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
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
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
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
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
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
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 | |
| 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 | |
| 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 | |
| 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 | |
| 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
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
- $('footer').setStyle(
- {
- height: '100px',
- background: '#ffc'
- }
- )
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
- new Ajax.Request('ninja.php',
- {
- parameters:
- {
- weapon1: 'foo',
- weapon2: 'bar'
- }
- }
- )
Escribe código limpio, tu cerebro te lo agradecerá.
6.
Modo Incorrecto
- new Ajax.Request('blah.php',
- {
- method: 'POST',
- asynchronous: true,
- contentType: 'application/x-www-form-urlencoded',
- encoding: 'UTF-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
- $('div.hidden').each(function(el)
- {
- el.show();
- }
- )
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
- $('div.collapsed').each(function(el)
- {
- el.observe('click', expand);
- }
- )
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
- $('input.date')
- .invoke('observe', 'focus', onFocus)
- .invoke('observe', 'blur', onBlur)
¿Para que abusar del operador $$ dos veces si podemos concatenar?
11.
Modo Incorrecto
- $('productTable').innerHTML =
- $('productTable').innerHTML +
- '' + productId + ' '
- + productName + ''
- + productId + ' ' + productPrice +
- ''
Modo Correcto
- var rowTemplate = new Template('#{id} #{name}#{id} #{price}');
- $('productTable').insert(
- rowTemplate.evaluate(
- {
- id: productId,
- name: productName,
- price: productPrice
- }
- )
- )
- )
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
- id: ean_128
- module name: ean_128
- function name: convierteA128
<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)