lunes, 12 de mayo de 2014

Renombrando ficheros masivamente con C#

Ya existen muchas aplicaciones que hacen esto, sin embargo son demasiado agobiantes. Pretenden que un usuario cualquiera sea capaz de asimilar el concepto de máscara y en muchos casos aplican puras expresiones regulares.

Lo que pretendo con este cacho-código es ver que existe una forma sencilla de desarrollar, de tontos novato pa tontos novato ...

La aplicación no tiene misterio:
1. Ejecutas
2. Arrastras ficheros a renombrar (pueden estar en distintas carpetas)
3. Indicas el nombre o prefijo que tendrán los ficheros y el valor por donde empezará a numerar
4. Clicas en renombrar y ya está todo.



Puedes descargar la aplicación aquí (con el setup.exe basta) y la solución (código fuente) del proyecto aquí.

Código principal:

jueves, 24 de abril de 2014

Imagenio en cualquier dispositivo (II) - Tráfico multicast a unicast

Ei, siguiendo el tema de Imagenio...
Ahora toca manipular los paquetes multicast que viajan por nuestra red para que sean visibles a través de una dirección http, es decir un protocolo unicast.

Se necesitará una máquina con alguna distribución de linux, yo he optado por una Rasperry con Raspbian, ¿Qué porqué? , a mi me interesa que esta conexión esté operativa 24/7, optar por un dispositivo que apenas llega a los 40 euros es una buena estrategia; su consumo es muy reducido (basta con un cargador de smartphone), el mantenimiento nulo y su configuración sencilla (gracias a su popularidad y su extensa comunidad).

Primero adquirir privilegios, su, sudo -i o lo que os haga falta y conectar el cable de red (no sirve que el servidor proxy vaya por wifi, el cliente da igual el método de conexión).

Lo que tendremos que hacer es descargar el servidor proxy que convertirá el trafico RTP o UDP con señal IPTV a HTTP, udpxy .
(en esta prueba lo haré desde un Debian limpio)

wget http://www.udpxy.com/download/1_23/udpxy.1.0.23-9-prod.tar.gz



El segundo paso será descomprir
tar -xzvf udpxy.1.0.23-9-prod.tar.gz mir:



Ahora necesitaremos compilar e instalarlo, para eso se entra en la carpeta donde se han descomprimido todos los ficheros y compilamos con make e instalamos con make install (si no podeis instalar build-essential, apt-get install build-essential).


Ya solo queda ejecutarlo (con privilegios siempre).
udpxy -p 5555 (puedes usar el puerto que te de la gana)
Ahora el problema viene cuando se cae nuestra máquina o por lo que sea hemos de reinciar, el proxy no estará iniciado y para solucionar esto y lograr un reboot de udpxy crearemos un script en /etc/network/if-up.d/

Creo el fichero
nano /etc/network/if-up.d/rebootUDPXY



Y le añado lo siguiente: 

#!/bin/bash
udpxy -p 5555
Guardamos con Ctrl+O y salimos con Ctrl+X

Le damos permisos...
chmod 755 /etc/network/if-up.d/NombreDelScript


Y reiniciamos para hacer la prueba
reboot

Podremos ver el estado desde cualquier ordenador de la red local añadiendo en la dirección del explorador http://la_ip_del_servidor_udpxy:puerto/status 
(muy recomendable usar ip estática)


Para preparar la lista de canales de imagenio cabe decir que van actualizando así que hay que estar un poco al tanto (por google hay mucho respecto al tema) y el reproductor que uso es vlc.

Descargar la lista de canales, ahora si editamos el fichero se puede ver que tenemos algo así http://ip:puerto/rtp/239.0.1.4:8208, hemos de buscar y reemplazar en el fichero, ip reemplazarlo por la ip del servidor proxy (hacer ifconfig para saber la ip) y puerto por el puerto que asignamos arriba.
Si lo hacéis desde linux se puede usar el comando sed -i


En windows puedes usar cualquier editor de texto como el bloc de notas, sublime text, notepad++

Si ejecutamos el fichero m3u con vlc ya estaremos viendo Imagenio


Ahora podemos ver Imagenio en área local, es decir solamente en nuestro hogar, en la siguiente entrada incluiré el acceso por VPN y la configuración de los clientes en android y windows.

Imagenio en cualquier dispositivo (I) - Como funciona Imagenio
Imagenio en cualquier dispositivo (II) - Tráfico multicast a unicast

lunes, 14 de abril de 2014

Números primos, hilos y ¿un break en el for?

Ola ke ase, como ejercicio pendiente para esta semana santa de un muy amable profesor, el cual no voy a nombrar por respeto pero si voy a agradecer (irónicamente) la tarea para realizar durante nuestro preciado descanso académico, ya que me ha hecho reflexionar joder... Siempre me han dicho, NI SE TE OCURRA PONER UN BREAK EN UN FOR, y así obedecí, jamás lo había usado pero esta vez no ha sido así:

El ejercicio plantea lo siguiente, tal cual lo voy a escribir:

 2-A.-Hacer un programa que ayude a crear la lista de los 100 primeros números primos, mediante 4 hilos. Cada hilo buscará el siguiente número natural, y si éste es primo lo deberá almacenar en un vector que contendrá los numeros primos obtenidos. Intentar evitar que se almacenen números primos repetidos. Al acabar su ejecución se debe mostrar el resultado acumulado en el vector de primos. Buscar la estrategia más óptima.

No es complicado, de hecho, es fácil pero aunque me redunde me resulta un hecho paradójico lo siguiente:

1º Creo un nuevo proyecto en el Eclipse y una nueva clase llamada Ejer2A.
2º Antes de agregar el método main pienso lo que necesito;

a) Variables globales para el número de números primos a buscar (nPrimos).
b) Vector que almacenará los números primos (primos[]).
c) Contador que recorrerá los números que sean necesarios (contador).
d) El número primo Actual (primoActual).
e) El índice del vector (indiceVector).

3º Como sabemos para usar los hilos (Threads) necesitamos extender la clase que hemos creado a la clase Thread. public class Ejer2A extends Thread
4º Realizo una sobrecarga del método run para que haga lo que yo quiero, que en este caso será llamar otro método en synchronized para que los 4 hilos no choquen.
5º Ahora si, escribo el método main...

Código:


Todo es fácil y bonito, esto me da el siguiente resultado con un i5 a 2,8Ghz y 4GB de RAM.



Ahora, dentro del método primos existe un for que comprueba si el siguiente valor es primo recorriendo todos los números hasta el valor actual y comprobando si su resto es 0 y además un for que recorre el vector de números primos y comprueba que no coincida ninguno con el valor actual:
for(int i=2;i<contador;i++)if(contador%i==0)primo=false;
for(int n:primos) if(n==primoActual) repetidos=true;
Cual es el problema, que si se repite en la segunda posición y hay cuatro, aunque me asigne el booleano a true el for va a seguir, por lo que es tiempo perdido, del mismo modo ocurre al comprobar si es primo o no. Si añado un break en estos for ocurre lo siguiente:
for(int i=2;i<contador;i++){ if(contador%i==0){ primo=false; break; } }
for(int n:primos){ if(n==primoActual){ repetidos=true; break; } }
Se ve a simple vista, se que es una mala práctica añadir un break dentro de un for, pero en este caso existe una excepción...
Si me animo lo haré con un Iterator y el método hasNext() aunque me da a mi que al construir un nuevo objeto voy a ralentizar aun más el procesamiento.



domingo, 30 de marzo de 2014

Imagenio en cualquier dispositivo (I) - Como funciona Imagenio

No hace mucho me propuse ver el servicio de Imagenio que tengo contratado con Telefónica a través de internet, desde mi movil, tablet, portátil u ordenador que me tope.

Me parece un poco lamentable que Telefónica ofrezca un servicio tan pésimo como es el de Movistar Go, que quizás estén en fase beta o quizás no, tampoco detallan nada, lo único que te ofrecen es una lista muy limitada de canales, cuando competidores directos como Ono o Yomvi(Digital Plus) ofrecen toda la lista de canales para ver online.
Esto no podía quedar así...

Primero me informé del funcionamiento de Imagenio:
El tráfico televisivo que viaja hasta nuestro hogar se establece mediante el protocolo IPTV/UDP multicast, telefónica reenvía el trafico a sus socios inscritos y entre el router y el decodificador que te instalan los técnicos se hace la magia.
Lo primero que va a suceder al inscribirse a Imagenio es la segmentación de la red de tu hogar, apareciendo otra subred distinta a la ya conocida (192.168.1.0/24), seguramente que sea una (10.XXX.XXX.XXX/29) por lo que nos da una flexibilidad de 6 host/decos. Esto lo podéis comprobar en la zona de LANS de vuestro router o viendo que IP tiene asignado nuestro deco actual.

(La futura técnica que usaremos no hará falta, ya que conseguiremos visualizar los canales por la primera subred, si si la de la 192.168.1.0/24, vamos la de siempre).

Sabiendo esta teoría os diréis, pos ya está, me configuro una IP 10.XXX.XXX.XXX/29 en mi ordenador y podré ver los canales con algún reproductor como VLC, estarías en lo cierto podrás ver los canales, de hecho en la siguiente entrada realizaré este paso, pero el problema llega cuando intentas reproducir este tráfico UDP multicast a través de una VPN, incluso da problemas por wifi...
Todo esto lo comentaré en la siguiente parrafada, de momento lo dejo aquí que no es poco, ya que es de vital importancia conocer la base teórica de lo que estamos trabajando para entenderlo y llegar a procesar una solución viable, que gracias a internet hoy en día es muy fácil.

Imagenio en cualquier dispositivo (I) - Como funciona Imagenio
Imagenio en cualquier dispositivo (II) - Tráfico multicast a unicast

viernes, 21 de marzo de 2014

Automatización objetos ADDS con Powershell

No hace mucho me propusieron la realización de un script en powershell con la finalidad de automatizar la agregación de objetos en un ADDS. 


El siguiente Script es capaz de añadir usuarios, grupos y unidades organizativa a través de un fichero CSV. 
Lo primero a tener en cuenta es el fichero CSV, ya que el script recogerá la información según dicha información. 

Como Administrador de sistemas cabe decir que el tiempo que puedes llegar a ahorrarte es de una magnitud considerable. Y bajo entornos empresariales windowseros puede ser una solución muy rentable.



El formato sobre el que se ha generado el script es el siguiente:
usuario,password,grupo,UO
pepe,awgewh34,grupo1,UO1
maria,q34shrjn45y,grupo2,UO2
antonio,203948ytpqoireh, grupo1,UO1

Se puede observar que usuario,password,grupo,UO son las cabeceras las cuales invocaremos y extraeremos la información por cada fila que leamos.

El script es el siguiente:




Poniendo esto como ejemplo se podría re-adaptar el código para gustos y necesidades, no es muy complicado de entender aunque no tengas experiencia en powershell.

jueves, 13 de marzo de 2014

Cambiar el destino de las carpetas de Usuarios

Generalmente empleo esta técnica para las máquinas que añado un SSD, siendo este la partición activa donde se alojará Windows. Básicamente tocaré un par de registros para dejar la carpeta Users en otra unidad de almacenamiento.

Los pasos a seguir son los siguientes:

1) Acceder al sistema como administrador

2) Ejecutamos el registro escribiendo en inicio ‘regedit’ o en ejecutar (con la combinación de teclas win+r) escribir ‘regedit’

- Aquí pueden haber dos opciones, que el usuario ya esté creado y que su carpeta se encuentre por defecto en C:\Users o que tengamos que crear el usuario.

3.1) El usuario ya está en el equipo:
En este caso iremos a
HKLM / SOFTWARE / Microsoft / Windows NT / CurrentVersion / ProfileList
y cambiaremos el valor de ProfilesDirectory por X:\Users (donde X es la unidad donde queremos que se guarden los perfiles)

Como podemos ver dentro de ProfileList hay una serie de claves, si vamos inspeccionando encontraremos a la que corresponde a nuestro usuario.



Deberemos cambiar el valor de ProfileImagePath por la nueva ruta de destino. X:\Users\david.grau.

Ya podemos cerrar el regedit, pero antes de cerrar sesión es de vital importancia copiar la carpeta entera de la ruta por defecto es decir ; C:\Users\david.grau a la nueva ruta X:\Users\
Reiniciamos la sesión, y ya podremos observar que las carpetas de destino por ejemplo de mis documentos apunta hacia la nueva ruta X:\Users\david.grau


3.2) Si el usuario aún no existe solo deberemos hacer el primer paso del caso 3.1

HKLM / SOFTWARE / Microsoft / Windows NT / CurrentVersion / ProfileList
y cambiaremos el valor de ProfilesDirectory por X:\Users (donde X es la unidad donde queremos que se guarden los perfiles)


Al crear el nuevo usuario ya se almacenará en la nueva ruta.

martes, 4 de marzo de 2014

Mejorar interfaz web móvil de VLC

VLC es uno de los mejores, por no decir el mejor reproductor de ficheros multimedia.
Una de sus múltiples opciones consiste en crear una interfaz de control mediante el navegador web, opción que uso a diario sobretodo para cambiar los canales de imagenio. Bien, pues yo me pregunto, ya que uno se molesta en definir una interfaz para los móviles, ¿porqué quitar la función más poderosa de esta herramienta? si accedes desde el móvil a la interfaz web de VLC nos redirige automáticamente a http://localhost:8080/mobile.html donde han quitado nuestra preciada lista de reproducción.

Para usuarios como yo que estén cambiando los canales desde la cama, nos putea, sí, puedo forzar el user-agent o evitar el re-direccionamiento, pero sigue viéndose mal  con la interfaz normal.
La solución que voy a ofrecer ahora establece la lista de canales en la interfaz móvil y no solo eso, sino que la lista de reproducción no se ha de desplegar por lo que está el contenido al toque de dedo.

Para aplicar la solución descargar: https://drive.google.com/file/d/0ByXmeCNI4zujbWcxNVBLZ1N5eDA/edit?usp=sharing
y descomprimir en la carpeta de VLC->lua-http y reemplazar los ficheros.

Normalmente la ruta está en:
C:\Program Files (x86)\VideoLAN\VLC\lua\http
Y en sistemas de 32 bits
C:\Program Files\VideoLAN\VLC\lua\http 

ATENCIÓN: Yo no uso la interfaz web "normal", solamente accedo desde el móvil y por esto me resulta útil, pero aviso que al tocar estilos globales la interfaz web "normal" se descuadra.





martes, 25 de febrero de 2014

Alta disponibilidad con VMWare ESXi (II)

Siguiendo la entrada Alta disponibilidad con VMWare ESXi (I) , lo único que queda por ver es el script usado en el servidor de redundante.

El script es muy parecido aunque su principal diferencia es que debe estar en SIEMPRE en ejecución.


Cada 10 segundos pasará por el do comprobando primero la ley 3 que se explicó en  Alta disponibilidad con VMWare ESXi (I) , y acto seguido la ley 4.

Se han de evitar posibles problemas como; conflicto de IPs entre las interfaces y el tiempo de respuesta entre que cae un servidor y se levanta el otro.

El número de intentos en ambos casos indica la cantidad de veces que va a intentar conectar o desconectar las interfaces, ya que podría darse el caso de haber un fallo de red y no de sistema o hardware del servidor.

Como he dicho antes este script se debe ejecutar siempre, así que además de configurar el script al iniciar el sistema, como en el caso del servidor1 si observamos el script, siempre estará dentro del do no dejando que la función muera..



Podemos ver desde el administrador de tareas como el proceso wscript nunca desaparece.


lunes, 17 de febrero de 2014

Alta disponibilidad con VMWare ESXi (I)

El paquete Free VMware vSphere Hypervisor: https://my.vmware.com/web/vmware/evalcenter?p=free-esxi5&lp=default es una versión gratuita de VMware ESXi, no se puede gestionar por un vCenter pero será suficiente para realizar la prueba.

Mi escenario es el siguiente:

Dos controladores de dominio que actúan juntos, estos hacen de servidor de archivos configurados con DFS. La intención es dejar el servidor de archivos accesible bajo cualquier circunstancia.
Para crear este proceso de HA "chapucero" necesito dos interfaces de red en cada controlador de dominio, digamos interfaz1 e interfaz2.

Las leyes son las siguientes:
1- La intetrfaz2 de ambos servidores está desconectada al inicio.
2- Si el controlador de dominio principal responde bajo la dirección de la interfaz1 se habilitará la interfaz2 del servidor1.
3- Si el controlador de dominio principal no responde bajo la dirección de la interfaz1 se habilitará la interfaz2 del servidor2.
4- Si el controlador de dominio principal responde bajo la dirección de la interfaz1 y responde el servidor2 bajo la interfaz2 se des-habilitará la interfaz2 del servidor2.


El controlador de dominio principal, servidor1, necesitará de un script al encender por primera vez tras un reinicio, apagado o caída. Este script comprobará la ley 4. Una vez realizada la acción el script puede morir.

¿Qué necesitaremos para crear el script?
-Función para realizar un ping.
-VMware Tools en nuestros servidores virtualizados.





viernes, 14 de febrero de 2014

Detectar si un dominio tiene registros MX con Powershell

Para inaugurar este pequeño rincón y empezar a añadir herramientas a la movida, que mejor forma de hacerlo que con Powershell.

Ámbito de la aplicación: Administrativo
Uso personal de la aplicación: Yo personalmente uso la siguiente técnica para lidiar con tareas administrativas. Por ejemplo, cada cierto tiempo se me remite un listado en Excel con varias columnas, una de ellas corresponde a "Emails", puede haber uno o más siendo estos separados por comas. Bien, con la función que os voy a enseñar compruebo los dominios de los correos para evitar rebotes de nuestro servidor de correos.


Para empezar con la explicación, remarco que aquí solo pondré la función que comprueba los dominios:

Ejecutamos Windows Powershell ISE y al lío.


Lo primero a pensar es si necesitaremos pasar algún parámetro y si tendremos que devolver algún valor. En este caso ambas cuestiones se responden con un sí.
Le pasaremos por parámetro el dominio a comprobar y devolveremos un valor entero para determinar el estado.

El siguiente paso, es averiguar como comprobar si existen registros MX en el DNS del dominio que estamos comprobando. Todos conoceréis nslookup, pues va a ser la reina del baile, ya que es tan sencillo que prácticamente no tendremos que hacer nada.

Sintaxis nslookup para comprobar un registro MX en un dominio:
nslookup -type=mx $dominio 

Para ejecutar comando en powershell lo haremos como nos dicen los manuales con el cmlet Invoke-Expression. Quedaría algo así:

Invoke-Expression -Command "nslookup -type=mx $dominio" 2>$null

He decidido redirigir los mensajes de error a null ya que no queremos que nos molesten pequeños warnings como la respuesta no autoritativa. 

Necesitaremos recorrer la respuesta del nslookup y esto lo haremos encadenando la expresión Invoke-Expression con un foreach-object. Al recorrerlo mediante el parámetro -match comprobaremos si existe la cadena 'mail exchanger', y si es así sumaremos 1 a un contador.

Si el contador es igual o mayor a 1 significa que el dominio ha devuelto como mínimo una cadena que contiene 'mail exchanger' y por lo tanto existe un registro MX en el DNS.

Devolveremos 1 si existe 0 si no existe.
Código completo: