Categoría: General

Como crear una libreria externa e independiente en PHP que pueda ser importada desde composer usando packagist

Mientras inicio el desarrollo de una librería en PHP que sirva de cliente para el API de Twitter, únicamente como pasatiempo, y sirviéndome de la excelente librería de Abraham  llamada abraham/twitteroauth, he pensado en documentar todos los pasos que hago.

En esta primera entrega explicaré que pasos he seguido para crear una librería externa e independiente en PHP, y que sea usada libremente por la comunidad, gracias a composer, github y packagist.

Como prerequisitos tendremos el conoceer mínimamente y tener cuenta operativa en github y packagist. Así como un conocimiento también en git y composer.

Lo primero será crear un nuevo directorio en nuestro directorio principal del servidor web (normalmente /var/www/html).


mkdir twitterclient

Crearemos un fichero composer.json con este contenido mínimo:

{  
   "name":"cybtow/twitterclient",
   "type":"library",
   "description":"A client for API Twitter, based on abraham/twitteroauth",
   "keywords":[  
      "twitter",
      "api",
      "client"
   ],
   "license":"MIT",
   "authors":[  
      {  
         "name":"cybtow",
         "role":"Developer"
      }
   ],
   "support":{  
      "source":"https://github.com/cybtow/twitterclient",
      "issues":"https://github.com/cybtow/twitterclient/issues"
   },
   "require":{  
      "php":"^5.6 || ^7.0",
      "abraham/twitteroauth":"^0.7.4"
   },
   "autoload":{  
      "psr-4":{  
         "Cybtow\\TwitterClient\\":"src"
      }
   }
}

Los elementos principales son:

  • name: El nombre de la librería. Se compone de un prefijo, normalmente el autor (cybtow), y el nombre del proyecto (twitterclient).
  • type: En nuestro caso “library“, que indica que el proyecto será una librería independiente.
  • require: Las dependencias de nuestra librería, en este caso se especifica la versión mínima de PHP y la dependencia que tenemos con la librería que vamos a usar “abraham/twitteroauth“.
  • autoload: Indicamos que desde cualquier proyecto que incluya nuestra librería, nuestras clases situadas en el directorio “src” estarán disponibles en el namespace “Cybtow\TwitterClient“.

Podéis encontrar más información sobre la estructura del fichero composer.json en:

Ahora, desde nuestro directorio “twitterclient“, vamos a crear el directorio “src“, donde situaremos nuestro código fuente.


mkdir twitterclient/src

A continuación vamos a ejecutar composer, para asegurarnos que por el momento vamos bien, y prepare nuestro proyecto con las dependencias que hemos especificado.

Desde twitterclient ejecutamos


composer update

Un nuevo directorio “vendor” se ha creado, en él podremos encontrar las librerías externas con las que tenemos dependencias, en este caso únicamente la librería “abraham/twitteroauth“.

Una vez hecho esto, desarrollaremos nuestra librería.

En nuestro caso, y a modo de prueba, he creado un fichero en src, llamado TwitterClient.php.

Una vez tengamos nuestro código fuente creado (y probado), el siguiente paso será subir la librería al repositorio GitHub.

Respecto a GitHub deberemos tener una cuenta creada y correctamente configurada (incluyendo las claves SSH: https://help.github.com/articles/connecting-to-github-with-ssh/)

Dentro de nuestra cuenta en GitHub, crearemos un nuevo repositorio.

Una vez tengamos el repositorio creado, tendremos que crear un fichero .gitignore en el directorio principal de nuestra librería, con el fin de excluir la carpeta “vendor” (y en mi caso la carpeta que se auto-crea “nbproject” por ser Netbeans el IDE que uso) del repositorio Git.

El fichero tendrá este contenido:

/nbproject/
/vendor/

Bien, ahora estamos en disposición de subir el código al repositorio GitHub, creando una primera versión 0.1 para nuestra librería.

En consola, y desde nuestro directorio “twitterclient” haremos:


git init
git remote add github git@github.com:cybtow/twitterclient.git
git add .
git commit -m "First commit"
git tag -a 0.1 -m "version 0.1"
git push -u --tags github master

Una vez hecho esto, ya tendremos nuestro código fuente en GitHub, en nuestro caso concreto en https://github.com/cybtow/twitterclient, y ya estará disponible para que otros usuarios puedan usarlo.

Pero nosotros queremos ir un paso más alla, y queremos que nuestra librería pueda usarse como una dependencia más en un proyecto PHP usando composer (igual que hicimos nosotros con nuestra librería importando la librería externa “abraham/twitteroauth“).

Ahora, desde packagist, y teniendo una cuenta creada y activa, subiremos nuestra librería o paquete (package en inglés, este término es el usual en packagist).

En “Repository URL (Git/SVN/Hg)” pegaremos la URL de nuestro repositorio en GitHub, en este caso es: https://github.com/cybtow/twitterclient

Y pulsaremos el botón “Check“.

Una vez chequeado, pulsaremos el botón “Submit“.

¡Bravo! Desde este momento cualquier programador podrá incluir nuestra librería (o paquete o package) en sus proyectos. En este caso, la librería “cybtow/twitterclient” ya está disponible para que desde cualquier proyecto PHP, y usando composer, pueda ser incluida, simplemente haciendo desde dicho proyecto:


composer require cybtow/twitterclient

 

Si miramos el fichero composer.json del proyecto que está haciendo uso de nuestra nueva librería, veremos que se ha incluido la dependencia en la zona “require”.


"require": {
"php": ">=5.5.9",
"cybtow/twitterclient": "^0.1.0",

...

Modificaremos manualmente en el fichero composer.json el valor “^0.1.0” a “0.*“, para cuando en el futuro actualicemos nuestra librería (más adelante en este artículo lo hago), se actualice automáticamente desde composer update.

Pero aún no hemos terminado, porque también queremos que cada vez que subamos una nueva versión de nuestro proyecto a GitHub, se genere una nueva versión en Packagist, y así los usuarios puedan actualizarse automáticamente con su “composer update“.

Para ello haremos click en “GitHub Service Hook” de la página justamente anterior.

En la página que se abre nos dan las instrucciones de como configurar GitHub para que “avise” automáticamente a Packagist cuando haya cambios. Para ello haremos:

Desde nuestro proyecto “cybtow/twitterclient” en GitHub, seleccionamos “Settings“.

En el menú de la izquierda seleccionamos “Integrations & services

Pulsamos el botón “Add service” de la derecha, y seleccionamos “Packagist

Volvemos a la página principal de “Packagist” para ver cual es nuestro token secreto.

Rellenamos los datos de “user” y “token“.  Pero “domain” lo dejamos vacío.

Pulsamos el botón “Add service“.

Abrimos el servicio que se acaba de crear.

Y pulsamos en “Test service” para comprobar que todo ha ido bien.

Una vez hecho esto, nos volvemos a la web de Packagist, en concreto a nuestro proyecto recién creado, en nuestro caso “cybtow/twitterclient“: https://packagist.org/packages/cybtow/twitterclient

Y pulsamos el botón verde “Update“.

Tras pulsar “Update“, veremos como el mensaje “This package is not auto-updated. Please set up the GitHub Service Hook for Packagist” so that it gets updated whenever you push!” desaparece. Eso significa que cada vez que hagamos push a nuestro repositorio GitHub con una nueva versión de nuestra librería, Packagist será automáticamente actualizado.

Para comprobar que todo haya ido bien realizaremos un cambio en nuestra librería, por ejemplo añadir un comentario en algún fichero de código fuente, etiquetaremos una nueva versión (0.2), haremos push, y desde otro proyecto que incluya una dependencia a nuestra librería (cybtow/twitterclient) veremos como se actualiza automáticamente desde la versión 0.1 a la versión 0.2.

Actualizamos y publicamos nueva versión (después de realizar algún cambio en código fuente):


git add src/TwitterClient.php

git commit -m "Adding comment in header"

git tag -a 0.2 -m "version 0.2"

git push --tags github master

Si ahora recargamos la página de Packagist veremos que ya tenemos disponible la nueva versión 0.2.

Finalmente, desde otro proyecto que esté usando nuestra librería, actualizamos las dependencias y veremos como nuestra librería es actualizada:


composer update

Con esto concluyo este artículo, espero lo hayas disfrutado igual que yo escribiéndolo. Si te ha resultado útil, por favor ¡compártelo!

Anuncios

Instalación y configuración de servidor Ubuntu Server 11.10 32 bits

A modo de mini-guía o  de chuleta, voy a explicar como instalar y configurar un servidor Ubuntu Server 11.10 32 bits, por lo que simplemente me limitaré a ir enumerando los pasos rápidamente.

Lo primero es descargarlo de http://www.ubuntu.com/download/server/download. Recordamos que la opción que hemos seleccionado es la 11.10 (la última en estos momentos) y de 32 bits.

Una vez descargado el fichero ISO, y grabado convenientemente en un CD, arrancamos el PC con dicho CD. A continuación voy detallando brevemente las opciones que voy seleccionando en el asistente de configuración:

  • Idioma: Español.
  • Seleccionamos la opción ‘Instalar Ubuntu Server’.
  • País, territorio o área: España.
  • ¿Detectar teclado?: No.
  • Teclado: Español.
  • Distribución del teclado: Español.
  • Nombre de la máquina: ubuntuserver.
  • Si la zona geográfica que nos muestra no es la correcta, seleccionamos la correcta, en este caso Madrid.
  • Método de particionado: Manual. Guiado – utilizar todo el disco completo y usar el LVM.
  • Particionado:
  • Seleccionamos el disco duro.
  • Indicamos el máximo de tamaño a usar.
  • Finalizamos el particionado.
  • Nombre completo: El nuestro 🙂
  • Nombre usuario de cuenta: Algo cortito: pepe, juan, maria, luis…
  • Escribimos contraseña.
  • Seleccionamos que SÍ cifre las carpetas personales.
  • Información del proxy: Lo rellenaremos si en  nuestro caso es necesario.
  • Seleccionamos “Instalar actualizaciones de seguridad automáticamente”.
  • Seleccionamos las aplicaciones de servidor que queramos instalar. En este caso selecciono: OpenSSH server, LAMP server, Mail server, Print server, Samba file server, Tomcat java server, Virtual Machine host, Manual package selection.
  • En la pantalla de Aptitude pulsamos la ‘q’ para cerrarlo.
  • Escribimos la constraseña del usuario root de MySQL.
  • En tipo genérico de configuración de correo, seleccionamos: Sitio de Internet.
  • Nombre del sistema de correo: En este caso dejamos el que sugiere el instalador.
  • ¿Desea instalar el cargador de arranque GRUB en el registro principal de arranque?: En mi caso selecciono que SÍ, porque en este PC solo estará este sistema operativo.

Una vez hechos estos pasos el sistema quedará instalado y se reiniciará.

Cuando arranquemos el PC ya podremos trabajar con Ubuntu Server desde consola usando nuestro login y password que creamos con anterioridad en el asistente de instalación.

Ahora vamos a configurar el interfaz gráfico Gnome en español, ya que Ubuntu Server se instala unicamente para ser usado desde consola.

Para ello realizaremos las siguientes acciones:

  • sudo apt-get update
  • sudo apt-get install ubuntu-desktop
  • sudo apt-get install language-pack-es language-pack-es-base language-pack-gnome-es language-pack-gnome-es-base language-selector
  • sudo apt-get install gksu
  • sudo apt-get install gnome-system-tools gnome-nettool

Una vez instalados todos los paquetes anteriores, necesitamos reiniciar (orden: reboot), y una vez arrancado de nuevo el sistema y hecho login, accederemos directamente al entorno gráfico, si no es así podremos arrancar el modo gráfico con la orden: startx.

Ahora pasaremos a configurar el compartir carpetas con los clientes Windows. Desde una consola nos crearemos una carpeta de esta forma:

  • sudo mkdir /var/compartida
  • sudo chmod -R 777 /var/compartida

Una vez creada necesitamos indicarla a SAMBA (es el servicio encargado de compartir carpetas y que sean vistas desde Windows) que queremos compartir dicha carpeta, para ello:

  • sudo gedit /etc/samba/smb.conf

Se abrirá un editor de texto, lo primero es especificar el grupo de trabajo, esto se indica en la directiva workgroup.

Después nos vamos al final del fichero y añadimos este bloque de código:

[compartida]

comment = Compartido en UBUNTU SERVER

path = /var/compartida

writeable = yes

browseable = yes

valid users = usuario

Donde usuario es el nombre del usuario, podemos poner más de uno separados por espacio en blanco.

Una vez salvado el fichero, y vuelto a la consola, debemos asignar una contraseña de acceso a cada usuario, para ello escribiremos:

  • sudo smbpasswd -a usuario

Donde usuario es el nombre del usuario, el sistema nos preguntará la contraseña nueva.

Ahora reiniciaremos el servicio para que nos pille los cambios:

  • sudo service smbd restart

Los números de 2011

Los duendes de las estadísticas de WordPress.com prepararon un reporte para el año 2011 de este blog.

Aqui hay un extracto

La sala de conciertos de la Ópera de Sydney contiene 2.700 personas. Este blog fue visto cerca de 34.000 veces en 2011. Si fuese un concierto en la Ópera, se necesitarían alrededor de 13 actuaciones agotadas para que toda esa gente lo viera.

Haz click para ver el reporte completo.

Realizar copia de seguridad automáticamente en Linux (Ubuntu)

Voy a explicar la solución que estoy usando para realizar una copia de seguridad de varios directorios a un disco duro externo USB. El backup quiero que se ejecute automáticamente todos los días, aunque no haya hecho login (iniciar sesión) en mi Ubuntu.

Lo primero que haré será especificar a mi Ubuntu que quiero que me monte automáticamente el disco duro externo USB, para ello desde línea de comandos ejecutaré la siguiente orden:

sudo kate /etc/fstab

Si no tenéis instalado el editor de texto kate (por defecto viene instalado en Kubuntu) deberéis poner el que vosotros uséis normalmente.

Una vez abierto el fichero fstab tenemos que añadir una línea tal que esta:

/dev/sdc1 /media/AUX1 ntfs auto,rw,exec,users,dmask=000,fmask=111,nls=utf8 0 0

De esta manera indicaremos que el disco duro conectado al dispositivo USB sdc1 queremos que se monte automáticamente en /media/AUX1, con permisos de lectura escritura, para todos los usuarios, y estando el disco duro usando el sistema de archivos NTFS.

Si no sabemos en que device está conectado el disco duro, lo que haremos será conectar el disco duro al PC, y montarlo usando algunos de los mecanismos visuales que incluyen los escritorios GNOME o KDE. Una vez montado ejecutaremos:

sudo mount

y veremos una lista de todos los dispositivos montados en nuestro sistema.

Una vez editado el fichero fstab lo salvaremos y cerraremos el editor, con esto si tenemos el disco duro conectado al PC, cada vez que se arranque el sistema, se montará automáticamente.

Lo segundo es crear un archivo batch que especifique que copiar y a donde. Yo he llamado al fichero backup.sh, lo he creado en /home/misuario, y le he dado permisos de escritura, lectura y ejecución para todos los usuarios:

sudo chmod 777 /home/miusuario/backup.sh

Editamos el fichero, y añadimos lo siguiente:

mount -a

rsync -r -t -v –progress –delete -s /var/ftp /media/AUX1/
rsync -r -t -v –progress –delete -s /var/www /media/AUX1/

La primera línea es para asegurarnos que si por alguna razón no se han montado automáticamente los dispositivos indicados en el fichero fstab pues que lo haga ahora.

La segunda y tercera línea realizan la copia de dos directorios al disco duro externo USB. En el artículo anterior escribí como instalar la utilidad rsync (que sirve para sincronizar directorios).

El tercer paso es indicar al sistema que ejecute el fichero backup.sh todos los días a las 2:00h. Para realizarlo tendremos que editar el fichero /etc/crontab:

sudo kate /etc/crontab

Añadiendo esta línea:

* 2    * * *    root    /home/miusuario/backup.sh

Y listo, todos los días a las 2:00h se ejecutará nuestra copia de seguridad automáticamente, tanto si hemos iniciado sesión como si no.

Aquí podéis encontrar más información sobre los ficheros/comandos usados:

fstab

rsync

cron

mount

De nuevo a la carga

Después de una gran paréntesis en el blog, voy a intentar volver a retomar el ir poniendo algunas cosillas de las que me encuentro por Internet o me dicen amigos, que luego a uno le hace falta y nunca encuentra nada 🙂