using System; using System.DirectoryServices; using System.DirectoryServices.ActiveDirectory; using System.IO; namespace udaExe { class Program { static void Main(string[] args) { string ldapEntry; string fileName; int cantUsuarios = 0; if (!GetParameters(args, out ldapEntry, out fileName)) { Console.Out.WriteLine("uso: udaExe ldap fichero"); Console.Out.WriteLine("Ejemplo: udaExe \"LDAP://OU=Users,dc=microsoft,dc=local\" \"c:\\usuarios.txt\""); } else { Console.Out.WriteLine("Buscando usuarios:"); using (StreamWriter sw = File.CreateText(fileName)) { try { DirectoryEntry directoryObject = new DirectoryEntry(ldapEntry); foreach (DirectoryEntry child in directoryObject.Children) { string displayName = GetProperty(child, "displayName"); string distinguishedName = GetProperty(child, "distinguishedName"); string samAccountName = GetProperty(child, "samAccountName"); child.Close(); child.Dispose(); sw.WriteLine($"{displayName}#{samAccountName}#{distinguishedName}"); cantUsuarios++; } directoryObject.Close(); directoryObject.Dispose(); } catch (DirectoryServicesCOMException ex) { Console.Error.WriteLine("Error: " + ex.Message.ToString()); } } Console.Out.WriteLine(cantUsuarios.ToString() + " usuarios encontrados, fichero generado: " + fileName); } } public static string GetProperty(DirectoryEntry de, string PropertyName) { if (de.Properties.Contains(PropertyName)) { return de.Properties[PropertyName][0].ToString(); } else { return string.Empty; } } public static bool GetParameters(string[] args, out string ldap, out string fileName) { ldap = String.Empty; fileName = @"c:\users.txt"; if (args.Length < 1) { return false; } ldap = args[0]; if (args.Length >= 2) { fileName = args[1]; } return true; } } }
15/5/17
Lectura de datos de usuario de directorio activo a un fichero.
30/3/17
Disposición típica en HTML con etiquetas semánticas.
https://www.w3.org/TR/css-flexbox-1/
<!DOCTYPE html>
<header>...</header>
<main>
<article>...</article>
<nav>...</nav>
<aside>...</aside>
</main>
<footer>...</footer>
3/2/17
Ordenar tablas de una base de datos para que las referenciadas estén antes de las que referencian
public void OrdenaTablas() {
List listaOrdenada = new List();
while (this.lTable.Count > 0) {//mientras haya elementos
ColocaTablaEnOrden(this.lTable, this.lTable[0], listaOrdenada);
}
foreach (var item in listaOrdenada) {
lTable.Add(item);
}
}
private void ColocaTablaEnOrden(List listaOriginal, CTableM cTableM, List listaOrdenada) {
listaOriginal.Remove(cTableM);
foreach (CRelationM relacion in cTableM.lRelation) {
string NombreTablaConLaQueSeRelaciona = relacion.tableDestination;
CTableM tablaRelacionada = listaOriginal.Find(x => x.Name.Equals(NombreTablaConLaQueSeRelaciona));
if (tablaRelacionada != null) {//Si la tabla relacionada aún está en la lista de tablas a ordenar
//Meter antes en la lista de ordenadas
ColocaTablaEnOrden(listaOriginal, tablaRelacionada, listaOrdenada);
}
}
listaOrdenada.Add(cTableM);
}
14/9/16
Crear servicio en Windows:
Nota final:
Si en las propiedades del Servicio hemos puesto "AutoLog" a true (que viene por defecto) podremos ver con el visor de eventos (ejecutar "eventvwr" en cmd) mensajes del servicio al instalarse, iniciar, parar tanto en la parte de "sistema" como en la de "aplicaciones".
24/8/16
Html y css. Esqueleto página centrada horizontalmente
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
div.clBloqueEncabezado{
background-color: cyan;
text-align: center;
}
div.clEncabezado{
display:inline-block;
background-color:green;
padding:0.5em;
}
div.clCuerpo {
text-align: center;
}
div.clMenu {
display: inline-block;
background-color: lightblue;
}
div.clPanelPrincipal {
display: inline-block;
background-color: lightcoral;
}
div.clBloquePie {
background-color: aquamarine;
text-align: center;
}
div.clPie{
display:inline-block;
background-color:green;
padding:0.5em;
}
</style>
</head>
<body>
<div class="clBloqueEncabezado">
<div class="clEncabezado">
Encabezado
</div>
</div>
<div class="clCuerpo">
<div class="clMenu">
<h2>Menú</h2>
<ul>
<li>Uno</li>
<li>Dos</li>
<li>Tres</li>
</ul>
</div>
<div class="clPanelPrincipal">panelPrincipal</div>
</div>
<div class="clBloquePie">
<div class="clPie">Pie</div>
</div>
</body>
</html>
19/8/16
Buscar con grep
grep -l -r -i --include="*.cs" "tExto a buscar" . (Ojo que hay un punto al final)
- -l que muestre solo el nombre
- -r que busque en los directorios recursivamente.
- -i CaseInsensitive. Que no distinga mayúsculas de minúsculas.
- --include="*.cs". Tipos de fichero a buscar.
El punto al final es "Donde" buscar. En este caso en el directorio actual.
(Si no se pone da un error extraño)
grep: (entrada estándar): Not enough space
12/8/16
29/6/16
Hola mundo con C# Interactive de Visual Studio 2015
> #r "System.Windows.Forms" //Cargar el ensamblado
> using System.Windows.Forms; //Usar el Namespace
> MessageBox.Show("Hola"); //Mostrar el mensaje
9/6/16
Incluir fichero css en código con JSF.
xmlns:h="http://java.sun.com/jsf/html"
Escribimos:
<h:outputStylesheet library="css" name="Estilos.css" />
En cualquier parte del código
Lo que genera incluye en la cabecera, y con la ruta adecuada, y ... con parámetros que no entiendo un enlace<link type="text/css" rel="stylesheet" href="/proyecto/javax.faces.resource/Estilos.css.xhtml?ln=css" />Pero el caso es que funciona. Si se usa algún estilo en la página lo usa.
Ejemplo:
<p:panelGrid columns="2" columnClasses="alinearArriba">
20/4/16
Conectar Java con SqlServer.
- Abrir SqlServer para conexión por tcp/ip
- Conseguir el jar adecuado.
- La cadena de conexión
Para SqlServer 2008 sería:
Ejecutar: Microsoft SQL Server 2008>Herramientas de configuración>Administración de Configuración de SQL Server
Desplegar "Configuración de red de SQL Server", "Protocolos de " [Nombre instancia], y en TCP/IP dejar como habilitado
página de Microsoft sobre el tema
Para la Java 1.7 corresponde el sqljdbc41.jar que habría que bajar de Internet
Aquí está la madre del cordero.
En mi caso "jdbc:sqlserver:" es siempre fijo.
//nombre servidor:numero de puerto
instanceName=nombre de instancia(si hay varias en el mismo equipo es fundamental ponerla)
si se trabaja con autenticación de sqlServer (no Directorio Activo), user y password
En resumen:
"jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";Con esto funciono.
Añado código de ejemplo:(Sacado de uno de los ejemplos de Microsoft que vienen junto al .jar para conectarse)
import java.sql.*;
public class CrudSqlServer1 {
public static void main(String[] args) {
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://localhost:1433;instanceName=SQLEXPRESS2008;databaseName=nombreBD;user=sa;password=secreta";
// Declare the JDBC objects.
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(connectionUrl);
// Create and execute an SQL statement that returns some data.
String SQL = "SELECT * FROM Tabla1";
stmt = con.createStatement();
rs = stmt.executeQuery(SQL);
// Iterate through the data in the result set and display it.
while (rs.next()) {
System.out.println(rs.getString(4) + " " + rs.getString(6));
}
System.out.println("FIN");
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
}
}
}
21/3/16
Estructura de directorios en proyecto Meteor.
client ← Solo Clientlib ← colecciones. como shared lo ven los dos. Se ejecuta el código al arrancar el proyecto.server ← Solo servershared ← Metodos19/3/16
Vim. Fijar los espacios de un tab. 8 es mucho.
:set ts=4
:set sw=4
Siempre el mismo número. Es para el tab y el >>. que por lo visto, no son lo mismo.
Estructura base html a 19/03/2016
- Bajar jQuery 4 ficheros: Los "min" para producción (con el javascript comprimido) y los normales para depuración Para cada uno habría que considerar las versiones 1.X compatibles con Explorers 6,7 y 8 y los de la 2.X que no soportan esos navegadores Download jQuery
- Bajar bootstrap Baja todas las versiones (min y normal) Download Bootstrap
- Página vacía Copiado de: https://openwebinars.net/tutorial-bootstrap-3-introduccion-e-instalacion/
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <!--Con esto garantizamos que se vea bien en dispositivos móviles-->
<title>Pon un título</title>
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen"> <!--Llamamos al archivo CSS --> </head>
<body>
<script src="js/jquery.min.js"></script> <!-- Importante llamar antes a jQuery para que funcione bootstrap.min.js -->
<script src="js/bootstrap.min.js"></script> <!-- Llamamos al JavaScript de Bootstrap -->
</body>
</html>
29/7/14
PsExec de PsTools
PsExec.exe \\nombreEquipo -i -d -s "c:\windows\notepad.
exe"
-i para que salga en la pantalla (en alguna prueba con
el notepad salio todo la ventana negra, problemas de repintado)
-d para que no se quede la línea de comandos pillada hasta que se
acabe el proceso. Lo lanza, devuelve el promp y un número de
proceso que usamos para matarlo luego.
-s Usa la cuenta del sistema para lanzar la aplicación. Soluciona
el problema de que no se vea la ventana
La aplicación saca algo como esto
c:\windows\notepad.exe started on nombreEquipo with process ID 7452.
Y lo matamos remotamente (el usuario podría cerrarlo) con:
C:\Users\icrufra\Desktop\PSTools>pskill.exe \\nombreEquipo 7452
Si se quiere entrar en la máquina remota con otro usuario se pondría –u (usuario@dominio) y el programa pide la clave.
15/7/14
Crear un acceso directo (Link) desde C#
Type ShellType = Type.GetTypeFromProgID("WScript.Shell");
dynamic Shell = Activator.CreateInstance(ShellType);
dynamic shortcut = Shell.CreateShortcut(@"c:\borrame.lnk");
shortcut.TargetPath = @"c:\Windows\Notepad.exe";
shortcut.WorkingDirectory = @"c:\Windows";
shortcut.Save();
(Esto es antiguo con .net 4 usar el anterior) Basado en:
http://www.codeproject.com/Articles/3905/Creating-Shell-Links-Shortcuts-in-NET-Programs-Usi
Por debajo usa Windows Scripting Host con lo que hay que importar un com (ocx) para que funcione. Es un poco chapuza pero es lo que hay.
En el proyecto se añade la referencia a ese com:
- En el proyecto,
- añadir referencia,
- de tipo com,
- el nombre es: “Windows Script Host Object Model”
using IWshRuntimeLibrary; El código que crea un link al notepad en el escritorio sería:
var shell = new WshShell();
IWshShortcut link = (IWshShortcut)shell.CreateShortcut((Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"borrame.lnk")));
link.TargetPath = @"c:\windows\notepad.exe";
link.Save();
6/3/14
Obtener información de catálogo de Base de datos Access
DataTable t = Ctx.con.GetSchema(OleDbMetaDataCollectionNames.Columns);
StringBuilder sb = new StringBuilder();
foreach(DataRow r in t.Rows){
foreach(DataColumn c in t.Columns){
sb.Append(String.Format("{0}: {1}||",c.ColumnName,r[c.ColumnName]));
}
sb.AppendLine();
}
Clipboard.SetText(sb.ToString());
MessageBox.Show(sb.ToString());
DataRow []dr = t.Select("TABLE_NAME = 'AnoActual' and COLUMN_NAME = 'Ano'");
MessageBox.Show(dr[0]["TABLE_NAME"].ToString() + dr[0]["COLUMN_NAME"].ToString());
29/1/14
Salto de página en html
@media all {
div.saltopagina{
display: none;
}
}
@media print{
div.saltopagina{
display:block;
page-break-before:always;
}
}
<div class="saltopagina"><div>
17/1/14
Compilar proyecto desde línea de comandos
msbuild UILog1.csproj /p:Configuration=Release /t:CleanEl msbuild está en:
C:\Windows\Microsoft.NET\Framework\v4.0.30319Este ejemplo borraría la versión release. Sin el /t:Clean la crearía. También funciona con soluciones. Y es compatible con SharpDevelop.
14/1/14
Nlog a fichero por mes
NLog.Targets.FileTarget ft = new NLog.Targets.FileTarget();
ft.FileName ="FicheroDeLog.txt";
ft.ArchiveEvery = FileArchivePeriod.Month;
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(ft, LogLevel.Trace);
LogManager.Configuration.AddTarget("File",ft);
Logger logger = LogManager.GetCurrentClassLogger();
9/7/13
Recabar información del equipo en windows
static void MostrarTodo(StringBuilder sb, string cad){
ObjectQuery query = new ObjectQuery("Select * from " + cad);
XmlOpen(sb,1,cad);
ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
if(mos!=null){
ManagementObjectCollection moc = mos.Get();
if(moc != null){
foreach (ManagementObject mo in moc) {
PropertyDataCollection pdc = mo.Properties;
if(pdc != null){
foreach (PropertyData pd in pdc) {
AppendProperty(sb, pd);
}
}else{
sb.AppendLine(" ");
}
}
}else{
sb.AppendLine(" ");
}
}else{
sb.AppendLine(" ");
}
XmlClose(sb,1,cad);
}
Se le llamaría con:
MostrarTodo(sb, "Win32_Desktop"); MostrarTodo(sb, "Win32_DesktopMonitor"); MostrarTodo(sb, "Win32_OperatingSystem"); MostrarTodo(sb, "Win32_StartupCommand"); MostrarTodo(sb, "Win32_LogicalDisk"); MostrarTodo(sb, "Win32_MappedLogicalDisk"); MostrarTodo(sb, "Win32_DiskDrive"); MostrarTodo(sb, "Win32_NetworkAdapter"); MostrarTodo(sb, "Win32_NetworkAdapterConfiguration");
12/6/12
Generación de Codigo en C#
Nota: Está el código en hithub https://github.com/IvanCruzFraguela/EjemploGeneracionCodigo
usings necesarios:
using System.CodeDom; using System.CodeDom.Compiler;Suponemos que hay 2 controles de Tipo TextBox llamados:
tbFuenteGenerado tbErroresla función que genera los objectos necesarios para definir el código a generar como ejemplo es:
private CodeCompileUnit GeneraCodigo(){
//Unidad de Compilación (ensamblado)
var cu = new CodeCompileUnit();
cu.ReferencedAssemblies.Add("System.dll");//Ensamblados que enlaza (aunque este debería estar por defecto)
//Espacio de nombres
var n = new CodeNamespace("EjemploGeneracionCodigo1");
cu.Namespaces.Add(n);
n.Imports.Add(new CodeNamespaceImport("System"));//Espacios de nombres que utiliza este namespace para compilar
//Clase
var c = new CodeTypeDeclaration("ClaseGenerada");
n.Types.Add(c);
c.BaseTypes.Add(new CodeTypeReference(typeof(System.Timers.Timer)));//Su clase padre
c.IsPartial = true;
//Atributo de la clase
CodeMemberField mf = new CodeMemberField(typeof(string),"_atributo");
c.Members.Add(mf);
//Propiedad de la clase
CodeMemberProperty cp = new CodeMemberProperty();
c.Members.Add(cp);
cp.Attributes = MemberAttributes.Public | MemberAttributes.Final;//lo de Final para que no sea virtual (por defecto si es público es virtual)
cp.Type = new CodeTypeReference(typeof(string));
cp.Name = "atributo";
CodeFieldReferenceExpression cfre = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_atributo");
CodeMethodReturnStatement mrs = new CodeMethodReturnStatement(cfre);
cp.GetStatements.Add(mrs);
//Metodo de la clase
CodeMemberMethod cmm = new CodeMemberMethod();
c.Members.Add(cmm);
cmm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
cmm.Name = "Metodo1";
cmm.ReturnType = new CodeTypeReference(typeof(int));
CodeParameterDeclarationExpression pde = new CodeParameterDeclarationExpression(typeof(int),"enteroDeEntrada");
cmm.Parameters.Add(pde);
pde = new CodeParameterDeclarationExpression(typeof(string),"cadenaDeEntrada");
cmm.Parameters.Add(pde);
//Declaración de variable
CodeVariableDeclarationStatement vds = new CodeVariableDeclarationStatement(typeof(string),"aux",new CodePrimitiveExpression("Prueba1") );
cmm.Statements.Add(vds);
//Llamar a método arbitrario
//variable a llamar y método
CodeMethodReferenceExpression ctr = new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("Console"),"WriteLine");
//Llamada en sí con sus parámetros
CodeMethodInvokeExpression invoke1 = new CodeMethodInvokeExpression( ctr, new CodeExpression[] {new CodePrimitiveExpression("Hola mundo")} );
cmm.Statements.Add(invoke1);
//Código a pelo. Ojo no se puede generar, por ejemplo, un foreach.
cmm.Statements.Add(new CodeSnippetStatement("foreach(string s in cadenas){"));
cmm.Statements.Add(new CodeSnippetStatement("Console.WriteLine(s);"));
cmm.Statements.Add(new CodeSnippetStatement("}"));
mrs = new CodeMethodReturnStatement(new CodePrimitiveExpression(42));
cmm.Statements.Add(mrs);
return cu;
}
el código para generar el fuente e incluso compilarlo desde aquí es:
CodeCompileUnit cu = GeneraCodigo();
CodeDomProvider dp = CodeDomProvider.CreateProvider("CSharp");
//Imprimir el código
StringWriter sw = new StringWriter();
System.CodeDom.Compiler.IndentedTextWriter itw = new IndentedTextWriter(sw);
CodeGeneratorOptions go = new CodeGeneratorOptions();
go.BlankLinesBetweenMembers = false;
dp.GenerateCodeFromCompileUnit(cu,sw,go);
this.tbFuenteGenerado.Text = sw.ToString();
//Compilar desde dom
CompilerParameters cp = new CompilerParameters(new string[]{},"borrame.dll");
CompilerResults cr = dp.CompileAssemblyFromDom(cp,cu);
tbErrores.Text = "";
foreach(CompilerError ce in cr.Errors){
tbErrores.Text += String.Format("{0}){1} in {2} at line {3} column {4} isWarning{5}",ce.ErrorNumber,ce.ErrorText,ce.FileName,ce.Line,ce.Column,ce.IsWarning);
}
En teoría se podría generar tanto VB con C# pero supongo que con el uso se abusará de CodeSnippetStatement (“pon esto y no preguntes”) dado que hay construcciones importantes de C# (foreach, using) que no se pueden generar como tal con lo que solo se podrá generar C#.Referencias:
- http://msdn.microsoft.com/es-es/library/bb972255.aspx //Hace lo que pienso hacer de generar clases para manejar tablas (y sí, ya sé que esta hecho)
- http://msdn.microsoft.com/en-us/library/f1dfsbhc.aspx //Las clases necesarias para generar código ordenadas por funcionalidad
- http://msdn.microsoft.com/en-us/library/system.codedom.compiler.aspx //Namespace necesario para la generación y compilación de código.
25/4/12
Rebol: Grabar lista de objetos y recuperarla
REBOL[title: "Grabar y recuperar lista de objetos"]
obj1: make object![
id: 1
nomb: "Uno"
]
obj2: make object![
id: 2
nomb: "Dos"
]
lObj: copy []
append/only :lObj to-block obj1 ; only para que inserte como bloque y to-block para que haga un bloque del objeto.
; no mola nada esta forma de hacer las cosas
; ¿Qué diferencia hay entre un bloque y un objeto en realidad?
append/only :lObj to-block obj2
print mold lObj ; para ver lo que rebol grabaría
fich: %ListaObjectos.r
save :fich :lObj
listaRecuperada: load :fich
print :listaRecuperada/1 ; imprimir primer elemento
print :listaRecuperada/2
Mercurial
* hg init <--Para crear el repositorio. Se ejecuta en el directorio a controlar. * hg add <-- Para añadir la primera vez. * hg ci -u ivancruz <-- Para hacer un commit * hg log <-- Para ver las versiones * hg update<-- Para volver a una versión anterior
8/11/11
Test. Marcar clases como conjuntos de pruebas y métodos como métodos de prueba.
[TestFixture]
Para cada método: que sea una prueba
[Test]
12/9/11
Compilando desde bajada de svn
svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/InventarioDHCP_1.10 svn co svn://desarrollo.dxx.xudicial.xunta.es/repositorio/csharp/Util cd InventarioDHCP_1.10 c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild /p:Configuration=ReleaseBaja el código a donde se encuentre el fichero .bat y lo compila.
24/5/11
Envío de teclas a aplicaciones (para pruebas automáticas)
// Código para enviar las pulsaciones de teclas
Microsoft.VisualBasic.Interaction.AppActivate(f.Text);//Activa la aplicación. f es el formulario creado anteriormente para pruebas
f.Focus();// Hace falta también esto por lo visto.
Util.EnviarTeclas(5000, "{TAB}");//Cuadro de diálogo. Pasar a "no"
Util.EnviarTeclas(6000, "{ENTER}");//Cuadro de diálogo. ENTER.
// Código en Utils
public static void EnviarTeclas(int TiempoEspera, string teclas) {
Thread t = new Thread(new ParameterizedThreadStart(AEjecutarPorEnvioTeclas));
EnvioTeclas et = new EnvioTeclas(TiempoEspera,teclas);
t.Start(et);
}
public static void AEjecutarPorEnvioTeclas(Object EnvTecl) {
EnvioTeclas aux = EnvTecl as EnvioTeclas;
Thread.Sleep(aux.espera);
SendKeys.SendWait(aux.teclas);
}
public class EnvioTeclas {
public int espera;
public string teclas;
public EnvioTeclas(int espera, string teclas) {
this.espera = espera;
this.teclas = teclas;
}
}
16/5/11
Crear filas de prueba
private static DS.AGPROVRow _ProvRow;
public static DS.AGPROVRow ProvRow {
get {
if (_ProvRow == null) {
DS.AGPROVDataTable aux = new DS.AGPROVDataTable();
_ProvRow = aux.NewAGPROVRow();
_ProvRow.ID = 99;
_ProvRow.NOMB = "Prueba Grabar 1";
}
return _ProvRow;
}
}
27/4/11
Comparar el contenido de dos filas
public static bool ContenidoRowsEsIgual<T>(T row1, T row2) where T : DataRow {
bool result = true;
if (!row1.GetType().Equals(row2.GetType())) {
throw new Exception("Las filas no son del mismo tipo");
}
DataRow r1 = row1 as DataRow;
DataRow r2 = row2 as DataRow;
for (int i = 0; i < r1.ItemArray.Length; i++) {
if (!r1[i].Equals(r2[i])) {
result = false;
}
}
return result;
}
24/11/10
Mostrar Fechas en Oracle
to_char(campo_fecha,'DD/MM/YYYY HH24:MI:SS')
Para probarlo:
select to_char(sysdate,'DD/MM/YYYY HH24:MI:SS') from dual;
Más información en:
http://www.oradev.com/oracle_date_format.jsp
12/11/10
Roles de un usuario de windows
de la página: http://www.netveloper.com/2004/12/c%C3%B3mo-obtener-los-roles-a-los-que-pertenece-un-usuario-de-windows/
Me falló como a Javier Carrillo y lo solucioné con:
using System;
using System.Collections;
using System.Security.Principal;
using System.Reflection;
using System.IO;
public
class Prueba
{
public static void Main()
{
StreamWriter sw = File.CreateText("roles.txt");
foreach (IdentityReference Role in WindowsIdentity.GetCurrent().Groups.Translate(typeof(NTAccount)))
{
Console.WriteLine(Role.Value);
sw.WriteLine(Role.Value);
}
Console.ReadLine();
sw.Close();
}
}
27/7/10
Añadir consultas a un DataAdapter por código
Para solucionarlo hay que heredar del DataAdapter generado y crear los Fill que se quieran.
public class AdapterModificado : DSTableAdapters.EnteTableAdapter
{
public void FillByNif(DS.EnteDataTable t,string nif)
{
SqlCeCommand aux = this.CommandCollection[0];
this.CommandCollection[0] = new SqlCeCommand("select * from ente where nif = @nif");
this.CommandCollection[0].Connection = this.Connection;
this.CommandCollection[0].Parameters.Add("@nif", nif);
this.Fill(t);
this.CommandCollection[0] = aux;
}
}
13/4/10
Usar servicios Web desde C# cómodamente
wsdl.exe
Se encuentra por ejemplo en:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
Hay que estar en la carpeta correspondiente y desde línea de comandos usar
wsdl [URL servicio]
genera un fichero de c# (por defecto) con el que poder llamar a los métodos web
Ejemplo:
wsdl http://localhost/Service1.asmx
Para usarlo:
serv = new Service1();
serv.Url = @"http://localhost/Service1.asmx";
serv.CookieContainer = new System.Net.CookieContainer();
serv.MetodoWeb("Dato para método",5); // El fichero generado tiene los métodos web como métodos normales del objeto
Sql Server desde línea de comandos (sqlcmd)
sqlcmd
Está en
C:\Program Files\Microsoft SQL Server\100\Tools\Binn
Las mayúsculas y minúsculas son importantes (curioso en Windows)
sqlcmd -S [nombre instancia servidor] -d [nombre bd] -i [fichero a ejecutar]
ejemplo
sqlcmd -S localhost\SQLExpress -d PruebaBD1 -i creacion_tablas.sql
21/2/10
Metadatos en sql server
SELECT name FROM SYSOBJECTS WHERE XTYPE='U';
Nombre de restricciones forenign key
SELECT * FROM SYSOBJECTS WHERE XTYPE='F';
Nombres de Primary keys
SELECT * FROM SYSOBJECTS WHERE XTYPE='PK';
Nombres de Campos de una tabla
Select name from syscolumns where id=object_id('tabla');
16/2/10
Compilación dll c# desde línea de comandos
csc /t:library /out:tiendalib.dll TiendaLib\TiendaLibBD.cs Tiendalib\
directorions\directorio.cs /lib:Utils\bin\Debug /reference:utils.dll
/t: <-- tarjet library = dll
/out: fichero de salida
lista de ficheros fuente
/lib: lista de directorios de donde cojer las dll
/reference: lista de ficheros dll referenciados
22/12/09
Oracle: Tablas que dependen de una dada
select CC.TABLE_NAME TablaQueReferencia,CC.COLUMN_NAME CampoDeEnlace,CC.POSITION PosicionDelCampo,C.CONSTRAINT_NAME NombreDelConstraint from all_constraints c
left join all_cons_columns cc
on c.constraint_name like cc.constraint_name
where c.constraint_type like 'R' -- Referencia
AND R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE
CONSTRAINT_TYPE LIKE 'P' -- Clave primaria
AND TABLE_NAME LIKE 'SERVIDORDAT')-- Nombre de la tabla a buscar sus dependientes
AND C.OWNER LIKE 'DESAR' AND CC.OWNER = 'DESAR'-- Nombre del esquema si hay varios
order by 1,2,3;
Hay que cambiar al nombre de la tabla y borrar lo del esquema si no hace falta.
Fundamental para poder borrar una tabla y saber qué otras tablas tienen referencias a ella.
Palabras clave (para búsqueda)
Oracle foreing key drop table clave foranea clave externa borrar tabla dependientes constraint constraints
31/7/09
Crear campo de tabla padre
dsOracle.EQUIPODAT.Columns.Add("NombMotivoBaja", typeof(string), "Parent(FK_Equipodat_Motivo_Baja).nombre");
dsOracle == El dataset
EQUIPODAT == La tabla.
importante el: Parent(la relación).el_campo
3/7/09
DataBinding con DateTimePicker
La parte de código maneja el evento del parse y el format había que ponerlo en alguna clase común.
Hay que crear una variable en la clase para almacenar el binding y poder referenciarlo desde el FormClosing.
Binding BindingFIni;
En el constructor. Yo lo paso a un “InicializarComponentes()”
private void InicializarComponentes() {
BindingFIni = new Binding("Value", Program.dm.OrganoBindingSource, Program.dm.dsOracle.ORGANO.FINIColumn.ColumnName);
BindingFIni.Format += new ConvertEventHandler(BindingFIni_Format);
BindingFIni.Parse += new ConvertEventHandler(BindingFIni_Parse);
this.dtpFIni.DataBindings.Add(BindingFIni);
this.dtpFIni.Value = DateTime.Today;// Sin estas 2 líneas no funciona, lo que no se es porqué.
BindingFIni.WriteValue();// Línea necearia
// Ojo: Tambien es neceario incluir líneas en el FormClosing
}
El código de los eventos es:
void BindingFIni_Parse(object sender, ConvertEventArgs e) {//Se llama al grabar
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
if (dtp != null && !dtp.Checked) {
e.Value = DBNull.Value;
}
}
void BindingFIni_Format(object sender, ConvertEventArgs e) {// Se llama al leer
if (e.Value is System.DBNull) {
DateTimePicker dtp = ((Binding)sender).Control as DateTimePicker;
e.Value = DateTime.Today;
dtp.Checked = false;
}
}
Por último al final del “FormClosing” hay que eliminar el Binding porque si no se ejecutan los eventos pese a que el formulario esté cerrado.
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
//Aquí las comprovaciones necesarias
if (!e.Cancel) {
// Si no se hace esto sigue ejecutando el format aunque este formulario esté cerrado.
this.dtpFIni.DataBindings.Remove(this.BindingFIni);
}
}
11/6/09
.net .WinForms. Formulario Edición sencillo.
Atención a que los "EndEdit" son del BindingSource (por lo que actualiza en todos los sitios que se muestra la fila) y el
r.HasVersion(DataRowVersion.Proposed))para comprobar si se han realizado cambios (el R.rowstate no se actualiza hasta que se ha hecho el "EndEdit" momento en el que no se podrían cancelar los cambios)
Para llamar al formulario según sea Creación o modificación.
internal static void RolCrear() {
dm.rolBindingSource.AddNew();
dm.RolActual.CODIGO = -1;
(new Rol.FE()).ShowDialog();
}
internal static void RolModificar() {
(new Rol.FE()).ShowDialog();
}
Formulario en sí
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace InventarioDHCP.Rol {
public partial class FE : Form {
public FE() {
InitializeComponent();
InicializarComponentes();
}
private void InicializarComponentes() {
this.tbNombre.DataBindings.Add("Text", Program.dm.rolBindingSource, Program.dm.dsOracle.ESPECIALIDAD.NOMBREColumn.ColumnName);
}
private void btnSalir_Click(object sender, EventArgs e) {
this.Close();
}
private void btnGrabar_Click(object sender, EventArgs e) {
this.GrabarYSalir();
}
private void GrabarYSalir() {
if (this.Grabar()) {
this.Close();
}
}
private bool Grabar() {// Devuelve true si fue capaz de grabar
bool result = false;
if (this.EsValido()) {
Program.dm.rolBindingSource.EndEdit();
Program.dm.RolGrabar(Program.dm.RolActual, null);
result = true;
}
return result;
}
private bool EsValido() {
bool result = true;
this.errorProvider1.Clear();
if (this.tbNombre.Text.Equals("")) {
result = false;
this.errorProvider1.SetError(this.tbNombre, "Se ha de indicar un nombre");
}
return result;
}
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
DSOracle.ROLRow r = Program.dm.RolActual;
if (r.HasVersion(DataRowVersion.Proposed)) {// Si no ha cambiado no hacer nada
DialogResult dr = MessageBox.Show("¿Desea grabar los cambios?", "Atención:",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch (dr) {
case DialogResult.Yes: {
if (!this.Grabar()) {//Si no es capaz de grabar que no salga del formulario
e.Cancel = true;
}
break;
}
case DialogResult.No: {// Si no quiere grabar, cancelar la edición
Program.dm.rolBindingSource.CancelEdit();
break;
}
case DialogResult.Cancel: {// Si cancela no hacer nada pero tampoco salir del formulario
e.Cancel = true;
break;
}
default: {
throw new Exception("Respuesta no contemplada");
}
}
}
}
}
}
Grabación
public void RolGrabar(DSOracle.ROLRow r, OracleTransaction Trans) {
// Atención si se nos produce un error de compilación en las lineas siguientes hay que ir a la definición de Adapter y cambiarlo por public.
// Esto pasará cada vez que cambiemos algo en DSOracle.
this.rolTableAdapter.Adapter.InsertCommand.Transaction
= this.rolTableAdapter.Adapter.UpdateCommand.Transaction
= this.rolTableAdapter.Adapter.DeleteCommand.Transaction
= Trans;
if (r.RowState == DataRowState.Added) {
r.CODIGO = Util.OracleGetSequence(conOracle, "Rol_SEQ", Trans);
}
rolTableAdapter.Update(r);
}
20/4/09
Grids en asp.net
if (!IsPostBack) {
PrepararGrid();
}
private void PrepararGrid() {
this.GridView1.DataKeyNames = { "Codigo" };//lista de campos que forman la clave primaria
this.SqlDataSource.SelectCommand = “Select Codigo, nombre from tabla”;// Consulta para rellenar el grid
//Añadir las columnas y botones
UtilWeb.AnadirColumnaText(this.GridView1, "nombre", "NOMBRE");
UtilWeb.AnadirColumnaBoton(this.GridView1, “AnadirAGenerarDat”, "Generar Fichero Dat");
UtilWeb.AnadirColumnaBoton(this.GridView1, “VerEquiposServidor”, "Ver Equipos");
}
public static void AnadirColumnaBoton(GridView gv, string Comando, string TextoBoton) {
ButtonField btnf;
btnf = new ButtonField();
btnf.ButtonType = ButtonType.Button;
btnf.CommandName = Comando;
btnf.HeaderText = "";
btnf.Text = TextoBoton;
gv.Columns.Add(btnf);
}
public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera, bool visible) {
BoundField bf;
bf = new BoundField();
bf.DataField = Campo;
bf.HeaderText = Cabecera;
bf.ReadOnly = true;
bf.Visible = visible;
gv.Columns.Add(bf);
}
public static void AnadirColumnaText(GridView gv, string Campo, string Cabecera) {
AnadirColumnaText(gv, Campo, Cabecera, true);
}
Al pulsar los botones que hemos añadido al grid se ejecuta el “RowCommand”.
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
// el e tiene:
//e.CommandArgument : La posicion en la que se ha pulsado el botón
//e.CommandName : El nombre del comando ”Lo hemos dado al crear el botón”
//e.CommandSource
int position = Convert.ToInt32(e.CommandArgument);
DataKey dk = this.GridView1.DataKeys[position];
decimal ServidorId = Convert.ToDecimal(dk.Value);// Si es una clave con varios campos dk.Values[X]
switch (e.CommandName) {
case “AnadirAGenerarDat”: {
//Acción con el botón correspondiente
break;
}
case “VerEquiposServidor”: {
//Acción con el botón correspondiente
break;
}
}
}
19/2/09
Manejo VirtualBox
Utilidades para arrancar la máquina sin hacerlo interactivamente.
Arrancar máquina virtual desde línea de comandos:
VBoxManage startvm "NombreMaquina"
Pausar una máquina desde línea de comandos:
VBoxManage controlvm "NombreMaquina" savestate
Copiar una máquina virtual (copia el disco duro. La máquina virtual hay que crearla y asignarle el nuevo disco duro creado):
VBoxManage clonevdi Fuente.vdi Destino.vdi
12/2/09
ASP.NET: Paso de Rows a Textboxes y viceversa
En Web no hay databinding salvo en grids. Hacen falta estas cosas para pasar los datos de la fila al formulario de de vuelta a la tabla en los formularios de edición
public static void SetTextOrNull(TextBox textBox, DataRow r, DataColumn dataColumn) {
if (textBox.Text.Equals("")) {
r[dataColumn] = System.Convert.DBNull;
} else {
r[dataColumn] = textBox.Text;
}
}
public static void GetTextOrNull(TextBox tb, DataRow r, DataColumn dataColumn) {
if (r[dataColumn].Equals(System.Convert.DBNull)) {
tb.Text = "";
} else {
tb.Text = r[dataColumn].ToString();
}
}
Hay que pasarles el textbox la Row y el nombre de la columna es una variable en la tabla (gracias a que la genera como pública).
27/11/08
URL para iniciar asistencia remota
"hcp://CN=Microsoft%20Corporation,L=Redmond,S=Washington,C=US/Remote%20Assistance/Escalation/Unsolicited/unsolicitedrcui.htm"
30/9/08
Añadir valor nulo en un comboBox asp.net (dropdownlist)
this.comboLocalidad.AppendDataBoundsItems = true;
this.comboLocalidad.Items.Add(new ListItem("Sin asignar", "0"));
El valor 0 tendrá que ser tratado al grabar como nulo.
19/9/08
Curioso juego de programación
palabras clave:
juego programación interesante aprendizaje chorrada
16/9/08
Para modificar o eliminar un registro de un GridView de asp. net.
GridView, Posición, Posicionar, modificar, eliminar, RowCommand, DataKeys, Grid, Rejilla.
// e.CommandArgument.ToString(). Nos devuelve una cadena con la posición en el grid en la que se ha pulsado el botón.
// Para obtener la clave primaria de la fila pulsada hemos de definir en el GridView en su propiedad “DataKeyNames” los nombres de los campos que forman la clave primaria a mano antes de empezar.
DataKey dk = this.GridView1.DataKeys[Int32.Parse(e.CommandArgument.ToString())];
// El dk obtiene la lista de valores para acceder al segundo se pone el [1]
this.Title = dk.Values[1].ToString();
Una vez obtenida la clave primaria ya se puede obtener el objeto a modificar.
31/7/08
Databinding de un textbox por código
30/7/08
Acceder al connection string en asp .net
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
14/7/08
Tamaño de la barra de windows
si a 768 ( de 1024 x 768) le restamos 22 tenemos que para aplicaciones podemos tener:
746 puntos de alto.
19/6/08
Creación de tabla en oracle
CREATE table "S" (
"A" NUMBER(5,5) NOT NULL,
"C" VARCHAR2(4000),
constraint "S_PK" primary key ("A")
)
/
CREATE sequence "S_SEQ"
/
CREATE trigger "BI_S"
before insert on "S"
for each row
begin
select "S_SEQ".nextval into :NEW.A from dual;
end;
/
ALTER TABLE "S" ADD CONSTRAINT "S_FK"
FOREIGN KEY ("C")
REFERENCES "TABLA1" ("ID")
/
23/4/08
Netbeans jsf oracle + Primera inserción que funciona
int id = 31;
String nomb = "Treinta y uno";
Connection con = null;
try {
InitialContext ic = new InitialContext();
//en esta parte es donde ponemos el Nombre
//de JNDI para que traiga el datasource
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/HR_Oracle");
con = ds.getConnection();
Statement st = con.createStatement();
try{
String com = "insert into TABLA1(id,nomb) values ("
+ Integer.toString(id)
+ ",'"
+ nomb
+ "')";
info(com);
int executeUpdate = st.executeUpdate(com);
info(Integer.toString(executeUpdate));
}catch(SQLException ex){
error(ex.getMessage());
}
//el resultSet es el encargado de traer los datos de la consulta
ResultSet rs = st.executeQuery("select * from TABLA1");
while (rs.next()) {
info(" " + rs.getString(1) + " " + rs.getString(2));
}
} catch (SQLException ex) {
error(ex.getMessage());
} catch (Exception exx) {
error(exx.getMessage());
}
4/3/08
Fila actual de un BindingSource
return (this.BaseDeDatosBS.Current as DataRowView).Row as DS.BaseDeDatosRow;
// Si no hay Current devolvería un null.
Sirve para acceder al elemento actual de un binding source con el tipo de fila adecuado.
public DS.JuzgadoRow JuzgadoActual {
get {
DS.JuzgadoRow result = null;
if (this.JuzgadoBs.Current != null) {
DataRowView drw = this.JuzgadoBs.Current as DataRowView;
result = drw.Row as DS.JuzgadoRow;
}
return result;
}
}
28/11/07
Text de solo números
Se permiten números y carateres de control (si no se permiten los caracteres de control el borrar falla)
private void textAno_KeyPress(object sender, KeyPressEventArgs e) {
e.Handled = !(Char.IsNumber(e.KeyChar) || Char.IsControl(e.KeyChar));
}
21/11/07
Campo calculado en un DataTable de un DataSet .net
(habría que explicarlo más)
17/10/07
Databinding ComboBox C#
ComboBox.DataSource = Program.dm.TipoProcBindingSource; //BindingSource a mostrar
ComboBox.DisplayMember = "nomb"; // Campo nombre
ComboBox.ValueMember = "id"; // Campo valor
ComboBox.DataBindings.Add( // enlace con el campo donde se guarda el valor
new Binding("SelectedValue", // La propiedad de SelectedValue ( no value)
Program.dm.procBindingSource, // Bindingsource de la tabla en la que grabamos el valor
"idTipoProc" // nombre del campo en el que guardamos el valor
));
4/10/07
Comprobar permisos al ejecutar aplicación .net
private static bool CheckFullTrust()
{
try
{
// Demandar Full Trust
new PermissionSet(PermissionState.Unrestricted).Demand();
return true;
}
catch (SecurityException)
{
try
{
// No estamos en Full Trust, se lo contamos al usuario
MessageBox.Show("La aplicación necesita Full Trust");
}
catch (SecurityException)
{
// La aplicación no tiene permisos mostrar mensajes... :(
//Logeamos lo ocurrido
}
}
return false;
}
27/7/07
Generar avisos de compilación en C#
private void grabacionCrear() {
#warning grabacionCrear sin hacer
}
19/7/07
Hacer un DataGridView de solo lectura.
ReadOnly = true;
AllowUserToAddRows = false;
AllowUserToDeleteRows = false;
SelectionMode = DataGridViewSelectionMode.FullRowSelect;
17/7/07
Ejecutar un programa desde c#
Process p = new Process();
p.StartInfo = new ProcessStartInfo(comando, parametros);
p.Start();
5/7/07
Textbox con solo números
public Form1()
{
InitializeComponent();
textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
}
void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// Permitir sólo las teclas de control o números
if (!(char.IsControl(e.KeyChar) || char.IsDigit(e.KeyChar)))
{
e.Handled = true;
}
}
7/6/07
Acceder a un fichero en el servidor desde página ASP
dataset.ReadXml ( Server.MapPath("fichero.xml") );
Esto accedería a "fichero.xml" en donde se encuentre instalada la aplicacion.
12/4/07
String.format en Java
Para fechas:
String.format("%1$te/%1$tm/%1$tY",[variable calendar]);
Para números enteros:
String.format("%1$d",[variable entera]);
Para double / float:
String.format("%1$.2f",[variable double o float]); // saca el nº con 2 decimales
21/3/07
HTML: Label más text en HTML
(ver el código de la página)
Buscar
7/3/07
Java. Detectar una cambio en la selección de un JTable
Hay que cambiar el "modelo de seleccionador" en principio el ponemos que solamente se pueda seleccionar una sola fila y luego definimos una clase para que se llame al evento y se la añadimos al "modelo de seleccionador" en el evento "Selection". (Pa flipá vamos. Lo que se echa de menos un "OnSelect" de toda la vida)
this.jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);/* lo de que solamente se pueda seleccionar una fila.*/
lsm = this.jTable1.getSelectionModel();
lsm.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e){
MetodoALlamarCuandoCambiaLaSeleccion();
}
};
Para saber la fila seleccionada se usa el método del JTable.getSelectedRow().
java String.format
para formatear cadenas: "s"
String.format(" la cadena %1$s", "es muy bonita") --> la cadena es muy bonita
para formatear enteros: "d"
String.format(" cantidad: %1$d", 4) --> cantidad: 4
1/3/07
Elementos en los jList ( los que muestran una lista cadenas para seleccionar (ListBox))
Doble click en swing
private void lTablaMouseClicked(java.awt.event.MouseEvent evt) {
if (evt.getClickCount() >= 2){// si es doble click
JOptionPane.showMessageDialog(this,"Doble click"); }
}
}
Creación de un table model específico para un JTable
http://www.chuidiang.com/java/tablas/tablamodelo/tablamodelo.php
20/2/07
Mini tutorial de action en Java
http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html
7/2/07
Tomcat. Librerias a usar en los proyectos sin estar en el classpath
Se puede usar para poner por ejemplo el controlador JDBC
Conjuntos de filas en Java
RowSet = ResultSet pero siendo un bean (para poder pegarlo desde la caja de herramientas de los IDE)
29/1/07
Creación de pdfs desde java
11/1/07
Serialización de objectos en java
package pruebasserializacion;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
/**
*
* @author ivancruz
*/
class Elemento implements Serializable{
int cod;
String nomb;
Calendar fNac;
public Elemento(int cod, String nomb, Calendar fNac){
this.cod = cod;
this.nomb = nomb;
this.fNac = fNac;
}
public String toString(){
return Integer.toString(cod) + "//" + nomb + DateFormat.getDateInstance().format(fNac.getTime());
}
}
public class Main {
final static String NOMBFICH = "d:\\borrame.serializacion";
public static void main(String[] args) throws IOException, ClassNotFoundException {
Main m = new Main();
ArrayList escribir = new ArrayList();
escribir.add(new Elemento(1,"Uno",Calendar.getInstance()));
escribir.add(new Elemento(2,"Dos",Calendar.getInstance()));
FileOutputStream fos;
fos = new FileOutputStream(Main.NOMBFICH);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(escribir);
//ArrayList leer;
FileInputStream fis = new FileInputStream(Main.NOMBFICH);
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList leer = (ArrayList)ois.readObject();
for(Elemento e:leer){
System.out.println(e);
}
}
}
13/11/06
26/10/06
BENEDETTI
- "NO TE SALVES"
- "NO QUIERAS CON DESGANA"
- "DEFENSA DE LA ALEGRIA"
- Casi completo
- "LA TREGUA"
- Trabajar de camarero
- "EL OLVIDO"
- "EL OLVIDO NO ES VICTORIA"
- "NO OLVIDA EL QUE FINGE OLVIDO,
SINO EL QUE PUEDE OLVIDAR"
13/8/06
HTML Base
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TODO supply a title</title>
</head>
<body style="margin:0px;padding:0px">
<table style="valign:centered;text-align:center;width:100%;height:100%;border-spacing:0px">
<tr style="height:20%">
<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">
<h1>Encabezado</h1>
</td>
</tr>
<tr style="height:65%">
<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">
<p>cuerpo</p>
</td>
</tr>
<tr style="height:15%">
<td style="valign:centered;text-align:center;background-image:url('borrame.jpg')">
<p>pie</p>
</td>
</tr>
</table>
</body>
</html>
3/8/06
¿Qué debe incluir un caso de uso?
Precondiciones
Postcondiciones
Flujo Básico
Flujos Alternativos
Requisitos especiales
Frecuencia
Web sobre el tema "usecases.org"
23/6/06
Java: Leer una url
try{
java.net.URL url = new java.net.URL("http","www.ya.com",80,"");
java.io.InputStream is = url.openStream();
System.out.println("[ya.com]");
int c;
while ((c = is.read()) != -1){
System.out.write(c);
}
System.out.println("[ya.com fin]");
}catch(Exception e){
e.printStackTrace();
}
5/6/06
Interesante historia acerca de pasar de Windows a Linux
(para verla pulsar sobre el título del artículo)
29/5/06
comando para conexión a una Bd Oracle
Para usar desde el SQL Plus o herramientas de script.
25/4/06
Truquillos chorras
Copiar ficheros
xcopy /e /c /h /r /k /z *.* dest\
Actualizar la hora del equipo a la del dominio
runas /user:familia\Administrador "net time /Domain:Familia /set"
Dir mostrando ocultos
dir /A
Instalar el redistribuible del .net
dotnetfx.exe /q /c:"install.exe /q"
30/3/06
ComboBox en .Net
this.cbMunicipio.DropDownStyle = ComboBoxStyle.DropDownList;
this.cbMunicipio.DataSource = Program.dm.ProvinciaMunicipioBindingSource; //BindingSource a mostrar
this.cbMunicipio.DisplayMember = Program.dm.dsOracle.MUNICIPIO.NOMBREColumn.ColumnName; // Campo nombre
this.cbMunicipio.ValueMember = Program.dm.dsOracle.MUNICIPIO.CODIGOColumn.ColumnName; // Campo valor
this.cbMunicipio.DataBindings.Add( // enlace con el campo donde se guarda el valor
new Binding("SelectedValue", // La propiedad de SelectedValue ( no value)
Program.dm.OrganoBindingSource, // Bindingsource de la tabla en la que grabamos el valor
Program.dm.dsOracle.ORGANO.CODIGO_MUNICIPIOColumn.ColumnName // nombre del campo en el que guardamos el valor
));
Conexión con Bd Access
- Provider=Microsoft.Jet.OLEDB.4.0;
- Data Source='"+d.FileName+"'"
Ejemplo completo:
System.Data.OleDb.OleDbConnection con = new OleDbConnection("Provider='Microsoft.JET.OLEDB.4.0';Data source = 'o:\datos\prueba1.mdb'");Con clave:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;Jet OLEDB:Database Password=MyDbPassword;
Leer autonumricos de Access y Sql Server(Identity)
OleDbConnection con = new OleDbConnection(CadCon);
OleDbCommand cmd = OleDbCommand("SELECT @@IDENTITY", con);
int clave = (int) cmdIdentidad.ExecuteScalar();
Ejemplo de Semáforos con C#
m.WaitOne();
if (instancia == null){
instancia = new ClaseUnica();
}
m.Close();
27/3/06
Cadenas en C#
Para que no interprete los caracteres de “\” en una cadena y tener que poner “\\” en las rutas de directorio se puede poner una arroba “@” delante de la cadena y listo.
Ejemplo:
Ruta = “c:\\path\\fichero”
Ruta = @”c:\path\fichero”
Si queremos tener una cadena en la que se valla construyendo una más larga debemos usar el StringBuilder por cuestiones de rendimiento.
22/2/06
Formulario C# con creación de controles a pelo
using System;
using System.Drawing;
using System.Windows.Forms;
namespace pruebas1
{
///
/// Description of EdicionConControles.
///
public partial class EdicionConControles
{
//Controles a los que es necesario acceder desde código del formulario
private TextBox tbAlias;
private TextBox tbNombre;
public void InicializarControles(){
// Panel Datos
FlowLayoutPanel flpDatos = new FlowLayoutPanel();
flpDatos.Parent = this;
flpDatos.Dock = DockStyle.Fill;
flpDatos.BackColor = Color.Cyan; // para ver donde acaba
// Alias
Panel panelAlias = new Panel();
panelAlias.Parent = flpDatos;
panelAlias.BackColor = Color.AliceBlue;
Label labelAlias = new Label();
labelAlias.Parent = panelAlias;
labelAlias.Text = "Alias";
labelAlias.Top = 2;
labelAlias.Left = 2;
labelAlias.Height = 12;
/* definido fuera*/
tbAlias = new TextBox();
tbAlias.Parent = panelAlias;
tbAlias.Left = 2;
tbAlias.Top = 2 + labelAlias.Height + 2;
panelAlias.Height = 2 * 3 + labelAlias.Height + tbAlias.Height;
panelAlias.Width = 2 * 2 + tbAlias.Width;
//nombre
Panel panelNombre = new Panel();
panelNombre.Parent = flpDatos;
panelNombre.BackColor = Color.AliceBlue;
Label labelNombre = new Label();
labelNombre.Parent = panelNombre;
labelNombre.Text = "Nombre";
labelNombre.Top = 2;
labelNombre.Left = 2;
labelNombre.Height = 12;
//Definido fuera
tbNombre = new TextBox();
tbNombre.Parent = panelNombre;
tbNombre.Left = 2;
tbNombre.Top = 2 + labelNombre.Height + 2;
panelNombre.Height = 2 * 3 + labelNombre.Height + tbNombre.Height;
panelNombre.Width = 2 * 2 + tbNombre.Width;
// Panel Botones
FlowLayoutPanel flpBotones = new FlowLayoutPanel();
flpBotones.Parent = this;
flpBotones.Dock = DockStyle.Bottom;
flpBotones.BackColor = Color.Red;// para ver donde acaba
flpBotones.Height = 27; //23 del boton estándar más 4
// botón grabar
Button bGrabar = new Button();
bGrabar.Parent = flpBotones;
bGrabar.Click += new EventHandler(bGrabarClick);
//void bGrabarClick(object sender, System.EventArgs e)
bGrabar.UseVisualStyleBackColor = true;
bGrabar.Text = "Grabar";
// botón salir
Button bSalir = new Button();
bSalir.Parent = flpBotones;
bSalir.Click += new EventHandler(bSalirClick);
//void bGrabarClick(object sender, System.EventArgs e)
bSalir.UseVisualStyleBackColor = true;
bSalir.Text = "Salir";
}
public EdicionConControles()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
this.InicializarControles();
}
void bGrabarClick(object sender, System.EventArgs e)
{
MessageBox.Show("Botón de grabar");
}
void bSalirClick(object sender, System.EventArgs e)
{
MessageBox.Show("Botón de Salir");
}
}
}
25/1/06
¿Qué observar en una vivienda ya construida?
Por lo visto hay que mirar:
- Estado de las zonas comunes, tanto internas como externas: jardines, fachada, cubierta, portal, ascensor, escaleras.
- Situación de la vivienda dentro del edificio.
- Situación del garaje y del trastero dentro del edificio.
- Distribución de la vivienda.
- Habitaciones interiores y exteriores.
- Metros cuadrados útiles y construidos.
- Superficies de cada hueco y distancia entre tabiques.
- Situación de pilares, salidas de humo, ventilación y tuberías.
- Calidad de los materiales de construcción de la vivienda y del edificio.
- Situación de las tomas de electricidad, luz y TV.
- Estado de suelos, paredes y techos.
- Calefacción y agua. Servicios centrales o individuales.
- Presión del agua en los grifos.
- Aire acondicionado.
- Armarios empotrados.
- Cocina amueblada.
- Aislamiento térmico.
- Aislamiento acústico.
18/1/06
Programar para Outlook
{
System.Windows.Forms.Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
Outlook.ContactItem ci;
Outlook.Application outlook = new Outlook.ApplicationClass();
ci = outlook.CreateItem(Outlook.OlItemType.olContactItem) as Outlook.ContactItem;
ci.NickName = "NickName";
ci.FullName = "FullName" + System.DateTime.Now.ToLongTimeString();;
ci.JobTitle = "JobTitle";
ci.CompanyName = "CAM Informática";
ci.Save();
}
http://msdn.microsoft.com/office/understanding/outlook/codesamples/default
.aspx?pull=/library/en-us/dno2k3ta/html/odc_ac_olauto.asp
Create a Contact Item in Outlook
This section shows you how to use automation from an Access form to start Outlook and to display a new contact screen for input. You can change just one line of code to make this example apply to a new Outlook appointment,
journal entry, mail message, note, post, or task.
The following sample shows you how to create a form in Access that starts
Outlook from a command button. Then the automation code opens a new
contact screen for input in Outlook. After you add the contact, save, and
close the contact form, the automation code quits Outlook and returns to
the Access form.
To create a contact item in Outlook from an Access form, follow these
steps:
1. Open the sample database Automation.mdb created earlier.
2. Create a form that is not based on any table or query, add a command
button the form, and make the following property assignments:
Form: (save as frmOutlook) - Caption: Add to Outlook Form
Command button -
Name: cmdOutlook
Caption: Start Outlook\
OnClick: [Event Procedure]
3. On the View menu, click Code to open the Visual Basic Editor.
4. On the Tools menu, click References.
5. Click Microsoft Outlook 11.0 Object Library in the Available
References list.
6. Click OK to close the References dialog box.
7. Type or paste the following procedure in the OnClick event of the
command button:
Option Compare Database
Option Explicit
Public Sub cmdOutlook_Click ()
On Error GoTo StartError
Dim objOutlook As Object
Dim objItem As Object
'Create a Microsoft Outlook object.
Set objOutlook = CreateObject("Outlook.Application")
'Create and open a new contact form for input.
Set objItem = objOutlook.CreateItem(olContactItem)
'To create a new appointment, journal entry, email message,
note, post,
'or task, replace olContactItem above with one of the following:
'
' Appointment = olAppointmentItem
'Journal Entry = olJournalItem
'Email Message = olMailItem
' Note = olNoteItem
' Post = olPostItem
' Task = olTaskItem
objItem.Display
'Quit Microsoft Outlook.
Set objOutlook = Nothing
Exit Sub
StartError:
MsgBox "Error: " & Err & " " & Error
Exit Sub
End Sub
8. On the File menu, click Close and Return to Microsoft Access, and
switch the form to Form View.
9. Click Start Outlook. Notice that Outlook displays a new contact
screen.
10. Fill in the contact information for a new contact and click
Save and Close.
11. Start Outlook and click the Contacts in the Navigation pane.
Notice the contact shows up in the list of contacts.
9/1/06
21/12/05
El error de programar (Mensaje enviado a barrapunto. No tiene desperdicio)
» Me preguntaba como algunos juegos que me compraba no estaba escritos en “basic” sino que venían en un extraño fichero ilegible cuyo nombre acababa en exe. Que cosa más extraña. Además esos juegos se ejecutaban más rápido que los programitas que yo hacía con el “basic”. Me compré revistas sobre el tema y...bingo!...eran un fichero ejecutable. Mi curiosidad se disparó, quería un nuevo ordenador más rápido y quería un compilador de lenguaje C. Quería hacer cosas profesionales, convertirme en un verdadero hacker de la informática. A esto ayudaba el montón de películas de hackers adolescentes (como yo en aquella época), que empezaron a salir a la palestra por aquella época. Recuerdo una que me marcó mucho. Se titulaba “Juegos de Guerra”, protagonizada por Mathew Broderik. La peliculita iba de un chaval “hacker” de poco más de 16 años que ponía en jaque al gobierno americano desde el ordenador de su habitación. En aquella época yo quería ser como él. Tenía muchos pájaros en la cabeza.
» Ya con 15 años tuve acceso a un imponente 8086, 640 KB, pantalla color, uff, vaya máquina. Y yo con mi compilador en C que me compré por correo. Me hice todo un experto en C, C++, gracias a los libros que venían con el compilador, que dicho sea de paso me costó una pasta (nadie me lo copió...). Tenía yo 17 años cuando estaba acabando COU (Curso de Orientación Universitaria, para los jovenzuelos que no sepan lo que es), corría el año 1992, las olimpiadas y la Expo de Sevilla. En aquellos tiempos ya era todo un “viciado” de la informática. Y me pregunté ¿Qué voy a hacer?. ¡Quiero estudiar informática! Allí me enseñarán todos los secretos que ahora no se (no había internet), me convertiré en hacker y ganaré mucho dinero. Que equivocado estaba....
» Aprobé, por poco, la selectividad y entré. ¡Estoy dentro! ¡Lo conseguí! No cantes victoria, insensato, eso me diría a mi mismo si pudiera volver al pasado. Pero no puedo. Bueno, comencé el primer año con un entusiasmo desbordante, aprobé todas las asignaturas y creo recordar en una o dos saqué matrícula de honor. Pensaba que esos conocimientos me serían muy útiles. Por aquella época, 1994, ya comenzaba a implantarse internet en la universidad pero a muy baja escala. Casi todos los aprendices de hackers iban cargados de disketes a la universidad para llenarlos de fotos guarras, aprovechando que allí había acceso por internet a algunos foros y news que colgaban dicho material. Si es que...lo primero es lo primero....Al poco tiempo internet comenzó a estar accesible en los hogares con los modems de poquitos baudios a través de la línea telefónica pero pocos se lo podían permitir.
» Lo primero que noté en mi primer año de Ingeniería Técnica Informática (más tarde me pasaría a la superior) fue la total y absoluta ausencia del sexo femenino en mi puñetera facultad. Eso fue muy duro para mi, pero mi vocación era entonces lo más importante. Las clases se hacían eternas, aquello era el servicio militar, ni una mujer, y las pocas que habían no sabias si realmente lo eran o no. Que conste que he conocido a chicas muy guapas durante la carrera pero la mayoría eran trolls disfrazados de veintiañeras. Supongo que para ellas sería el paraíso, pues estaban muy solicitadas, no es de extrañar, con un ejercito de “futuros hackers” con las hormonas a flor de piel. Para mi no fue el paraíso, fue algo muy duro. Menos mal que existía la biblioteca de la universidad y allí si que había material, umm, jeje. Bueno, dejando a parte el tema de las mujeres, volvamos al tema que nos importa ahora. No solo lo pase mal por esta cuestión sino porque me di cuenta, ya debería ir por el tercer año cuando noté esto, que me estaba volviendo muy, muy introvertido.
» Esto lo notaba en que cuando pasaba dos o tres horas delante de la pantalla, si venía alguien a hablar conmigo o yo tenía que hablar con alguien, me notaba muy nervioso. Eso también me pasaba en mi casa, era como que estar con el ordenador me desconectaba del mundo y luego cuando volvía a este me encontraba con que no reaccionaba demasiado bien a las situaciones. Creo que esto lo habréis sentido la mayoría que ha programado alguna vez o que pasa mucho tiempo frente a la pantalla del puñetero ordenador. Otra cosa que no soportaba ya por aquella época era la puta manía que tienen los ordenadores de dar fallos inexplicables, eso me volvía loco, me pasaba horas y horas, incluso durmiendo, pensando en el puto problema de ayer y que podría haber sido, era insoportable. Además tenía la mala costumbre de querer programar por mi cuenta y hacer pequeños proyectos, sobre todo de gráficos y juegos, que me quitaban mucho tiempo y que a veces me volvían loco con su putos errores.
» Ya por aquella época, con 20 años, me gustaba enseñar lo que hacía a mis padres y amigos (los pocos que tenía porque con el tiempo que pasaba frente a la puñetera pantalla no me daba tiempo para tener nada). Con 13 o 14 años también enseñaba los programas que hacía, pero entonces no me daba cuenta de las verdaderas reacciones de los “espectadores”. ¡Me mentían! Me decían que en realidad era muy bonito y que siguiera haciendo cosas. Pero en realidad pensaban: “Vaya forma más tonta de perder el tiempo, anda que yo iba a estar ahí haciendo el gilipollas con la maquinita”. Con 20 años ya había hecho algún que otro programa. Hice uno de un mapa de España que me costó un huevo y parte del otro y cuando se lo enseñé a mi padre descubrí otra cosa nueva sobre la informática, “el trabajo del informático NADIE LO VE”. Daba igual que me hubiera costado dos meses hacer aquel puto mapa de España, a mi padre no se le ocurrió otra cosa que decirme: “y ¿no puedes hacer que salgan también los ríos, las montañas, etc?” Estuve a punto de responderle: “si claro, y también puedo hacer que salgamos nosotros, y los extraterrestes y la puta madre que los pario, ¡no te jode!”. Nada de valorar mi trabajo. Se creería que lo había hecho en unas horas.... Desde entonces aprendí que el trabajo del informático solo es valorado por uno mismo, los demás no tienen ni puta idea de lo que cuesta. Solo un informático puede valorar el trabajo de otro informático, es una verdad como un templo, vaya puta mierda de verdad.
» Pero sigamos que aún hay más. No os durmáis. Por aquella época ya me estaba dando cuenta de muchas cosas. Antes parece que vivía en la inopia. Creo que fue porque por aquella época se creía que la informática tendría mucho futuro y ganaríamos una pasta, hablo del año 1995 aproximadamente. Por entonces yo tenía la irreal idea de que al final los ordenadores podría llegar a tener consciencia y yo sería uno de los científicos que sabría descifrar los enigmas del cerebro y de la consciencia. Uff, cuantos pájaros en la cabeza!, que equivocado que estaba!. Los ordenadores nunca tendrán consciencia, si lo dudáis solo teneis que pasaos por una clase de universidad de inteligencia artificial, redes neuronales, etc, os daréis cuenta de la moto que os quieren vender. Bueno, volviendo al tema, con 20 años y un futuro prometedor de ingeniero informático olvidé todos estos problemas y seguí adelante con mi vocación de “hacker adolescente”, pero los años pasaban y la realidad no se parecía a las películas. ¡Las películas son un fraude! ¡Vaya descubrimiento chaval!.
» Llegamos a 1996, me paso de la técnica a la superior, umm, ya soy yo un tío importante, voy a ser ingeniero superior, ¡vaya gilipollez! Seguí estudiando y estudiando como un negro, porque la puta carrera era difícil de cojones, pero lo peor de todo es que las cosas más difíciles de la carrera son las que menos me sirven ahora. Bueno voy a abreviar un poco. Año 2000 acabo la carrera. Vale. Ahora a trabajar. Pero...¿a trabajar de que?. Encontré trabajo y ahora os voy a hablar de mi experiencia laboral.
» Si os tengo que resumir en una palabra el trabajo de programador, esta palabra sería AISLAMIENTO. El trabajo del informático no es un trabajo normal. Es un trabajo muy estresante. Dependes de una maquina la cual puede tener infinitos fallos, que tú debes resolver. Es un trabajo en el que estás solo, repito, solo. Es un trabajo mental que no dura solo las horas de trabajo sino que te lo llevas a casa. El mejor ejemplo que puedo poner de llevarte trabajo a casa es cuando intentas compilar una cosa y el puto compilador te da un error inexplicable que nadie en el mundo sabe lo que significa, esa sensación de impotencia no se la deseo a nadie. No me puedo imaginar un trabajo que pueda provocar esa puta sensación de indefensión frente a la jodida máquina, dan ganas de darle una patada al puto ordenador y mandarlo a tomar por culo. Puedes pasar días con ese puto error (a mi me ha pasado) y nadie en el mundo (ni con internet) sabe lo que pasa, y tu trabajo depende de eso, es desolador, desquiciante, puede acabar con la moral de cualquiera.
» Por no hablar del tipo de jefes y de compañeros que te sueles encontrar. El tipo de jefe suele ser el típico “listo” que ha llegado allí por enchufe, no tiene porque se ingeniero en informática ni nada, todo vale, teleco, matemático, físico, químico, abogado, ¿fontanero?, da lo mismo, programar sabe todo el mundo. Por supuesto el piensa que tu titulo de ingeniero no vale nada, pues el está por encima de ti y además sin estudiar. Demostrar a alguien que no sabe de informática lo bueno que eres es imposible. La valía de un informático no suele importar. Lo que importa es que tragues con todo sin rechistar. Los compañeros suelen ser por lo general otros “pringaos” como tu. Suelen ser buenas personas, serios, introvertidos, como no puede ser de otra manera pues las horas frente al ordenador dejan su marca. Tu estás en el mismo saco que ellos, y tenéis los mismos problemas, a excepción de los trepas, que con esos mejor ni hablar. En mi trabajo pasábamos la mitad del tiempo maldiciendo a los trepas y el puto día que decidimos dedicarnos a la informática. Es de los peores trabajos que puedo imaginar. Después está el sueldo que es una puta miseria y que en los últimos años la cosa va a peor. Todo son becarios, contratos de practicas, y si no te gusta pues a la calle, que ya vendrá otro de fp a hacer tu trabajo.
» Trabajar de programador es un trabajo que mina la moral de cualquiera. Es un trabajo en el que nunca puedes dejar de estudiar cosas intrascendentes y que a nadie, es decir, a nadie en el puto mundo, con dos dedos de frente, se le ocurriría estudiarlas. Cada dos por tres aparecen nuevas putas APIs (Application Programming Interface, para los que no saben lo que significa) que vete tu a saber quien coño las habrá programado para hacerlas tan enrevesadas, nuevos leguajes que aparecen cada dos meses salidos de no se sabe donde, ni para que. Esto no era la informática que yo me había imaginado de pequeño, esto es un puto infierno. Pero hablemos un poco más de los compañeros. Lo peor es dar con el “friki” de turno viciado hasta la muerte con la informática, que sabe todas las pijadas, la tarjeta gráfica más potente, el procesador top, etc, pero que en realidad sabe menos que tú de la “informática real”. Lo malo es que aunque él sepa menos que tú, da la impresión, al jefe, de que sabe más, y en el mundo de la informática la apariencia que des lo es todo. Da igual que seas un programador en C++ de la ostia y quites el sentio con tus bucles while, ¡da lo mismo! si no pareces un “friki” de la informática no se te va a valorar.
» Más cosas de trabajar como informático. Es un trabajo que esta muy mal visto. Dices que eres informático y la gente casi que te da el pésame y te acompaña en el sentimiento. La sabiduría popular es muy grande, se huele que trabajar de informático no es ningún chollo, independientemente del sueldo. Se hacen horas extraordinarias que nunca se pagan, y si no te gusta a la calle. Lo peor de todo, según mi punto de vista, es que tienes que estar siempre actualizándote, es decir, después de haber aprendido un puto leguaje de programación que a nadie en su sano juicio se le hubiera ocurrido aprendérselo, ahora parece que ya no sirve y te tienes que aprender otro que hace lo mismo, pero que es totalmente diferente del anterior. Es decir, el informático siempre tiene la cabeza llena de cosas que NO LE IMPORTAN A NADIE y eso al final se nota. El trabajo mental del informático equivale al trabajo mental que realizan 50 fontaneros, o 200 barrenderos, etc, es decir, la mente del informático es explotada sin piedad y además te pagan cuatro duros.
» Un ejemplo, lunes 9 AM, llega mi jefe: “Mira, te tienes que estudiar está bonita API de 500 páginas, creo que una semana podrás, y después me haces un programa en leguaje x2r4 que extraiga la retribución incremental de los registros impares al cuadrado, lo compilas, me haces una librería dinámica, lo documentas todo, y me hace una interfaz de usuario ¿lo has entendido? Ok. Tiene que estar en dos semanas ehh. No te duermas”.
» Y yo pienso: “¿Que cojones hago yo aquí aprendiéndome una puta API de los cojones, para hacer un puto programa sin sentido, por cuatro duros y además aguantar que mi jefe se lleve todo el mérito, ¿Qué cojones hago aquí si cualquiera con menos estudios cobra más que yo, y además, en su trabajo, no se tiene que aprender putas APIs, ni gilipolleces que a nadie le importan? En resumen, ¿Qué cojones hago yo aquí?”
» Bueno, ¡como veis no me gusta la informática! Me gustaba, pero ahora sé lo que es, ¡y la odio!
» Odio saber que he sido engañado desde pequeño, por mi mismo y por la sociedad, diciéndome lo bonita que era la informática y su gran futuro, TODO ERA MENTIRA. Odio que la informática sea una PUTA MIERDA y que yo no me haya dado cuenta antes. Odio los putos errores de los ordenadores, compiladores, interpretes, y demás mierda, que tantas horas me han hecho pasar en vela sin saber que hacer. Odio estar horas y horas frente al ordenador programando cosas que ¡NO LE IMPORTAN A NADIE! Odio llegar a casa y estar pensando horas y horas en problemas que NO ME IMPORTAN NI A MI, ¡NI A NADIE! Odio que mi profesión no se valoré pues NADIE tiene ni puta idea del trabajo que hay detrás de lo que yo hago. Odio que mi trabajo no se pueda ver, pues nadie que no sea informático tiene ni puta idea de lo que significa un proyecto informático, una línea de código fuente, un compilador, una instrucción for, o un puto puntero a char. Odio trabajar sentado todo el puto día delante de un ordenador escribiendo gilipolleces en una pantalla, escritas en un lenguaje que no significa nada, que no sirve para nada y que no le importa a nadie. Odio haber estudiado 6 años de mi vida una puta carrera que NO SIRVE PARA NADA más que para poder hacer oposiciones de grupo A. Odio estar horas y horas programando y levantarme y tener la sensación de que todo lo que he estado haciendo durante ese tiempo es una PUTA GILIPOLLEZ SIN SENTIDO ALGUNO.
» Tengo que decir que no estoy alterado y que todo esto lo digo desde la frialdad más absoluta. Es mi experiencia y así la cuento, cada uno puede interpretar o intuir la verdad que pueda haber detrás de mis palabras. Muchos me entenderán e incluso les habré quitado las palabras de la boca. La informática es una profesión muy dura y desagradecida, solo valdría la pena si estuviera extremadamente bien remunerada, y aún así, yo no volvería nunca. Prefiero barrer un suelo a escribir una línea más de código fuente. Por lo menos así la gente sabría cual es mi trabajo y mi mente no estaría inundada de palabras clave sin sentido, de punteros a ninguna parte, de bytes incompletos o de bits desesperados. Quiero que mi mente no este, nunca más, llena de esa basura informática que nadie entiende, que nadie comprende ni desea, que no sirve para nada y que es absolutamente agotadora.
» A los que os estéis planteando estudiar informática, lo único que os puedo decir, es: ¿Habéis sentido alguna vez esa frustración que se siente cuando no eres dueño de la situación y no puedes hacer nada para arreglar el problema? Pues esa sensación tan abominablemente desgarradora es la que tendréis a lo largo de vuestra “vida informática”. Una sensación de estar haciendo cosas que no tienen sentido, que no valen para nada y que no importan a nadie. Dependeréis de una máquina falible, que fallará cuando menos te lo esperes. Cuando creas que nada puede ir mal, el compilador te dará un error inexplicable que nadie sabrá lo que significa. Cuando después de días enteros sin dormir, creas que lo has hecho todo bien y que nada puede fallar, el sistema operativo se borrará a sí mismo entrando en un bucle de formateo de todo el disco duro y no podrás hacer nada para evitarlo. Cuando creas que tu trabajo será valorado, te darás cuenta de que a nadie le importa. Cuando creas que la informática puede llenar tu vida, te darás cuenta de que la informática no tiene ningún sentido.
» Tenemos tanto intrusismo profesional porque nuestro trabajo es una MIERDA y la mierda atrae a las moscas».
12/12/05
Crear un jpg desde C#
System.Drawing.Bitmap b = new System.Drawing.Bitmap(200,200);
System.Drawing.Graphics g = Graphics.FromImage(b);
g.DrawString("hola",new System.Drawing.Font("Arial",20),System.Drawing.Brushes.Red,new System.Drawing.Rectangle(0,0,100,100));
b.Save("c:\\borrame.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
b.Dispose();


