Leer y escribir un archivo con Python


Para abrir un archivo en Python se utiliza la función open. Ésta devuelve un objeto del tipo archivo, que tiene métodos y atributos.
Entre sus atributos se pueden citar:

  • mode: modo de apertura del archivo
  • name: nombre del archivo
  • closed: estado del archivo (abierto o cerrado)
Y métodos como:

  • seek: mueve la posición actual dentro del archivo
  • tell: confirma que la posición actual ha cambiado
  • read: lee un número especificado de bytes (o todo el archivo)
  • readline: lee una línea
  • readlines: lee todas las líneas y devuelve una lista
  • write: escribe en un archivoclose: cierra un archivo
Veamos el siguiente ejemplo (basado en los ejemplos de Inmersión en Python). La aplicación recibe por parámetro el nombre de un archivo MP3, del mismo se lee la información del ID3 tag y permite al usuario el ingreso de una nuevo comentario.

import sys
def nstring(s, n):
  s= s[:n]
  return s + (' ' * (n - len(s)))
if(len(sys.argv) > 1):
  filename = sys.argv[1]
  print "Abro archivo: " + filename
else:
  print "Pase por argumento el nombre de un archivo MP3"
  exit()
try:
  mp3=open(filename,'r+b')
  try:
    mp3.seek(-128,2)
    print mp3.read(3)
    print "Nombre..........: " + mp3.read(30)
    print "Artista.........: " + mp3.read(30)
    print "Album...........: " + mp3.read(30)
    print "Anio............: " + mp3.read(4)
    print "Comentario......: " + mp3.read(30)
    print "Genero..........: " + mp3.read(1)
    comentario = raw_input("\nSu comentario...: ")
    mp3.seek(-31,2)
    mp3.write(nstring(comentario,30))
    mp3.seek(-31,2)
    print "Nuevo comentario: " + mp3.read(30)
  finally:
    mp3.close()
except IOError:
  print ("IO Error");
  exit()

Es todo, espero les sirva este sencillo ejemplo... =)

¿La cagamos al usar DateTime.Now?


UTC vs hora local
Antes de nada, os aviso de que no voy a denostar por completo el uso de DateTime.Now, ni de las estructuras similares que existen en cada lenguaje. Obviamente, cada vez que tengamos que mostrar a los usuarios un dato horario, lo ideal es dárselo en su formato local, aquél que conocen y sabeninterpretar de forma inmediata sin necesidad de realizar cálculos mentales.
Sin embargo, todas las operaciones internas en las que intervenga una hora deberían hacerse con horas en Tiempo Universal Coordinado, más conocido como UTC. Aunque a algunos pueda parecerles un capricho o un formalismo innecesario, son varias las situaciones en que agradeceremos usar UTC, y no solamente por su invariabilidad, sino también por su eficiencia.

Menos operaciones, menos incertidumbre

Antes de ver los casos caóticos, conviene saber qué tiene de provechoso usar UTC en el día a día. Por ejemplo, en el típico caso en el que queremos medir un lapso de tiempo ocurrido entre dos eventos (normalmente el principio y el final de una operación cuya eficiencia nos interesa especialmente).
DateTime comienzo = DateTime.Now;
// Operaciones cuya duración queremos medir
DateTime fin = DateTime.Now;
TimeSpan duracion = fin - comienzo;
Nuestro objetivo debe ser introducir el menor ruido posible en la medición, por lo que toda operación que no sea parte del conjunto a medir, debería ser lo más rápida posible. Dependiendo de la precisión deseada, puede ser fundamental conocer el funcionamiento interno de DateTime.Now: en primer lugar llama a DateTime.UtcNow, a continuación calcula el desfase horario en función de la zona establecida, y por último verifica si hay que aplicar la corrección por horario de verano. En resumen,DateTime.UtcNow es un par de órdenes de magnitud más rápido que DateTime.Now.
De hecho, en C# es incluso más rápido que la clase Stopwatch, creada ex profeso para este tipo de mediciones de precisión, pero que obviamente aporta más herramientas destinadas a dicho fin. Podemos verlo en este gráfico, obtenido a partir de un benchmarking realizado por Keyvan Nayyeri:
Eficiencia comparada de DateTime.Now, Stopwatch y DateTime.UtcNow

Trabajar con usuarios de todo el mundo sin volverse loco

Si ganar algunos milisegundos no es tu finalidad, no te preocupes, hay más motivos para utilizar UTC. Uno bastante importante es que tu aplicación sea utilizada por usuarios de distintas zonas horarias. Y ni siquiera es necesario que sean de países distintos.
Imagina: tu base de datos tiene un registro del usuario A, que utilizó la aplicación en Las Palmas de Gran Canaria, con hora 09:10; mientras que hay otro registro del usuario B, que utilizó la aplicación en su PC de Córdoba, a las 10:05. Si no recuerdas si la hora guardada se tomó en los clientes o en el servidor, puedes dudar acerca de cuál de los dos es anterior.
Pero es más, puedes encontrarte con este mismo problema con usuarios de una misma zona horaria. Es tan simple como que tu servidor pase a alojarse en un hosting de otro país, y si lo tienes configurado conforme a su información regional, las horas guardadas en él pueden dejar de significar lo que tú crees que significan.

Fatalidad, ocurre lo que no debería ocurrir cuando no debería ocurrir

Pero cuando de verdad se ve lo necesario que es usar datos invariables es en las situaciones excepcionales, aquellas en las que nunca solemos pensar, entre las que cabe destacar los cambios de hora debidos al ahorro energético.
Cambio horario de verano
Y es que el destino caprichoso puede querer que uno de tus usuarios comience una operación a las 2:59 CET del último sábado de marzo… ¡y la termine a las 2:00 CEST de ese mismo día por culpa del cambio al horario de verano! Es poco probable, pero puede ocurrir y fastidiarte contadores con tiempos negativos (o enormes por culpa de un desbordamiento). O que te pase como en Samoa, donde el gobierno decidió suprimir el 30 de diciembre de 2011 para mejorar sus relaciones económicas internacionales.
En definitiva, más vale pensar que lo peor puede pasar, y que no nos pille desprevenidos.

El desbloqueo de logros llega a la programación con Visual Studio Achievements


Logros en Visual Studio
Las nuevas redes sociales y aplicaciones para móviles nos han habituado al modelo de desbloqueo de logros. A día de hoy, raro es que alguno de nosotros aún no haya recibido una medallita por ver una película, visitar un monumento, pasarse una fase de un juego, etc. Pero Microsoft le da una nueva vuelta de tuerca al asunto y en su afán por hacer del desarrollo una labor divertida, nos propone empezar a conseguir logros a base de hacer nuestro trabajo y programar.
La herramienta en cuestión para hacerlo es un plugin para Visual Studio (y ojo, que todavía está en fase beta, nada de usarlo en el entorno de producción del megacliente). Para intentar distraernos lo menos posible mientras programamos, sólo se muestran los nuevos logros al compilar, ya que un hilo en segundo plano analiza nuestro código en busca de las características que lo conviertan en digno de una medalla.
Estas chapitas que podemos conseguir se catalogan en 6 categorías: Customizing Visual Studio,Don’t Try This At HomeGood HousekeepingJust For FunPower Coder y Unleashing Visual Studio. Mientras la de personalización de Visual Studio o la de generación de un código limpio son más que aconsejables, lo cierto es que la categoría que te propone no intentar esto en casa más bien debería incentivar lo contrario, intentarlo como mucho en casa, y nunca en entornos sensibles. Y es que crear una clase con 10 niveles de herencia, más de 10 sobrecargas de un sólo método y enumerados de más de 30 campos, quizá no es algo de lo que se deba presumir, por mucho que el plugin permita compartir tus logros en Facebook.

Primer Congreso Internacional de Informática Aplicada, CIIA 2012


El Comité Organizador del “Primer Congreso Internacional de Informática Aplicada. CIIA 2012″ del Instituto Tecnológico Superior de Misantla ha invitado de manera personalizada a alumnos y publico en general a participar en este importante evento, a celebrar del 25 al 27 de Abril de 2012 en la ciudad de Misantla, Veracruz, México.
Se ofrecerán conferencias magistrales, sesiones técnicas, talleres, demostraciones y un concurso de programación, con énfasis en el tema: “Tecnologías Emergentes: Retos y Oportunidades”.
Cada ponencia debe describir su aportación de forma breve y completa, presentarse en formato IEEE, y sus autores deben registrarse en la página del congreso, o a la dirección electrónica: ciia2012.itsm@gmail.com.
Para fechas importantes, costos y detalles, favor de consultar:
Twitter: @ciia2012itsm
Teléfono: (235) 3231545 ext. 122

Python 4 Android


Me tomo un relax de algunas horas, para encontrar algo con que distraerme, y recorde la existencia de un proyecto que permitia usar Python para correr aplicacion Android, opte por probarlo y escribir un articulo al respecto.

Android Scripting


Si no eres fanatico de Java, o si eres un amante de scripting particularmente de python o simplemente te gusta cambiar de vez en cuando lo aburrido de las llaves y los punto y comas y ademas quieres trabajar con Android, pues bien SL4A te parecera una buena opcion. (Si no la unica ¬¬). La descripcion del proyecto va asi:


Scripting Layer for Android (SL4A) lleva los lenguajes de scripting a Android, permitiendo editar y ejecutar script de manera interactiva directamente en dispositivos Android. Estos script tienen accesos a muchas APIS disponibles en el dispositivo, pero con una interfaz increiblemente simple que permite accederlos de forma sencilla.



Hay una guia detallada Practical Android Project que te guia paso a paso sobre lo que debes hacer. Pero aqui tienes mi confusa explicacion de como hacerlo.


Manos a la obra


Existen dos formas de hacer esto, hacerlo directamente desde el dispositivo o bajarlo en tu ordenador y luego instalarlo con el ADB con el siguiente comando:

> adb install sl4a.apk


En lo personal prefiero hacerlo desde el telefono, me ahorro abrir la terminal, para hacerlo abre el navegador y descargalo desde el sitio del proyecto. Asi que operacion "Descarga e Instala", te dira que necesita muchas  y muchos permisos, dandole el voto de confianza acepta e instala.



Ahora ya tienes SL4A, pero te hace falta algo, y no es amor es el interprete para ello  necesitaras otro APK de Python For Android, igualmente en el sitio oficial puedes descargarlo.



Una vez que necesitas extraer los extras para tener los script de python y curosear el codigo y como se ejecuta.



Ahora si puedes ver la cantidad de Script en la aplicacion SL4A alli tienes para empezar a ver ejemplos basicos de SL4A.




Todos corren de maravilla, y todos los puedes editar "on the fly" como es costumbre con las aplicaciones python. Algo que me fascino es la simplicidad de los script, el hell_world.py se destaca, son 4 lineas de codigos en lo que en Android Java me tomaria al menos diez tan solo en la clase. Aqui el codigo


import android
droid = android.Android()
droid.makeToast('Hola Mundo')
print 'Hola Mundo'

La aplicacion tambien te permite correrlo en consola, ejecutarlo, modificarlo, renombarlo o eliminarlo.

Otra caracteristica super util es que te permite ver las trazas:



Perspectivas del proyecto

Es probable que siga jugando con SL4A, lo recomiendo ya sea si quieres empezar con Android y no te gusta java, o estas aburrido en la noche y quieres distraerte un poco, aprenderas una ó dos cosas nuevas, garantizado!

Si te preguntas si puedes llegar al mercado de Android con esto, pues lo creas o no, esto no es un juguete es una manera de desarrollar aplicaciones real!. La documentacion incluye la manera en como puedes crear Scripting as APK. Y si ya existen app con esto incluido. TaskBom es una de ellas.

Existen otros proyectos similares que portan lenguajes a la plataforma Android. Dos que me llaman la atencion son:

Scala 4 Android(Una buena excusa para aprender scala)

Un detalle final, me sorprendio, sino me asusto la cantidad de tutoriales para esta herramienta en el sitio oficial, si de algo se ha caracterizado python desde el principio es de su documentacion extrema y este proyecto no excepcion, no hay excusas par ano pasar unas horas probando y quien sabe si te gusta quizas hagas un DroidCopter:

avast! Mobile Security: antivirus gratuito para Android


Con el auge que últimamente han tenido losdispositivos Android, al menos en Argentina, ha traído como consecuencia miles de herramientas nuevas para estos celulares, como lo es el caso de este nuevo antivirus gratuito para Android.
Entre las principales funciones encontraremos algunas como las siguientes:
  • Escáner antivirus de aplicaciones y tarjeta SD.
  • Asesor de privacidad.
  • Administrador de aplicaciones.
  • Filtro de llamadas y SMS con bloqueo.
  • Escudo de página web.
  • Cortafuegos para móvil.
  • Anti-robo.
avast! Mobile Security ocupa sólo 2,5 MB del espacio en tu móvil y se instala directamente en la memoria del mismo. Después de haberlo instalado nos solicitará acepta los términos de la licencia y preguntará si deseamos enviar información anónimo a la Comunity IQ, la red de seguridad de avast!.

Antivirus para aplicaciones y tarjeta SD

Esta es la principal función de esta herramienta ya que en los últimos tiempos se han multiplicado la cantidad de malware en Androidavast! Mobile Securityutiliza su propio escaner para atajar las diferentes amenazas que se presentan al dispositivo.
avast-security-mobile
A pesar de que la protección no es en tiempo real completa, esta aplicación es capaz de detectar las diferentes aplicaciones maliciosas en el dispositivo y además, hasta archivos infectados, incluyendo los de Windows.

Asesor de privacidad y aplicaciones

Esta función es realmente interesante, ya que al instalar diferentes aplicaciones y aceptar sus términos de uso, podemos estar cometiendo un grave error, principalmente si la misma no fue creada con fines benéficos.
avast-android
avast! Mobile Security, se encarga de analizar a qué tipo de información tiene acceso las aplicaciones y después hace un resumen de la situación dividido por categorías.

Escudo web y cortafuegos

Muchas personas que cuentan con un dispositivo Android, se encuentran conectadas a la red permanentemente, y aquí existen una gran cantidad de peligros que se pueden transmitir a través del navegador o a través de las aplicaciones.
antivirus-avast-android
El escudo web se encarga de impedir ingresar a sitios “peligrosos”, es decir que contengan pishing o malware. Por su parte, el cortafuegos permite bloquear el tráfico a la red de todas las aplicaciones, ya sea por WiFi o 3G, aunque para funcionar tendremos que rootear el móvil anteriormente.

Bloqueo de llamadas y SMS

Aunque no sea una herramienta de seguridad, esta función es realmente muy útil, ya que habilita un filtro de llamadas y mensajes entrantes y salientes. Podrás configurar grupos de contactos o números individuales, y tildar si queremos bloquear llamadas o SMS, entre otras pequeñas opciones.
antivirus

Antirrobo para el móvil

Esta función nos protege ante posible robos o pérdidas del celular, y esta aplicación antirrobo puede ayudarnos a dar con el paradero del mismo. Este módulo se instala de manera silenciosa y podemos disfrazarla con el nombre de otra herramienta, ya sea alarma, solitario, cronómetro, etc. Además, en caso de que el móvil tenga root, podrá resistir intentos de reseteo y hasta acceso vía USB.
La verdad que esta herramienta es muy útil para aquellas personas que cuenten con celulares Android. Y si eres de los que no tiene antivirus te aconsejo que vayas pensando en instalar uno. Y si eres de los que ya tiene un antivirus, ¿qué te pareció avast! Mobile Security?

Enlace | avast! Mobile Security

Using External Programs with SQL Server Agent


The Job Activity Monitor

The Job Activity Monitor is a great tool to use for real time monitoring and administration of your SQL Server agent jobs. For Level 8 in this stairway, you are going to look back into another capability of SQL Server Agent – the ability to shell out to the operating system and run programs outside of the SQL Server environment. Some of those programs will be command line (either traditional cmd applications/scripts or PowerShell scripts), or even ActiveX scripts, but you can actually shell out and run nearly any program, as long as the program doesn’t expect direct user input. You will look at how to runcmdexec and PowerShell scripts, and we will have a brief discussion of when each subsystem would be appropriate. You will learn how to call other programs from SQL Server Agent.

Built-in Job Subsystems

There are several built-in job subsystems, as you have seen in previous articles. In this article, you will examine three of the built-in job subsystems that are capable of running scripts and/or programs within the scope of Windows Server, rather than within the context of the SQL Server environment itself. These three subsystems include:
  • Operating System (CmdExec)
  • PowerShell
  • ActiveX Script
When a program or script is launched from one of these three subsystems, a separate process is created within Windows (i.e. not directly part of SQL Server Agent), the script or program is run, and then information is passed back to the SQL Server Agent job that started the process or script.

The Operating System (CmdExec) subsystem

The first subsystem we’ll review is the Operating System (CmdExec) subsystem. The CmdExec subsystem opens up a command prompt, as if you had logged into the Windows Server machine running SQL Server. From that point you can run anything you could otherwise type yourself in a command prompt window. This includes any batch file, script, or even program that exists on your server, and of course if you could type in a UNC path and access a file, so could the CmdExec subsystem.

But what about security?

Of course, the big caveat about all of this is permissions – what will work, and under what security context? By default, when you create a job in the CmdExec subsystem (or the others, as you will see), the job will run in the security context of the SQL Server Agent Service Account (as shown in Figure 1). You may also notice that this is a drop-down form value, so other options are possible. You will examine these proxy accounts in level 10 in the Stairway. Another important note: you must be asysadmin login role member in SQL Server to be able to run jobs that impersonate (i.e. use the security rights of) the SQL Server Agent service account.
Figure 1: Job Security in a CmdExec job step

Creating a CmdExec job step

To create a CmdExec job step, create a new job (we can call it ShellOut), then add a New Job Step. As shown in Figure 1, we’ll name the step s1. Change the Type of job step to “Operating system (CmdExec)”, and leave the Run as: field at the default value (“SQL Server Agent Service Account”). For our first job, simply enter “dir c:\” as shown in Figure 1 for the command text. Click OK, then OK again to save the job. Run the job (right click on the job “ShellOut” and select “Start Job at Step”, then once the job has run right-click and select View History. Click on the job step output as shown in Figure 2 to see that a DIR was run against your C drive.
Figure 2: The Log File Viewer showing the results of a CmdExec job
As you might imagine, this is a trivial command but you could easily imagine running complex batch scripts, or as mentioned before, even start a program (for example, “start notepad” would run notepad). A word of caution is in order, however. If you launch a program such as notepad, it will be running in a virtual hidden desktop, waiting for input from a userAnd because the desktop is hidden, no user can supply any input, not even a command to exit the program. In other words, your job step won’t ever complete. You will have to find the notepad process in a program such as Task Manager, and kill the process for the job step to return. Running programs from the CmdExec subsystem enables many interesting scenarios as long as the program will naturally return control back to SQL Server Agent when it’s complete.

The PowerShell subsystem

The PowerShell subsystem was added to SQL Server with the SQL Server 2008 release. It will function with either PowerShell 1.0 or PowerShell 2.0, depending upon which version is installed on your server. When you create a job step and select the PowerShell subsystem for your job step type, you will have options similar to the CmdExec subsystem. You can enter the text of a PowerShell script, or call an existing PowerShell script (.ps1). When you start a PowerShell session from within SQL Server Agent, the SQL Server PowerShell provider and cmdlets are pre-loaded for you.
There are many additional considerations with PowerShell dealing with script signing and security, which are too extensive to go into for this article. However, you can read about them in this TechNet article from the Windows PowerShell Owner’s Manual:http://technet.microsoft.com/en-us/library/ee176949.aspx.
With that caveat, PowerShell could easily become your favorite subsystem for scripting work. For ordinary tasks within SQL Server, running a Transact-SQL script is usually simpler. However, repetitive tasks, or as in the case of CmdExec, any task that leaves the SQL Server environment is much simpler from the PowerShell subsystem.
To show an example, re-open your ShellOut job, and add a job step, s2. Select PowerShell for the Type, and then enter the following script:

$server = new-object( 'Microsoft.SqlServer.Management.Smo.Server' ) “(local)”
foreach ($database in $server.databases) {
$dbName = $database.Name
Write-Output "Database: $dbName" }

Figure 3: The Job Step for the PowerShell subsystem
This script will simply log into your local SQL Server (change the instance name if using a named instance), and then loop through and get the name of each database on the server. You can easily imagine backing up the database, or examining its properties, for example. The other thing to notice is that you had to log in and make a database connection – so nothing is stopping you from logging into any SQL Server in your organization. To try this out, click OK, the OK again. If you are prompted to, fix up the job step s1 so that it will flow properly into step s2. Run the job, and view the output as you did for the CmdExec subsystem step. You will see a list of your databases on your server has been output.
What’s really interesting about the PowerShell subsystem, however is that you can query information from the operating system, or active directory, etc. and then run just about any script you can think of to act upon your server. Do you want to query the ports SQL Server is listening on? You can use WMI through PowerShell. Do you want to get some information from the registry? You get the idea. There are many, many PowerShell scripts posted on the Internet (including many articles here at SQLServerCentral).

The ActiveX Script subsystem

The ActiveX Script subsystem allows you to run ActiveX scripts, which can use VBScript or Jscript to complete tasks in the operating system. This subsystem is included here for completeness, but you should not use ActiveX scripts from SQL Server Agent. The subsystem is deprecated, meaning it will be removed from a future version of SQL Server.

Which subsystem should I use?

If you have an existing job using one of these subsystems, you should probably continue to let it work unless you have a compelling reason to change it. However, if you are starting a new job and/or job step, the PowerShell subsystem offers the most compelling capabilities. Additionally, Microsoft has clearly moved in the direction of PowerShell as the standard scripting language for all Microsoft server products. An investment of your time learning PowerShell will pay dividends well beyond SQL Server Agent.

What’s Next

SQL Server Agent’s CmdExec, PowerShell, and ActiveX subsystems allow you to leave the confines of SQL Server to perform many tasks, including running batch files or external programs. Additionally, with PowerShell you can access and control just about any Microsoft product. PowerShell is the recommended subsystem to use for new work.