Carlos Ble

Carlos Ble

I am a professional software developer, I solve problems.

I also teach and mentor developers to build better software.

Developing software since 2001.

Can I help you?

  • Do you need high quality tailor-made software?
  • Need training on TDD, clean code or refactoring?
  • Is it risky? do you need advise?
  • May I pair with you to write better code?

Events

Upcoming public training courses:

  1. [Online - en Español] 25 y 26 de Junio
    Test Doubles con JavaScript - Online
  2. [in English] July 7, 8 & 9
    TDD (open to the public) - Tenerife, Canary Islands
  3. [en Español] 14 y 15 Julio
    TDD (en abierto) - Gran Canaria, Canary Islands
  4. [in English] October 13, 14 & 15
    TDD (open to the public) - London, UK
  5. [en Español] 29, 30 y 31 de Octubre.
    TDD (en abierto) - Madrid, Spain

Conferences:

  1. I'll be at SocratesUK 2014
  2. I'll be at the London Test Gathering Workshops.

Archive for May, 2008



Esta vez toca escribir en español porque la mayoría de entradas que encontré en la red sobre Samba y máquinas Windows estaba en castellano lo cual parece indicar que es una herramienta muy usada en paises latinos.

Dentro del poco conocimiento que tengo de Samba y advirtiendo que algunas de las afirmaciones que vienen a continuación podrían ser incorrectas, describo cómo hemos resuelto los problemas de políticas usuario, perfiles e impresoras en dominios netbios que contienen equipos con Windows XP y Windows 2000.
Samba hace que un servidor Linux funcione como controlador de dominio Windows (netbios) de manera que puede enviar el perfil de los usuarios a las máquinas cliente cuando hacen login junto con políticas que definen permisos. Además en nuestro caso hay un servidor LDAP que contiene la base de datos de usuarios que pueden acceder al sistema. La configuración de Samba y de OpenLDAP puede encontrarse en internet en multiples sitios por lo que no voy a detallarla aquí. Voy a hablar de los problemas que hemos tenido y su solución que tiene que ver con el funcionamiento de las redes Windows.
Samba también funciona para compartir unidades de red mediante la red windows así que en muchos sitios se usa como lugar de almacenamiento compartido.
Samba está un poco obsoleto para administrar equipos posteriores a la familia NT, ya que a partir de Windows XP, las políticas de usuario ya no se definien con Poledit sino con las herramientas para "Group Policies" (gpedit.msc, etc). Samba no soporta Group Policies. Así, cuando una máquina con Windows XP tiene definidas políticas de grupo, éstas prevalecen sobre las que envía el servidor Samba y dicho servidor queda inútil en ese sentido.
Existe otro motivo fundamental por el que las políticas definias mediante Samba no tienen efecto en el equipo Windows y es que haya un fichero NTUser.DAT o algun otro NTUSERalgo. Este fichero es generado por Windows y contiene políticas y claves del registro de Windows.
Puede ser que la maquina Windows cliente genere este fichero y lo aloje en el directorio profile de Samba en el servidor. Para evitarlo hay que crear un fichero ntuser.man o poner permisos de sólo lectura en el directorio profile. Tambien puede ser que la maquina Windows no pueda conectar con
el servidor y genere el NTUser.DAT localmente dentro de la carpeta del usuario en C:\Documents and Settings. En tal caso hay que entrar como administrador local y eliminar toda la carpeta. Puede ser que haya que reinciar la máquina para que sea posible borrar.
De lo anterior deduzco que cuando una máquina Windows entra en un dominio, obtiene una copia local de ciertos datos del servidor, ya que permite a los usuarios hacer login incluso sin conexión con el servidor. Por este motivo, si la maquina que ejerce como controlador de dominio cambia, pero el nombre del dominio no ha cambiado, hay que sacar del dominio a los clientes, pasarlos a un
grupo de trabajo y volverlos a meter en el dominio para que funcionen correctamente. Digamos que es la manera de refrescarles los datos que mantienen del servidor. La misma operacion es necesaria para cambiar el nombre de un equipo.

El fichero donde se definen las políticas de usuario se genera con la herramienta Poledit en un pc Windows, y se guarda con el nombre NTconfig.POL en la carpeta netlogon del servidor Samba.
El problema de que el teclado aparezca en inglés se resuelve añadiendo la plantilla administrativa del teclado a Poledit. Esta es la plantilla para que el teclado aparezca en español (keyboard.adm):

CLASS USER

CATEGORY "Keyboard Layout"

POLICY "Poner el teclado en español"
KEYNAME "Keyboard Layout\Preload"
VALUENAME       "1"
VALUEON "0000040a"
VALUEOFF "0000040a"
ACTIONLISTON
VALUENAME       "2"     VALUE   "0000040a"
END ACTIONLISTON
ACTIONLISTOFF
VALUENAME       "2"     VALUE   "0000040a"
END ACTIONLISTOFF
END POLICY

END CATEGORY

Para que la impresora predeterminada aparezca a los usuarios cuando hacen login en la maquina cliente, hemos instalado un script .bat también en el directorio netlogon que contiene lo siguiente:

rundll32 printui.dll,PrintUIEntry /dn /n "\\nombreDelPCqueTieneLaImpresora\HP LaserJet 1200 Series PCL" /q
rundll32 printui.dll,PrintUIEntry /in /n "\\nombreDelPCqueTieneLaImpresora\HP LaserJet 1200 Series PCL"
rundll32 printui.dll,PrintUIEntry /y /n "\\nombreDelPCqueTieneLaImpresora\HP LaserJet 1200 Series PCL"

(Cambie HP LaserJet 1200... por el nombre de su impresora)

I got surprised when I found that there was no Web Services implementation in the Python standard lib but fortunately there is a nice project called SoapLib that is open source and implements web services. SoapLib generates the WSDL for your web service and it is supposed to be ready to consume with Java or .Net.

Service code sample:

  1.  
  2. from soaplib.wsgi_soap import SimpleWSGISoapApp
  3. from soaplib.wsgi_soap import SimpleWSGISoapApp
  4. from soaplib.service import soapmethod
  5. from soaplib.serializers.primitive import *
  6. from cherrypy.wsgiserver import CherryPyWSGIServer
  7.  
  8. class ServersInfoService(SimpleWSGISoapApp):
  9.  
  10. @soapmethod(_returns=Array(String))
  11. def getServersList(self):
  12. results = []
  13. for serverValues in Server.objects.values():
  14. results.append(str(serverValues))
  15. return results
  16.  
  17.  
  18. if __name__=='__main__':
  19. try:
  20. server = CherryPyWSGIServer(('localhost' ,17777), ServersInfoService())
  21. # enable the next two lines if you want HTTPS
  22. #server.ssl_private_key = '/fullpath/file.key'
  23. #server.ssl_certificate = '/fullpath/file.pem'
  24. server.start()
  25. except KeyboardInterrupt:
  26. server.stop()
  27.  

Client code sample:

  1.  
  2. from soaplib.client import make_service_client
  3. import unittest
  4. import os
  5. import re
  6.  
  7. class infoServicesTests(unittest.TestCase):
  8.  
  9. def setUp(self):
  10. # https=True enables HTTPS
  11. self.clientInfoService = make_service_client('localhost:17777/', ServersInfoService(), https=True)
  12.  
  13. def testGetServiceWSDL(self):
  14. # this generates the WSDL:
  15. print self.clientInfoService.server.wsdl('')
  16.  
  17. def testGetServersList(self):
  18. servers = self.clientInfoService.getServersList()
  19. for tuple in servers:
  20. print "Servidor:" + tuple
  21.  

The HTTPS client is still not implemented in SoapLib as far as I know. I've just sent a patch to the SoapLib group that is working for me.
The WSDL generation is made with client.server.wsdl('').
I'll tell you if we can consume the web service from Java successfully.

The Python syntax highlight has been done with CodeHighlighter plugin.

La Oficina de Software Libre de la ULL (mi curro) junto con la propia Universidad, GULIC y CajaCanarias, organizan éste sábado una jornada con homenaje al día de Internet.
El personal de la OSL estaremos en Guajara impartiendo talleres y charlas. Ordenadores con Bardinux y conexión a internet para todos.
Será en el nuevo edificio de CajaCanarias, al lado de la pirámide de Periodismo. La entrada es libre y tendremos ocasion de charlar sobre temas diversos.
Si te quieres pasar ya sabes que estaré allí, éste 17 de Mayo, de 9 de la mañana a 2 de la tarde.
Más info aquí

I use to think that once you're use to 2 or 3 programming languages, you can learn another one easily but my thought now is that specialization is important. If you are a Python developer learning C# you not only need to know the syntax but the best practices, the know-how, and you won't get that in two weeks (as the common wisdmon says). So Python is not Java nor C# and the know-how is hard to get. The past month I've been researching and thinking of things like... "How do I write a static method in Python?" and then realizing that the philosophy is different so you just need to write the function in a module and call the function as ModuleName.Function which in terms of API looks like a static method. Actually if you follow the name conventions it should be moduleName.function (mind the case).
If you're learning Python and you come from a strongly typed language, just keep this in mind: implementation in Python should be written fast and easy, otherwise, you're probably thinking wrong.

This does not mean Python is better than Java or C#, I see it as another option for some kind of problems. It is my favorite choice when it comes to scripting, system administration or code generation.

In my current environment people uses Vim or Emacs to write source code which is a common trend within the Open Source world. However I do believe that IDE's improve productivity and I just can't write code without Intellisense (Autocompletion). I am using Eclipse as my IDE along with the Pydev plugin that enables Autocompletion, syntax highliting, indentation and so for Python. Some fine tuning for the development platform:

Define JAVA_HOME in ~/.eclipse/eclipserc: JAVA_HOME=/usr/lib/jvm/java-6-sun

Make sure you install the latest Pydev. I installed it from the .zip rather than the Eclipse updater. Once it is installed, go to the Windows Menu, Preferences, Pydev, and "Interpreter - Python". Add python 2.5 there.
If you install Django after all of this, you have to go to Pydev configuration again, remove the python interpreter and add it again in order for Pydev to recover all the information about Django objects. See this post. If you want to use Django in a console application, i.e, you just want the ORM to work with models, then you need to define two environment variables and make sure Eclipse knows them:

export PYTHONPATH=$PYTHONPATH:/home/carlosble/workspace/yourproject
export DJANGO_SETTINGS_MODULE=settings
eclipse &

That assumes the settings file is inside yourproject folder.

Cheers