jueves, septiembre 30, 2010

El próximo domingo termina la primera guerra mundial

foto extraida de Wikipedia

92 años después del armisticio de Rethondes (11 de noviembre de 1918 según wikipedia) Alemania va a terminar de pagar las indemnizaciones de guerra que le impusieron los vencedores:
http://www.elnuevoherald.com/2010/09/30/811907/alemania-paga-deuda-pendiente.html

Han hecho coincidir el último pago con la conmemoración de los 20 años desde la reunificación Alemana.

Aprovecha la ocasión para recordar cómo se desarrollo el conflicto y cómo a pesar de los éxitos iniciales los imperios centrales perdieron la guerra. Puedes leer un resumen muy interesante en la wikipedia:
http://es.wikipedia.org/wiki/Primera_Guerra_Mundial

Ya he leído en varios sitios que las condiciones del final de la guerra fueron tan duras que auparon al tercer Reich al poder años más tarde.

No hay que olvidar que redujeron el imperio alemán, convirtiendolo en República y quitandole territorio que se apropiaron Belgica, Dinamarca, Francia, República Checa, Polonia, Rusia y Lituania.

También desmembraron el imperio Austrohúngaro reduciendo Austria a la zona donde se hablaba Alemán. Hungría pierde territorio en favor de Checoslovaquia, Rumanía, y Yugoslavia.

Bulgaria perdió territorio en favor de Yugoslavia y Grecia, perdiendo el acceso al mar Egeo.

Teniendo en cuenta que antes de la Primera Guerra Mundial también hubo unos años de preparación para la guerra, se puede considerar que la Segunda Guerra Mundial fue continuación de la primera. Desde luego las motivaciones Alemanas y Austriacas (Hitler era Austriaco) no se pueden entender sin leer antes lo ocurrido en la Primera.

Este sitio tiene un mapa interactivo donde se señalizan perfectamente los territorios afectados:
http://www.emol.com/especiales/infografias/2008/interactivo/WWI/index.htm

También hay buenas fotografías de la contienda:
http://www.emol.com/mundografico/?G_ID=7683

Saludos.

jueves, septiembre 23, 2010

La conjura de los necios


¿Hola que tal?

Ha finales de agosto os comenté que estaba leyendo un libro impresionante. Es "La conjura de los necios" de John Kennedy Toole.

El autor hace una crítica social tremenda a través de unos personajes muy particulares. Lo curioso es que en seguida puedes asociar los personajes a gente que conoces, incluso a ti mismo (o a mí).

Como anécdota os contaré que el libro era prestado. Me despisté y me lo dejé encima del techo de mi coche con otras cosas más. Uff! menos mal que lo pude comprar en la librería.

Como escribe el editor en la introducción, el libro es divertido y te ríes mucho en algunos pasajes, pero queda un poso de tristeza en el relato. Probablemente el protagonista o su relación con su madre sea triste... o tal vez nos vemos reflejados en las situaciones que se plantean...

Al igual que en el caso de Stieg Larsson (Millenium), el autor de esta novela no llegó a conocer el éxito de su obra. Se suicidó en un momento de gran depresión, sin haber conseguido que ningún editor publicara el libro. Tras mucho insistir su madre consiguió que un editor empezara a leerlo y ya no pudo dejar de leer. Al año siguiente fue tal el éxito de la novela que le concedieron el premio Pulitzer a título póstumo.

Saludos y os animo a su lectura.

sábado, septiembre 18, 2010

Comprueba tus servicios de red

Hace unos meses comenté el comando NETSTAT.

Resumiendo mucho, con NETSTAT podemos ver en un servidor que conexiones activas tiene (dirección remota, puerto, estado de la conexión, etc.).

El comando LSOF podemos ver ficheros abiertos. También sirve para ver los sockets abiertos. Los sockets son las conexiones de red TCP/IP.

lsof -i
Con la opción -i se listan sólo sockets IP.

Ahora bien, puede que un atacante que haya accedido al servidor haya modificado los comandos lsof y netstat para que no podamos ver la conexión activa.

Por una parte por la advertencia anterior, y por otra porque nos resultará más cómodo el acceso desde nuestro propio PC, es más recomendable utilizar un escaneador de puertos como NMAP.

Para la comprobación desde el propio servidor:

nmap -sT -0 localhost

De forma remota: en lugar de localhost ponemos la IP del servidor a comprobar.

Otra opción habitual:

nmap -sTU direccion-IP

En esta web tenemos todo lo necesario sobre nmap, desde la descarga para la mayoría de S.O., listas de distribución, foros, guía técnica, manuales, hacking con nmap, etc.

http://nmap.org/

Saludos.

martes, septiembre 14, 2010

Mapeos de unidades de red de otros dominios

Hola,

Hoy he tenido que hacer un tema en el trabajo que puede que os sea útil alguna vez.

Se trata de hacer un formulario .net en el que el usuario tiene que meter el código de usuario y la password de un dominio Windows.

El programita lo que tiene que hacer es el mapeo.

Para hacer esto hay que tirar de la API de Windows porque en el framework .NET (al menos en el del Visual Studio .NET 2005 que es el framework 2.0) que utilizamos no tengo una clase para ello.

Importante: La alternativa que parece fácil, es utilizar el comando "net use" del sistema operativo para hacer el mapeo. Yo lo hice así al principio, pero cuando hay varios mapeos produce problemas. Un proceso net se pega con otro y los mapeos al final fallan mucho.

Así que empezaremos declarando la función WNetAddConnection2:

De esta forma ya podemos preparar la función que hace el mapeo:


Antes de mapear las unidades es mejor desmapearlas. Así que preparamos la función de desmapeo:


El código fuente va más abajo (cuidado porque igual Blogger lo deteriora un poco).

Lo importante son estos detalles:

1.-Al acceder a otro dominio en lugar del usuario a secas hay que pasarle a la función WNetAddConnection2 la pareja formada por dominio\usuario (hay una contrabarra entre los dos, pero igual blogger lo quita).

2.-A lpLocalName hay que pasarle la letra de la unidad a mapear seguido de dos puntos. Por ejemplo M:

3.-Cuidado con el orden de los parámetros. A WNetAddConnection2 hay que pasarle primero la password y luego el usuario.

4.-Hay que controlar los errores 85 (unidad ya mapeada) y 1326 (usuario o password incorrecto).

Public Class Form1

Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
(ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, _
ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer

Public Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" _
(ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer

Public Structure NETRESOURCE
Public dwScope As Integer
Public dwType As Integer
Public dwDisplayType As Integer
Public dwUsage As Integer
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure

Public Const ForceDisconnect As Integer = 1
Public Const RESOURCETYPE_DISK As Long = &H1

Public Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath As String) As Boolean

Dim nr As NETRESOURCE
Dim strUsername As String
Dim strPassword As String

nr = New NETRESOURCE
nr.lpRemoteName = UNCPath
nr.lpLocalName = DriveLetter & ":"
strUsername = "xxxxxxxxxxx\" & Me.txtErabiltzailea.Text
strPassword = Me.txtPasahitza.Text
nr.dwType = RESOURCETYPE_DISK

Dim result As Integer
result = WNetAddConnection2(nr, strPassword, strUsername, 0)

If result = 0 Then
Return True
Else
If result = 85 Then
'El resultado 85 se da cuando la unidad ya está mapeada.
'en ese caso salimos de esta función.
Exit Function
Else
If result = 1326 Then
MsgBox("Usuario o Password incorrecto")
Else
MsgBox("Se ha producido un error")
End If
End If
Me.Close() 'Cierra el formulario actual.
Return False
End If
End Function

Public Function UnMapDrive(ByVal DriveLetter As String) As Boolean
Dim rc As Integer
rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect)

If rc = 0 Then
Return True
Else
Return False
End If

End Function



Saludos.

jueves, septiembre 09, 2010

Trazas en SYS.AUD$

Actualizado el viernes 10 de septiembre de 2010.

Esas trazas las almacenamos en la tabla del usuario SYS: SYS.AUD$

Pues hoy crearemos un par de vistas para analizar cómodamente las trazas.

A la primera vista le he llamado _A_USUARIOS.
Pongo el guion bajo por delante sólo para que sea la primera vista en aparecer.

Esta vista tiene tres campos en mi ejemplo particular:

  • per_ej es el código de usuario Windows
  • per_nombre el nombre
  • per_apellido el apellido.

Esto es necesario porque en la tabla de las trazas se registrará el usuario Windows y queremos saber los nombres y apellidos del que accede.


Ahora creamos la vista con miga. Se llamará _A_AUDIT.
Servirá para hacer una selección de los campos de la tabla y para añadir los nombres y apellidos de los que acceden o tratan de acceder.

ntimestamp# es la fecha y hora del registro. Cuidado, es la hora UNC. No es la hora local. Más abajo explico cómo solucionar esto.

spare1 tiene el usuario Windows del usuario que accede.

userid es el usuario Oracle al que accede.

host indica el dominio windows y nombre de máquina del PC que accede.

action# es un código que indica la acción que realiza.

returncode es un código que indica el resultado del intento de acceso.

logoff$time indica la fecha y hora de fin de sesión.

La vista que muestra los accesos sería de esta forma:

Ahora bien, ya hemos dicho que la hora que aparece en ntimesstam# es la hora UNC, no la hora local.

Si hacemos "select current_timestamp from dual;" me da la hora actual bien.

Si hago "select systimestamp from dual;" también da la misma hora.

Con "Select dbtimezone from dual;" en mi caso obtengo +2 (por el horario de verano).

Lo que tenemos que hacer es modificar ligeramente la vista para que nos transforme la hora UTC a hora local según el dbtimezone que tengamos.

Esto se hace poniendo en lugar de ntimestam#:

"CAST ((FROM_TZ(ntimestamp#,'00:00') AT LOCAL) AS DATE)"

Para un copy-paste rápido así queda la vista con hora local:

CREATE OR REPLACE FORCE VIEW SYS."_A_AUDIT" (ntimestamp#,

per_nombre,

per_apellidos,

spare1,

userid,

userhost,

action#,

returncode,

logoff$time

)

AS

SELECT CAST ((FROM_TZ(ntimestamp#,'00:00') AT LOCAL) AS DATE), per_nombre, per_apellidos, spare1, userid, userhost,

action#, returncode, logoff$time

FROM aud$, "_A_USUARIOS"

WHERE "_A_USUARIOS".per_ej = aud$.spare1;




 
 
Otra opción para lo mismo sería utilizar una vista de trazas diferente a SYS.AUD$:
La vista que hay en el usuario Oracle SYS llamada DBA_AUDIT_TRAIL hace una select de AUD$ y otras tablas. En esta vista (DBA_AUDIT_TRAIL) la hora que aparece es hora local y no hora UNC.

Saludos.

miércoles, septiembre 08, 2010

SAS forum en octubre

Creo que el interés que puede tener este Congreso no está en el producto en sí, sino en los temas que van a tratar algunos de los ponentes.

El software SAS es tremendamente caro. Sólo accesible para grandes empresas. El licenciamiento de muchos de sus módulos se asemeja a un alquiler anual del software. Si utilizas su formato de datos nativo estarás obligado a pagar la enorme cuota anual que te corresponda.

Aquí expuse mi opinión hace dos años: http://aitoreus.blogspot.com/2008/10/software-para-el-conocimiento.html

A pesar del duro párrafo anterior, es interesante porque tratarán de temas que preocupan a las empresas de todo tipo como pueden ser:
  • Aumentar ventas
  • Conseguir mayores cuotas de mercado
  • Reducir pagos por reclamaciones
  • Realizar previsiones de ingresos
  • Cómo tener toda la información disponible en cada momento
  • Cómo aumentar los márgenes y reducir los precios a la vez.
  • Etc. etc.

Las salas se distribuyen por los siguientes sectores de actividad:

  • Banca
  • Seguros
  • Energía
  • Telecomunicaciones
  • Sector Público
  • Gran consumo, farmacia y distribución

Hay 4 salas con las siguientes temáticas:

  • Customer Intelligence
  • Business Analytics
  • Risk Management
  • Performance Management

Bueno, sin más. Si tienes interés recuerda que es el 21 de octubre en Madrid y se puede solicitar una invitación en esta dirección: http://www.sas.com/reg/offer/es/sfe10

¿Hay otras herramientas para hacer este tipo de cosas?

Claro que sí. Algunas incluso son software libre como R. Recuerda que todo lo que hace SAS se puede hacer en R. Y no todos los algoritmos disponibles en R se han trasladado a SAS (suele haber un desfase de algunos años hasta que se implementan). Eso sí, R tiene una curva de aprendizaje mucho más dura.

He encontrado esta comparativa entre software para análisis de datos que está muy bien:

http://anyall.org/blog/2009/02/comparison-of-data-analysis-packages-r-matlab-scipy-excel-sas-spss-stata/

Saludos.

Para la reflexión

Esto lo escribí muy probablemente en 1994 en un libro con el título "Virus informáticos" de G. González.

Estoy repasando la historia de los virus de la pelotita y el viernes13 para una charla, y me pareció un cita interesante entonces, y también ahora 16 años después:

"LAS APLICACIONES QUE HOY TIENE LOS ORDENADORES SON FASCINANTES. QUIÉN SABE SI LAS DE MAÑANA NO TRASCENDERÁN LITERALMENTE DE NUESTRA COMPRENSIÓN".

La cita aparece en la edición en castellano en "Alianza Editorial", aunque el original inglés es "The Penguin Computing Book".

Los autores: Susan Curran y Ray Curnow.

Saludos.

viernes, septiembre 03, 2010

Los nuevos amigotes de Telefónica (ahora Movistar)


Esto es lo que me temía.


Telefónica S.A heredó de la anterior empresa pública toda la red de telecomunicaciones existente.


Todavía hoy en la mayoría de lugares toda la infraestructura es propiedad de Telefónica y las otras operadoras utilizan sus líneas.


Estos condicionantes colocan a la compañía en una situación cercana al monopolio. En el mejor de los casos se trata de un Oligopolio, y los nuevos contratos que establezca la principal compañía serán aceptadas por las demás. Al fin y al cabo se trata de aumentar beneficios a costa del consumidor.


Ayer (31/08/2010) era Movistar. Hoy (01/09/2010) es Vodafone la que dice en el Diario de Noticias de Álava: "Vodafone se alinea con su rival Telefónica contra el uso ilimitado de las tarifas planas".
Por cierto, que se dejen de eufemismos. Lo que quieren es cargarse las tarifas planas. Pero eso es demasiado fuerte, ya que va a ser el único lugar de Europa donde lo consigan.
Por eso en vez de decirlo claramente quieren convencernos de que seguirán siendo tarifas planas, pero limitadas.
Saludos.