Plugin BackupFile para Sublime Text 2

Hace poco que he empezado a usar Sublime Text 2 (ST2) para desarrollar código. A veces hago grandes modificaciones sobre un archivo y necesito mantener el archivo antes de modificarlo por si tuviera que volver atrás.

Con esta idea me he creado un simple plugin para hacer un duplicado o backup del archivo con el nombre original más una cadena YYYYMMDD-HHMMSS. Es decir un archivo index.php se copiaría a index.php-2014-03-04-190354.

Para crear el plugin nos  vamos al menú de ST2: Tools -> New Plugin…

Esto nos creará un nuevo plugin de ejemplo, que cambiaremos por este código:

import sublime, sublime_plugin
import time
import os
import shutil

    class BackupFileCommand(sublime_plugin.WindowCommand):
        def run(self, paths):
            filesrc = paths[0]
            filedst = paths[0]+"-"+time.strftime('%Y%m%d-%H%M%S')
            if os.path.isfile(filesrc):
                try:
                    shutil.copy(filesrc, filedst);
                except:
                    sublime.status_message("Error copiando el archivo")

Este archivo lo guardamos en el directorio » ~/.config/sublime-text-2Packages/User/BackupPlugin.py «.

Lo siguiente será crear o modificar el archivo » ~/.config/sublime-text-2Packages/User/Side Bar.sublime-menu » y añadir el siguiente código:

[ {
    "caption": "Backup File",
    "command": "backup_file",
    "args": { "paths": [] }
 } ]

Ahora, cuando pulsemos sobre un archivo en la barra lateral (sidebar), nos aparecerá una nueva opción «Backup File» que nos copiará el archivo seleccionado.

Este es el primer plugin de ST2 que creo, sin tener apenas idea, pero buscando algo por Internet he conseguido justo lo que quería. Quizás os venga bien a más de uno, así que lo comparto.

Hay un plugin bastante bueno, llamado Automatic Backups, que realiza una copia de backup cada vez que guardamos el archivo. La pega que tiene es que genera demasiadas copias, mientras que el mío sólo lo hace cuando nosotros queremos.

Eliminar ‘index.php’ de Laravel 4.1 en Apache 2 con mod_rewrite

Una vez que hayamos instalado Laravel, el acceso a los recursos precisa que las URLs queden como http://localhost/index.php/resource/. Sería más bonito poder quitar ese ‘index.php’, ¿verdad? Laravel incluye un archivo .htaccess en el directorio ‘public’ que sirve para reescribir las URLs internamente y que éstas sean como http://localhost/resource/.

Este archivo ‘.htacces’ contiene lo siguiente:

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller…
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

Como podemos ver, este archivo habilita el RewriteEngine, pero para ello necesita el módulo mod_rewrite habilitado en Apache. Usaremos el siguiente comando para habilitarlo:

$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart

Es posible que con esto no sea suficiente, ya que la configuración del VirtualHost default contiene una directiva AllowOverride None que impide que .htaccess funcione. Así que tendremos que editar el archivo de configuración del VirtualHost (/etc/apache2/sites-available/default) y cambiar ‘AllowOverride None’ por ‘AllowOverride All’.

Una vez tengamos habilitado el módulo mod_rewrite y configurada la directiva AllowOverride All, reiniciamos Apache:

$ sudo service apache2 restart
* Restarting web server apache2                                                                                                                                                 apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
… waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
[ OK ]

Ya podremos navegar por nuestra aplicación web sin tener que usar ‘index.php’.

Instalación de Laravel-4-Generators

En el anterior artículo instalamos Laravel 4.1. Ahora le vamos a añadir el paquete Laravel-4-Generators. La instalación la explican perfectamente en su página, pero la voy a poner aquí por si alguien tiene problemas con el inglés.

Lo primero será editar el archivo composer.json que está en nuestro directorio. En mi caso este archivo se encuentra en:

/var/www/nagvel/composer.json

Buscamos la clave «require» y añadimos detrás otra clave llamada «require-dev»:

«require-dev»: {
«way/generators»: «2.*»
},

Y actualizamos:

/var/www/nagvel$ sudo composer update -dev

Loading composer repositories with package information
Updating dependencies (including require-dev)
– Installing way/generators (2.6)

Downloading: 100%

Writing lock file
Generating autoload files
Generating optimized class loader

Una vez se ha completado la instalación, necesitamos añadir el proveedor de servicio al archivo app/config/app.php. Editamos dicho archivo, buscamos la clave ‘provider’ y añadimos la siguiente línea al final de dicha clave:

‘Way\Generators\GeneratorsServiceProvider’

Si ahora ejecutamos «php artisan» veremos que ahora tendremos más opciones, todas ellas del tipo generate. Os muestro las diferencias:

generate
generate:controller          Generate a controller
generate:migration           Generate a new migration
generate:model               Generate a model
generate:pivot               Generate a pivot table
generate:publish-templates   Copy generator templates for user modification
generate:resource            Generate a new resource
generate:scaffold            Scaffold a new resource (with boilerplate)
generate:seed                Generate a database table seeder
generate:view                Generate a view

A partir de ahora, cuando queramos generar algún controlador, modelo, vista, migración, pivote, recurso… podremos usar el comando:

php artisan generate:xxxxxxx

Notas sobre composer

Ejecutar un diágnostico:

$ composer diagnose
Checking platform settings: FAIL
The xdebug extension is loaded, this can slow down Composer a little.
Disabling it when using Composer is recommended, but should not cause issues beyond slowness.
Checking git settings: OK
Checking http connectivity: OK
Checking disk free space: OK
Checking composer version: FAIL
Your are not running the latest version

Ver la versión que tenemos instalada:

$ composer –version
Composer version 7adc41d02c3536b3e19a6b906cf0c4cf6d3beb70 2014-01-20 18:10:11

Actualizar la versión actualmente instalada:

$ sudo composer selfupdate
Updating to version aa74818fe00c5f5eb57c1c38b807e9e2950c670c.
    Downloading: 100%        
Use composer self-update –rollback to return to version 7adc41d02c3536b3e19a6b906cf0c4cf6d3beb70

 

$ composer –version
Composer version aa74818fe00c5f5eb57c1c38b807e9e2950c670c 2014-02-21 15:53:59

Hacer un rollback a la versión anterior:

$ sudo composer selfupdate –rollback
Rolling back to version 2014-01-20_18-10-11-7adc41d.

 

$ composer –version
Composer version 7adc41d02c3536b3e19a6b906cf0c4cf6d3beb70 2014-01-20 18:10:11

Instalación de Laravel 4.1 en Debian 7 Wheezy

Hace poco me he iniciado en este framework de desarrollo web basado en PHP. Se llama Laravel y actualmente va por la versión 4.1.18. En este primer artículo voy a explicar cómo instalarlo en Debian 7 Wheezy, aunque debe funcionar igualmente en cualquier versión de Linux. Como requisito hay que tener instalado PHP versión 5.3.7 o superior y la librería MCrypt de PHP.

En primer lugar necesitamos descargarnos composer. Como en mi sistema no tengo instalado curl pero sí tengo php, voy a usar este último para descargar composer, y posteriormente lo moveré al directorio /usr/local/bin para ejecutarlo de forma más fácil.

root@wheezy:/var/www# php -r «readfile(‘https://getcomposer.org/installer');» | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading…

Composer successfully installed to: /var/www/composer.phar
Use it: php composer.phar
root@wheezy:/var/www# mv composer.phar /usr/local/bin/composer

Si os fijáis he usado el usuario root, así que que tened en cuenta el uso de sudo si no sois root, y el archivo descargado se llama composer.phar y lo he renombrado a composer.

Una vez descargado y movido a /usr/local/bin lo ejecutamos para comprobar que funciona:

root@wheezy:/var/www# composer
______
/ ____/___  ____ ___  ____  ____  ________  _____
/ /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 7343198817f365b1676ced0f353808f0e408ff9a 2014-02-07 09:59:35

Usage:
[options] command [arguments]

Options:
–help           -h Display this help message.
–quiet          -q Do not output any message.
–verbose        -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
–version        -V Display this application version.
–ansi              Force ANSI output.
–no-ansi           Disable ANSI output.
–no-interaction -n Do not ask any interactive question.
–profile           Display timing and memory usage information
–working-dir    -d If specified, use the given directory as working directory.

Available commands:
about            Short information about Composer
archive          Create an archive of this composer package
config           Set config options
create-project   Create new project from a package into given directory.
depends          Shows which packages depend on the given package
diagnose         Diagnoses the system to identify common errors.
dump-autoload    Dumps the autoloader
dumpautoload     Dumps the autoloader
global           Allows running commands in the global composer dir ($COMPOSER_HOME).
help             Displays help for a command
init             Creates a basic composer.json file in current directory.
install          Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
licenses         Show information about licenses of dependencies
list             Lists commands
require          Adds required packages to your composer.json and installs them
run-script       Run the scripts defined in composer.json.
search           Search for packages
self-update      Updates composer.phar to the latest version.
selfupdate       Updates composer.phar to the latest version.
show             Show information about packages
status           Show a list of locally modified packages
update           Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
validate         Validates a composer.json

Parece que sí y la versión descargada es:

Composer version 7343198817f365b1676ced0f353808f0e408ff9a 2014-02-07 09:59:35

El siguiente paso será descargar e instalar laravel. Yo voy a crearme un nuevo proyecto que voy a llamar nagvel, así que en el directorio /var/www ejecuto el siguiente comando:

root@wheezy:/var/www# composer create-project –prefer-dist laravel/laravel nagvel

Si queréis que vuestro proyecto tenga otro nombre, sólo tenéis que cambiar «nagvel» en el comando anterior.

Empezará a descargarse (tarda un poco) y descargará también todas las dependencias que tenga:

root@wheezy:/var/www# composer create-project –prefer-dist laravel/laravel nagvel
Installing laravel/laravel (v4.1.18)
– Installing laravel/laravel (v4.1.18)
Downloading: 100%

Created project in nagvel
Loading composer repositories with package information
Installing dependencies (including require-dev)
– Installing symfony/translation (v2.4.1)
Downloading: 100%

– Installing psr/log (1.0.0)
Downloading: 100%

– Installing symfony/routing (v2.4.1)
Downloading: 100%

– Installing symfony/process (v2.4.1)
Downloading: 100%

– Installing symfony/finder (v2.4.1)
Downloading: 100%

– Installing symfony/console (v2.4.1)
Downloading: 100%

– Installing symfony/filesystem (v2.4.1)
Downloading: 100%

– Installing symfony/debug (v2.4.1)
Downloading: 100%

– Installing symfony/http-foundation (v2.4.1)
Downloading: 100%

– Installing symfony/event-dispatcher (v2.4.1)
Downloading: 100%

– Installing symfony/http-kernel (v2.4.1)
Downloading: 100%

– Installing symfony/dom-crawler (v2.4.1)
Downloading: 100%

– Installing symfony/css-selector (v2.4.1)
Downloading: 100%

– Installing symfony/browser-kit (v2.4.1)
Downloading: 100%

– Installing swiftmailer/swiftmailer (v5.0.3)
Downloading: 100%

– Installing stack/builder (v1.0.1)
Downloading: 100%

– Installing predis/predis (v0.8.5)
Downloading: 100%

– Installing phpseclib/phpseclib (0.3.5)
Downloading: 100%

– Installing patchwork/utf8 (v1.1.18)
Downloading: 100%

– Installing nesbot/carbon (1.8.0)
Downloading: 100%

– Installing monolog/monolog (1.7.0)
Downloading: 100%

– Installing nikic/php-parser (v0.9.4)
Downloading: 100%

– Installing jeremeamia/superclosure (1.0.1)
Downloading: 100%

– Installing filp/whoops (1.0.10)
Downloading: 100%

– Installing ircmaxell/password-compat (1.0.3)
Downloading: 100%

– Installing d11wtq/boris (v1.0.8)
Downloading: 100%

– Installing classpreloader/classpreloader (1.0.1)
Downloading: 100%

– Installing laravel/framework (v4.1.21)
Downloading: 100%

symfony/translation suggests installing symfony/config ()
symfony/translation suggests installing symfony/yaml ()
symfony/routing suggests installing symfony/config (For using the all-in-one router or any loader)
symfony/routing suggests installing symfony/yaml (For using the YAML loader)
symfony/routing suggests installing symfony/expression-language (For using expression matching)
symfony/routing suggests installing doctrine/annotations (For using the annotation loader)
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/http-kernel suggests installing symfony/class-loader ()
symfony/http-kernel suggests installing symfony/config ()
symfony/http-kernel suggests installing symfony/dependency-injection ()
predis/predis suggests installing ext-phpiredis (Allows faster serialization and deserialization of the Redis protocol)
predis/predis suggests installing ext-curl (Allows access to Webdis when paired with phpiredis)
phpseclib/phpseclib suggests installing ext-gmp (Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.)
phpseclib/phpseclib suggests installing pear-pear/PHP_Compat (Install PHP_Compat to get phpseclib working on PHP >= 4.3.3.)
patchwork/utf8 suggests installing ext-intl (Use Intl for best performance)
monolog/monolog suggests installing mlehner/gelf-php (Allow sending log messages to a GrayLog2 server)
monolog/monolog suggests installing raven/raven (Allow sending log messages to a Sentry server)
monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server)
monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server)
monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))
monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server)
monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB)
d11wtq/boris suggests installing ext-readline (*)
laravel/framework suggests installing doctrine/dbal (Allow renaming columns and dropping SQLite columns.)
Writing lock file
Generating autoload files
Generating optimized class loader
Application key [USCuULF66wR8NykEDq6EWr7ZbVmAS5YW] set successfully.

Ya con esto tenemos instalado Laravel 4.1.18 en nuestro equipo.

Para probar nuestra web entraremos en http://localhost/nagvel/public/.

Muy probablemente nos mostrará una página en blanco. Esto se debe a que el usuario del servidor web (www-data) no tiene permisos de escritura sobre el directorio /var/www/nagvel/app/storage. Así que cambio el propietario de dicho directorio:

root@wheezy:/var/www# chown -R www-data nagvel/app/storage/

Y ahora sí deberíamos ver la siguiente página de bienvenida:

Imagen

El siguiente paso es opcional, pero recomendable, ya que lo voy a usar en mis siguientes artículos sobre Laravel. Se trata de instalar Laravel-4-Generators, un paquete de Laravel 4, que proporciona una variedad de generadores para acelerar el proceso de desarrollo de nuestra aplicación. Estos generadores incluyen:

  • generate:model
  • generate:controller
  • generate:seed
  • generate:view
  • generate:migration
  • generate:resource
  • generate:scaffold
  • generate:form
  • generate:test
  • generate:pivot

Instalación de PNP4Nagios en Debian Wheezy

Complementando mi anterior artículo, en el que explicaba cómo instalar Nagios en Debian, ahora es el momento de instalar PNP4Nagios, un addon para Nagios que sirve para analizar los datos de rendimiento proporcionados por los plugins y almacenarlos en bases de datos RRD (Round Robin Databases).

Debian ya incluye PNP4Nagios en sus repositorios oficiales, así que lo instalaremos usando apt:

# aptitude install pnp4nagios

Lo siguiente será leer el archivo /usr/share/doc/pnp4nagios/README.Debian del paquete pnp4nagios, donde nos recomiendan usar bulk mode y será el que yo utilice. Para configurar este modo bulk seguimos los siguientes pasos:

  1. Habilitar NPCD: Editar el archivo /etc/default/npcd y establecer RUN=»yes»
  2. Habilitar «process_performance_data»: Editar el archivo /etc/nagios3/nagios.cfg y establacer process_performance_data=1
  3. Registrar «broker_module»: Editar el archivo /etc/nagios3/nagios.cfg y establecer broker_module=/usr/lib/pnp4nagios/npcdmod.o config_file=/etc/pnp4nagios/npcd.cfg
  4. Ejecutar NPCD: /etc/init.d/npcd start (si éste no ha sido iniciado ya)
  5. Recargar Nagios: /etc/init.d/nagios reload

Para ver las gráficas generadas, entramos en la siguiente URL: http://localhost/pnp4nagios/

Si queremos crear enlaces a PNP4Nagios en la interfaz de Nagios para cada uno de nuestros hosts y services configurados, tenemos que configurar la propiedad action_url de estos hosts y services. Para no configurarlos uno a uno, se puede optar por configurar las plantillas (templates).

Para los hosts, editamos la definición de plantilla para generic-host (/etc/nagios3/conf.d/generic-host_nagios2.cfg o el que corresponda) y agregamos la siguiente línea: action_url  /pnp4nagios/graph?host=$HOSTNAME$

Para los services, editamos la definición de plantilla para generic-service (/etc/nagios3/conf.d/generic-service_nagios2.cfg o el que corresponda) y agregamos la siguiente línea: action_url  /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$

Con estos cambios, ahora veremos un nuevo icono que nos enlaza a las gráficas del correspondiente HOST o SERVICE, tal como podemos ver en las siguientes capturas:

PNP4Nagios01 PNP4Nagios02

Instalación de Nagios 3.4.1 en Debian Wheezy

Vamos a ver cómo instalar Nagios en Debian. He utilizado la última versión estable de Debian actualmente: Debian Wheezy.

Podemos instalar Nagios usando los repositorios oficiales de Debian o hacerlo descargando las fuentes desde la web de descargas de Nagios. En mi caso he optado por lo más sencillo, usar los repositorios de Debian, así que lo único que debemos hacer es instalar el paquete nagios3 usando apt o aptitude.

# aptitude install nagios3

En total se instalan 156 paquetes por las dependencias, entre las que se incluyen apache2, exim4 y nagios-plugins.

La instalación es muy sencilla. Lo único que nos pide es la contraseña del usuario nagiosadmin, que necesitaremos para acceder a la interfaz web una vez terminada la instalación.

http://localhost/nagios3/

Configurar escáner Genius ColorPage-Vivid 1200XE en Ubuntu 12.04

Hoy he necesitado escanear un par de documentos y he comprobado que Ubuntu tiene una aplicación llamada Simple Scan que es muy sencillita. He probado con el comando lsusb para comprobar que lo detectaba:

$ lsusb
Bus 007 Device 004: ID 0458:201f KYE Systems Corp. (Mouse Systems) ColorPage-Vivid 1200 XE

Lo detecta perfectamente.

Luego he probado a ejecutar la herramienta scanimage y me da el siguiente error:

$ scanimage
[gt68xx] Couldn’t open firmware file (`/usr/share/sane/gt68xx/CCD569.fw’): Permission denied
scanimage: open of device gt68xx:libusb:007:004 failed: Invalid argument

Buscando… veo que hay que copiar el archivo CCD569.fw a ese directorio. Pero, ¿de dónde saco ese archivo? Aprovechando que lo tenía instalado en Windows 7, lo encuentro en C:\Program Files\ScannerU\CCD569.fw. Lo copio en el directorio anterior y a escanear!

$ sudo mkdir -p /usr/share/sane/gt68xx
$ sudo cp /media/windows/Program\ Files/ScannerU/CCD569.fw /usr/share/sane/gt68xx
$ sudo chmod 666 /usr/share/sane/gt68xx/CCD569.fw
$ scanimage
scanimage: output is not a file, exiting

Ahora el mensaje que da es informativo, pero no de error, así que ejecutamos de nuevo la aplicación Simple Scan y ya podemos escanear nuestros documentos.

 

NOTA: Os pongo aquí el enlace al archivo CCD569.fw por si os hiciera falta. Por limitaciones de WordPress, lo he subido con extensión PDF, así que renombradlo a CCD569.fw.

Instalar plugin de PHP de Aptana 1.5 en Aptana 2.0

En casa he instalado Aptana 3, pero en el trabajo tengo Aptana 2. Éste no tiene soporte de PHP, así que he buscado cómo instalarlo. He llegado a la siguiente página donde explican perfectamente cómo instalar el plugin de PHP de Aptana 1.5 en Aptana 2.0:

http://www.bram.us/2010/01/26/installing-the-original-aptana-15-php-plugin-in-aptana-20/

Resumo los pasos:

  1. En Aptana seleccionamos Help -> Install New Software…
  2. Pinchamos en el botón Add y añadimos una nueva entrada con nombre «Aptana PHP Update Site» y con localización «http://update.aptana.com/install/php«.
  3. Seleccionamos esta nueva entrada que hemos creado en el menú desplegable y luego el paquete «Aptana PHP 1.1 Development Environment«.
  4. Seguimos los pasos pulsando los botones Next y Finish.

También se puede hacer una instalación manual, pero eso mejor lo véis en el artículo original:

http://www.bram.us/2010/01/26/installing-the-original-aptana-15-php-plugin-in-aptana-20/

Instalación de MapSource

Me he bajado la última versión de MapSource de la página de Garmin:

MapSource software version 6.16.3

Esta descarga tiene la pega de que es una actualización y, si no tenemos previamente instalado MapSource en nuestro ordenador, nos dará el siguiente mensaje de error:

No se ha encontrado la instalación anterior de MapSource

La solución es muy sencilla. Tan sólo tendremos que crear una clave en el registro. Éste podría ser el archivo MapSouce-InstallDir.reg:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\Mapsource\Products]
«InstallDir»=»»

Una vez tengamos creada esa clave, lanzamos otra vez la instalación y esta vez no debería darnos ningún problema.

NOTA: En caso de que tengamos Windows de 64 bits, entonces la clave de registro es otra:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Garmin\Mapsource\Products]
«InstallDir»=»»