amantecayotl y otras ciencias

amantecayolt, se traduce del nahuatl como ciencias de la tecnología ó tecnología http://www.espanolsinfronteras.com/Diccionarios/EspdeMx-DiccEspanolNahuatl-T.htm

miércoles 18 de junio de 2008

vmware time wrong

--tomado de http://vmblog.com/archive/2007/08/24/help-vmware-fixing-time-keeping-problems-with-the-guest-os.aspx

HELP: VMware - Fixing Time Keeping Problems with the Guest OS

Because virtual machines work by time-sharing host physical hardware, a virtual machine cannot exactly duplicate the timing behavior of a physical machine. VMware virtual machines use several techniques to minimize and conceal differences in timing behavior, but the differences can still sometimes cause timekeeping inaccuracies and other problems in guest software.

This problem occurs because current VMware for Linux products do not have complete support for host power management features (such as Intel SpeedStep, or AMD PowerNow or Cool'n'Quiet) that vary the processor speed. To work around this problem, specify the correct maximum CPU speed in your global configuration file. This can be done on either a Windows host server or a Linux host server.

On a Windows host server:

1.
Find the speed of your host's CPU. For example, in Windows XP, right click My Computer, then choose Properties. This path may be different, depending on the version of Windows you use.

2.

Look for config.ini in one of the following locations:
*

C:\Documents and Settings\All Users\Application Data\VMware\VMware Workstation\config.ini
*

C:\Documents and Settings\All Users\Application Data\VMware\VMware GSX Server\config.ini
*
C:\Documents and Settings\All Users\Application Data\VMware\VMware Server\config.ini

*
C:\ProgramData\VMware\VMware Workstation or
C:\Program Files\VMware\VMware Workstation
(on a Windows Vista host running Workstation 6.0)


3.

Edit config.ini, adding the lines described below.

host.cpukHz = "X" where "X" equals the maximum speed in KHz of your host machine. That is, its speed in MHz times 1000 or its speed in GHz times 1000000. A 3GHz machine would be 3000000.
host.noTSC = "TRUE"
ptsc.noTSC = "TRUE"

The second and third lines enable a mechanism that tries to keep the guest clock accurate even when the time stamp counter (TSC) is slow.
Note: On Windows, you can use Notepad, but be careful when you save the file that Notepad does not add an extra .txt extension to the filename. You can do that by selecting All files instead of Text files in the Save dialog box.

4.

In addition, check the VMware Tools control panel in the guest operating system. On the Options tab, ensure that Time synchronization between the virtual machine and the host operating system is selected.

On a Linux host server:

To prevent guest clocks from running too quickly, specify the correct maximum host CPU speed in your global configuration file, /etc/vmware/config. If this file exists, edit it with a text editor, adding the lines described below. The file may not exist. If it does not exist, create it as a plain text file.

Add the following lines to your global configuration file:

host.cpukHz = "X" where "X" equals the maximum speed in KHz of your host machine. That is, its speed in MHz times 1000 or its speed in GHz times 1000000. A 3GHz machine would be 3000000.
host.noTSC = TRUE
ptsc.noTSC = TRUE

To periodically correct the time (once per minute) when a guest clock runs slowly, VMware Tools must be installed in the guest. On the Options tab of VMware Tools in the guest, verify that Time synchronization between the virtual machine and the host operating system is selected.

Windows 2003, servidor de horario

-- tomado de http://support.microsoft.com/kb/816042

Configurar el Servicio de hora de Windows para usar un origen de hora externo
Para configurar un servidor de hora interno para que se sincronice con un origen de hora externo, siga estos pasos:
1. Cambie el tipo de servidor a NTP. Para ello, siga estos pasos:
a. Haga clic en Inicio, en Ejecutar, escriba regedit y, a continuación, haga clic en Aceptar.
b. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\Type
c. En el panel derecho, haga clic con el botón secundario del mouse en Type y, a continuación, haga clic en Modificar.
d. En el cuadro de diálogo Editar valor DWORD, escriba NTP en el cuadro Información del valor y, a continuación, haga clic en Aceptar.
2. Configure AnnounceFlags en 5. Para ello, siga estos pasos:
a. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags
b. En el panel derecho, haga clic con el botón secundario del mouse en AnnounceFlags y, a continuación, haga clic en Modificar.
c. En el cuadro de diálogo Editar valor DWORD, escriba 5 en el cuadro Información del valor y, a continuación, haga clic en Aceptar.
3. Habilite NTPServer. Para ello, siga estos pasos:
a. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer
b. En el panel derecho, haga clic con el botón secundario del mouse en Enabled y, a continuación, haga clic en Modificar.
c. En el cuadro de diálogo Editar valor DWORD, escriba 1 en el cuadro Información del valor y, a continuación, haga clic en Aceptar.
4. Especifique las fuentes de tiempo. Para ello, siga estos pasos:
a. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer
b. En el panel derecho, haga clic con el botón secundario del mouse en NtpServer y, a continuación, haga clic en Modificar.
c. En el cuadro de diálogo Editar valor DWORD, escriba interlocutores en el cuadro Información del valor y, a continuación, haga clic en Aceptar.

Nota: interlocutores es un marcador de posición para una lista de delimitada mediante espacios que contiene los interlocutores de los que su equipo obtiene las marcas de tiempo. Cada nombre DNS de la lista debe ser único. Debe agregar ,0x1 al final de cada nombre DNS. Si no agrega ,0x1 al final de cada nombre DNS, los cambios hechos en el paso 5 no surtirán efecto.
5. Seleccione el intervalo de encuesta. Para ello, siga estos pasos:
a. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\SpecialPollInterval
b. En el panel derecho, haga clic con el botón secundario del mouse en SpecialPollInterval y, a continuación, haga clic en Modificar.
c. En el cuadro de diálogo Editar valor de DWORD, escriba tiempoEnSegundos en el cuadro Información del valor y, a continuación, haga clic en Aceptar.

Nota: tiempoEnSegundos es un marcador de posición para el número de segundos que quiere que transcurran entre cada encuesta. Un valor recomendado es 900 Decimal. Este valor configura el servidor de tiempo para que haga una encuesta cada 15 minutos.
6. Configure los valores de corrección de tiempo. Para ello, siga estos pasos:
a. Busque la siguiente subclave del Registro y haga clic en ella:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxPosPhaseCorrection
b. En el panel derecho, haga clic con el botón secundario del mouse en MaxPosPhaseCorrection y, a continuación, haga clic en Modificar.
c. En Editar valor DWORD, haga clic para seleccionar Decimal en el cuadro Base.
d. En el cuadro de diálogo Editar valor de DWORD, escriba tiempoEnSegundos en el cuadro Información del valor y, a continuación, haga clic en Aceptar.

Nota: tiempoEnSegundos es un marcador de posición para un valor razonable, como 1 hora (3600) o 30 minutos (1800). El valor que seleccione dependerá del intervalo de encuesta, la condición de la red y el recurso de tiempo externo.
e. Busque y haga clic en la siguiente subclave del Registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxNegPhaseCorrection
f. En el panel derecho, haga clic con el botón secundario del mouse en MaxNegPhaseCorrection y, a continuación, haga clic en Modificar.
g. En Editar valor DWORD, haga clic para seleccionar Decimal en el cuadro Base.
h. En el cuadro de diálogo Editar valor de DWORD, escriba tiempoEnSegundos en el cuadro Información del valor y, a continuación, haga clic en Aceptar.

Nota: tiempoEnSegundos es un marcador de posición para un valor razonable, como 1 hora (3600) o 30 minutos (1800). El valor que seleccione dependerá del intervalo de encuesta, la condición de la red y el recurso de tiempo externo.
7. Salga del Editor del Registro.
8. En el símbolo del sistema, escriba el comando siguiente para reiniciar el Servicio de hora de Windows y presione después ENTRAR:
net stop w32time && net start w32time

viernes 13 de junio de 2008

Hacer certificados x509 con openssl para windows

--tomado de http://www.codeproject.com/KB/IP/sslclasses.aspx y http://dns.bdat.net/documentos/certificados_digitales/x359.html

1.- Generar llave privada "openssl genrsa -des3 -out clientkey.pem 2048". El archivo se genera en base 64.

2.- Generar peticion "openssl req -new -key clientkey.pem -out clientrequest.csr".

3.- Generar certificado: Se puede hacer de 2 formas.

3a.-En el sitio de tu servidor /certsvr, en "Solicitar certificado" -> "Solicitud avanzada de certificado" -> "Enviar una solicitud de certificados usando un archivo cifrado de base64 CMC o PKCS #10 o una solicitud de renovación usando un archivo cifrado de base64 PKCS #7." dile donde se encuentra el archivo clientrequest.csr y descarga el archivo generado con el nombre de "clientcert_x509_codificado.cer". Este archivo esta en formato x509 codificado.

3b.- En la linea de comandos logeado en el servidor "certreq -submit -attrib "Ce
rtificateTemplate:ClientAuth" -crl -f clientrequest.csr clientcert_x509_base64.cer" . Para mas atributos http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/advcert.mspx#EK4AG en la sección "Certreq.exe INF File Structure"

* Ahora los vamos a convertir en x509 base 64 "openssl x509 -inform DER -in clientcert_x509_codificado.cer -out clientcert_x509_base64.pem"

* Y combinamos el certificado y la llave privada en un archivo. "type clientcert_x509_codificado.pem clientkey.pem >client_cert_key.pem".

* Algunos programas (Como Internet Explorer o Mozilla Firefox) necesitan que el archivo este en formato pkcs12, el cual obtenemos asi "openssl pkcs12 -export -out client_cert_key.p12 -in client_cert_key.pem -name "Mi certificado" "


Ahora si a usarlo en nuestra aplicación

jueves 12 de junio de 2008

Configuracion Windows 2003 PDC

TOMADO DE http://eventid.net/display.asp?eventid=53258&eventno=4493&source=MSDTC&phase=1
Para el error
Origen: MSDTC
ID: 53258

David Grant (Last update 4/12/2005):
I corrected the error by doing the following:
1. Click Start -> Administrative Tools -> Component Services.
2. Click the "+" next to Component services to expand it.
3. Right click "My Computer" in the right window pane and select Properties.
4. Click the MS DTC Tab.
5. Click the "Security Configuration" button, a dialog box appears. Click "OK".
6. Click "OK" on the "My Computer Properties" box; this will take you back to the console.
7. Right click "My Computer" and select "Stop MS DTC" (this stops the MSDTC service.
8. Again, right click "My Computer" and select "Start MS DTC".
By following the above steps, it appears that this sets the MS DTC defaults resolving the error messages. Check the event log to verify that the problem is gone. You might also want to restart the server to verify this.

viernes 18 de abril de 2008

Certificado como lo usa Hacieda

-- tomado de http://www.lacorona.com.mx/fortiz/

Manejo del certificado y sello digital + Factura Electronica en México

Contenido/contents:
Introducion
Llave privada
Llave publica
Pagina anterior/Previous page

Introduccion
Para los que todavia no tengan el famoso anexo 20 del diario oficial del 1 de septiembre del 2004 lo pueden obtener aqui. El Anexo 20 empieza en la pagina 135 y termina en la pagina 160.
En la pagina informacion a detalle sobre Comprobantes fiscales Didigitales del SAT esta una presentacion en PowerPoint fechada en Febrero del 2005 fea_fe.ppt donde en la diapositiva 58 "Un par de Notas Sobre Llaves" mecionan que la llave privada esta en con el standard PKCS8 en formato DER.
Desafortunadamente los algoritmos PHP de OpenSSL requieren que este en formato PEM.
Llave privada
Ademas esta el 'problema' de la contraseña, se puede escribir la contraseña en el codigo PHP pero queda muy a la vista, o se le puede quitar la contraña al archivo. Yo obte por esto ultimo.
openssl pkcs8 -inform DER -in AAA010101AAA_0408021316S.key -out AAA010101AAA.key.pem
Este programa pide la contraseña para poder abrir la llave y la convierte al formato PEM ya sin la contraseña. Podemos ver el contenido del archivo porque ya esta en formato base64.
$ cat AAA010101AAA.key.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDArCo5om1eOPsVVkgG57X0VZI+Y/kqSRRqtOVBGj8rKx38nYjH
VqAkKS4sYRsvLtXI+1courEksbrhYxkYJOc1rqm6uyWSIbrtwhSStoETa2/+3Zsv
tGYakQARhlPm6Pqyj6DjiNZrMW8JjtSehr4grd17Aub6L3wv28tkHvIizwIDAQAB
AoGBALxMReQXws0v4OsEbNYaw++rZYaGC+/whfyXF+pdLVkSBXdpulAeb9mHSXHj
4T5mhlaqlI7gjdkvvVUilVbMUgypGYr8D7tw+cIw4dY59T+iYJP4ohu0/9QxT61z
LaxCDWz1oQSWrqVrC2YeBMZlUMqoj60qhZuN/nMLuMlf69s5AkEA6gDl7P8sgMk5
ur0BIpDDsAiXS0GwbrbKg+b9Ha7OAG+8rMG4K8oTSNXsZESLrN2ZcLzr08Xp/GIv
8qZzWoT17QJBANLIq6mQKXjPYX9PYvFB4voQJ2uBzARbT+9IBEki9IeBoa+8KMlh
XatepWNnWN+EGFu25K+TYimWvW/alL81pCsCQQDGsbyKYKIJONQsHBC6qPGAp8rP
vBdz6wJKvfhvG98Pv9EVX+hiRlPZpMv0179CKWgAsmoMiCEGjNjp0Sxh0ESBAkEA
jrmCQxZyfnMtuV6vyFysrFYz2v/QfUK3JXbGMB+TJA4KxUvK8lETc+5qXpyj+PUg
6Tk2MAzD8xU2wH5pKe/QcQJAEYsi0vjsIzcIOaCRRPA+H0kOEgx4wPZmKNrLNGru
gBIUpRlCzi6zGAhq3KVosQeqp0TAg9aSREW+Jux6nYJigA==
-----END RSA PRIVATE KEY-----
Como mencione, este certificado ya esta sin contraseña, si se quiere en formato PEM pero con la contraseña se ejecuta este otro comando que la solicita y encripta la llave privada.
$ openssl rsa -in AAA010101AAA.key.pem -des3 -out conllave.key.pem
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Este archivo en formato PEM tambien tiene el contenido en formato base64 pero esta cifrado con el metodo 3DES por lo cual solo se puede usar para firmar si se proporciona la contraseña correcta.
$ cat conllave.key.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,40B029D5AE25EDB0

n/giCSQ/F91Zn1sAfdx8qO6fNNHYIJijtTUWABCrP9t8B/WLXkdhpOE4f/8pq1mc
NesOY6/wIwWxOOilBXjcOFUuvJAIys6M6YXhVt5i3efU5NxdfLHGcUtMh2sQnVia
X1c094aMONYtVXOfTphWnSIwillGIIRaDkwZXV8T1dxt4X0uzXM7EFTYi6cYE9Ok
3931+ehoRUN8wPqblZpCVqaM14m71nI9VC7PYe72Dhu/62B/PHl5uX551KV0ABHv
rn1rycdsz0c+ynu1No2Hx0MacP//QzRjHkfhKbHCJEOHCSQIRQw8noU035cXmG3O
zMoxZFgPpZPSbBYK/F3xtcqos+Zfp9neE9d/K/LHUC2W2YRl9bMZV3xcV9jArqJ4
3pL4Q6qwF8XG2Qeu1kUBtkOXqmUNa+6y7FaPCPbjS3sBXKBc+Ysgei2KWSmRDNR6
urulvRNhtfTJzLM52KlvAjg6rj8O+YFaErz8fJ2TiDDBiUdcKMLbH1uADe+aZyEt
LvshfAtyl7lKpdWxCro6wfCvkt95YRvQa1JILV6eVnhu5CZWtc3hjCaJuiSTvkjK
fxXaZWLNC9L2Du+xR4ceBk4L1BSu6k6up1nlTqctj9znRJ5BdkOdxkNhCbU9MI65
TthIFHkRAjHZUsJx79EhsLPH1lh9VPMxgNdYTr9OuYC+ro9pKinHsGnbQIkCOEkt
OSKwelU94DrOcpzIvqIeV4dxxCHPHLaeLUN13w3mLX0vtbLKb8Ml0CkTjzFBYA4H
DmgS3duVXUnPO4GDxcn+ZrXPDdBCqMW1nFG0BVgsBwuwd4v5LvgCtw==
-----END RSA PRIVATE KEY-----
Llave publica
Ademas el certificado o llave publica tambien esta en formato DER por lo que tambien hay que convertirlo
openssl x509 -inform DER -outform PEM -in AAA010101AAAsd.cer -pubkey >AAA010101AAA.cer.pem
Ya convertido ya podemos ver el contenido del certificado de llave publica
24/feb/2006, Gracias a Hector Magaña de Accend por corregirme en el comando para generar el archivo incluyendo la llave publica.
$ cat AAA010101AAA.cer.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDArCo5om1eOPsVVkgG57X0VZI+
Y/kqSRRqtOVBGj8rKx38nYjHVqAkKS4sYRsvLtXI+1courEksbrhYxkYJOc1rqm6
uyWSIbrtwhSStoETa2/+3ZsvtGYakQARhlPm6Pqyj6DjiNZrMW8JjtSehr4grd17
Aub6L3wv28tkHvIizwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIDpDCCAoygAwIBAgIUMDAwMDEwMDAwMDAwMDAwMDAxMTQwDQYJKoZIhvcNAQEF
BQAwgcMxGTAXBgNVBAcTEENpdWRhZCBkZSBNZXhpY28xFTATBgNVBAgTDE1leGlj
bywgRC5GLjELMAkGA1UEBhMCTVgxGjAYBgNVBAMTEUFDIGRlIFBydWViYXMgU0FU
MTYwNAYDVQQLFC1BZG1pbmlzdHJhY2nzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5m
b3JtYWNp824xLjAsBgNVBAoUJVNlcnZpY2lvIGRlIEFkbWluaXN0cmFjafNuIFRy
aWJ1dGFyaWEwHhcNMDQwODAyMTk0NzEzWhcNMDYwODAyMTk0NzEzWjCBuDElMCMG
A1UELRMcQUFBMDEwMTAxQUFBIC8gQUFBQTAxMDEwMUFBQTEeMBwGA1UEBRMVIC8g
QUFBQTAxMDEwMUhERlJYWDAwMRowGAYDVQQKExFFbXByZXNhIGRlIFBydWViYTEb
MBkGA1UECxMSU3VjdXJzYWwgZGUgUHJ1ZWJhMRowGAYDVQQDExFFbXByZXNhIGRl
IFBydWViYTEaMBgGA1UEKRMRRW1wcmVzYSBkZSBQcnVlYmEwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAMCsKjmibV44+xVWSAbntfRVkj5j+SpJFGq05UEaPysr
HfydiMdWoCQpLixhGy8u1cj7Vyi6sSSxuuFjGRgk5zWuqbq7JZIhuu3CFJK2gRNr
b/7dmy+0ZhqRABGGU+bo+rKPoOOI1msxbwmO1J6GviCt3XsC5vovfC/by2Qe8iLP
AgMBAAGjHTAbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgPoMA0GCSqGSIb3DQEB
BQUAA4IBAQA3c1OpeaWhP1Qt5XBb3CKogVjo8oUfIJdayTYVG/jy/STtWUJpQ5V1
4esa4ZrhTtYT1ZJiXPwQTS1fEDNr4XrmyFoimXfj9/pemGu/61skcViVB2rw3H6S
5Mn8b2ICx6zAK+KVoFal/mJpXLOGvH4S7E529MneLh6rktDxJ+338fFgF2sEZItf
NaSeAsX4Nllsz4G4re0nnSShD3T9y6o2nMpOwphMgpy12HsQm7XxIvZe+SIUjhBk
Q7UVz9/6yuD/Hguh38vnU9j98VWahVjUT4BnI1RTPiYlaxlMsqQOkh1QIbOufki5
4wledKtwlkS5x71yo3HMVR9CMK2GJV39
-----END CERTIFICATE-----
Y por supuesto ya podemos usar varios comandos para sacar mas informacion de ese conjunto de datos.
$ openssl x509 -in AAA010101AAA.cer.pem -issuer -noout
issuer= /L=Ciudad de Mexico/ST=Mexico, D.F./C=MX/CN=AC de Pruebas SAT/OU=Administraci\xF3n de Seguridad de la Informaci\xF3n/O=Servicio de Administraci\xF3n Tributaria
$ openssl x509 -in AAA010101AAA.cer.pem -startdate -enddate -noout
notBefore=Aug 2 19:47:13 2004 GMT
notAfter=Aug 2 19:47:13 2006 GMT
$ openssl x509 -in AAA010101AAA.cer.pem -subject -noout
subject= /x500UniqueIdentifier=AAA010101AAA / AAAA010101AAA/serialNumber= / AAAA010101HDFRXX00/O=Empresa de Prueba/OU=Sucursal de Prueba/CN=Empresa de Prueba/name=Empresa de Prueba
$ openssl x509 -in AAA010101AAA.cer.pem -serial -noout
serial=3030303031303030303030303030303030313134
Ya para ver ejemplos de como usar estos certificados para generar el sello del certificado digital les recomiendo que vean esta pagina donde tambien aplico XSLT para generar la cadena original.

miércoles 16 de abril de 2008

Errores comunes con Prototype

-- Todamo de este blog: http://www.pablasso.com/

Errores comunes con Prototype

1.

Modo Incorrecto

document.getElementById('foo')

Modo Correcto

$('foo')

El operador $ es lo mas esencial de Prototype, de ahí viene toda su magia, utilizalo!

2.

Modo Incorrecto

var woot = document.getElementById('bar').value
var woot = $('bar').value

Modo Correcto

var woot = $F('bar')

El operador $F es un gran atajo para obtener valores de elementos.

3.

Modo Incorrecto

$('footer').style.height = '100px';
$('footer').style.background = '#ffc';

Modo Correcto

JAVASCRIPT:
  1. $('footer').setStyle(
  2. {
  3. height: '100px',
  4. background: '#ffc'
  5. }
  6. )

Olvidate de problemas de bugs sobre diferentes navegadores si utilizas el metodo setStyle()

4.

Modo Incorrecto

$('tusuperelemento').innerHTML = 'algun contenido'

Modo Correcto

$('tusuperelemento').update('algun contenido')

Podras decir que es casi la misma, pero no opinaras lo mismo cuando necesites concatenar funciones.

5.

Modo Incorrecto

new Ajax.Request('ninja.php?weapon1=foo&weapon2=bar')

Modo Correcto

JAVASCRIPT:
  1. new Ajax.Request('ninja.php',
  2. {
  3. parameters:
  4. {
  5. weapon1: 'foo',
  6. weapon2: 'bar'
  7. }
  8. }
  9. )

Escribe código limpio, tu cerebro te lo agradecerá.

6.

Modo Incorrecto

JAVASCRIPT:
  1. new Ajax.Request('blah.php',
  2. {
  3. method: 'POST',
  4. asynchronous: true,
  5. contentType: 'application/x-www-form-urlencoded',
  6. encoding: 'UTF-8',
  7. }
  8. )

Modo Correcto

new Ajax.Request('blah.php')

Todos esos parámetros ya son defaults, ¿Para que repetirlos?.

7.

Modo Incorrecto

Event.observe('myContainer', 'click', doSomeMagic)

Modo Correcto

$('myContainer').observe('click', doSomeMagic)

Es mas fácil concatenar si escoges el segundo, pero aquí es cuestión de gustos, escoge el sabor que mas te guste.

8.

Modo Incorrecto

JAVASCRIPT:
  1. $('div.hidden').each(function(el)
  2. {
  3. el.show();
  4. }
  5. )

Modo Correcto

$$('div.hidden').invoke('show')

Invoke es muy útil, piensa en el como en un atajo cuando necesitas asignar valores iguales a todos tus elementos sin necesidad de iterar sobre ellos.

9.

Modo Incorrecto

JAVASCRIPT:
  1. $('div.collapsed').each(function(el)
  2. {
  3. el.observe('click', expand);
  4. }
  5. )

Modo Correcto

$$('div.collapsed').invoke('observe', 'click', expand)

Y también puede ser usado para manejo de eventos, muy practico!

10.

Modo Incorrecto

$$('input.date').invoke('observe', 'focus', onFocus);
$$('input.date').invoke('observe', 'blur', onBlur);

Modo Correcto

JAVASCRIPT:
  1. $('input.date')
  2. .invoke('observe', 'focus', onFocus)
  3. .invoke('observe', 'blur', onBlur)

¿Para que abusar del operador $$ dos veces si podemos concatenar?

11.

Modo Incorrecto

JAVASCRIPT:
  1. $('productTable').innerHTML =
  2. $('productTable').innerHTML +
  3. '' + productId + ' '
  4. + productName + ''
  5. + productId + ' ' + productPrice +
  6. ''

Modo Correcto

JAVASCRIPT:
  1. var rowTemplate = new Template('#{id} #{name}#{id} #{price}');
  2. $('productTable').insert(
  3. rowTemplate.evaluate(
  4. {
  5. id: productId,
  6. name: productName,
  7. price: productPrice
  8. }
  9. )
  10. )
  11. )

Este tip en especial es una joya, con Prototype podemos hacer templates, evitando de esta manera enormes plastas de código. Me confieso culpable de no haber utilizado esto antes.

Enlace | How well do you know prototype

martes 15 de abril de 2008

Script de Python para generar un codigo de barra 128

Este es un script que hice para mi aplicacion de Zope en la que imprimo unas credenciales con codigo de barras en codigo 128. Se copia en la carpeta de Extensions y se crea en mi instancia de zope un objeto tipo External Metod con
  • id: ean_128
  • module name: ean_128
  • function name: convierteA128
La mando llamar con el siguiente codigo

<dtml-let codigo="'%06d-%05d'">
<div class="nomostrar" id="codigo_barra"><dtml-var expr="ean_128((codigo)%(taller, credencial), False)"></div>
<div class="nomostrar" id="taller_credencial"><dtml-var expr="(codigo)%(taller, credencial)"></div>
</dtml-let>

El <dtml-let codigo="'%06d-%05d'">permite dar formato: si le mando taller 15 y credencial 148 me regresa 000015-00148 y convierto la cadena a codificacion 128.

Se debe tener instalado el tipo de letra Code128bWin. Tambien es importante tener en codificacion de salida en zope.conf, opcion default-zpublisher-encoding como iso-8859-1

script ean_128.py [RS] [MU]:

validoB=' !"#$%&\'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
validoC='0123456789'
startB = 154
startC = 155
cambioC= 149
cambioB= 150
stop = 156
def convierteA128(s, TipoC=True):
"""Convierte una cadena a su representacion ASCII de codigo de barra"""
lista = formaLista(s, TipoC)
verificador= digito_verificador(lista)
lista.append(verificador)
lista.append(chr(stop))
cadena=""
for c in lista:
cadena=cadena + c
return cadena

def digito_verificador(lista):
"""Saca el digito verificador de la lista de Codigo de Barra Codificada"""
import string
l2=[]
i=suma=l=0
j=len(lista)
if ord(lista[0])==startB:
suma=startB-50
elif ord(lista[0])==startC:
suma=startC-50
for i in range(1,j):
if len(lista[i])==2:
l=string.atoi(lista[i])
elif ord(lista[i])==cambioC:
l=cambioC-50
elif ord(lista[i])==cambioB:
l=cambioB-50
else:
l=ord(lista[i])-32
l=l*i
suma=suma+l
i,residuo= divmod(suma,103)
return regresa(residuo)

def formaLista(s,TipoC):
"""Recorre la cadena para formar una lista con el Codigo de Barra Codificado"""
l=[]
esC=False
cambio=False
c=s[0]
c2=' '
if c in validoB:
l.append(chr(startB))
else:
c=s[1]
if c in validoB or TipoC==False:
l.append(chr(startB))
else:
l.append(chr(startC))
cambio=True

for c in s:
if (c in validoB or TipoC==False):
esC=False
if cambio==True:
l.append(chr(cambioC))
cambio=False
if c2<>' ':
l.append(c2)
c2=' '
l.append(c)
elif (c in validoC):
if (esC==False):
c2=c
esC=True
else:
if c2 <> ' ':
if cambio==False:
cambio=True
l.append(chr(cambioB))
num=c2 + c
c2=' '
l.append(num)
else:
c2=c

if c2<>' ':
if cambio==True:
l.append(chr(cambioC))
l.append(c2)

return l

def regresa(i):
"""Convierte el digito verificador a su representacion ASCII"""
if i==0:
return chr(128)
if i >= 95:
return chr(i+50)
elif i>0 and i<95:
return chr(i+32)