Autocompletar con scriptaculous
Lo que vamos a hacer es un cuadro search box como el google suggest, que a diferencia de este, no haremos una petición ajax al servidor ya que tendremos los valores precargados en una variable javascript, útil cuando los registros son pocos y estáticos.
Reconozco que a estas alturas medio mundo usa jquery, pero como persona de escaso conocimiento en el área, para el propósito me sirvió prototype y scriptaculous.
Lo primero que tenemos que hacer es descargar scriptaculous, y extraemos todos los js dentro de una carpeta javascripts.
El siguiente paso es crear el archivo css.css para darle un diseño bonito al recuadro de opciones que aparecerán conforme vayamos escribiendo, el código de css.css es
div.autocomplete { margin:0px; padding:0px; width:250px; background:#fff; border:1px solid #888; position:absolute; } div.autocomplete ul { margin:0px; padding:0px; list-style-type:none; } div.autocomplete ul li.selected { background-color:#ffb; } div.autocomplete ul li { margin:0; padding:2px; height:32px; display:block; list-style-type:none; cursor:pointer; }
El tercer paso es crear el archivo autocompletar.html donde incluiremos los javascripts de prototype y scriptaculous, automáticamente se incluirán todas las dependencias.
<script type="text/javascript" src="javascripts/prototype.js"></script> <script type="text/javascript" src="javascripts/scriptaculous.js?load=effects,controls"> </script> <script type="text/javascript"> var bandsList = [ 'ABBA', 'AC/DC', 'Aerosmith', 'America', 'Bay City Rollers', 'Black Sabbath', 'Boston', 'David Bowie', 'Can', 'The Carpenters', 'Crass', 'Deep Purple', 'The Doobie Brothers', 'Eagles', 'Fleetwood Mac', 'Haciendo Punto en Otro Son', 'Heart', 'Iggy Pop and the Stooges', 'Journey', 'Judas Priest', 'KC and the Sunshine Band', 'Kiss', 'Kraftwerk', 'Led Zeppelin', 'Lindisfarne (band)', 'Lipps, Inc', 'Lynyrd Skynyrd', 'Pink Floyd', 'Queen', 'Ramones', 'REO Speedwagon', 'Rhythm Heritage', 'Rush', 'Sex Pistols', 'Slade', 'Steely Dan', 'Stillwater', 'Styx', 'Supertramp', 'Sweet', 'Three Dog Night', 'The Village People', 'Wings (fronted by former Beatle Paul McCartney)', 'Yes' </script><script type="text/javascript"> window.onload = function() { new Autocompleter.Local( 'bands_from_the_70s', 'band_list', bandsList, {ignoreCase:false} ); } </script> <body> <p> <label for="bands_from">Your favorite rock band from the 70's:</label> <br /> <input id="bands_from_the_70s" autocomplete="off" size="40" type="text" value="" /> </p> <div class="autocomplete" id="band_list" style="display:none"></div>
Y listo ya con eso debemos tener un textbox con sugerencias.
Enlaces
Autocompleter.Local para ver los parámetros aceptados.
Busquedas de filtros complejos en CakePHP
Para comprender la situación mejor, necesitamos ver el screenshot de la vista.
Hay varias formas de hacer esto, la mas común es usar la función query de CakePHP para armar la consulta SQL en base a condiciones by (@el_keogh) , está la función find, pero no se pueden poner condiciones dentro, así que lo que se puede hacer es armar el array conditions desde afuera de la siguiente forma:
<?php //Bloque #1 asignacion de variables para comodidad $alumnoid=$this->data['Examene']['cuenta']; $user=$this->data['Examene']['user']; $fechaInicio=$this->data['Examene']['Fecha de Inicio']; $fechaFin=$this->data['Examene']['Fecha de Fin']; $formadepago=$this->data['Examene']['forma_de_pago']; $resultado=$this->data['Examene']['resultado']; $conditions=array(); //Bloque #2 Condiciones tabla Alumnos if(!empty($this->data['Examene']['nombre'])){ $conditions['Alumno.nombre LIKE']='%'.$this->data['Examene']['nombre'].'%'; } if(!empty($this->data['Examene']['apellido_paterno'])){ $conditions['Alumno.apellido_paterno LIKE']='%'.$this->data['Examene']['apellido_paterno'].'%'; } if(!empty($this->data['Examene']['apellido_materno'])){ $conditions['Alumno.apellido_materno LIKE']='%'.$this->data['Examene']['apellido_materno'].'%'; } //Bloque #3 Condiciones tabla Examenes if(!empty($alumnoid)){ $conditions['Examene.alumno_id']=$alumnoid; } if(!empty($user)){ $conditions['Examene.user_id']=$user; } //Bloque #4 Condiciones de intervalos de fecha if(!empty($fechaInicio)){ $conditions['Examene.created >'] = $fechaInicio; } if(!empty($fechaFin)){ $conditions['Examene.created <='] =$fechaFin.' 23:59:59'; } if(!empty($formadepago)){ $conditions['Examene.forma_de_pago'] =$formadepago; } if(!empty($resultado)){ $conditions['Examene.resultado'] =$resultado; } //Bloque #5 query $conditions['Examene.statusid <>']=4; $examenes= $this->paginate($conditions); ?>
Bloque #1 asignación de variables
En este caso se manejan dos tablas distintas de la base de datos, están relacionadas entre si, Alumnos y Examenes, utilicé asignación de variables para mas comodidad en su manejo, pero no son necesarias.
Bloque #2 Condiciones de tabla Alumnos
Las condiciones determinan cuando hay datos en los campos, si no hay datos, no hay condición que aplicar y nada que meter en el array, las primeras tres condiciones pertenecen a la tabla alumnos, de la cual se va a buscar por nombre NO exacto por eso los LIKE y la concatenación del símbolo de porcentaje. Para que esto funcione, las relaciones en el modelo deben estar previamente establecidas.
Bloque #3 Condiciones de tabla Examenes
En el segundo bloque ponemos las condiciones de la otra tabla, nada especial ya que los valores de esos campos deben ser exactos.
Bloque #4 Condiciones de intervalos de fecha
Para cuando tenemos intervalos de fechas y tenemos el formato en Datetime, es necesario concatenar la hora en la que termina el dia, si no lo hiciéramos contaría hasta la hora 00:00:00 no devolviéndonos los resultados del ultimo dia especificado.
Bloque #5 Query
La función paginate, se utiliza casi de la misma manera que un find y listo automagicamente cakephp devolverá solo los exámenes de los campos donde se les haya especificado algun dato, notese que este tipo de búsqueda es de tipo AND, o sea cada campo va filtrando aun mas la búsqueda, en lugar de añadir nuevas coincidencias.
Cualquier duda o comentario es bienvenido.
Referencias
Complex Find Conditions
Pagination in cakephp
cakephp-instaweb
cakephp-instaweb server es un webserver pequeño con todas las configuraciones necesarias para desarrollar en cakephp, no necesitas instalar todo el entorno php. Funciona igual al django-runserver, solo en la terminal te colocas en la carpeta de la aplicación, corres el comando y listo, tendrás tu app funcionando en http://localhost.com:3000
Si usas Ubuntu 10.10 y cakephp 1.3.8 te marcará un error
CGI Script Error
Premature end of script headers.
Si instalaste cakephp-instaweb desde los repositorios de maverick se habrá instalado la versión 0.4.X, el error anterior se soluciona con la versión mas nueva 0.5-1 para instalarlo primero debes desinstalar completamente el cakephp-instaweb y luego descargar el .deb desde launchpad para Ubuntu Natty, no causa conflicto alguno.
Con eso se habrá solucionado el problema.
Como imprimir en impresora (Miniprinter) desde Python en Linux

Via MrTopf
Como en muchas otras cosas, apenas soy un novato y hay muchas formas de hacer lo que expongo en el titulo, está podría no ser la mejor, pero es una de ellas y por supuesto gracias a @Jorgekbw3 que encontró la solución:
Después de haber instalado la impresora en cuestión y haberla colocado como predeterminada con el administrador de impresoras, ya debe ser accesible a impresión con el comando
lp texto.txt
Bajo ese principio accesaremos al sistema desde python con
import os
printer=os.popen('lpr','w')
printer.write('texto')
printer.close()
Y eso es todo.
Probado con Ubuntu 10.10, Python 2.6 y Miniprinter Epson TM-T88V
Entorno de desarrollo para Symbian en Linux

Recientemente he tenido interés en desarrollar una aplicación para móviles symbian con Python for S60 tambien conocido como Pys60, cabe mencionar que soy novato en esto y no tengo idea de como la mayoria de los desarrolladores tienen configurado su entorno.
En el articulo anterior expliqué como Conectar Nokia 5530 por bluetooth y RFComm para desarrollo en Python en Ubuntu 10.04 pero al funcionar en la consola de linux no es practico estar viendo o estar ejecutando el codigo al vuelo, así que expongo lo que creo es una mejor manera.
También descarté usar el emulador de symbian para Windows (tristemente no hay emulador para linux, y no parece que vaya haber pronto) ya que parece lento y pienso que si vamos a batallar lo mismo correr el script en el emulador que en el mismo celular ¿que mejor que hacerlo en el celular?.
Interprete Python para Symbian
Para que una aplicacion hecha en python funcione en el celular de manera comercial necesita elaborarse un paquete .sis, de otra manera si intentas ejecutar un .py lo va a leer como archivo de texto, para eso se ocupa el interprete Python (Python_2.0.0.sis) y el PythonScriptShell(PythonScriptShell_2.0.0_3_2.sis) eso se descarga desde https://garage.maemo.org/projects/pys60/ (PythonForS60_2.0.0.tar.gz) ambos se encuentran en el directorio /PythonForS60/PyS60Dependencies/. Pasan los archivos al celular y los ejecutan en el siguiente orden Python primero y despues el PythonScriptShell.
Conexion PC - Celular
Ubuntu linux viene preparado para conectar por bluetooth y tener acceso a los archivos para eso vamos a dar en el icono de bluetooth y 'Configurar un dispositivo nuevo', seguimos los pasos indicados en el que tendremos que proporcionar la clave provista por ubuntu desde el celular.
Despues de emparejar el celular ocupamos saber la direccion de la carpeta a la que tiene acceso el interprete python, que suele ser /data/python, para eso vamos a entrar desde el navegador de archivos dando clic en el icono de bluetooth de nuevo y luego, examinar los archivos en el dispositivo, buscamos el directorio de python y una vez ahí veremos varios archivos .py de demostracion, estamos en la carpeta correcta, ahora presionamos las teclas Ctrl + L para saber la direccion y nos debe aparecer algo similar a esto en la parte superior
obex://[00:BD:3A:70:9B:EB]/E:/data/python

En la barra de direcciones después de presionar Ctrl + L estará la dirección que necesitaremos mas adelante.
Sincronizacion
Suponiendo que la carpeta del proyecto y todo el entorno python ya lo tenemos instalado en la computadora, procederemos a hacer una sincronizacion, para eso utilizo el programa Conduit que es bastante practico, ligero, eficiente y lo podemos descargar desde los repositorios, nosotros solo utilizaremos sincronizacion de una direccion entre carpetas, primero arrastramos una 'Carpeta' desde 'Files and Folders' hacia la derecha le damos clic derecho al elemento y luego en 'Configure Item' , seleccionamos la carpeta donde tenemos nuestro proyecto, dejando desmarcadas las opciones avanzadas presionamos cerrar, luego añadimos otra carpeta del lado derecho de la carpeta que recien creamos y ponemos la direccion obtenida en el paso de Conexion PC - Celular dando clic donde está el icono del lapiz.
Despues de eso ya está configurado todo, pero para eficiencia daremos clic derecho sobre la linea negra que une las dos carpetas y nos vamos a 'Sincronization Options' y luego en 'Always Up to Date' con eso en cuanto guardemos el archivo empezará la sincronizacion, que apenas tarda algunos segundos.
Y eso es todo, si tienes alguna duda o crees que hace falta algo puedes dejarlo en los comentarios.

