jueves, noviembre 06, 2014

Una aplicación web (CRUD) con Yii

 

 

Instalar Yii en Ubuntu


sudo apt-get install php5-mcrypt


wget -nd https://github.com/yiisoft/yii/releases/download/1.1.15/yii-1.1.15.022a51.tar.gz
tar -xzvf yii-1.1.15.022a51.tar.gz
rm yii-1.1.15.022a51.tar.gz
sudo mv yii-1.1.15.022a51 /var/www/html/yii



Verificar los requisitos accediendo a la página web:
http://localhost/yii/requirements/

Crear la estructura de la aplicación

cd /var/www/html/yii
framework/yiic webapp miapp
chmod o+w miapp/protected/models/
chmod o+w
miapp/protected/views/
chmod o+w
miapp/protected/controllers/ 

Instalar giix

wget -nd http://www.yiiframework.com/extension/giix/files/giix-1.9.2.zip
mkdir giix
cd giix/
unzip ../giix-1.9.2.zip 

rm ../giix-1.9.2.zip
cp -r giix-co* ../miapp/protected/extensions/
 


Modificar la configuración del fichero protected/config/main.php, para indicar el nombre de la aplicación, idioma español, que se importe la extensión de giix, habilitar gii y establecer la configuración de la base de datos (comentamos sqlite y configuramos Mysql):

'name'=>'Nombre de mi App',
'language'=>'es',
'sourceLanguage' => 'en',
'charset' => 'utf-8',

...
'import'=>array(
        'application.models.*',
        'application.components.*',
        'ext.giix-components.*', // giix components
    ),

...
        'gii'=>array(
            'class'=>'system.gii.GiiModule',
            'password'=>'una clave para entrar a gii',
            'generatorPaths'=> array('ext.giix-core', ),
            'ipFilters'=>array('127.0.0.1','::1'),
        ),

...
        /*'db'=>array(
            'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
        ),
        // uncomment the following to use a MySQL database
        */
        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=mibasededatos',
            'emulatePrepare' => true,
            'username' => 'miusuario',
            'password' => 'clave',
            'charset' => 'utf8',
        ),


...
Podemos ver el prototipo creado en:
http://localhost/yii/miapp/


Generando código automáticamente con Giix


Tablas de ejemplo:

CREATE TABLE localizacion (
  id integer NOT NULL auto_increment PRIMARY KEY,
  localizacion varchar(100) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE evento (
  id integer NOT NULL auto_increment PRIMARY KEY,
  idlocalizacion integer DEFAULT NULL COMMENT ,
  fecha datetime DEFAULT NULL,
  descripcion varchar(1000) DEFAULT NULL,
  FOREIGN KEY (idlocalizacion) REFERENCES localizacion (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Accedemos a Gii en:
http://localhost/yii/miapp/index.php?r=gii

Para crear toda la gestión (CRUD) de una tabla ya creada previamente en mysql podemos realizar lo siguiente en Gii:

1.- Generamos el modelo (Giix Model Generator) correspondiente a nuestra tabla, para ello indicamos el nombre de la tabla (localizacion) y el de la clase modelo que ya se nos ofrece automáticamente (Localizacion), pulsamos 'preview' y por último 'generate'. Igual para la tabla evento.

2.- Creamos la gestión del modelo (Giix CRUD Generator), para ello tendremos que indicar el modelo previamente creado: Localizacion y el controlador: localizacion. Como en la ocasión anterior pulsamos 'preview' y por último 'generate'. Igual para el modelo evento.


Veamos la gestión de la tabla funcionando:
http://localhost/yii/miapp/index.php?r=localizacion


Personalizando la aplicación

Menú y pie de página

Editamos el fichero protected/views/layouts/main.php y ahí podemos personalizar nuestro menú y pie de página según nuestras necesidades. Como crear una nueva opción de menú en función de si el usuario está o no identificado, que nos dará acceso de forma privada a la gestión de localizaciones y eventos:


    <div id="mainmenu">
        <?php
            if (Yii::app()->user->isGuest) {
                $this->widget('zii.widgets.CMenu',array(
                'items'=>array(
                    array('label'=>'Inicio', 'url'=>array('/site/index')),
                    array('label'=>'Sobre', 'url'=>array('/site/page', 'view'=>'about')),

                array('label'=>'Contactar', 'url'=>array('/site/contact')),                    array('label'=>'Conectar', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
                    array('label'=>'Desconectar ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
                ),
                ));
            }
        else {
                $this->widget('zii.widgets.CMenu',array(
                'items'=>array(
                    array('label'=>'Inicio', 'url'=>array('/site/index')),
                    array('label'=>'Sobre', 'url'=>array('/site/page', 'view'=>'about')),

                array('label'=>'Contactar', 'url'=>array('/site/contact')),                    array('label'=>'Gestión', 'url'=>array('/site/page','view'=>'gestion')),
                    array('label'=>'Conectar', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
                    array('label'=>'Desconectar ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
                ),
                ));           
        }

         ?>
    </div><!-- mainmenu -->

...
    <div id="footer">
        Copyright &copy; <?php echo date('Y'); ?> by Nacho.<br/>
        All Rights Reserved.<br/>

        <?php echo Yii::powered(); ?>
    </div><!-- footer -->


Personalizar la página de inicio, sobre, gestión, etc...

Estas páginas se encuentran en protected/views/site y editando por ejemplo el fichero index.php podremos personalizar los textos iniciales que aparecen al acceder a nuestra página web.

Crear una nueva página de gestión de los eventos y localizaciones, creamos un fichero llamado gestion.php dentro de protected/views/site/pages

<?php

$this->pageTitle=Yii::app()->name . ' - Gestión';
$this->breadcrumbs=array(
    'Gestión',
);
?>

<h1>Gestión</h1>

<?php echo CHtml::link('Localización', array('/localizacion/')); ?></br>
<?php echo CHtml::link('Evento', array('/evento/')); ?>


Usuarios y claves

Editamos el fichero protected/components/UserIdentity.php y ahí establecemos nuestros usuarios y claves:

public function authenticate()
    {
        $users=array(
            // username => password
            'nacho'=>'miclave',           
        );

...


Fuentes de información:
http://www.yiiframework.com/

sudo mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/ - udo mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/

lunes, noviembre 03, 2014

Primeros pasos con Yii 2 Framework

 

 

Instalar Yii 2


sudo apt-get install php5-mcrypt

cd /var/www/html/
sudo mkdir yii

sudo chown mi-usuario.www-data yii
chmod g+w yii/basic/models/
chmod g+w yii/basic/views/
chmod g+w yii/basic/controllers/
cd yii
wget -nd https://github.com/yiisoft/yii2/releases/download/2.0.0/yii-basic-app-2.0.0.tgz
tar -xzvf yii-basic-app-2.0.0.tgz
rm yii-basic-app-2.0.0.tgz
vi basic/config/web.php

'cookieValidationKey' => 'poner aquí una llave - texto al azar',

En ubuntu se produce un error por no detectar la librería de php mcrypt, para ello tendremos que:

sudo mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/
sudo php5enmod mcrypt
sudo /etc/init.d/apache2 restart


Generando código con Gii

Configurar la BD editando el fichero basic/config/db.php con el siguiente contenido, la BD ya debe de estar creada:

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'usuario',
    'password' => 'clave',
    'charset' => 'utf8',
];

ya podemos acceder a Gii en:
http://localhost/yii/basic/web/index.php?r=gii

Para crear toda la gestión (CRUD) de una tabla ya creada previamente en mysql podemos realizar lo siguiente en Gii:

1.- Generamos el modelo (Model Generator) correspondiente a nuestra tabla, para ello indicamos el nombre de la tabla (mitabla) y el de la clase modelo (Mimodel), pulsamos 'preview' y por último 'create'.

2.- Creamos la gestión del modelo (CRUD Generator), para ello tendremos que indicar el modelo previamente creado: app\models\Mimodel y un buscador y controlador: app\models\MimodelSearch y app\controllers\MimodelController. Como en la ocasión anterior pulsamos 'preview' y por último 'create'.


Veamos la gestión de la tabla funcionando:
http://localhost/yii/basic/web/index.php?r=mitabla



Fuentes de información:
http://www.yiiframework.com/doc-2.0
http://www.pannix.net/721/ubuntu_php_problem_json_and_mcrypt_missing_in_action/
sudo mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/ sudo mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/

Un editor para desarrollar aplicaciones web: Sublime text 3 y Brackets en Ubuntu

Sublime text 3


Instalación en Ubuntu:
 
sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer 
 
Software adicional que necesitaremos para la extensiones:
 
sudo apt-get install imagemagick 
sudo apt-get install nodejs 
sudo apt-get install npm
sudo apt-get install python-flake8 
sudo apt-get install python-pip
sudo npm install -g jshint
sudo npm install -g csslint
sudo pip install pep257 
 
 
Para poder instalar extensiones utilizaremos Package Control, por lo que procederemos a su instalación. Abrimos la consola de Sublime text 3 con View->Show Console y pegamos lo siguiente:

import urllib.request,os,hashlib; h = 
'7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0';
 pf = 'Package Control.sublime-package'; ipp = 
sublime.installed_packages_path(); urllib.request.install_opener( 
urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = 
urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', 
'%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error 
validating download (got %s instead of %s), please try manual install' %
 (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
            

Esto puede cambiar según la versión, por lo que es buena opción visitar:
https://sublime.wbond.net/installation

Extensiones a instalar para python y javascript

Para instalar las extensiones pulsar: shift+CTRL+P y buscar Control Package: Install Package.

SublimePythonIDE
Sublimelinter
Sublimelinter-jshint
Sublimelinter-flake8
Sublimelinter-csslint
Sublimelinter-pep257
Djaneiro
Ternjs
GutterColor
Emmet

Atajos de teclado a destacar

CTRL + F: buscar
CTRL + H: buscar y remplazar
CTRL + P: cambiar entre los ficheros.
CTRL + R: saltar entre las clases y métodos del programa.

Selección de varias líneas y SHIFT + CTRL + L: edición simultanea de las líneas. Con CTRL + left o right se va al principio o al final de la línea.

CRTL + D: añadir a la selección y CTRL + K saltar selección para una edición simultanea posterior.

SHIFT+ ALT + ARRIBA o ABAJO: selección en columna.

ALT + .: cierra la etiqueta abierta.

CTRL + M: saltar a la llave o parentesis.




Brackets

Instalación:

sudo add-apt-repository ppa:webupd8team/brackets 
sudo apt-get update 
sudo apt-get install brackets
 

lunes, octubre 27, 2014

Recuperando información de discos y CD-ROMs dañados

Comenzaremos por la instalación de las herramientas necesarias, en Ubuntu:

sudo apt-get install gddrescue
sudo apt-get install foremost
sudo apt-get install testdisk

sudo apt-get install dvdisaster



Vamos a tratar de recuperar un CD-ROM completo mediante :

ddrescue -b 2048 /dev/sr0 /home/nacho/imagen.iso ficherolog


Luego podemos montar la imagen obtenida para ver si hemos tenido éxito:

sudo mount -o loop imagen.iso /mnt/

También se puede intentar recuperar a nivel de ficheros, mediante  foremost:

foremost -wT -t all -i /dev/sr0 -o carpeta-destino




Más información sobre recuperación de información:
https://help.ubuntu.com/community/DataRecovery

domingo, octubre 19, 2014

Conectar Dolibarr con otra aplicación mediante un servicio SOAP

Para conectar con Dolibarr otras aplicaciones, como un carrito de la compra, puede ser muy interesante utilizar los "Web Services" que nos ofrece Dolibarr.

Para activarlos tenemos que ir a Configuración-> Módulos-> Módulos Interfaz y poner a ON los WebServices. También hay que configurar la clave para usar los Web Services (parámetro "dolibarrkey" en webservices). Indicamos una palabra clave que se nos ocurra como por ejemplo: $5x8Cd45Cadec_f?K y pulsamos salvar.


A continuación muestro un ejemplo con Python y la librería suds para obtener una factura:

from suds.client import Client

client = Client('http://www.midominio.es/dolibarr/webservices/server_invoice.php?wsdl')
auth = client.factory.create('authentication')
auth.dolibarrkey='$5x8Cd45Cadec_f?K'
auth.sourceapplication=''
auth.login='usuario'
auth.password='clave'
auth.entity=''

result = client.service.getInvoice(auth,'1')
print result


Otro ejemplo para la creación de un factura:

from suds.client import Client
import datetime


client = Client('http://www.midominio.es/dolibarr/webservices/server_invoice.php?wsdl')

auth = client.factory.create('authentication')
auth.dolibarrkey='
$5x8Cd45Cadec_f?K'
auth.sourceapplication=''
auth.login='usuario'
auth.password='clave'
auth.entity=''

invoice = client.factory.create('invoice')
invoice.date = datetime.datetime.now()
invoice.type=0
invoice.note=''
invoice.note_public='nota publica'
invoice.thirdparty_id=1 # Cliente
invoice.ref_ext=''
invoice.project_id=''

lineas = client.factory.create('LinesArray2')

line = client.factory.create('line')
line.desc='descripcin'
line.type=1
line.product_id=''
line.vat_rate=21
line.qty=1
line.total_net=25
line.total_vat=5.25
line.total=27.5

lineas.line.append(line)
invoice.lines=lineas

result = client.service.createInvoice(auth,invoice)

print result

jueves, octubre 16, 2014

Manipulando ficheros OpenXPS en Ubuntu

Para visualizar un fichero OpenXPS (Open XML Paper Specification) con extesión .xps o .oxps en Ubuntu podemos utilizar evince (en su últimas versiones) u Okula (del proyecto KDE).

Pero no se puede imprimir desde Okular debido a un bug (https://bugs.kde.org/show_bug.cgi?id=245912) en el programa, por lo que será necesario convertir el fichero en PDF para su impresión.

Procedemos a instalar el conversor mediante:

sudo apt-get install libgxps-utils

Y para convertir el fichero:

xpstopdf el-fichero.xps fichero.pdf

sábado, octubre 11, 2014

CentOS release 6.5 (Final) con versión superior a PHP 5.3.10 para funcionar con Joomla

Podemos utilizar el repositorio SCL para instalar PHP 5.4.16:


yum install centos-release-SCL
yum install php54 php54-*

Activamos el nuevo php:

source /opt/rh/php54/enable




Reiniciamos Apache para que tome la nueva configuración:

/etc/init.d/httpd restart






Pero si estas utilizando Plesk necesitas hacerle saber de la nueva configuración de PHP:

/usr/local/psa/bin/php_handler --add -displayname 5.4.16 -path /opt/rh/php54/root/usr/bin/php-cgi -phpini /opt/rh/php54/root/etc/php.ini -type fastcgi


Ahora tendremos que desde el panel de plesk acceder a inicio-> herramientas y configuración -> configuración del servidor web apache y seleccionar el módulo php54-php5 y desactivar el php5.



Ya está listo con PHP 5.4.16


Fuente de información: http://www.funkertosh.com/2014/07/25/lions-centos-6-plesk-joomla-and-php-oh-my/

jueves, octubre 02, 2014

OpenERP 7 y la actualización de Ubuntu 12.04 a Ubuntu 14.04

Tras la actualización del servidor de Ubuntu 12.04 a la nueva versión 14.04 OpenERP ha dejado de funcionar por un problema con la configuración de los idiomas en python, a continuación se muestra el log del servidor:

Traceback (most recent call last):
  File "/opt/openerp7/server/openerp/addons/web/http.py", line 203, in dispatch
    response["result"] = method(self, **self.params)
  File "/opt/openerp7/server/openerp/addons/web/controllers/main.py", line 701, in bootstrap_translations
    translations_per_module[addon_name] = {'messages': _local_web_translations(f_name)}
  File "/opt/openerp7/server/openerp/addons/web/controllers/main.py", line 493, in _local_web_translations
    for x in po:
  File "/usr/lib/python2.7/dist-packages/babel/messages/catalog.py", line 552, in __iter__
    for name, value in self.mime_headers:
  File "/usr/lib/python2.7/dist-packages/babel/messages/catalog.py", line 337, in _get_mime_headers
    locale='en')))
  File "/usr/lib/python2.7/dist-packages/babel/dates.py", line 609, in format_datetime
    locale = Locale.parse(locale)
  File "/usr/lib/python2.7/dist-packages/babel/core.py", line 313, in parse
    raise UnknownLocaleError(input_id)
UnknownLocaleError: unknown locale 'en'


Para resolver este problema basta con reinstalar python-babel-localedata:

  sudo apt-get install --reinstall python-babel-localedata

miércoles, octubre 01, 2014

Envío masivo de correos personalizados mediante Thunderbird y Mail Merge

Seguramente hayas necesitado enviar correos electrónicos a muchas personas sobre un mismo asunto pero te hubiera gustado que hubieran llegado con su nombre y a su dirección de correo (no en un saco de direcciones de copia oculta). Esto es realmente sencillo con Thunderbird y el complemento Mail Merge.

Primero, como es lógico, necesitamos Thunderbird instalado y configurado con la cuenta de correo electrónico que vamos a utilizar para realizar el envío masivo.

Ahora accede a Herramientas-> Complementos y busca "mail merge", este aparecerá en la lista de resultados y pulsaremos en el botón de instalar. Reiniciamos Thunderbird para que se active el complemento.


Llega el momento interesante, crea un nuevo correo electrónico de forma habitual y redacta el correo que deseas enviar de forma masiva. En el destinatario indica {{correo}} y en el cuerpo de correo {{nombre}}




Y ahora llega la hora de la verdad, pulsa sobre Archivo -> Mail Merge.



Obtendremos un dialogo donde tendremos que indicar la fuente (source) de nuestra lista de correos a los que deseamos escribir, seleccionaremos la opción CSV. Pues se puede utilizar la libreta de contactos de Thunderbird pero lo habitual será obtener de alguna base de datos un listado de correos que tendremos que convertir en un fichero CSV. Esto es muy  sencillo con una hoja de calculo, por ejemplo en LibreOffice.

El fichero CSV tendrá dos columnas, una con las direcciones de correo y la otra con los nombres. En la primera fila tendrán sus nombres (que son las variables que hemos utilizado al redactar el correo): correo y nombre. Veamos un ejemplo de fichero CSV:

correo,nombre 
correodeejemplo@undominio.com,Nombre de la persona
otrocorreo@sudominio.es,otro nombre
mascorreos@dominio.mx,su nombre


En la sección de CSV tendremos que facilitar el fichero (file) que hayamos preparado con las direcciones, junto con la dirección podemos almacenar el nombre del destinatario. Por lo que tendremos que fijarnos en nuestro CSV si ha separado los campos con comas (,) o con punto y coma (;) e indicarlo como delimitador de campo (field delimiter).


Finalmente pulsamos aceptar y se generan tantos correos electrónicos como tengamos en nuestro fichero CSV. Dependiendo del número de destinatarios esto puede tardar un rato. Pero ojo aún no se han enviado los correos, estos se encuentran en la Bandeja de salida.


Podemos revisar primero que los correos se han generado correctamente y en se momento Archivo -> Procesar mensajes no enviados.

También se nos queda guardado el correo inicial en plantillas por si necesitamos volver a realizar un correo masivo similar.


lunes, septiembre 29, 2014

Instalación Django en NAS Synology con FastCGI

Los NAS Synology no traen el módulo de apache mod-wsgi por lo que he utilizado el módulo mod-fastcgi en su lugar para hacer funcionar Django en los NAS Synology.


Necesitamos del módulo mysql-python, para su instalación podemos seguir la entrada que ya se publicó en este mismo blog:  http://ilizaran.blogspot.com.es/2014/09/instalacion-del-modulo-mysql-python-en.html

De la instalación de mysql-python ya tendremos instalado pip en el NAS por lo que podremos instalar Django con algunos módulos necesarios:

pip install Django
pip install setuptools
pip install flup


Para saber que la instalación de Django ha sido correcta y verificar la versión podemos realizar:


python
import django 

django.VERSION


Ahora modifcamos la configuración de apache editando el fichero /etc/httpd/conf/httpd.conf-user  para hacer accesible los ficheros css, imágenes y javascript de la parte administrativa de Django, por lo que añadimos:


Alias /static/admin /usr/local/packages/@appstore/Python/usr/local/lib/python2.7/site-packages/django/contrib/admin/static/admin


<Directory /usr/local/packages/@appstore/Python/usr/local/lib/python2.7/site-packages/django/contrib/admin/static/admin >
Order allow,deny
Allow from all
</Directory>



Dependiendo de donde se instale Django puede que esta configuración sea diferente, también se me ha dado el caso siguiente:


Alias /static/admin /lib/python2.7/site-packages/django/contrib/admin/static/admin


<Directory /lib/python2.7/site-packages/django/contrib/admin/static/admin >
Order allow,deny
Allow from all
</Directory>



Reiniciar apache desde el DSM para que surta efecto.

El resto de configuración de apache la podemos realizar mediante un fichero .htaccess, que lo tendremos que crear en la carpeta del alojamiento web de nuestro NAS. En mi caso la carpeta por defecto de alojamiento de páginas web es /volume1/web y ahí creo el fichero con el contenido:

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f 

RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]


Ahora creamos un pequeño script en python que situaremos en el espacio web (en mi caso /volume1/web/),  para ver si FastCGI y python funcionan correctamente, lo llamamos por ejemplo test.fcgi:


#!/usr/bin/python
# -*- coding: UTF-8 -*-


from cgi import escape
import sys, os
from flup.server.fcgi import WSGIServer


def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])


    yield '<h1>FastCGI Environment</h1>'
    yield '<table>'
    for k, v in sorted(environ.items()):
       yield '<tr><th>%s</th><td>%s</td></tr>' % (escape(k), escape(v))
    yield '</table>'


WSGIServer(app).run()

Desde un navegador web indicamos http://mi-ip-nas/test.fcgi y debemos obtener la configuración del entorno FastCGI.



Ahora hay que configurar un puente entre FastCGI y Django para ello vamos obtener el script fcgi.py de Allan Saddi gracias a Keikubo (descargarlo de: https://github.com/keikubo/Python-FastCGI-Sample) y localizarlo en nuestro espacio web.


wget -nd https://github.com/keikubo/Python-FastCGI-Sample/archive/master.zip
unzip master.zip
mv Python-FastCGI-Sample-master/lib/fcgi.py /volume1/web


Ahora tenemos que crear el fichero que utiliza fcgi.py para lanzar nuestra aplicación Django, por ejemplo lo podemos llamar index.fcgi y contendrá:

#!/usr/bin/python

import sys, os

sys.path.append("/volume1/mi-carpeta/mi-aplicacion-django")

os.chdir("
/volume1/mi-carpeta/mi-aplicacion-django")
os.environ.setdefault("DJANGO_SETTINGS_MODULE","mi-aplicacion-django.settings")

from fcgi import WSGIServer
#from django.core.handlers.wsgi import WSGIHandler

#WSGIServer(WSGIHandler()).run()

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

WSGIServer(application).run()


La aplicación de Django no se pone en el espacio web, en mi caso  /volume1/mi-carpeta, dentro está mi aplicación Django.

Ya podemos acceder a nuestra aplicación Django en http://ip-nas/


Fuentes de información utilizadas:

http://forum.synology.com/enu/viewtopic.php?f=40&t=18423
http://zoia.org/2006/12/16/como-correr-django-y-python-usando-apache-y-fastcgi
https://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/



domingo, septiembre 28, 2014

Instalar Dolibarr (ERP/CRM) en Ubuntu 14.04

Dolibarr versión 3.3.4 se encuentra en los repositorios de Ubuntu por lo tanto sólo tenemos que realizar:

sudo apt-get install dolibarr

Se muestra una alerta con respecto adodb, pero no hay problema todo funciona correctamente.

Para finalizar la instalación nos vamos al navegador web y accedemos a la página de instalación de Dolibarr en nuestro equipo:

http://mi-host/dolibarr/install/

Nos mostrará una página web donde se verifica que se cumplen todos los requisitos para el correcto funcionamiento de Dolibarr y la posibilidad de comenzar la configuración pulsando sobre el botón siguiente.

A continuación se nos muestra una pantalla con todas las opciones de configuración, en principio no hay que cambiar nada salvo indicar la clave que se le quiere asignar al usuario de la base de datos (usuario: dolibarr y la clave la que deseemos) y por último el usuario administrador de la base de datos (normalmente será root y la clave dependerá de nuestra configuración). 

Después de varias páginas informando del proceso de instalación alcanzamos la penúltima pantalla donde se nos solicita el usuario y clave del administrador. Nos sugiere 'admin', pero sería mejor utilizar un usuario menos predecible por temas de seguridad y poner una contraseña fuerte.

Cuando se acceda por primera vez a Dolibarr nos llevará a la configuración para que indiquemos los valores mínimos de configuración para poder funcionar, como por ejemplo el nombre de la empresa, país, etc...



miércoles, septiembre 24, 2014

Create new certified for Courier (popd and imapd), Dovecot and Postfix

If you find these types of errors in your maillog:

courier-imaps: couriertls: read: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca

or

courier-imaps: couriertls: /usr/share/imapd.pem: error:0906D06C:PEM routines:PEM_read_bio:no start line


Probably you have to create a news certified. Let go:

Make a backup of you old certified, you can edit courier, dovecot and postfix files configs to know where is it  (/etc/courier-imap/imap-ssl and /etc/courier-pop3d-ssl, /etc/postfix/main.cf and /etc/dovecot/dovecot.conf):


mkdir certbackup
cp /usr/share/pop3d.pem certbackup
cp /usr/share/imapd.pem certbackup

cp /etc/postfix/postfix_default.pem certbackup
cp /etc/dovecot/private/ssl-cert-and-key.pem certbackup

Now, you have to create a private key and certified. Importan to respond to 'Common Name'.


openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout cert.key -out cert.csr
...
Common Name (eg, your name or your server's hostname) []:www.domain.com
...
cp cert.key /usr/share/pop3d.pem
cat cert.key cert.csr > /usr/share/imapd.pem

cat cert.key cert.csr > /etc/postfix/postfix_default.pem
cat cert.key cert.csr > /etc/dovecot/private/ssl-cert-and-key.pem


Restart courier, dovecot and postfix.

Instalación del módulo mysql-python en NAS Synology

Instalar gcc en Synology

Para la instalación de mysql-python es necesario el compilador gcc, por lo que lo obtendremos de Synology Open Source Project (http://sourceforge.net/projects/dsgpl). El paquete a descargar dependerá de la versión de NAS Synology que tengamos, por lo que tendremos que utilizara el comando:


uname -a


para conocer la versión de nuestro kernel y arquitectura instalada y descargar el paquete correspondiente. En mi caso he descargado: gcc463_glibc213_i686_cedarview-GPL.tgz pues mi equipo muestra cedarview y i686. Ahora lo descargamos y lo extraemos:


cd /usr/local
http://kent.dl.sourceforge.net/project/dsgpl/DSM%205.2%20Tool%20Chains/Intel%20x86%20Linux%203.2.40%20%28Cedarview%29/cedarview-gcc463_glibc213_i686_patched-GPL.txz
tar -xvJf cedarview-gcc463_glibc213_i686_patched-GPL.txz
rm
cedarview-gcc463_glibc213_i686_patched-GPL.txz


Instalación de las fuentes de Mysql

Synology utiliza MariaDB, pero para la compilación del módulo de python podemos utilizar las fuentes de Mysql. Descargaremos la versión que coincida con la que ya tenemos instalada.

cd /volume1
wget -nd http://cdn.mysql.com/Downloads/MySQL-5.5/mysql-5.5.39-linux2.6-i686.tar.gz
gzip -d mysql-5.5.39-linux2.6-i686.tar.gz
tar -xvf mysql-5.5.39-linux2.6-i686.tar
rm mysql-5.5.39-linux2.6-i686.tar


Necesitamos mysql_config que no está en el NAS.


ln -s /volume1/mysql-5.5.39-linux2.6-i686/bin/mysql_config /usr/bin/mysql_config

Instalación de pip

Descarga e instalación:

wget -nd https://bootstrap.pypa.io/get-pip.py
python get-pip.py


Instalación de mysql-python

Tenemos que definir todas estas variables de entorno para que se adapte al compilador y las fuentes de Mysql que hemos instalado, por lo que será necesario modificarlas para que se adapten a nuestra configuración:


export CROSS_PREFIX=i686-pc-linux-gnu
export TARGET=i686-pc-linux-gnu
export TOOLCHAIN=/usr/local/i686-pc-linux-gnu
export AR=${TOOLCHAIN}/bin/${CROSS_PREFIX}-ar
export AS=${TOOLCHAIN}/bin/${CROSS_PREFIX}-as
export CC=${TOOLCHAIN}/bin/${CROSS_PREFIX}-gcc
export CXX=${TOOLCHAIN}/bin/${CROSS_PREFIX}-g++
export LD=”${TOOLCHAIN}/bin/${CROSS_PREFIX}-ld”
export LDSHARED="${TOOLCHAIN}/bin/${CROSS_PREFIX}-gcc -shared "
export RANLIB=${TOOLCHAIN}/bin/${CROSS_PREFIX}-ranlib
export CFLAGS="-I${TOOLCHAIN}/include -O3 ${MARCH} -I/opt/include/python2.6/ -I/volume1/mysql-5.5.39-linux2.6-i686/include"
export LDFLAGS="-L${TOOLCHAIN}/lib -L/lib/"
export PKG_CONFIG_PATH="${TOOLCHAIN}/lib/pkgconfig"

Finalmente  procedemos a la instalación:

pip install mysql-python

domingo, septiembre 21, 2014

Configuración automática de impresoras en equipos Windows


Para la instalación automática de impresoras en equipos Windows utilizaremos un script en Visual Basic Script que a continuación veremos.

Lo primero será hacernos de los controladores del fabricante para nuestro modelo de impresora. En este ejemplo se trata de una impresora Kyocera FS 4200 DN. Una vez tengamos el controlador del fabricante tendremos que localizar el fichero INF que contiene la información para la instalación de la impresora. Por lo que tendremos que localizar dentro del fichero el nombre exacto con que el fabricante identifica el modelo de impresora en cuestión, en nuestro caso es: "Kyocera FS-4200DN KX"


Como pretendemos que el script se pueda utilizar en las diferentes versiones de Windows,  vamos a utilizar una función llamada FindOSType que nos ayude con dicho objetivo.

Al comienzo del script para las versiones superiores a windows XP necesitamos que este se auto llame solicitando privilegios de administrador para poder realizar la instalación de los controladores de la impresora.


Luego hacemos uso del procedimiento MapLPRPrinter para que se genere el puerto de la impresora y se instale la impresora. La llamada al procedimiento tendremos que adaptarla para nuestra impresora o impresoras (pues podríamos instalar todas las impresoras que nos hagan falta).  Los parámetros serán:

  1.  el nombre exacto que nos indicó el fabricante de la impresora,
  2.  la trayectoria a los controladores (en el ejemplo hemos asumido que están en el mismo lugar que el script)
  3.  el nombre exacto del fichero INF.
  4.  IP que deseamos asignar a la impresora
  5.  nombre que deseamos asignar a la impresora
  6.  nombre de la cola


Script completo para la instalación de una impresora Kyocera FS 4200 DN:

Set WshShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
strComputer = WshShell.ExpandEnvironmentStrings("%computername%")
OSType = FindOSType(strComputer)






Set WshShell = WScript.CreateObject("WScript.Shell")

If WScript.Arguments.length = 0 And OSType <> "Windows XP" Then
  Set ObjShell = CreateObject("Shell.Application")
  ObjShell.ShellExecute "wscript.exe", """" & _
  WScript.ScriptFullName & """" &_
  " RunAsAdministrator", , "runas", 1
  WScript.Quit
End If

MapLPRPrinter "Kyocera FS-4200DN KX", oFSO.GetParentFolderName(wscript.ScriptFullName) & "\" , "\OEMSETUP.INF",  "192.168.1.175","Impresora kyocera","followme"
MapLPRPrinter "Kyocera ECOSYS P6026cdn KX", 

 
 Wscript.Echo "Finalizada la instalación."


Sub MapLPRPrinter(strDriverName,strDriverInfPath,strDriverInf,strIPAdr,strPrinterName,strQueue) 

    Const PathArc = "winmgmts:root\cimv2:Win32_Processor='cpu0'"
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
    objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True 
    on Error Resume Next 
  
'SETS PRINTER PORT. 
     Set objNewPort = objWMIService.Get("Win32_TCPIPPrinterPort").SpawnInstance_ 
    objNewPort.Name = strPrinterName &  strIPAdr 
    objNewPort.PortNumber = "515" 
    objNewPort.Protocol = 2 
    objNewPort.HostAddress = strIPAdr 
    objNewPort.Queue = strQueue 
    objNewPort.ByteCount = True 
    objNewPort.SNMPEnabled = False 
    objNewPort.Put_ 
 
    NewPort = objNewPort.Put_ 
      
'INSTALLS DRIVER NOT LOCATED IN Driver.cab 
     Set objDriver = objWMIService.Get("Win32_PrinterDriver") 
    objDriver.Name = strDriverName 
     
    if GetObject(PathArc).AddressWidth = 32 then
        'WScript.Echo "Arquitectura 32bits"
        objDriver.DriverPath = strDriverInfPath  & "32"
        objDriver.FilePath = strDriverInfPath  & "32"
        objDriver.Infname = strDriverInfPath & "32" & strDriverInf 
        objDriver.SupportedPlatform = "Windows NT x86"
       
     else
        'Wscript.Echo "Arquitectura 64bits"
        'objDriver.DriverPath  = strDriverInfPath  & "64"
        objDriver.FilePath  = strDriverInfPath  & "64"
        objDriver.Infname = strDriverInfPath & "64" & strDriverInf 
        objDriver.SupportedPlatform = "Windows x64"
       
    end if
    objDriver.Version = "3" 
    intResult = objDriver.AddPrinterDriver(objDriver) 
    If intResult >0 Then
        WScript.Echo "Error en la instalación codigo: " & intResult & _
        "  Carpeta del driver: " & objDriver.DriverPath & _
            "  INFO: " & objDriver.Infname & _
        "  Driver: " & strDriverName
    End If
 
'SETS PRINTER TO PORT. 
  
     Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_ 
    objPrinter.Name = strPrinterName 
    objPrinter.DriverName = strDriverName 
    objPrinter.PortName   = strPrinterName &  strIPAdr 
    objPrinter.DeviceID   = strPrinterName 
    objPrinter.CurrentLanguage = 2 
    objPrinter.Network = True 
    objPrinter.Shared = False 
    objPrinter.EnableBIDI = False 
    objPrinter.Put_ 
End Sub 


Function FindOSType(strComputer)
    'Defining Variables
    Dim objWMI, objItem, colItems
    Dim OSVersion, OSName, ProductType

    'Get the WMI object and query results
    Set objWMI = GetObject("winmgmts://" & strComputer & "/root/cimv2")
    Set colItems = objWMI.ExecQuery("Select * from Win32_OperatingSystem",,48)

    'Get the OS version number (first two) and OS product type (server or desktop)
    For Each objItem in colItems
        OSVersion = Left(objItem.Version,3)
        ProductType = objItem.ProductType
    Next

    'Time to convert numbers into names
    Select Case OSVersion
    Case "6.1"
    OSName = "Windows 7"
        Case "6.0"
            OSName = "Windows Vista"
        Case "5.2"
            OSName = "Windows 2003"
        Case "5.1"
            OSName = "Windows XP"
        Case "5.0"
            OSName = "Windows 2000"
        Case "4.0"
            OSName = "Windows NT 4.0"
        Case Else
            OSName = "Windows 9x"
    End Select

    'Return the OS name
    FindOSType = OSName

    'Clear the memory
    Set colItems = Nothing
    Set objWMI = Nothing
End Function




Fuente de información:

http://gallery.technet.microsoft.com/scriptcenter/Add-a-LPR-Printer-include-f462f332

http://www.leinss.com/blog/?p=1098

viernes, septiembre 19, 2014

Configurando el entorno de desarrollando para Django en Ubuntu GNU/Linux

Python ya estará instalado en nuestra versión de Ubuntu, sólo tendremos que instalar Django, pero la versión disponible para Ubuntu no suele ser la más reciente de Django así que utilizaremos:

sudo apt-get install python-pip
sudo pip install Django


También podemos instalar ipython para tener una shell más rica: 

sudo apt-get install ipython

podemos verificar que se ha instalado correctamente verificando la versión instalada:

django-admin --version


También necesitamos tener instalado java versión 7, con OpenJDK:

sudo apt-get install icedtea-7-plugin openjdk-7-jre
 
con Oracle Java:
 
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Obtener Eclipse IDE for Java EE Developers, actualmente la última versión es Luna:

http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/lunar

Instalar PyDev desde Eclipse, seleccionamos Help en el menú y luego Install new software ... donde añadimos una nueva fuente de software con la dirección web:
http://pydev.org/updates

y a instalar se ha dicho... 


Para indicarle a PyDev que utilice Python y Django instalado, tenemos que acceder al siguiente dialogo Window->Preferences->PyDev->Interpreter-Python y pulsar sobre el botón Auto Config y finalizamos pulsando OK.




Fuentes de información:
www.eclipse.org
http://www.ubuntu-guia.com/2012/04/instalar-oracle-java-7-en-ubuntu-1204.html
http://pydev.org/manual_101_install.html

lunes, septiembre 08, 2014

OPENOFFICE/LIBREOFFICE Y LILYPOND

La suite ofimática libre OpenOffice o LibreOffice dispone de un procesador de textos WYSIWYG llamado Writer con unas prestaciones similares o superiores a muchos otros comerciales. Este procesador puede ser de gran utilidad para la escritura de documentos de texto junto a fragmentos de música gracias a la extensión OOoLilypond de Samuel Hartmann. 
 
La puedes descargar de la siguiente dirección: http://ooolilypond.sourceforge.net. También hay una versión de esta misma página traducida al español por Francisco Vila: http://www.paconet.org/ooolilypond/.

Esta extensión nos permite incorporar fragmentos musicales como imágenes dentro del texto, mediante el lenguaje Lilypond. Estos fragmentos musicales son   modificables en cualquier momento sin necesidad de salir del procesador de textos.

Una vez instalada la extensión OooLilypond podemos incorporar un fragmento musical pulsando sobre el botón Oly de la barra de herramientas y obtendremos el siguiente dialogo:


El mayor espacio del dialogo lo ocupa la área de edición donde introducir el lenguaje Lilypond, donde por defecto nos muestra un ejemplo: \key e \major e8 fis gis e fis8 b,4. | e2\fermata \bar "|.".  

Para la correcta integración de Lilypond con el procesador de textos no se permite la incorporación directa de todas las características propias de Lilypond, pues en especial todo lo relacionado con el formato de la página podría chocar con el formato del documento que se está editando. Por lo tanto OooLilypond utiliza una serie de plantillas (Templates) con el fin de parametrizar algunos valores de configuración. Donde podemos apreciar que la longitud (LineWidth) y tamaño (StaffSize) del pentagrama se establece mediante parámetros. Se disponen de otros parámetros personalizados (Custom 1 y 2) según la plantilla, para el caso de la plantilla Default el campo Custom 1  se refiere la instrucción \relative de Lilypond. En cuanto al posicionamiento de la imagen (Anchor) lo podemos vincular al carácter (As Character), párrafo (To Paragraph) o página (To page).

Para que se muestre la imagen del fragmento músical pulsaremos sobre el botón Lilypond  en el caso de producirse algún error con el texto introducido los errores se mostrarán al pie del dialogo y se podrán ver los distintos mensajes utilizando los botones de desplazamiento < y > que están situados al pie izquierdo del dialogo. También podemos ver la salida de Lilypond pulsando sobre el botón Ly Output.

Podemos acceder a otros valores de configuración mediante el botón Config, para  establecer los valores por defecto que obtendremos con el dialogo de edición de OooLilypond, además de indicar donde se encuentran las plantillas y la instalación de Lilypond. También podremos indicar que formato de la imagen sea png o eps y la resolución de la imagen en puntos por pulgadas.



Una interfaz Gráfica para Lylipond


El proyecto de Lilypond no ha desarrollado una interfaz gráfica, pero si podemos encontrar otros proyectos que nos pueden ayudar a suplir esta carencia. Se tratan de  aplicaciones de software libre que permiten la edición y reproducción visual de partituras, con la posibilidad de exportar estas al formato de Lilypond. Por ejemplo: GNU Denemo, Canorus, Rosegarden o MuseScore.
MuseScore (http://musescore.org/es) es un editor visual de partituras con un manejo sencillo y similar a otras alternativas comerciales muy conocidas. Dispone de un estupendo asistente para comenzar la creación de una nueva partitura, que es ideal para principiantes y un rápido inicio para las personas experimentadas. Puede ser la mejor opción para iniciarse en la edición de partituras mediante software libre, pues al permitir importar partituras en formato MusicXML y en MIDI estándar, podremos recuperar partituras que tengamos de otras aplicaciones anteriores. Posteriormente podremos exportar estas partituras a Lilypond y así lograr mejores resultados. No tendremos limitación por el sistema operativo, pues al igual que Lilypond es multiplataforma, funciona tanto en GNU/Linux como en Windows y MacOS X.



Además de estos editores, existen otros que sin ser gráficos disponen de diversas funcionalidades que nos hacen más fácil el trabajo con Lilypond. Por ejemplo: JEdit o Frescobaldi. 
Frescobaldi (http://frescobaldi.org/) es un entorno de trabajo, que integra un editor con  el procesamiento en Lilypond para la generación de los formatos de salida, y su posterior reproducción o visualización. 

Sus principales características son:
  • un asistente para la generación de nuevas partituras, donde fácilmente podemos introducir los títulos y los encabezamientos, las partes y la configuración de la partitura.

  • Sintaxis resaltada por colores. De forma similar a los editores de los entornos de programación de los lenguajes de desarrollo de aplicaciones informáticas, el editor de Frescobaldi nos identifica los términos que introducimos por colores según sean palabras reservadas del lenguaje, cadenas de caracteres, identificadores, etc. Esto permite una mayor facilidad en la lectura del lenguaje y una identificación más rápida de errores introducidos durante la transcripción al ser resaltados en rojo por el editor. 
  • Ocultación de fragmentos de código,  algo que se agradece en partituras de gran extensión para reducir la lectura de fragmentos que no necesitamos o sabes que ya están correctos y en ese momento no son de interés. 
  • Balanceo de llaves. Cuando nos posicionamos o escribimos un cierre de llaves Frescobaldi nos resalta la llave de apertura a  la que corresponde el cierre para que verifiquemos de esta forma que está correcto el balanceo de llaves. 
  • Botonera para la inserción rápida de articulaciones, adornos y símbolos. 
  • Sistema de autocomplementación. Cuando iniciamos la introducción de un termino, a medida que vamos introduciendo caracteres, Frescobaldi nos va ofreciendo los diferentes términos que se pueden utilizar en ese lugar. Esto ahorra tiempo en la escritura y evita errores en la introducción de términos. 
  • Documentación sensible al contexto. 
  • Integración de visualizador de PDF, con posibilidad de pulsar sobre la notación musical  y saltar al lenguaje Lilypond que ha generado la notación correspondiente. 
  • Vinculación con la aplicación Rumor para la entrada de la notación musical desde un teclado MIDI. 
  • Posibilidad de incorporar extensiones con nuevas funcionalidades como: corrección ortográfica, exportación en formato HTML del lenguaje Lilypond de la partitura, etc.

UN EJEMPLO CON FRESCOBALDI

A continuación se muestra la canción popular ¿Dónde están las llaves? elaborada con las notas en colores.


\version "2.16.0"

\header {
title = "¿Dónde están las llaves?"
}

\paper {
% utilize the new format
#(set-paper-size "a4" 'landscape)
indent = #0
ragged-right = ##t
ragged-bottom = ##t
}

global = {
\key c \major
\time 4/4
}

%Association list of pitches to colors.
#(define color-mapping
(list
(cons (ly:make-pitch 0 0 0) (x11-color 'magenta))
(cons (ly:make-pitch 0 1 -1/2) (x11-color 'grey))
(cons (ly:make-pitch 0 1 0) (x11-color 'grey))
(cons (ly:make-pitch 0 1 1/2) (x11-color 'grey))
(cons (ly:make-pitch 0 2 0) (x11-color 'orange))
(cons (ly:make-pitch 0 2 1/2) (x11-color 'orange))
(cons (ly:make-pitch 0 3 -1/2) (x11-color 'green))
(cons (ly:make-pitch 0 3 0) (x11-color 'green))
(cons (ly:make-pitch 0 4 -1/2) (x11-color 'blue))
(cons (ly:make-pitch 0 4 0) (x11-color 'blue))
(cons (ly:make-pitch 0 4 1/2) (x11-color 'blue))
(cons (ly:make-pitch 0 5 0) (x11-color 'red))
(cons (ly:make-pitch 0 5 -1/2) (x11-color 'red))
(cons (ly:make-pitch 0 5 1/2) (x11-color 'red))
(cons (ly:make-pitch 0 6 1/2) (x11-color 'purple))
(cons (ly:make-pitch 0 6 0) (x11-color 'purple))
(cons (ly:make-pitch 0 6 -1/2) (x11-color 'purple))))

%Compare pitch and alteration (not octave).
#(define (pitch-equals? p1 p2)
(and
(= (ly:pitch-alteration p1) (ly:pitch-alteration p2))
(= (ly:pitch-notename p1) (ly:pitch-notename p2))))

#(define (pitch-to-color pitch)
(let ((color (assoc pitch color-mapping pitch-equals?)))
(if color
(cdr color))))

#(define (color-notehead grob)
(pitch-to-color
(ly:event-property (ly:grob-property grob 'cause) 'pitch)))

nmi =\markup { Mi }
nfa = \markup { Fa }
nsol = \markup { Sol }
nla = \markup { La }
nsi = \markup { Si }
ndo = \markup { Do }
nre = \markup { Re }

linea_uno = \relative c' {
e8^\nmi f^\nfa g4^\nsol c^\ndo b8^\nsi b^\nsi a^\nla a^\nla g^\nsol g^\nsol a^\nla b^\nsi
c^\ndo g^\nsol e^\nmi f^\nfa g4^\nsol c^\ndo b8^\nsi b^\nsi a^\nla a^\nla g^\nsol g^\nsol a^\nla b^\nsi c4^\ndo

e,8^\nmi f^\nfa g4^\nsol c^\ndo b8^\nsi b^\nsi a^\nla a^\nla g^\nsol g^\nsol a^\nla b^\nsi
c^\ndo g^\nsol e^\nmi f^\nfa g^\nsol c^\ndo b^\nsi b^\nsi a^\nla a^\nla g^\nsol g^\nsol a^\nla b^\nsi c4^\ndo
}



letra_uno = \lyricmode {
Dón- de_es- tán las lla- ves ma- ta- ri- le, ri- le,
ri- le dón de_es- tán las lla- ves ma- ta- ri- le, ri- le rón.
En el fon- do del mar ma- ta- ri- le, ri- le,
ri- le. En el fon- do del mar ma- ta- ri- le, ri- le, rón.
}


\score {
\new Staff \with {
} { \linea_uno}
\addlyrics { \letra_uno }
\layout {
#(layout-set-staff-size 40)
\context {
\Staff
\override NoteHead #'color = #color-notehead
\override NoteHead #'font-size = #5
\override StaffSymbol #'staff-space = #(magstep 7)
\override StaffSymbol #'thickness = #3
\override Clef #'font-size = #4
}
}
}

Se obtiene algo así:

 

INTEGRACIÓN DE PARTITURAS Y TEXTO

Lilypond nos ofrece unos resultados excelentes para la creación de partituras, pero además nos posibilita la incorporación de sus capacidades en la redacción de nuestros textos de LaTeX, Texinfo, HTML y DocBook, con fragmentos de partituras.

Por ejemplo, para el caso de HTML directamente dentro de nuestra página web podemos incorporar:


<html>
<body>
<lilypond fragment relative=1>
\clef treble
\key d \major
\time 2/4
a'4 d,8 e
</lilypond>
</body>
</html>


Previo a la publicación de la página web deberemos procesar el fichero HTML con lilypond-book que realizará la conversión. Este genera una imagen en formato png para su visualización con un enlace para que se pueda descargar el lenguaje Lilypond que ha generado la notación musical. El fichero HTML resultante tendrá algo similar a:


<html>
<body>
<p>
 <a href="df/lily-ace312ec.ly">
  <img align="middle"  border="0" src="df/lily-ace312ec.png" alt="[image of music]">
 </a>
</p>
</body>
</html>