Category Archives: Windows

Recursively copy from a FTP server

In Linux (and also in the World of Windows), there is a small great tool called wget (you probably already know it, it’s pretty popular). I have been using it for some years know as it is very convenient for downloading files (or even entire HTML websites) from the command line (specially when you manage a Linux server through SSH). What I didn’t know about it was that it also allows you to recursively copy files from a FTP server (a task that is not usually pleasant).

This is how:

wget -r ftp://username:password@ftp.server.com/*

If the FTP username is something like this: user@somedomain.com, then, you should replace the @ by a + simbol, like this: user+somedomain.com.

Windows 7 failing to copy large files through network

I have faced problems copying large files (several hundreds megs) over a Windows Network between two Windows 7 boxes. During the copy, the process just freeze forever, and when trying to cancel it, it just tries forever without success.

At first I tough it was a antivirus/firewall issue, but disabling the software on both machines didn’t fix the problem. What really helped was this fix, that disables a feature called Auto-Tuning. It only takes one command on the Command Prompt (Start/Run: cmd) to bring it down:

netsh int tcp set global autotuninglevel=disabled

Then, restart the machine and voila, the problem should be gone.

If this does not fix your problem and want to re-enable this feature, just run:

netsh int tcp set global autotuninglevel=normal

Fixing WMI Service (root\cimv2 namespace missing)

I was working on a VBScript code that uses the Windows Management Instrumentation (WMI) to query the running processes on the local machine, something like this:

strComputer = "."
strProcess2Kill = "something.exe"
 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = " & strProcess2Kill)
 
For Each objProcess In colProcess
	'Now we will each one of the running processes "something.exe"
	objProcess.Terminate()
Next

This code works in, at least, Win2k, WinXP, WinVista and Win7 (not sure if works on WinNt 4). The problem I had (as you can see here) was that the box where it should have been deployed (Win2k) showed an 0x8004100E error (Namespace specified cannot be found) on the 4th line of the code.

When I ran the following script to query all the namespaces on root:

strComputer = "."
 
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root")
Set colNameSpaces = objSwbemServices.InstancesOf("__NAMESPACE")
 
For Each objNameSpace In colNameSpaces
 Wscript.Echo objNameSpace.Name
Next

I got this:

DEFAULT
SECURITY
WMI
directory
aspnet

As you can see, the CIMV2 namespace was not present and it should have been. So, something was wrong with the WMI installation on that box.

Then, I ran a very nice tool called wmidiag.vbs (pointed by user Uros Calakovic on my StackOverflow question) to diagnose several problems with WMI. Unfortunately, the tool gave me the same error and no proposed solution. He also mention a couple of interesting screencasts that more than one may find useful.

At the end, Google gave me the final answer once again. Reinstalling the WMI into the Windows Registry and rebuilding the WMI Repository did the trick (I did both, but maybe only the Repository rebuilding helped me this time).

In any case, to rebuild the WMI Repository, these are the only required steps:

  • Stop the WMI service (net stop winmgmt)
  • Go to %windows%/system32/wbem (in my win2k, winnt, on XP would be windows)
  • Rename or remove the repository directory
  • Start the WMI service again (net start winmgmt)

And for reinstalling WMI, you should run these commands on a console:

winmgmt /clearadap
winmgmt /kill
winmgmt /unregserver
winmgmt /regserver
winmgmt /resyncperf

Windows 7 bug affecting Subversion

There is a bug on Windows 7 (and Windows Server 2008 R2) that relates to corrupted files error messages and affects several SVN’s operations (like commit and update). The detailed error message you can get is something similar to:

svn: Can't move '[repo]\.svn\tmp\entries' to '[repo]\.svn\entries': The file or directory is corrupted and unreadable.

And you can even get a Windows error message telling you about a corrupted file.

As I found in here and here, there is nothing to be afraid of, it is just another bug/error on Windows that is going to be fixed on SP1 (but there is already a hotfix ready to install). I haven’t finished test it myself (just missing the restart after the hotfix installation).

The hotfix’s download requires you to give your email address to Microsoft before they send you the link where you can download it (some way annoying). I have uploaded on my own server to avoid the process if I need it again, so you can get it from here if you want (remember that you should NOT download executables from non-trusted sources as they can contain viruses and harm your computer).

Reinstalar Grub luego de instalar Windows

Luego de haber instalado Windows 7 hace algunos meses, en un equipo donde tenía tanto el Windows XP como Ubuntu 9.04, quedó inaccesible este último. Esto debido a que el instalador de Windows no reconoce otro sistema operativo que no sea propio de Microsoft (a diferencia de Linux).

Se debe tomar en cuenta NO utilizar el Live CD de Ubuntu 9.10 para restaurar el Grub de las versiones anteriores de Ubuntu. Esto debido a que Ubuntu 9.10 y posteriores utilizan Grub2, que difiere mucho de la primera versión.

Lo primero que se debe hacer es iniciar la máquina con algún Live CD de Linux (como el de Ubuntu, que es el que utilicé en el proceso).

Una vez que está funcionando, abrimos un terminal. Vamos a necesitar los privilegios del root, por lo que lo más práctico sería ir al shell respectivo:

sudo -i

Luego, creamos un punto de montaje para la partición de Ubuntu:

mkdir /mnt/linux

Después, montamos la partición:

mount /dev/sda2 /mnt/linux

Donde sda2 (sd porque es un disco SATA, a por ser el primer disco duro, y 2 por ser el número de la partición) es la partición donde se encuentra Ubuntu. Si no estamos seguros de cual es la partición, podemos usar el programa GParted (visual) o el comando:

fdisk -l

Una vez que está montada la partición, podemos corroborar que sea la partición listando los archivos en ella:

ls -la /mnt/linux
ls -la /mnt/linux/boot

Luego de que estamos seguros que es la partición correcta, pasamos a reinstalar el Grub mediante el siguiente comando:

grub-install --root-directory=/mnt/linux /dev/sda

En caso aparezca algún error o advertencia, podemos probar el siguiente comando:

grub-install --root-directory=/mnt/linux /dev/sda --recheck

Donde sda hace referencia al disco (usualmente el primario) cuyo MBR será utilizado para instalar el Grub (ojo que NO incluye el número de partición).

Reiniciamos y deberíamos ver ya el menú de booteo del Grub.

Vía: Ubuntu Documentation

Subrutinas para VBA

Por más que no sea un gran fan de Microsoft, debo admitir que el Office es un buen producto. A mi me gusta especialmente el Excel por la cantidad de cosas que se pueden hacer con él. Si además, lo utilizamos en conjunto con VBA (el pequeño entorno de desarrollo en Visual Basic que está metido dentro del Office), el número de posibilidades se incrementa exponencialmente. Es cierto que el VB está muy, muy lejos de ser el mejor lenguaje de programación, pero en este caso cumple su cometido (aunque muchas veces extrañe las ventajas de lenguajes más elaborados como C#).

Bueno, regresando al tema de este post, quería colocar acá algunas subrutinas que utilizo cuando programo en VBA. Creo que pueden ser útiles a más de uno, además que me sirven a mi cuando comienzo un nuevo proyecto.

' Adds a new worksheet to the current workbook.
' Name of the sheet should be pass as a parameter.
' If a sheet with the same name already exists, it is deleted prior creation.
Sub AddSheet(sheetName As String)
    RemoveSheet (sheetName)
    ' Added as last sheet
    Sheets.Add After:=Sheets(Sheets.count)
    Sheets(Sheets.count).name = sheetName
End Sub
 
' Deletes a worksheet from the current workbook.
Sub RemoveSheet(sheetName As String)
    Dim alerts As Boolean
    If SheetExists(sheetName) Then
        alerts = Application.DisplayAlerts
        ' Avoid alert on delete
        Application.DisplayAlerts = False
        Sheets(sheetName).Delete
        Application.DisplayAlerts = alerts
    End If
End Sub
 
' Returns TRUE if there is a worksheet with the given name on the active workbook.
Function SheetExists(sheetName As String) As Boolean
    SheetExists = False
    On Error GoTo NoSuchSheet
    If Len(Sheets(sheetName).name) > 0 Then
        SheetExists = True
        Exit Function
    End If
NoSuchSheet:
End Function

UPDATE: He encontrado que el cambio de nombre de la hoja en AddSheet puede fallar si existen hojas ocultas en el libro. Así que estoy buscando una solución, apenas la tenga la cuelgo.

Cambiar el idioma de los programas basados en GTK

Programas como GIMP e Inkscape (incluso Pidgin), que utilizan la librería GTK+, suelen detectar y escoger automáticamente el idioma de la interfaz de usuario (en cristiano, el idioma de todos los menús y mensajes).

Para obligar a estos programas (todos los que usen GTK) a utilizar otro idioma en Windows, basta agregar una variable de entorno. ¿Cómo? Muy sencillo:

  • En Windows XP, ir a Panel de Control -> Performance and Maintenance -> System -> viñeta Advanced -> Environment Variables (no tengo a la mano un XP en español con las traducciones exactas, así que mejor en su idioma original).
  • En Windows Vista, ir a Panel de Control -> System and Maintenance -> System -> Advanced system settings -> Environment Variables (tampoco tengo el Vista en español :S).
  • Presionar el botón Nuevo en Variables de Sistema (o si el cambio solo lo quieren en su usuario, utilizan Variables de Usuario). Nombre de la variable: LANG. Valor: EN (si quieren dichos programas en inglés, por ejemplo).
  • Reinician el programa en cuestión y listo.

Editores de texto, más allá del Bloc de Notas

El tristemente celebre Bloc de Notas (o Notepad) ha estado presente desde las épocas en que ejecutábamos el comando win desde aquella pantalla negra de DOS (versión 6.22 quizá) para abrir el Windows. Con el paso de los años, su funcionalidad, para bien o para mal, no ha cambiado en casi nada (corríjanme si me equivoco). Definitivamente no es un programa de uso de uso intensivo.

Desde hace algunos años, he venido utilizando algunas alternativas más trabajadas para tareas que van desde abrir simples archivos de texto hasta programar en ASM (aquellas épocas de la universidad) y hacer desarrollo web. Acá una lista de mis preferidos (todos gratuitos):

  • Notepad2: El primer programa con el que reemplazé al Bloc de Notas.
  • Notepad++: Muchas muchas opciones.
  • SciTE: El editor del proyecto Scintilla, sobre el que muchos otros están basados (incluyendo al Notepad2 y Notepad++). Definitivamente este es mi preferido. Otro punto a favor es que es multiplataforma (corre tanto en Windows como en Linux).
  • GEdit: El editor de facto de muchas distribuciones de Linux que utilizan GNOME (como Ubuntu). Utiliza la librería GTK+. Aunque no tiene un instalador directo para Windows, es posible instalarlo.
  • Editra: Lo encontré hace poco. Está escrito en Python por lo que también es multiplataforma.
  • Geany: También lo encontré recientemente. Utilizá GTK+, por lo que también es multiplataforma. Se ve muy interesante, así que le estoy dando una chance.

Espero no olvidarme de alguno… ¿Cuál usas tú?

Utilizar varias versiones del Internet Explorer a la vez

¿Por qué quisiera alguien en su sano juicio, tener más de una versión del infame Internet Explorer instalada en su PC, e incluso, corriendo simultáneamente?

Bueno, la única razón válida que se me ocurre es por lo que yo mismo hago esto: Probar los websites que desarrollo en los navegadores más utilizados actualmente (para mal de todos), IE 6 e IE 7. Si todos decidieran utilizar un navegador de verdad como Firefox u Opera, por mencionar dos, la vida de los diseñadores web sería más fácil y la de los internautas, más segura y placentera.

Existen por lo menos dos programas que permiten tener instaladas varias versiones del IE (por ejemplo, IE4.01, IE5.01, IE5.5, IE6, IE7, IE8) simultáneamente:

  • MultipleIEs: La última versión que he probado no puede ser instalada en Windows Vista, solo en XP. Permite utilizar IE3, IE4.01, IE5.01, IE5.5, IE6 e IE7.
  • IETester: Todavía está en una fase alpha de desarrollo, por lo que tiene algunas limitaciones que probablemente se vayan corrigiendo. Funciona con Windows XP y Vista (IE7+ instalado de preferencia), y permite utilizar IE8 beta2, IE7, IE6, IE5.5.

No las he probado extensivamente, pero como actualmente mi máquina principal tiene Vista, el IETester ha pasado mi elección obligada.

Alternativa al WinZip

Actualmente, trabajar con archivos comprimidos es pan de cada día; ¿cuántos de los archivos que descargamos de la web están en algún formato como zip o rar ó incluso en el menos conocido (para aquellos que solo trabajan en Windows) pero más eficiente tar.gz? ¿y cuántos de esos archivos son manejados por el famoso WinZip?

Aquellos que alguna vez hemos usado dicho programa, recordaremos la pantalla inicial donde se informa que estamos trabajando con una versión de evaluación. Luego de algunos miles de clics en esa pantalla, decidí buscar otro programa similar, pero que fuera gratuito. Lo que encontré es aún mejor.

7-Zip es un programa Open Source, que podemos descargar gratuitamente desde acá. Comprime y descomprime archivos como zip, gzip, el propio 7z (que tiene un ratio de compresión mejor que la mayoría de formatos conocidos, como vemos en su página oficial), entre otros. Además de descomprimir archivos rar, cab, iso, lzh…

Entonces, ¿qué ventajas tenemos con el 7-Zip? Primero, es gratuito y Open Source (si queremos, podemos ver y modificar el código fuente, aunque muchos puedan no saber que es esto). Segundo, podemos trabajar con gran variedad de formatos como rar.

Tras descargar e instalar el 7-Zip en nuestra PC, es recomendable hacerle una pequeña modificación a la configuración del programa para convertirlo en el predeterminado para abrir archivos comprimidos.

Primero abrimos el programa desde el menú Inicio. Una vez dentro, nos dirigimos al menú Tool/Options. Vemos que en la pestaña System podemos escoger que archivos queremos asociar al programa. Terminada la selección, le damos clic a OK y listo.

Ahora, cada vez que hagamos doble clic en un archivo con alguna de las extensiones que escogimos, nos abrirá el 7-Zip.

Para comprimir un archivo o un directorio, basta hacer clic derecho sobre él, escoger el menú 7-Zip/Add to [nombre].zip. Ojo que también tiene la opción de Add to [nombre].7z, que creará un archivo comprimido con el formato 7z (menos común). Si vamos a compartir el archivo con otra persona, es preferible utilizar el formato zip, pero si es para uso personal, les recomiendo el 7z ya que tiene una mejor tasa de compresión.

De igual manera, para descomprimir un archivo, escogemos la opción (en el menú al hacer clic derecho sobre él), 7-Zip/Extract Here o mejor aún, 7-Zip/Extract to [nombre]/, que nos creará un directorio con el mismo nombre del archivo, y colocará ahí el contenido.