Un programa en php que tiene que hacer muchas operaciones con la base de datos (lo cual tarda un tiempo considerable ya que hace un merge de una base grande casi completa) me tiraba el error...
Fatal error: Maximum execution time of 30 seconds exceeded in xxxx
Para arreglar el problema desde PHP le defino mas time_limit al script usando la función
set_time_limit(600);
... que limita el tiempo máximo de ejecución del script... acá más info: http://php.net/manual/es/function.set-time-limit.php
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
lunes, 11 de noviembre de 2013
Cambiar timeout en php
Cómo setear variables globales en MySQL
Desde línea de comandos (consola linux)...
Listo!
:-P
#>mysql -uroot -e "show variables like '%timeout';" -p
+----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | connect_timeout | 10 | | delayed_insert_timeout | 300 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 28800 | | net_read_timeout | 30 | | net_write_timeout | 60 | | slave_net_timeout | 3600 | | table_lock_wait_timeout | 50 | | wait_timeout | 28800 | +----------------------------+-------+
10 rows in set (0.00 sec)
#>mysql -uroot -e "SET GLOBAL net_read_timeout=600;" -p
#>mysql -uroot -e "show variables like '%timeout';" -p
+----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | connect_timeout | 10 | | delayed_insert_timeout | 300 | | innodb_lock_wait_timeout | 50 | | innodb_rollback_on_timeout | OFF | | interactive_timeout | 28800 | | net_read_timeout | 600 | | net_write_timeout | 60 | | slave_net_timeout | 3600 | | table_lock_wait_timeout | 50 | | wait_timeout | 28800 | +----------------------------+-------+10 rows in set (0.00 sec)
Listo!
:-P
lunes, 8 de julio de 2013
Imprimir en impresora de etiquetas SATO desde PowerShell
Aquí les dejo un pequeño programa que me habilita la impresión desde PowerShell en impresoras de etiquetas SATO. (parte del código salio de http://social.msdn.microsoft.com/Forums/en-US/94967169-a9ee-45db-9c8a-acd6f173680d/rawprinthelper-for-bold-font)...
El archivo PrinterHelper.ps1 es
Con lo que estaríamos imprimiendo una etiqueta con el valor 555 en code39, imprimiendo el número 555 debajo.
Esta misma clase se puede usar para imprimir desde .Net (con c#)
El archivo PrinterHelper.ps1 es
clear
$src = @'
using System;
using System.IO;
using System.Runtime.InteropServices;
public class RawPrinterHelper
{
// Structure and API declarions:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)]
public string pDocName;
[MarshalAs(UnmanagedType.LPStr)]
public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)]
public string pDataType;
}
#region "Imports"
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
#endregion
public RawPrinterHelper(){}
// SendBytesToPrinter()
// When the function is given a printer name and an unmanaged array
// of bytes, the function sends those bytes to the print queue.
// Returns true on success, false on failure.
public bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My document";
di.pDataType = "RAW";
try
{
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
}
catch (Exception ex)
{
throw (ex);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
szString = reemplazarCaracteres(szString);
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
private string reemplazarCaracteres(string PrintCommand)
{
PrintCommand = PrintCommand.Replace("<STX>", ((char)02).ToString());
PrintCommand = PrintCommand.Replace("<ETX>", ((char)03).ToString());
PrintCommand = PrintCommand.Replace("<ESC>", ((char)27).ToString());
return PrintCommand;
}
}
'@
Add-Type -TypeDefinition $src -Language CSharpVersion3
$PrinterHelper = new-object RawPrinterHelper
Su uso es simple, por ejemplo desde otro archivo ps1 hacemos. .\PrinterHelper.ps1
$PrinterHelper.SendStringToPrinter('\\PROG03\sato cg408', '<STX><ESC>A1002400880<ESC>A<ESC>H0030<ESC>V0030<ESC>BT101030100<ESC>BW03100*555*<ESC>H0030<ESC>V0133<ESC>WB0555<ESC>Q1<ESC>Z<ETX>')
Con lo que estaríamos imprimiendo una etiqueta con el valor 555 en code39, imprimiendo el número 555 debajo.
Esta misma clase se puede usar para imprimir desde .Net (con c#)
Etiquetas:
.NET,
C#,
imprimir,
PowerShell,
programación,
SATO,
SBPL,
script,
shell
jueves, 23 de mayo de 2013
Powershell y passwords
EnPower Shell a veces tenemos la necesidad de manejar claves, para lo que tenemos que por ejemplo para leer una clave y que aparezcan los típicos asteriscos, cada vez que pulsamos una tecla hacemos:
Donde, con "-AsSecureString" le indicamos que guarde lo ingresado en un string seguro. Bueno, ahora si ponemos
vemos que la respuesta es
Lo cual nos deja un poco perplejos, para ver el valor ingresado debemos hacer
...lo que nos mostrará la clave ingresada por el usuario.
$psw = Read-Host "Ingrese la clave" -AsSecureString
Donde, con "-AsSecureString" le indicamos que guarde lo ingresado en un string seguro. Bueno, ahora si ponemos
Write-Host $psw
vemos que la respuesta es
System.Security.SecureString
Lo cual nos deja un poco perplejos, para ver el valor ingresado debemos hacer
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($psw) Write-Host [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
...lo que nos mostrará la clave ingresada por el usuario.
Etiquetas:
Power Shell,
PowerShell,
programación,
script
miércoles, 15 de mayo de 2013
PowerShell: Búsqueda Binaria en arrays de objetos personalizados
El problema del IComparer
Siguiendo con el tema de la búsqueda rápida (haciendo búsqueda binaria), en éste artículo ya había encontrado cómo hacer una búsqueda binaria sobre un ArrayList desde Power Shell, pero al complicar un poco el tema, usando arreglos de objetos propios encontré un problema...El problema es que al ser objetos propios debemos indicarle sobre qué campo hacer la búsqueda y cómo se ordenan los objetos... El mismo problema tenemos al ordenar (hacer un sort) sobre un Array o ArrayList.
Veamos a un ejemplo, tenemos un ArrayList de objetos Empleado, con atributos Nombre, Apellido, Legajo... por ej uso esta funcion para crearlos:
function Nuevo-Empleado(){
param ($Nombre, $Apellido, $Codigo)
$empleado= New-Object PSObject
$empleado| Add-Member -type NoteProperty -Name Nombre -Value $Nombre
$empleado| Add-Member -type NoteProperty -Name Apellido -Value $Apellido
$empleado| Add-Member -type NoteProperty -Name Legajo -Value $Codigo
return $empleado
}
Y supongamos que los cargamos de un archivo csv desordenado y queremos buscar por nro de legajo...
[System.Collections.ArrayList] $listaEmpleados = New-Object System.Collections.ArrayList $listaEmpleados = Import-Csv-h Nombre, Apellido, Codigo
$ listaEmpleados = $ listaEmpleados | sort Codigo# ordeno por codigo
Ahora el tema es.. cómo hace para ordenar por código... bueno, supongamos que código es string... luego, para poder hacer el BinarySearch...
La función de comparación
$src = @'
using System;
using System.Collections;
using System.Management.Automation;
public sealed class ScriptBlockComparer : IComparer
{
ScriptBlock _Comparer;
public ScriptBlockComparer(ScriptBlock Comparer) { ComparerScript = Comparer; }
public ScriptBlock ComparerScript
{
get { return _Comparer; }
set { _Comparer = value; }
}
public int Compare(object x, object y)
{
try {
return (int)ComparerScript.Invoke(x, y)[0].BaseObject;
} catch(Exception ex) {
throw new InvalidOperationException("Comparer Script failed to return an integer!", ex);
}
}
}
'@
Add-Type -TypeDefinition $src -Language CSharpVersion3
$cmp = New-Object ScriptBlockComparer {
Param($primero, $segundo)
$pos = $primero.Codigo.CompareTo($segundo)
return $pos
}
.......
..........
mas codigo
...........
... y...
$pos = $list.BinarySearch($codigoABuscar, $cmp)
Y nos devuelve en pos la posición del elemento buscado en el array (empezando desde 0) y un nro <0 si no se encontró. Espero les sirva de ayuda!
Nota: si les tira error con la version de .Net pueden intentar cambiar
Add-Type -TypeDefinition $src -Language CSharpVersion3
Por:
Add-Type -TypeDefinition $src -Language CSharp
Ya que espera tener instalado el Framework .Net versión 3.5
Etiquetas:
binaria,
búsqueda,
IComparer,
Power Shell,
PowerShell,
programación
viernes, 5 de abril de 2013
Algunas cosas sobre el comando sc
Crear y eliminar servicios en windows desde línea de comandos.
El comando sc, sirve para, entre otras cosas instalar y desinstalar servicios...Por ejemplo para instalar
sc create nombre_de_mi_servicio binPath= path_del_exe start= auto
Prestar atención a que después de binPath= hay un espacio en blanco y despues el path, así se ponen los parametros, dejando un espacio en blanco, sino no funciona (loquísimo!), igual en start= auto y los demás...
Para eliminar el servicio
sc delete nombre_de_mi_servicio
También hay otros parámetros como start , para iniciar el servicio, stop para detenerlo, y el más útil "sc help" nos da la ayuda sobre SC...
Nota:
Cuando estaba probando instalar mi servicio, tuve que instalarlo y desinstalarlo varias veces con distintos parámetros. Pero me pasaba que una vez desinstalado, cuando quería reinstalarlo me tiraba el siguiente mensaje de error:The specified service has been marked for deletion.
... y no me instalaba el servicio nuevamente.
A poco de probar descubrí que la "culpa" de ese error la tenía la consola de servicios de windows (ctrl-alt-del -> start task manager -> solapa Services -> botón Services), mientras estaba abierta tira ese error, cuando la cierro el error deja de ocurrir.
Etiquetas:
instalar,
pc,
pcs,
programación,
windows
jueves, 10 de enero de 2013
Mouse click en PowerShell
Tuve que recorrer media internet para encontrar finalmente como hacer un click del mouse con Power Shell sin tener que usar otros programas externos. Así que acá finalmente pude armar una función que hace clicks del mouse en la posición indicada de la pantalla...
# Ejecuta un click del mouse
function MouseClick ($Button = "left", $x, $y, $cant = 1){
$signature = @'
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
'@
[Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point($x, $y);
$SendMouseClick = Add-Type -memberDefinition $signature -name "Win32MouseEventNew" -namespace Win32Functions -passThru
for ($i = 1; $i -le $cant; $i++){
if($Button -eq "left"){
$SendMouseClick::mouse_event(0x00000002, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000004, 0, 0, 0, 0);
}
if($Button -eq "right"){
$SendMouseClick::mouse_event(0x00000008, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000010, 0, 0, 0, 0);
}
if($Button -eq "middle"){
$SendMouseClick::mouse_event(0x00000020, 0, 0, 0, 0);
$SendMouseClick::mouse_event(0x00000040, 0, 0, 0, 0);
}
}
}
Etiquetas:
Power Shell,
PowerShell,
programación,
script,
software
lunes, 7 de enero de 2013
Tips PowerShell
- Para ejecutar desde la consola DOS usar: powershell <path del script> o bien powershell .\nombre_del_script.ps1 en caso que esté en el mismo directorio.
- Los comentarios dentro de los script se inician con numeral (#)
- Algunas funciones útiles
- Escribir texto en colores por la consola DOS:
- Escribir una línea en color: Write-Host "Texto rojo en fondo verde" -foregroundcolor red -backgroundcolor green
- Cambiar los colores de la consola: $HOST.UI.RawUI.BackgroundColor = "Black"
$HOST.UI.RawUI.ForegroundColor = "Red" - Para detener la ejecución del programa: Start-Sleep -m 10000 si se usa -m se refiere a milisegundos, si se quieren usar segundos se usa -s (ej Start-Sleep -1 10 es equivalente al ejemplo anterior)
- Para concatenar strings se usa el signo
+ Para invocar programas se usa &, por ejemplo & "C:\Program Files\Winamp\winamp.exe" abrirá el winamp. o bien $winamp = "C:\Program Files\Winamp\winamp.exe"
& $winampPara escribir comandos multilínea se usa el acento invertido `, ejemplo
$msg = "mi mensaje empieza en esta línea " + [Environment]::NewLine `
+ "... y sigue en esta segunda línea"[Environment]::NewLine es el caracter de nueva línea Apagar y reiniciar Stop-Computer para apagar la computadora Restart-Compute para reiniciar Ambos se pueden usar con la opción -computer "nombrepc1, nombrepc2, nombreotrapc, etc " -force para apagar o reiniciar computadoras que se encuentren en la red. Operaciones con archivos Borrar: Remove-Item c:\borrame.txt Copiar: Copy-Item Origen Destino Escribir en archivo: "escribime en archivo" > c:\archivo.txt Operadores de comparaci ón -eq: igual -ne: distinto -gt: mayor -ge: mayor o igua -lt: menor -le: menor o igual -like: comparacion entre caracteres -notlike: -like negado -match: Que machee el segundo operando -notmatch: -match negado Operadore lógicos -and: and lógico -or: or lógico -not: not lógico Finalizar la ejecución del programa: exit Variables de error (PowerShell utiliza varias variables globales para guardar estados de error y otras informaciones importantes) aquí algunas: $? contiene el estado de ejecución de la última operación. True indica que todo salio Ok, false indica que hubo error o ejecución parcial (se basa en el exit code de los programas windows, un exit code 0 debería indicar que todo termino ok, cualquier valor distinto de 0 indicaría error, pero no todos los programas respetan esta convención, ver $LASTEXITCODE). $LASTEXITCODE guarda el código de salida de la ejecución de la última operación, sirve para interpretar la salida de programas que no respeten la convención de exit code diferente de 0 para ejecuciones con errores o no completas (ver el punto anterior). $Error ArrayList de los errores ocurridos en la sesion, los nuevos errores se agregan al principio del arraylist, dejando el último error en posición 0. Otras $true es true $false es false $null es un objeto null $_ el objeto actual (por ejemplo en un foreach-object o en un where-object, etc) Para obtener la fecha y hora: get-date -format u
Try, catch, finally en PowerShell
Acá les dejo un ejemplo de try - catch - finally en powerwhell que me fue de utilidad
:-)
try
{
$ErrorActionPreference = "Stop"; #esto se hace para que stopee en los errores
Copy-Item file_origin file_dest #copio un archivo
}catch{
Write-Host $Error[0].exception # muestro el mensaje de error
$ErrorActionPreference = "Continue"; #vuelvo a setear la acción por defecto en los errores
Exit # Termino la ejecución si hubo error
}finally{
$ErrorActionPreference = "Continue"; #vuelvo a setear la acción por defecto en los errores
}
:-)
Etiquetas:
Power Shell,
PowerShell,
programación,
software
Power Shell - ¿Cómo llamar a una función que está en otro script?
Bueno, acá explico como llamar desde un script PowerShell (ps1) a una función que se encuentra en otro script...
Supongamos que tenemos los script funciones.ps1 y principal.ps1, siendo:
funciones.ps1:
Para llamar a la funcion test desde principal.ps1 se hace
En el ejemplo estoy llamando al script de forma relativa, suponiendo que están en el mismo directorio, si no fuera así habría que hacer algo tipo ". C:\<path del script funciones.ps1>\funciones.ps1...
Espero que les sea de utilidad....
Supongamos que tenemos los script funciones.ps1 y principal.ps1, siendo:
funciones.ps1:
Function test(){
Write-Host "Dentro de la funcion"
}
Para llamar a la funcion test desde principal.ps1 se hace
. .\funciones.ps1 # acá incluyo al script funciones.ps1
# notar que hay un espacio entre . y .\funciones.ps1
#luego llamo a la función
test
En el ejemplo estoy llamando al script de forma relativa, suponiendo que están en el mismo directorio, si no fuera así habría que hacer algo tipo ". C:\<path del script funciones.ps1>\funciones.ps1...
Espero que les sea de utilidad....
Etiquetas:
Power Shell,
PowerShell,
programación,
script,
software
jueves, 19 de julio de 2012
Cómo convertir una solución o proyecto de C# a VB.NET automáticamente
Muchas páginas permiten pasar pedazos de código de VB.Net a C# y viceversa, pero cuando uno tiene un proyecto o solución grande, utilizar éstas páginas para convertir de lenguaje suele ser tedioso y lento. Por eso para pasar una solución completa tuve que ponerme a buscar una mejor opción....
Luego de buscar bastante por internet encontré una mejor forma de hacerlo.
Para poder hacerlo hay que bajar un interesante programa de internet que se llama SharpDevelop (al momento de escribir este artículo en su version 4.2).
SharpDevelop es un interesane IDE de desarrollo en tecnología .NET el cual es gratuito y open-source, dispone de varios lenguajes para desarrollar (C#, VB.NET, C++, F#, Python, Ruby y algunas cosas más)... Es verdaderamente muy liviano y anda muy rápido, aunque lo utilicé poco le encontre un solo defecto importante: no permite, al estar haciendo debug modificar el código y seguir debuguiando (a no ser que reinicie el debug), esto se debe a que (según leí en sus foros) el compilador .NET deMicrosoft no tiene abierta la posibilidad de hacer esto (se me ocurre que así Microsoft se asegura que nadie pueda hacer un IDE mejor, o que le pueda competir al Visual Studio)...
Bueno, el tema es que este IDE, entre otras funcionalidades tiene la de convertir Proyectos enteros de un lenguaje a otro de los que tiene para desarrollar. :-)
Por ejemplo para pasar de C# a .NET mi proyecto hago lo siguiente, abro mi solución con SharpDevelop y en la solapa projects selecciono el proyecto a convertir y con botón derecho->Convert->From C# to VB.NET lo convierto y me deja una copia convertida del proyecto con el mismo nombre pero agregando .Converted... GENIAL!!!
Deja algún que otro pequeño error o advertencia, pero no muchas y fáciles de solucionar. Lo único que tardé un poco en darme cuenta fue que deja los Resources en
Global.<nombre proyecto>.Properties.Resources.<recurso>
cuando debería dejarlos en
Global.<nombre proyecto>.Resources.<recurso>
O sea sin el properties...
También que a algunos controles se "olvida" de ponerles el WithEvents cuando tienen eventos...
En algunas páginas deja los "Option Strict On" "Option Explicit On" sin estar exactamente al principio, lo cual genera algunos errores.
... Fuera de eso y alguna que otra advertencia ¡Compilo y anda!
Luego de buscar bastante por internet encontré una mejor forma de hacerlo.
Para poder hacerlo hay que bajar un interesante programa de internet que se llama SharpDevelop (al momento de escribir este artículo en su version 4.2).
SharpDevelop es un interesane IDE de desarrollo en tecnología .NET el cual es gratuito y open-source, dispone de varios lenguajes para desarrollar (C#, VB.NET, C++, F#, Python, Ruby y algunas cosas más)... Es verdaderamente muy liviano y anda muy rápido, aunque lo utilicé poco le encontre un solo defecto importante: no permite, al estar haciendo debug modificar el código y seguir debuguiando (a no ser que reinicie el debug), esto se debe a que (según leí en sus foros) el compilador .NET de
Bueno, el tema es que este IDE, entre otras funcionalidades tiene la de convertir Proyectos enteros de un lenguaje a otro de los que tiene para desarrollar. :-)
Por ejemplo para pasar de C# a .NET mi proyecto hago lo siguiente, abro mi solución con SharpDevelop y en la solapa projects selecciono el proyecto a convertir y con botón derecho->Convert->From C# to VB.NET lo convierto y me deja una copia convertida del proyecto con el mismo nombre pero agregando .Converted... GENIAL!!!
Deja algún que otro pequeño error o advertencia, pero no muchas y fáciles de solucionar. Lo único que tardé un poco en darme cuenta fue que deja los Resources en
Global.<nombre proyecto>.Properties.Resources.<recurso>
cuando debería dejarlos en
Global.<nombre proyecto>.Resources.<recurso>
O sea sin el properties...
También que a algunos controles se "olvida" de ponerles el WithEvents cuando tienen eventos...
En algunas páginas deja los "Option Strict On" "Option Explicit On" sin estar exactamente al principio, lo cual genera algunos errores.
... Fuera de eso y alguna que otra advertencia ¡Compilo y anda!
Etiquetas:
.NET,
C#,
programación,
VB,
Visual Studio 2008,
Visual Studio 2010,
VS2008,
VS2010,
windows,
WinForm
jueves, 12 de julio de 2012
Cómo convertir una solución de Visual Studio 2010 a 2008
Convertir una vieja solución de VS 2008 a VS 2010 es bastante fácil, se convierte automáticamente al abrirla con el nuevo VS, pero volver de uno en 2010 a ponerlo en 2008 no es tan simple (aunque tampoco es muy complicado).
E aquí los pasos a seguir...
Problemas que surgieron en algunos proyectos usando este método y como solucionarlos...
Tiro un mensaje 'Container' is ambiguous in the namespace 'System.ComponentModel': lo solucione quitando la referencia a System dentro de Referencias y luego agregándola nuevamente. (!?)
E aquí los pasos a seguir...
- Abra en el notepad, o en el programa de edición de texto que más le guste, en mi caso el NotePad++ (np++ http://notepad-plus-plus.org/) el archivo de la solución (el que termina en .sln).
- Busque la línea que dice "Microsoft Visual Studio Solution File, Format Version 11.00" y reemplace por "Microsoft Visual Studio Solution File, Format Version 10.00" (o sea, cambie la versión de 11 a 10.
- Busque la línea que dice "# Visual Studio 2010" y ponga "# Visual Studio 2008" (o sea, cambie 2010 por 2008.
- Busque con el explorador de windows y abra la carpeta "obj\x86\Debug" (se encuentra dentro de la carpeta de su proyecto), allí debe eliminar los archivo terminados en .chache.
- También busque y elimine los archivos .cache en la carpeta "obj\x86\Release"
- ¡Listo! ya puede abrir su solución en VS 2008.
Problemas que surgieron en algunos proyectos usando este método y como solucionarlos...
Tiro un mensaje 'Container' is ambiguous in the namespace 'System.ComponentModel': lo solucione quitando la referencia a System dentro de Referencias y luego agregándola nuevamente. (!?)
Etiquetas:
.NET,
programación,
Visual Studio 2008,
Visual Studio 2010,
VS2008,
VS2010
miércoles, 11 de julio de 2012
Obtener la posicion de un control respecto al parentform
Bueno, aquí un breve código que utilicé para obtener la posición de un control WinForm con respecto a su ParentForm, es útil si se quieren poner controles dinámicamente dentro de un formulario y cambiar su posición (por ejemplo posicionándolo al lado de otro control)... con c# .Net
using System.Drawing;
using System.Windows.Forms;
...
public class UserControlGeneral : UserControl
{
/// <summary>
/// Busca el Point donde está ubicado el control respecto del ParentForm
/// </summary>
/// <returns>Point</returns>
protected Point buscarLocationRespectoParentForm()
{
return buscarLocationRespectoParentForm(this);
}
/// <summary>
/// Busca el Point donde está ubicado el control que recibe de parámetro respecto del ParentForm
/// </summary>
/// <param name="control">Control al que se le quiere encontrar la posición</param>
/// <returns>Point</returns>
protected Point buscarLocationRespectoParentForm(Control control)
{
if (control.Parent == this.ParentForm)
{
return new Point(control.Location.X, control.Location.Y);
}
else
{
Point p = buscarLocationRespectoParentForm(control.Parent);
p.X += control.Location.X;
p.Y += control.Location.Y;
return p;
}
}
}
domingo, 24 de junio de 2012
Cómo ver si un programa está instalado en nuesta PC
Utilizando el registro de windows se pueden ver todos los programas instalados en nuestra máquina (o cualquier texto que esté en la registry de windows). El código que sigue a continuación se desarrolló para buscar una serie de programas instalados en un cliente.
El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);
Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;
Y siendo reg
RegistroWindows reg = new RegistroWindows();
Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.
El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);
Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;
Y siendo reg
RegistroWindows reg = new RegistroWindows();
Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.
using System;
using System.Collections.Generic;
using Microsoft.Win32;
namespace ProgramasInstalados.Clases
{
/// <summary>
/// Clase para trabajar con el registro de windows
/// </summary>
public class RegistroWindows
{
/// <summary>
/// Item a buscar
/// </summary>
public class itemBuscar
{
/// <summary>
/// Nombre del item o texto a buscar
/// </summary>
public string Nombre { get; set; }
public bool Encontrado { get; set; }
public string Paths { get; set; }
public itemBuscar(string nombre)
{
Nombre = nombre;
Encontrado = false;
Paths = "";
}
}
/// <summary>
/// Busca un texto en la registry
/// </summary>
/// <param name="registryKey">Clave del registro donde se realiza la busqueda (y en sus nodos hijo)</param>
/// <param name="buscar">Lista de items a buscar del tipo itemBuscar</param>
public void buscarEnLaRegistry(RegistryKey registryKey, List<itemBuscar> buscar)
{
foreach (string keyName in registryKey.GetSubKeyNames())// me fijo si esta en alguna clave de este nivel
{
if (!ignorar(keyName))// solo veo las claves que no estan en la lista de ignorar
{
try
{
using (RegistryKey rk = registryKey.OpenSubKey(keyName))
{
foreach (string valueName in rk.GetValueNames())
{
foreach (itemBuscar item in buscar)
{
string path = "";
if ((path = rk.GetValue(valueName).ToString()).ToLower().EndsWith(item.Nombre.ToLower()))// me fijo si tiene el .exe que estoy buscando
{// si no esta NO lo seteo en false porque podria haberlo encontrado antes
item.Encontrado = true;
if (!item.Paths.Contains(path))// me fijo que ya no este cargado
{
item.Paths += path;
}
}
}
}
buscarEnLaRegistry(rk, buscar);// me fijo si esta en alguno de sus hijos
}
}
catch (Exception)
{
}
}
}
}
/// <summary>
/// Verifica si keyName esta en la lista de ignorar (en los settings, sitting Excluir separado por comas)
/// </summary>
/// <param name="keyName">el string a buscar para ver si se debe ignorar</param>
/// <returns>true si se debe ignorar, sino false</returns>
private bool ignorar(string keyName)
{
foreach (string ignorar in ProgramasInstalados.Properties.Settings.Default.Excluir.Split(','))
{
// En settings guardo en un string separado por comas los nodos en los que no quiero
// que se busque dentro de la registry; ya que por ejemplo el nodo Microsoft tiene
// todos los programas que instalo Microsoft, tambien se puede evitar el nodo Windows
// ya que tiene los programas propios de windows, entre otros. Esto hace que sea mas
// rapida la busqueda dentro de la registry, ya que recorrerla completa si no es
// necesario insumiria bastante tiempo.
if (ignorar == keyName)
{
return true;
}
}
return false;
}
}
}
Etiquetas:
.exe,
.NET,
C#,
programación,
Registro de windows,
Registry,
windows
sábado, 23 de junio de 2012
Cómo ejecutar un programa con .NET C#
Con una simple instrucción se puede ejecutar un programa que esté instalado en nuestra pd desde .NET... con C# son un par de líneas:
try
{
Process.Start(item.Paths);
}
catch (Exception exception)
{
MessageBox.Show("Se ha producido un error al intentar abrir el programa." + Environment.NewLine + "Mensaje de error: " + exception.Message;);
}
Para que esto funcione hay que usar también: using System.Diagnostics;
miércoles, 25 de enero de 2012
¡No me digas que era eso!!!
Este es uno de esos errores tontos que pueden hacer perder mucho tiempo al programador.
Bueno, resulta que desarrollé un template (plantilla) para Joomla para un sitio web. En mi máquina local del laburo tengo instalado wamp para desarrollar en php. El tema es que hice todo mi sitio y una vez funcionando lo publicamos en el servidor.
Al publicarlo, lamentablemente, la planilla no se ve y aparece un mensaje de error: "Error. La plantilla no está disponible para esta presentación. Por favor, contacte con un administrador del sitio.".
Tras mucho maldecir y hacer distintas pruebas descubro cuál es el problema:
El tema vino por el lado de que linux es case sensitive en los archivos (diferencia entre mayúsculas y minúsculas), no así windows; por lo que si la plantilla se llama "MiPlantilla" o "miplantilla" en windows es indistinto, pero en linux no.
Cuando se tiene una plantilla en Joomla la misma va en el directorio templates en un directorio con el nombre de la plantilla. El nombre del directorio debe ser idéntico al de la plantilla para que funcione en linux, también revisar el xml de la plantilla que tenga el mismo nombre.
Bueno, resulta que desarrollé un template (plantilla) para Joomla para un sitio web. En mi máquina local del laburo tengo instalado wamp para desarrollar en php. El tema es que hice todo mi sitio y una vez funcionando lo publicamos en el servidor.
Al publicarlo, lamentablemente, la planilla no se ve y aparece un mensaje de error: "Error. La plantilla no está disponible para esta presentación. Por favor, contacte con un administrador del sitio.".
Tras mucho maldecir y hacer distintas pruebas descubro cuál es el problema:
El tema vino por el lado de que linux es case sensitive en los archivos (diferencia entre mayúsculas y minúsculas), no así windows; por lo que si la plantilla se llama "MiPlantilla" o "miplantilla" en windows es indistinto, pero en linux no.
Cuando se tiene una plantilla en Joomla la misma va en el directorio templates en un directorio con el nombre de la plantilla. El nombre del directorio debe ser idéntico al de la plantilla para que funcione en linux, también revisar el xml de la plantilla que tenga el mismo nombre.
Suscribirse a:
Entradas (Atom)