Este espero que sea un blog donde mucha gente que este empezando en el mundo de la programación, encuentre una ayuda.
lunes, 19 de noviembre de 2007
Creación de WebServices IIS + VS205
using System;
using System.Collections;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace webService {
[WebService(Namespace = "http://tempuri.org/Pruebas", Description = "Prueba servicio Web.")]
public class Class1 : System.Web.Services.WebService {
public string HelloWorld() {
return "Hello World";
}
[WebMethod(CacheDuration = 30, Description = "Devuelve una prueba")]
public string GetPrueba() {
return "Esto es una prueba";
}
}
Una vez creada esta dll hay que añadirla al IIS como nueva aplicación.
Para probar el servicio se utilizará el código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Services.Description;
namespace probeWebService {
public partial class Form1 : Form {
public delegate void pruebaDlg(object data);
public pruebaDlg delegado;
public Form1() {
InitializeComponent();
this.delegado = new pruebaDlg(pruebas);
}
[SoapDocumentMethodAttribute("http://tempuri.org/pruebas/Service.asmx/GetPrueba", Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public string getPruebas(string data) {
object results = this.Invoke(delegado, data);
return ((string)(results));
}
public void pruebas(object data) {
Console.WriteLine(data.ToString());
}
private void button1_Click(object sender, EventArgs e) {
getPruebas("probando...");
}
}
}
sábado, 3 de noviembre de 2007
Generador de Objetos. Optimizado para trabajar con dbmanager
Simplemente hay que seleccionar el tipo de origen de datos y pinchar en generar.
A mi, personalmente, me ha quitado mucho trabajo de encima.
Espero que os sirva de algo.
Para descargarlo pinchad aqui
Licencia Creative Commons
miércoles, 4 de julio de 2007
Flash en debian etch con amd64
Pasos a realizar:
1.- Descargar e instalar:
http://ftp.es.debian.org/debian/pool/main/i/ia32-libs-gtk/ia32-libs-gtk_1.0_amd64.deb
2.- Añadir a /etc/apt/sources.list
deb http://getswiftfox.com/builds/debian unstable non-fre
3.- Instalar Swiftfox
aptitude install swiftfox-athlon64
4.- Instalar el plugin de flash de la página oficial de adobe.
Swiftfox es una versión de firefox compilada para 64bit que soporta los plugins de 32bit.
Un Saludo
martes, 26 de junio de 2007
Acceso a base de datos desde .NET y C#
DataTable table = new DataTable();
SqlConnection conexion = new SqlConnection("Cadena de Conexión"));
SqlCommand cmd = new SqlCommand();
cmd.Connection = conexion;
cmd.CommandText = "Select * from table";
conexion.Open;
SqlDataReader reader = Command.ExecuteReader(CommandBehavior.CloseConnection);
table.Load(reader);
jueves, 7 de junio de 2007
Objectos. Falta por comentar
1.- Un proyecto que se conecte a un servidor de BD sea cual sea (por ahora SQL) e indicando una Base de datos y una tabla genere automáticamente el objecto VO y el DAO.
2.- Una clase dbManager que se encarge de realizar todas las operaciones con la base de datos. Voy a intentar hacer tambien un constructor para que el mismo genere los query a ejecutar.
Se que lo que acabo de escribir es algo, más bien muy rollo, pero... espero poder en poco tiempo poner un enlace para que lo probeis. En el trabajo están encantados con él y eso que por ahora está en fase Beta.
Seguiré comentando ...
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
public class clasesVO {
private System.Int32 _id;
public System.Int32 Id{
get { return _id;}
set { _id=value;}
}
private System.String _descripcion;
public System.String Descripcion{
get { return _descripcion;}
set { _descripcion=value;}
}
private System.String _path;
public System.String Path{
get { return _path;}
set { _path=value;}
}
}
public class clasesDAO {
public static string tableName = "clases";
public static object get() {
dbManager.Manager man = new dbManager.Manager(new clasesVO(), tableName, dbManager.sqlOperation.select);
int top = 100;
return man.select(new string[] { }, top);
}
/*
public static object getNombreById(int id) {
dbManager.Manager man = new dbManager.Manager(new clasesVO(), tableName, dbManager.sqlOperation.select);
List
condiciones.Add(new dbManager.dbCondition("id", id, dbManager.typeCondition.igual));
return man.selectWhere(new string[] { "nombre" }, condiciones, 1);
}
*/
public static bool set(clasesVO item) {
dbManager.Manager man;
if (item.Id == 0) {
man = new dbManager.Manager(item, tableName, dbManager.sqlOperation.insert);
return man.insert();
} else {
man = new dbManager.Manager(item, tableName, dbManager.sqlOperation.update);
return man.update();
}
}
public static int setReturn(clasesVO item) {
dbManager.Manager man = new dbManager.Manager(item, tableName, dbManager.sqlOperation.insert);
int lastInsertId = man.insertReturn();
return lastInsertId;
}
public static bool delete(int id){
dbManager.Manager man = new dbManager.Manager(id, tableName, dbManager.sqlOperation.delete);
return man.delete();
}
public static List
List
clasesVO pr = new clasesVO();
PropertyInfo[] prop = pr.GetType().GetProperties();
foreach (System.Data.DataRow row in rows) {
pr = new clasesVO();
foreach (PropertyInfo pi in prop) {
if (pi.CanWrite) {
try {
pi.SetValue(pr, row[pi.Name], null);
} catch (ArgumentException ex) {
Console.WriteLine(ex.Message);
}
}
}
lista.Add(pr);
}
return lista;
}
}
viernes, 11 de mayo de 2007
Un log para toda aplicación.
using System;
using System.IO;
public class Redirect {
public static void Main() {
StreamWriter log_out;
try {
log_out = new StreamWriter("logfile.txt");
}
catch(IOException exc) {
Console.WriteLine(exc.Message + "Cannot open file.");
return ;
}
// Direct standard output to the log file.
Console.SetOut(log_out);
Console.WriteLine("This is the start of the log file.");
for(int i=0; i<10; i++) Console.WriteLine(i);
Console.WriteLine("This is the end of the log file."); log_out.Close();
}
martes, 1 de mayo de 2007
Curriculum Vitae
Nombre: Javier Lema Liñares
Teléfono: 699 28 03 51
Email: javier.lema@gmail.com
Estudios Realizados:
FPI Auxiliar Administrativo. IFP Vimianzo.
FPII Administrativo (Sin terminar). IFP Vimianzo.
FPII Informática de gestión. IFP Fernando Wirtz
Conocimientos de Informática
- Programación Web:
PHP (Dominio de PHP4 y PHP5)
HTML, CSS, XHTML, XML
- Programación Orientada a Objetos POO:
C#, Visual Basic .NET, Delphi, PHP5 y ActionScript 2.0
- Bases de Datos:
MySQL, PostgreSQL, SQL Server, SQL Server 2005, SQLite, Firefir y Oracle
- Programas de Diseño y Retoque Fotogrãfico:
Adobe Photoshop, Macromedia FireFox, Gimp, Corel PhotoPaint,
Macromedia Flash, Macromedia Dreanweaver
- Servidores:
Experiencia demostrable en mantenimiento y configuración y mantenimientos de servidores LAMP (Linux+Apache+MySQL+PHP), Servidores de Correo, FTP, Samba.
Experiencia demostrable en configuración ymantenimiento de servidores linux Samba como controladores de dominios.
Experiencia demostrable en mantenimiento y configuración de servidores Windows (NT4, W2000, WXP)
- Otros:
Montaje, configuración y mantenimiento de redes Windows y Linux.
Amplios conocimientos en Sistemas Operativos Windows y Linux
- Experiencia:
30/01/2001 - 25/05/2003 Autónomo.
Negocio propio. Academia de Informática, tienda y mantenimientos a empresas.
01/06/2003 - 30/09/2003 Grupo Base2000.
Programador PHP y mantenimiento de servidor linux.
01/10/2003 - 30/12/2003 Bicolan ETT.
Peón en cadena de producción de puertas Tren.
01/02/2004 - 31/07/2006 Comintper.
Desarrollo de los sitios web de la empresa, mantenimiento de servidores, creació de aplicaciones de escritorio.
Desarrollo de Intper.es y homecomunity (aplicación web y aplicación windows.)
01/08/2006 - 31/09/2006 Efenet.
Desarrollo de aplicaciones de escritorio con Visual Studio .NET (c#, VB.NET, ASP.NET).
01/10/2006 - 26/10/2007. MNMProgram
Diseño, desarrollo e implementación de aplicaciones Windows echas con Visual Studio 2005 en c#.
Desarrollo de aplicaciones en Delphi.
Responsable de varios proyectos en C# con grupo de trabajo a mi cargo.
Desarrollo de, entre otros, www.plandocumental.com
01/11/2007 - Actualidad. Alcatraz Solutions
Actualización de programas a .NET
Idiomas
Español
Gallego
Inglés. Inglés técnico a nivel alto
Lector de Archivos .INI
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace touzasClass
{
public static class config{
public static string ruta = System.Windows.Forms.Application.StartupPath + @"\config.ini";
public static IniFile ini = new IniFile(ruta);
public static string getKeyValue(string section, string key){
string tmp = String.Empty;
tmp = ini.IniReadValue(section, key);
return tmp;
}
}
public class IniFile {
public string path;
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key,string val,string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key,string def, StringBuilder retVal, int size,string filePath);
public IniFile(string INIPath) {
path = INIPath;
}
public void IniWriteValue(string Section,string Key,string Value) {
WritePrivateProfileString(Section,Key,Value,this.path);
}
public string IniReadValue(string Section,string Key) {
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp, 255, this.path);
return temp.ToString();
}
}
}
=============================================================================
=========================== SAMPLE ============================================
=============================================================================
string server = string.empty;
server = config.getKeyValue("Configuracion", "SERVIDOR")
--- RESULT ---
server = "localhost"
=============================================================================
==================== ARCHIVO config.ini ============================================
=============================================================================
[Configuracion]
SERVIDOR = localhost
DATABASE = dbPruebas
USUARIO = userdb
CLAVE = pwd
---------------------------------------
P.D. Ya sé que actualmente se utilizan archivos .xml en lugar de archivos .ini pero en la empresa actual como en alguna de las que
trabajado los siguen usando. Pos si acaso a alguien le puede servir...
En esta página voy a intentar recoger mis experiencias como programador, analista, diseñador,... y demás trabajos que van surgiendo en la vida de un informático.
Aún no hace mucho estuve trabajando con Delphi, modificando un programa ya hecho. No se lo recomiendo a nadie sobre todo si tienes experiencia en programación orientada a objetos, que si, que ya sé que delphi tiene orientación a objectos pero... en un programa donde una unit (trozo) tiene unas 8.000 líneas de código, como comprenderéis no voy a ser yo quien modifique todo eso, simplemente lo estoy parcheando para que no de los errores que está dando.
Como actualmente me encuentro desarrollando con c#, y como todos los que trabajamos en este mundo sabemos, ahi cosas que no deberían ser así pero, por lo menos a a mí me pasan constantemente, voy a contar una pequeña anécdota.
Hay que hacer un trabajo, dicho trabajo lo estimas en que te puede llevar 20 días hacerlo. Una vez empiezas con el diseño de base de datos, diseño de clases, objetos,... y te pones manos a la obra picando código, va el superior de turno y...
- bueno,... esto podría ser así en lugar de asao,
- bueno... esto de aquí, que antes te dijimos que no, ahora si,.. etc,...
Estas situaciones se repiten constantemente, por lo menos en todas las empresas por las que he pasado. A todos los responsables de empresas de software que puedan leer esto: "Debeis pensar que si decimos que nos lleva un 70% del tiempo el diseño en papel y un 30% el teclear código por algo será. Si lo hacemos al revés y luego los mantenimientos, modificaciones,... se disparan en cuanto a tiempo de realización ya sabeis por que es".
Ahora me han hecho responsable de un proyecto, yo he aceptado como no, y voy a intentar hacer algo que los muchos programadores, analistas que han pasado por mí trabajo no han hecho. Hacer las cosas en un orden lógico, para mí este orden lógico es:
- Pensar que quiero hacer
- Pensar que necesito para hacerlo
- Diseñar en papel la BD que me haga falta
- Diseñar en papel las clases que me hagan falta
- Hacer un diagrama de casos de uso
- Picar código.
Creo que me he saltado algún paso pero... más o menos.
Bueno, y cambiando de tema, voy a intentar recoger scripts, programas, enlaces que me han sido útiles en estos años. No sé quizás nadie los use, pero cuando a mí me hicieron falta, me costo mucho encontrarlos, sobretodo si tienes un tiempo muy limitado para hacer un proyecto a nivel nacional.
Estoy abierto a todo tipo de sugerencias, quejas (estas menos), y todo lo que deseeis.
lunes, 30 de abril de 2007
Crear y restaurar copias de seguridad en C# con SQLExpress 2005.
Como comenzar. Bueno... en estos días he tenido que realizar un proyecto para realizar copias de seguridad de unas bases de datos, con lo que implica tambén crear un sistema de restauración.
En SQLServer existen unos objectos llamados jobs con los que podemos "decirle" a SQL que realice unas copias de seguridad, pero... en SQLExpress 2005 esta opción no existe.
Librerias a usar Estas librerias se incluyen en referencias del proyecto en .NET:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
Backup Database
private Server GetServer() {
ServerConnection conn =
new ServerConnection("Serer", "user", "pass");
Server myServer = new Server(conn);
return myServer;
}
public void backupDB(object data) {
backupItem item = (backupItem)data;
if (changeDBEnv != null)
changeDBEnv(item.DbName, EventArgs.Empty);
Console.WriteLine("Backup the {0} database!", item.DbName);
Server myServer = GetServer();
Backup backup = new Backup();
backup.Action = BackupActionType.Database;
backup.Database = item.DbName;
item.BackupPath =
System.IO.Path.Combine(item.BackupPath, item.DbName + ".bak");
backup.Devices.Add(new BackupDeviceItem(item.BackupPath, DeviceType.File));
backup.Initialize = true;
backup.Checksum = true;
backup.ContinueAfterError = true;
backup.Incremental = false;
backup.LogTruncation = BackupTruncateLogType.Truncate;
backup.PercentComplete +=
new PercentCompleteEventHandler(backup_PercentComplete);
backup.Complete +=
new ServerMessageEventHandler(backup_Complete);
backup.SqlBackup(myServer);
}
Restore Database
public void RestoreDB(string file, string db) {
try {
Console.WriteLine("Restore the {0} database!", db);
if (changeDBEnv != null)
changeDBEnv(db, EventArgs.Empty);
Server myServer = GetServer();
Restore restore = new Restore();
restore.Action = RestoreActionType.Database;
restore.Database = db;
Database currentDb = myServer.Databases[db];
if (currentDb != null)
myServer.KillAllProcesses(db);
restore.Devices.AddDevice(file, DeviceType.File);
restore.ReplaceDatabase = true;
restore.PercentCompleteNotification = 10;
restore.PercentComplete +=
new PercentCompleteEventHandler(restore_PercentComplete);
restore.Complete +=
new ServerMessageEventHandler(restore_Complete);
Console.WriteLine("Restoring:{0}" + db);
restore.SqlRestore(myServer);
currentDb = myServer.Databases[db];
currentDb.SetOnline();
} catch(System.Data.SqlClient.SqlException e) {
log.WriteToLogAndConsole(e.Message);
}
}
Este código no funciona tal cual ya que faltan una serie de eventos que yo tenía. Simplemente hay que quitar lo que esta después de += incluidos estos y generarlos de nuevo.
Threading secuencial.
En estos días tuve un ligerillo problema con una aplicación que requeria una secuencia de acciones ejecutadas de forma secuencial pero en threads distintos. Aquí dejo un ejemplo que me hice y que me ayudo mucho:
using System;
using System.Threading;
using System.Collections.Generic;
namespace WindowsApplication1 {
class secuencialThread {
[STAThread]
static void Main(string[] args) {
threadSleep t = new threadSleep();
t.init();
}
}
public class threadSleep {
public Object esperaThread = "Que te esperes ...";
public Mutex firstMutex = new Mutex(false);
private DictionarylistadoThreads = new Dictionary ();
public void init() {
this.listadoThreads.Add("Thread0", new Thread(new ParameterizedThreadStart(initThead)));
this.listadoThreads.Add("Thread1", new Thread(new ParameterizedThreadStart(initThead)));
this.listadoThreads.Add("Thread2", new Thread(new ParameterizedThreadStart(initThead)));
this.listadoThreads.Add("Thread3", new Thread(new ParameterizedThreadStart(initThead)));
this.listadoThreads.Add("Thread4", new Thread(new ParameterizedThreadStart(initThead)));
foreach (KeyValuePairitem in this.listadoThreads) {
item.Value.Start(item.Key);
}
}
private void initThead(object data) {
lock (esperaThread) {
firstMutex.WaitOne();
Console.WriteLine("inicio de Thread --> " + (string)data);
for (int i = 0; i <= 5; i++) {
Console.WriteLine((string)data);
}
firstMutex.ReleaseMutex();
Console.WriteLine("Fin de Thread --> " + (string)data);
if ((string)data == "Thread4") {
Console.WriteLine("Fin de Threads" );
}
}
}
}
}
Esto produce como resultado:
inicio de thread Thread0 1,2,3,4,5 Fin de thread Thread0
inicio de thread Thread1 1,2,3,4,5 Fin de thread Thread1
inicio de thread Thread2 1,2,3,4,5 Fin de thread Thread2
inicio de thread Thread3 1,2,3,4,5 Fin de thread Thread3
inicio de thread Thread4 1,2,3,4,5 Fin de thread Thread4
Fin de Threads