Sunday, 27 December 2009

Downloading videos from youtube

Watching the great videos of Delphi 2010, I was wondering "How could I get the videos from there easily?" The answer came to me very fast as I remembered the KeepVid web page. This web allows you to download the video that you want from youtube. it's easy to use, you only have to paste the link of the video, enter the name that appears in the CAPTCHA and presto!, your video will be downloaded in seconds.

Enjoy it!

Tuesday, 22 December 2009

Stretching an image

Muchas aplicaciones disponen de una pequeña previsualización de sus documentos, de ésta manera echando un vistazo a su preview o thumbnail nos podemos hacer una idea de que documento o proyecto hay dentro de ese fichero. El problema me vino a la mente cuando trabajando en mi proyecto (VLO) me di cuenta de que había hecho más de 20 proyectos y ya ni me acordaba que había en cada uno de ellos, y claro la única solución es abrir cada uno de los documentos hasta encontrar el proyecto que querías abrir.

La solución que propongo aún está muy verde pero es una solución que de momento va bien y que permite obtener la imagen del documento que se está editando sobre el canvas, recortar la parte útil y redimensionarla para que luego podamos mostrarla en el preview de la carga de proyectos.

Monday, 21 December 2009

Meditation and Learning

Hoy os dejo la continuación del anterior capítulo de redes - Educationg world citizens dor the 21st Century -. En éste interesante reportaje veremos lo importante que es el desarrollo social y emocional para poder moldear mejor tu cerebro. Como yogi, he podido comprobar de primera mano las mejoras en salud mental al practicar la meditación y sobretodo mejorar la capacidad de atención y de toma de decisiones. Si consultáis el libro de Andy Hunt sobre el "Pensamiento y aprendizaje pragmático" del cuál os llevo hablando muchos meses, en uno de los últimos capítulos aparece una pequeña entrada hacia el mundo contemplativo y la utilización de la meditación para el entreno de tu mente.






New features with VLO framework part V

Aún estoy retocando diversas características de la plataforma y me queda mucho trabajo por delante. Pero lo bueno es que el proyecto sigue en pie, con muchísimos cambios insignificantes a simple vista, pero que marcan una gran diferencia en el comportamiento final. He actualizado temas de movimiento y conexionado de nodos, de ésta manera podemos realizar ediciones mucho más rápidas y más precisas. Además estoy empezando a llevar el sistema al límite, realizando pruebas unitarias sobre las diversas clases que tengo (os recomiendo el Pragmatic unit testing donde se muestran muchas de las técnicas utilizadas sobre las pruebas unitarias) y sobrecargando los diversos objetos intentando que el sistema se vuelva inestable.

De momento las pruebas son satisfactorias y la aplicación parece robusta. Aquí os dejo las nuevas funcionalidades de la plataforma:
  • Mejora en el conexionado entre nodos (corrección del cursor)
  • Posibilidad de incrustar una imagen en el background de la aplicación
Por ejemplo ahora en minutos podemos crear increíbles diagramas de todo tipo y lo mejor de todo es que luego podremos personalizar el funcionamiento de los objetos para propósito general. El siguiente ejemplo es una muestra a un vistazo a un enrutamiento de red:

Ésta imagen dispone de más de 200 nodos y 230 vértices y el movimiento y los cálculos siguen siendo muy rápidos.

Además al poder cargar una imagen de fondo, podemos dibujar diagramas sobre planos y así luego diseñar diversos algoritmos para la búsqueda de caminos mínimos o rutas:

También os dejo el último vídeo que ha subido mostrando las últimas características implementadas y que espero que os sorprendan y os gusten:





Aquí os dejo también el enlace al último built que he hecho de la plataforma en Win32 para que so la podáis descargar y probar. Los ejemplos con las imágenes también los podréis encontrar aquí.


Friday, 18 December 2009

Adding more features to the Blog

El blog aún no está al 100% y me falta arreglar un par de cosas. He añadido unos botones más interesantes en el panel de la derecha desde donde podéis contactar conmigo desde diferentes frentes (twitter, linkedIn, etc).
Desde bloggerStop he encontrado un artículo muy interesante de cómo integrar esos botones en el blog y hacer un pequeño efecto de opacidad al pasar el mouse por encima.





















Además podemos crear diferentes tipos de botones ya que por la red corren muchísimas aplicaciones online que permiten personalizar todos éstos enlaces.

He añadido también el componente de traducción de google que faltaba, y el también famoso RevolverMaps que integra una mini aplicación que te permite ver de dónde son los diferentes lectores. Funciona igual que ClusterMaps pero me gusta bastante más por su interfaz gráfica.


  • Enlaces de interés:
Adding social networking buttons.
Opacity image hover effect.

Thursday, 17 December 2009

Paper?, that's and old story

Durante las últimas semanas he estado mirando diferentes modelos de libros electrónicos y después de largas comparaciones entre modelos, por fin! ya tengo mi Sony eReader PRS-505. Éste modelo (no táctil) es uno de los mejores situados en las comparaciones por su calidad y precio. Los que me seguís en el blog sabéis que soy un lector asiduo y hacía tiempo que me quería mirar uno de éstos lectores ya que en la última conferencia que fui vi que la gente los utilizaba bastante. Además de ser increíblemente útil, te permite poder llevar encima todos los libros que quieras. Dispone de una memoria base de unos 200 Mb y luego podemos ir añadiendo memorias SD. Ya casi tengo el dispositivo listo, con todos mis libros en formato electrónico, audio libros, imágenes, etc.

La pantalla me sorprendió ya que su lectura no cansa los ojos y la navegación es rápida. Si que a veces hay que tener un poco de paciencia con el dispositivo pero después de trastearlo bastante no se ha colgado ni una vez (y eso que he visto que en la parte posterior tiene la típica pestaña de reset).

Aquí os dejo un vídeo de youtube que me parece interesante para mostraros las diferentes características del lector:




Como comento en el título del post, con éstos dispositivos evitaremos el ir con los libros encima todo el tiempo. Ésto representa un cambio importante, ya que perdemos el cálido contacto de las hojas de papel, el olor, la textura, etc. por una máquina fría con una autonomía de más de 9000 páginas leídas antes de volver a recargar, con reproductor MP3, con visor de imágenes y muchas cosas más que puede nos haga leer más o puede que nos vuelva a llevar otra vez hacia el viejo papel. Quien sabe, depende de nuestra adaptación al medio.

Tuesday, 15 December 2009

New Image!

Como podréis ver, la imagen del Blog ha cambiado. Llevo días trabajando en ésto (gracias a btemplates donde podemos encontrar gran variedad de templates gratuitas para poner en nuestros blogs) y puede que me haya dejado algún enlace por traspasar. Si notáis que hay algún blog que no aparece en el blogroll, avisarme y lo añadiré.

Además aprovecho para comentar que estoy muy contento con el rumbo que tiene el blog. De momento he recibido bastantes visitas y de muchas partes del mundo!.

Para el año que viene estoy preparando diferentes cambios, y uno de ellos es empezar a publicar en inglés. He notado que no tengo mucho público y quería ampliar horizontes, además me irá bien para ir practicando el idioma.

No dudéis en dejar un comentario para saber vuestra opinión!.

Monday, 14 December 2009

Educating world citizens for the 21st Century

No puedo dejar pasar éste fantástico documental de redes donde aparecen extractos de la última conferencia celebrada en Washington D.C sobre "Educando ciudadanos del mundo para el siglo 21". En la web www.educatingworldcitizens.org podréis encontrar mucha más información sobre el evento tan importante que se celebró en octubre.





source:

http://www.redesparalaciencia.com/1784/redes/2009/redes-49-educar-para-fabricar-ciudadanos

Friday, 11 December 2009

Blogger Backup

Hace poco leí un post de Jose manuel beas en se hace camino al andar, donde hace poco google le robó el blog (por un error en un falso positivo en los robots de búsqueda). Y esperando que eso no me pase nunca a mí, he decidido hacer un backup de mi blog.

Buscando por la red, he encontrado diversas opciones e incluso blogger ofrece una exportación del contenido desde el escritorio. Pero al final me he decidido por la aplicación Blogger Backup de codeplex.com, una herramienta sencilla y gratuita que permite conectarte a tu blog y descargarse el contenido vía fed y guardar los artículos en formato XML.


De ésta manera podemos recuperar nuestros artículos si es que algún día nos pasa algo parecido y no podemos acceder a nuestro contenido o nos tenemos que mover a otro blog.


  • Enlaces de interés:
Se hace camino al andar.
Easy restoration.
Simple way to backup a content.

Wednesday, 9 December 2009

Force Directed Graphs part II

Aquí os dejo un enlace muy interesante sobre un motor creado en javascript que permite ordenar los diagramas utilizando Force-Directed. El trabajo realizado por Kyle Scholz es increíble. Mucha gente está utilizando su algoritmo para crear diversas estructuras dinámicas vía Web.

La utilización de su motor es bastante sencillo y con solo importar sus librerías ya podemos empezar a crear los diagramas a través de código javascript.

En el siguiente enlace podemos encontrar la información necesaria para crear los diagramas. Además os dejo un enlace para que podáis ver un ejemplo online.

Os recomiendo mirar su proyecto WordNet que implementa su motor Force-Directed. No tiene desperdicio:


Processing 1.0

Continuando con el tema del día, he encontrado una aplicación muy interesante para el procesado de imágenes. Ésta aplicación Open Source llamada Processing 1.0 permite a través de código similar al java crear diversas aplicaciones donde la parte gráfica ya está implementada y solo nos tenemos que preocupar del código. Creo que es bastante interesante para estudios científicos ya que permite a la persona que está al otro lado centrarse en la parte importante del algoritmo sin tener que preocuparse de los diferentes eventos que pueden aparecer en una aplicación gráfica. Aunque la aplicación pesa unos 70 Mb (la versión para windows), dispone de muchos ejemplos y documentación para empezar a generar diagramas y tratar imágenes fácilmente.

Además el IDE es bastante amigable con una codificación como la de java y un código exportable.

En la misma web del autor (Ben Fry y Casey Reas) encontraremos mucha información sobre éste lenguaje de programación para un contexto visual.

Force Directed Graphs part I

En ésta entrada os dejo unos vídeos interesantes mostrando el resultado de aplicar un algoritmo Force-Directed sobre un grafo.











Cómo podéis ver, aplicando éstos algoritmos podemos hacer que nuestros diagramas queden posicionados de tal manera que son más inteligibles.

  • Enlaces de interés:
Complexity management in visualizating protein interaction networks.

DOT Language

Investigando un poco por la red (haciendo trabajo de campo) he encontrado varias librerías relacionadas con el tema de grafos. Ya que estoy desarrollando una herramienta que generará grafos (dirigidos - no dirigidos) y que además implementará un algoritmo para la búsqueda de caminos, pues no está nada mal lo que ya hay por la red y que me resulta tan interesante. Ahora que ya tengo bastante avanzado el proyecto VLO (a ver si en un par de semanas lo avanzo un poco más y os muestro en lo que he estado trabajando recientemente) ahora estoy intentando reordenar los grafos aplicando algoritmos de dibujado Force-Directed. Éstos permiten posicionar los nodos de una manera más elegante asignado propiedades físicas a cada uno de éstos.

Utilizando éstos Algoritmos llamados Force-based o Force-Directed podremos generar diagramas tan espectaculares como los siguientes:



Éstos diagramas los he sacado de aiSee graph Visualization, donde podemos encontrar muchos ejemplos sobre diferentes diagramas.

Como indica el título del artículo, aquí os comentaré un poco el lenguaje DOT. Éste lenguaje es del tipo plano donde aplicando un pequeño trozo de código, podemos llegar a crear diagramas sin tener que preocuparnos de su dibujado.

Por ejemplo el siguiente script:


digraph if {
graph [rankdir=LR];
node [label="\N"];
graph [bb="0,0,218,108"];
{
graph [rank=same,
bb=""];
b [pos="119,18", width="0.75", height="0.5"];
c [pos="119,90", width="0.75", height="0.5"];
}
a [pos="27,18", width="0.75", height="0.5"];
a -> b [pos="e,91.77,18 54.105,18 62.732,18 72.431,18 81.65,18"];
c -> b [label="long long long", pos="s,119,71.831 119,36.413 119,44.059 119,53.108 119,61.573", lp="168.5,54"];
}


crea el siguiente grafo en un servicio online utilizando el lenguaje DOT.

Es bastante interesante ya que podemos tener herramientas que generen éstos pequeños scripts y luego instalar un servicio de renderizado de grafos y ver el resultado en una imagen.

Podemos encontrar librerías para diferentes SO que utilizan éste lenguaje. Una de éstas es Graphviz (Graphic visualization Software) un paquete Open Source que contiene una serie de librerías para la visualización y generación de grafos. He encontrado varias aplicaciones por la red que utilizan ésta librería y quería indagar un poco más sobre éste tema.

En la web de Graphviz podréis encontrar la última versión estable del paquete e incluso el código fuente para ver los diferentes algoritmos que utilizan.

Si miramos en la galería de imágenes podemos encontrar grafos con una estética muy buena:

Además recomiendo la lectura de los diferentes documentos de ayuda que contienen referéncias muy buenas a diferente bibliografía relacionada con el tema de los grafos. Uno de los libros que yo recomiendo es el siguiente:
Thomas M. J. Fruchterman and Edward M. Reingold. Graph Drawing by Force- directed Placement. Software– Practice and Experience, 21(11):1129–1164, November 1991
Dentro de la propia arquitectura del Graphviz, podemos encontrar las diferentes aplicaciones que modelan los grafos y los posicionan en función del algoritmo seleccionado. En su caso, dispone de los programas NEATO, TWOPI, CIRCO, FDP, DOTTY y LEFTY. Cada uno de éstos tiene un tipo de posicionamiento diferente, ordenando los diagramas en formas circulares, de redes, etc. Todo para que el dibujo final sea mucho más inteligible.

Además desde la página principal de Graphviz, encontramos WebDot, un servicio web que nos permite generar diagramas utilizando el lenguaje DOT y que nos devuelve el resultado en HTML.

Es increíble el trabajo realizado por todas las personas involucradas en el proyecto, la verdad es que me ha gustado mucho y sobretodo por la información y documentación que hay. Podemos aprender mucho de ellos y sobretodo consultar la bibliografía recomendada para poder introducirnos un poco más sobre la teoría de grafos. También os recomiendo ver el siguiente vídeo que muestra gráficamente como funciona un algoritmo de éste tipo.

Podría hacer el artículo mucho más extenso, pero prefiero dejarlo aquí y si queréis indagar un poco más, os dejo una serie de enlaces de interés muy interesantes desde donde poder continuar con la investigación.

Espero que os hay entretenido la lectura, y espero vuestros comentarios!.

  • Enlaces de interés:
OmniGraffle.
vizierfx a Flex Library for GraphViz rendering.
aiSee graph visualization.
force-directed node interface.
Webdot demo graphs.
DOT Tutorial.
Force directed layouts.
Force directed Algorithm (Spring Algorithm).
aiSee graph gallery.
Visual Complexity.
more Force Directed in google.

Thursday, 3 December 2009

Sharing and Unsharing a folder with Delphi

Navegando por internet no he encontrado una buena unit con toda la información necesaria para compartir y descompartir carpetas utilizando la librería netapi32.dll del SO. Recopilando información de varias webs, he conseguido crear una pequeña librería bastante útil que nos permitirá compartir y descompartir las carpetas que queramos a partir de unas funciones muy sencillas sin tener que manejar las complicadas NetShareAdd y NetShareDel.
A partir de aquí, podremos crear pequeñas aplicaciones para que manipulen los diferentes directorios que queremos compartir. No he probado las funciones para unidades así que no se si funcionaría, pero si que lo hace con las carpetas. Además del conocimiento de las diferentes funciones que dispone netapi32.dll, hay que crear la estructura SHARE_INFO_2 con la que hay que trabajar para poder compartir una carpeta.


unit uNetShare;

interface

uses
SysUtils, Windows;

type
SHARE_INFO_2 = record
shi2_netname: LPWSTR;
shi2_type: DWORD;
shi2_remark: LPWSTR;
shi2_permissions: DWORD;
shi2_max_uses: DWORD;
shi2_current_uses: DWORD;
shi2_path: LPWSTR;
shi2_passwd: LPWSTR;
end;
PSHARE_INFO_2 = ^SHARE_INFO_2;

const
STYPE_DISKTREE = 0;
STYPE_PRINTQ = 1;
STYPE_DEVICE = 2;
STYPE_IPC = 3;
STYPE_DFS = 100;
STYPE_SPECIAL = $80000000;

ACCESS_NONE = 0;
ACCESS_READ = 1;
ACCESS_WRITE = 2;
ACCESS_CREATE = 4;
ACCESS_EXEC = 8;
ACCESS_DELETE = 16;
ACCESS_ATRIB = 32;
ACCESS_PERM = 64;
ACCESS_ALL = (ACCESS_READ + ACCESS_WRITE + ACCESS_CREATE + ACCESS_EXEC + ACCESS_DELETE + ACCESS_ATRIB + ACCESS_PERM);

function UnshareFolder(sName: string): boolean;
procedure ShareFolder(StrName: string);
function getNetName(sFolder: string): string;

implementation

uses
StrUtils;

function NetShareAdd(servername: LPWSTR; level: DWORD; buf: pSHARE_INFO_2; parm_err: LPDWORD): LongWord; stdcall; external 'netapi32.dll';
function NetShareDel(ServerName, ShareName: pwChar; level: DWord): DWord; stdcall; external 'NETAPI32.DLL';

function UnshareFolder(sName: string): boolean;
var
Size: Integer;
rep: LongInt;
NameNT: PWChar;
ret : Boolean;
begin
ret := false;
if DirectoryExists(sName) then
begin
Size := SizeOf(WideChar) * 256;
GetMem(NameNT, Size);
StringToWideChar(getNetName(sName), NameNT, Size);
rep := NetShareDel(nil, NameNT, 0);
if rep = 0 then
ret := True
else
ret := false;
end;
Result := ret;
end;

procedure ShareFolder(StrName: string);
var
buf: Pointer;
UserInf: Share_INFO_2;
err: lpdword;
F: integer;
begin
err := nil;
if DirectoryExists(strName) then
begin
UserInf.shi2_netname := StringToOleStr(getNetName(strName));
UserInf.shi2_type := STYPE_DISKTREE;
UserInf.shi2_remark := '';
UserInf.shi2_permissions := ACCESS_ALL;
//UserInf.shi2_max_uses := -1;
UserInf.shi2_current_uses := 0;
UserInf.shi2_path := StringToOleStr(StrName);
UserInf.shi2_passwd := nil;
GetMem(Buf, sizeof(UserInf));
F := NetSHAREAdd(nil, 2, @UserInf, err);
FreeMem(Buf);
end;
end;

function getNetName(sFolder: string): string;
var
ipos, i: integer;
sTemp: string;
begin
ipos := 0;
for i := 1 to Length(sFolder) do
if sFolder[Length(sFolder)-i] = '\' then
begin
iPos := Length(sFolder)-i;
break;
end;
stemp := AnsiRightStr(sFolder, Length(sFolder) - ipos);
result := sTemp;
end;

end.



La utilización de las funciones es muy simple:


ShareFolder('C:\temp');
UnshareFolder('C:\temp');


Éstos métodos funcionaran en versiones superiores de windows NT, pero no lo he probado en windows Vista, solo en windows Xp.
  • Enlaces y fuentes de interés:
is Folder shared?.
Compartir carpetas en windows.
Network share problem.
Using NetShareDel.
Using NetShareAdd.
Window Share functions.

Manifiesto: En defensa de los derechos fundamentales en Internet

Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…

  1. Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.
  2. La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.
  3. La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.
  4. La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.
  5. Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.
  6. Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.
  7. Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.
  8. Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.
  9. Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.
  10. En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Este manifiesto, elaborado de forma conjunta por varios autores, es de todos y de ninguno. Si quieres sumarte a él, difúndelo por Internet.
  • Enlaces de interés:
El nuevo anteproyecto permitiría cerrar una web por incluir un enlace a otra de P2P
Encuentro digital con David Bravo
Web Economía Sostenible

Tuesday, 1 December 2009

Start or Stop a MSSQLServer service with Delphi

Muchas veces nos encontraremos en diferentes situaciones donde tenemos que controlar los servicios de un equipo. En éste pequeño artículo, he recuperado diversos posts de gente que hizo el trabajo en su día y hago una pequeña adaptación para el ejemplo que quiero mostrar. Los servicios de windows los podemos encontrar en Herramientas administrativas -> Servicios. Desde la propia herramienta del SO podemos iniciar, parar o ver el estado de los servicios que tenemos instalados en nuestro equipo. En varias webs podemos encontrar mucha información referente a los servicios, algunas interesantes con el código desarrollado son por ejemplo:
Los 2 ejemplos disponen de todo el código que he utilizado para los métodos que aquí os pongo. En mi caso lo que yo quiero hacer es parar el servicio de SQLServer de un servidor (con Windows Server). Para ello, debemos parar el servicio SQLSERVERAGENT y luego una vez parado éste, parar el servicio MSSQLSERVER. Para iniciarlo otra vez, debemos hacer el camino opuesto y primero iniciar el MSSQLSERVER y luego el SQLSERVERAGENT.


Aquí os dejo el código fuente utilizando la unit TServiceManager de marc Dürst. Además podemos encontrar información de ésta unit en el siguiente enlace.
  • Iniciar el servicio:


procedure StartSQLServer();
var
i: integer;
begin
//Iniciar un altre cop els serveis
Log('Starting Service MSSQLSERVER');
while ServiceManager2.ServiceStopped do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager2.StartService;
Sleep(defTime);
end;
while not ServiceManager2.ServiceRunning do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager2.ServiceRunning then
begin
Log('Service Started MSSQLSERVER');
Sleep(defTime);
Log('Starting Service SQLSERVERAGENT');
while ServiceManager1.ServiceStopped do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager1.StartService;
Sleep(defTime);
end;
while not ServiceManager1.ServiceRunning do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager1.ServiceRunning then
begin
Log('Service Started SQLSERVERAGENT');
end;
end;
Log('Status Services SQLSERVERAGENT: ' + BoolToStr(ServiceManager1.ServiceRunning) + ' MSSQLSERVER: ' + BoolToStr(ServiceManager2.ServiceRunning));
end;



  • Parar el servicio:


procedure StopSQLServer();
var
status: DWORD;
i: integer;
begin
//Primer hem d'aturar el SQLSERVERAGENT
status := ServiceGetStatus(GetComputerNetName(), 'SQLSERVERAGENT');
Log('Getting status from service SQLSERVERAGENT -> ' + GetTextStatus(status));
ServiceManager1.Connect(PAnsiChar(name));
ServiceManager1.OpenServiceConnection('SQLSERVERAGENT');

status := ServiceGetStatus(GetComputerNetName(), 'MSSQLSERVER');
Log('Getting status from service MSSQLSERVER -> ' + GetTextStatus(status));
ServiceManager2.Connect(PAnsiChar(name));
ServiceManager2.OpenServiceConnection('MSSQLSERVER');

Log('Stopping Service SQLSERVERAGENT');
while ServiceManager1.ServiceRunning do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager1.StopService;
Sleep(defTime);
end;
while not ServiceManager1.ServiceStopped do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager1.ServiceStopped then
begin
Log('Service Stopped SQLSERVERAGENT');
Sleep(defTime);
Log('Stopping Service MSSQLSERVER');
while ServiceManager2.ServiceRunning do
begin
mmolog.Lines.Add('.');
Sleep(defTime);
i := 0;
while i < timeout do
begin
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Inc(i);
Application.ProcessMessages;
end;
ServiceManager2.StopService;
Sleep(defTime);
end;
while not ServiceManager2.ServiceStopped do
begin
mmolog.Lines.Add('.');
mmolog.Lines[mmolog.Lines.count - 1] := mmolog.Lines[mmolog.Lines.count - 1] + '.';
Sleep(defTime);
Application.ProcessMessages;
end;
if ServiceManager2.ServiceStopped then
Log('Service Stopped MSSQLSERVER');
end;
Log('Status Services SQLSERVERAGENT: ' + BoolToStr(ServiceManager1.ServiceStopped) + ' MSSQLSERVER: ' + BoolToStr(ServiceManager2.ServiceStopped));
end;

Para la utilización del TServiceManager además hay que crear los objetos:


uses
ServiceManager, WinSvc;


procedure Destroy();
begin
FreeAndNil(ServiceManager1);
FreeAndNil(ServiceManager2);
FreeAndNil(IniFile);
end;

procedure Create();
begin
ServiceManager1 := TServiceManager.Create();
ServiceManager2 := TServiceManager.Create();
end;

  • Enlaces de interés:
Stop Service MSSQLSERVER.
Get Computer name.