Instalar Oracle JDK en Debian/Ubuntu

Introducción

Recientemente he descargado el Android Studio y necesito el JDK oficial de Oracle para hacerlo funcionar. Para instalarlo en nuestra distribución Linux primero debemos comprobar la versión de java instalada (interprete y compilador):

$ java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.4)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)

Desintalar OpenJDK si está instalado

Si no tienes instalada el OpenJDK no necesitas seguir estos pasos, pero en mi caso voy a desinstalar los paquetes del OpenJDK.

$ sudo apt-get remove openjdk-6-jre*

Instalar Oracla JDK

A continuación, para instalar el Oracle JDK:

  1. Añadir repositorio:
    sudo add-apt-repository ppa:webupd8team/java
  2. Actualizamos los repositorios con:
    sudo apt-get update
  3. Instalar Oracle JDK:
    sudo apt-get install oracle-java7-installer

Para comprobar que la instalación ha tenido éxito, ejecuta en una terminal el comando para saber la versión de Java que utiliza tu Ubuntu:

java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM (build 24.45-b08, mixed mode)

Desintalar Oracle JDK

Si quisieramos desinstalar el Oracle JDK:

sudo apt-get remove oracle-java7-installer

Y sus repositorios:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:webupd8team/java

Configurar un multihost con apache2 y en Debian/ubuntu [ACTUALIZADO]

Introducción

Como desarrollador Web en alguna ocasión he tenido que realizar algún proyecto sin disponibilidad de tener un servidor de desarrollo. Hasta este punto, existen tres opciones si queremos trabajar con un servidor de desarrollo en lugar de usar un WAMP o un XAMPP (que son cómodos pero poco profesionales).

  • Contratar un multihost a algún proveedor de servicios de hosting
  • Instalar una máquina servidor configurandola con multihost y su propio DNS, etc.
  • Instalar un servidor LAMP con multihost en el equipo de trabajo

En esta entrada me voy a decantar por esta última opción por comodidad y rapidez. Pero hay que tener en cuenta que esta solución sólo servirá para tener un entorno multihost para uno mismo, si se trabaja en grupo en un red no será un sistema válido.

Instalando apache2, php5, mysql5 … (lamp)

Lo primero, es instalar un sistema LAMP (Linux, Apache, Mysql, PHP). Esto en un sistema Debian/Ubuntu es tan sencillo cómo ejecutar en consola:

$ sudo apt-get install apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libaprutil1-dbd-sqlite3 libaprutil1-ldap libhtml-template-perl mysql-server mysql-server-5.5 mysql-server-core-5.5 apache2-mpm-prefork libapache2-mod-php5 libtidy-0.99-0 php5 php5-cli php5-common php5-curl php5-gd php5-mysql php5-odbc php5-sqlite php5-tidy php5-xdebug php5-xmlrpc libapache2-mod-auth-mysql libphp-jpgraph dbconfig-common libmcrypt4 php-doc php5-mcrypt phpmyadmin

A continuación, como sana costumbre recomiendo cambiar la clave de root de MySQL.

mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('yourpassword');

Y por último, si hemos instalado PHP, editar el fichero /etc/php5/apache2/php.ini y habilitar el uso de mysql, en la línea:

;extension=mysql.so

Cambiadla por: 

1extension=mysql.so

Un poco de DNS

Apache2 se configura de modo que se le indica al servidor en que interfaces de red y puertos debe funcionar. Tomemos la imagen siguiente:

Disponemos de varios nombres de dominio (reales o ficticios) y deseamos que apunten a la misma máquina, pero claro, no queremos que apache nos facilite las mismas Webs para cada uno, sino que sean proyectos diferentes (multihost), para ello debemos indicar el sistema DNS que esos nombres apuntan a la IP del servidor de trabajo.

Si estuviéramos en un entorno real y profesional, tendríamos un servidor DNS y un servidor LAMP dedicado con una IP W.X.Y.Z, e indicaríamos al servidor DNS que cada dominio apunte al servidor con IP W.X.Y.Z. Como estamos probando en un servidor “monopuesto” no necesitamos configurar ningún servidor DNS, sólo debemos editar el fichero /etc/hosts. Este fichero es una reminiscencia del origen de Internet y contiene parejas del tipo (nombre, ip).

De modo que si queremos añadir el dominio de prueba “midominio”, sólo debemos añadir al final del fichero /etc/hosts la sighuiente línea:

127.0.0.1    midominio

Una vez hecho esto, nuestro equipo sabe que la IP del dominio midominio es 127.0.0.1. Pero, sólo nuestro equipo, este fichero es local al equipo dónde lo hemos editado de ahí que este sistema sólo nos sirva para el equipo de trabajo no para trabajar en equipo.

Sistema multihost en apache2

Y por fin, vamos a ver los pasos para configurar un sistema multihost en nuestro apache2. Supongamos que los DocumentRoot de los diferentes dominios estan en la carpeta /home/usuario/www, debemos seguir estos pasos:

  1. Añadir el usuario al grupo WWW-DATA de apache2: Para que apache pueda leer/escribir sin problemas en sus carpetas (Cambiad USUARIO por vuestro usuario)
    $ sudo usermod -G www-data USUARIO
  2. Poner los permisos 775 para directorios y 664 para ficheros: Por lo mismo que en el apartado anterior ($PWD se evalúa como el directorio actual, se puede indicar el directorio correspondiente).
    $ find $PWD -type d -print -exec chmod 775 {} \;
    $ find $PWD -type f -print -exec chmod 664 {} \;
  3. Cambiar los permisos del directorio del vhost:
    $ sudo chown -R USUARIO:www-data *
  4. Edita el fichero del virtual host:
    
    <VirtualHost *:80>
    	ServerAdmin	info@miemail.com
    	Servername	midominio
    	DocumentRoot	/home/usuario/www/midominio
    	LogLevel	warn
    	ErrorLog 	${APACHE_LOG_DIR}/midominio_error.log
    	CustomLog	${APACHE_LOG_DIR}/midominio_access.log combined
    	<Directory />
    		Options FollowSymLinks
    		AllowOverride None
    	</Directory>
    	<Directory /home/usuario/www/midominio>
    		Options Indexes FollowSymLinks MultiViews
    		AllowOverride All
    		Order allow,deny
    		allow from all
    	</Directory>
    </VirtualHost>

    Debemos tener cuidado con lo siguiente, en Debian/Ubuntu la configuración inicial de apache2 desactiva el uso del fichero .htaccess. Para habilitarlo debemos ser cuidadods de poner la directiva AllowOverride All como en el ejemplo anterior.

    Novedad: En versiones recientes de apache está configuración puede no ser suficiente y debemos añadir alguna directiva adicional, para no encontrartos un error HTTP 403 Forbbiden. De modo que en la configuración del directorio con el DOCUMENT ROOT debemos a Require all granted, quedando algo así

    :

    <Directory "your directory here">
       Order allow,deny
       Allow from all
       # New directive needed in Apache 2.4.3: 
       Require all granted
    
    

    Tal y como podemos leer en Stack Overflow.

  5. Activar el mod_rewrite:
    $ sudo a2enmod rewrite
    $ sudo service apache2 restart
  6. Accede a http://midominio

Suerte con vuestros servidores LAMP!

Referencias

  1. DNS en Wikipedia: http://en.wikipedia.org/wiki/Domain_Name_System
  2. Virtual Host: http://httpd.apache.org/docs/2.2/vhosts/
  3. Ejemplos: http://httpd.apache.org/docs/2.2/vhosts/examples.html

Corregir: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName

Problema arrancando apache con Server’s fully qualified domain name

Hace poco, he tenido un pequeño “problema” instalando un servidor web apache2 y quería resolver cómo lo he solucionado. Trans instalar apache2 al realizar cualquier operación de administrador obtengo este mensaje:

* Starting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

Tranquilidad, no ocurre nada. Sólo que apache no sabe que nombre (DNS) tiene el servidor y por defecto emplea la IP de loopback (127.0.0.1). esto es así porqué httpd.conf está vacío, una solución sería añadir la cadenaServerName, pero con la nueva estructura de directorios de Apache2 disponemos de la siguiente opción:

sudo sh -c 'echo "ServerName localhost" >> /etc/apache2/conf.d/name' && sudo service apache2 restart

Con lo cual queda asignado este nombre y solucionado el problema.

Instalar Spotify en Linux

Introducción


Spotify es una aplicación empleada para la reproducción de música vía streaming disponible en los sistemas operativos Microsoft Windows, Mac OS X, Linux, Windows Phone, Symbian, iOS, Android y BlackBerry. Permite escuchar en modo radio buscando por artista, álbum o listas de reproducción creadas por los propios usuarios.

La empresa, que tiene su sede en Estocolmo, Suecia, ha firmado acuerdos con las discográficas Universal Music, Sony BMG, EMI Music, Hollywood Records y Warner Music entre otras.

ES uno de tantos programas para escuchar música bajo demanda en Internet, pero a mi me encanta. Por eso dejo esta guía tan sencilla para su instalación en Linux (el tema no es nuevo, pero he recogido un poco de información de aquí o allá).

Instalar usando Wine

Instalar Spotify en Linux en Wine es tan sencillo cómo descargar la versión para Windows e instalar wine en nuestro ordenador.

$ sudo apt-get install wine

A continuación ir a la carpeta donde hemos descargado el instalador para Windows de Spotify y ejecutarlo con Wine:

$ wine SpotifySetup.exe

Para ejecutarlo, (aunque seguramente tengamos un enlace directo en el escritorio):

$ wine "C:\Archivos de programa\Spotify\spotify.exe"

Instalar Soptify para Linux nativo (experimental)

Si usamos debian o un sistema similar:

# 1. Añade esta línea a tu lista de repositorios
#    editanddo /etc/apt/sources.list
deb http://repository.spotify.com stable non-free

# 2. Si quieres comprobar los paquetes descargados,
#    tendrás que añadir nuestra clave pública
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 94558F59

# 3. Ejecuta apt-get update

# 4. Instala Spotify
sudo apt-get install spotify-client

Al final, tendremos algo como lo siguiente:

Espero que haya sido de ayuda!

Detectar hardware en Linux (Debian/Ubuntu)

Introducción

Si soís usuarios de Windows y quereís conocer qué componentes tiene vuestro PC disponeís de herramientas muy sencillas como speccy. Pero, ¿y si somos usuarios de Linux?

Pues también disponemos de herramientas para tal efecto. Tanto si somos unos amantes del shell como si preferimos usar un GUI.

lshw

Hardware lister es una herramienta clásica de consola que nos proporciona toda la información disponible de nuestro sistema, por ejemplo:

$ sudo lshw -short
ruta H/W        Dispositivo  Clase       Descripción
=====================================================
                             system      System Product Name
/0                           bus         P5P800-SE
/0/0                         memory      64KiB BIOS
/0/4                         processor   Intel(R) Pentium(R) 4 CPU 3.40GHz
/0/4/5                       memory      16KiB L1 caché
/0/4/6                       memory      1MiB L2 caché
/0/4/1.1                     processor   CPU lógica
/0/4/1.2                     processor   CPU lógica
/0/33                        memory      2GiB Memoria de sistema
/0/33/0                      memory      512MiB DIMM DDR Síncrono
/0/33/1                      memory      512MiB DIMM DDR Síncrono
/0/33/2                      memory      512MiB DIMM DDR Síncrono
/0/33/3                      memory      512MiB DIMM DDR Síncrono
/0/1                         processor   Intel(R) Pentium(R) 4 CPU 3.40GHz
/0/1/1.1                     processor   CPU lógica
/0/1/1.2                     processor   CPU lógica
/0/100                       bridge      82865G/PE/P DRAM Controller/Host-Hub Interface
/0/100/1                     bridge      82865G/PE/P AGP Bridge
/0/100/1/0                   display     RV350 [Radeon 9550/9600/X1050 Series]
/0/100/1/0.1                 display     RV350 [Radeon 9550/9600/X1050 Series] (Secondary)
/0/100/6                     generic     82865G/PE/P Processor to I/O Memory Interface
/0/100/1d                    bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
/0/100/1d.1                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
/0/100/1d.2                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3
/0/100/1d.3                  bus         82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
/0/100/1d.7                  bus         82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
/0/100/1e                    bridge      82801 PCI Bridge
/0/100/1e/5     eth0         network     82540EM Gigabit Ethernet Controller
/0/100/1f                    bridge      82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
/0/100/1f.1                  storage     82801EB/ER (ICH5/ICH5R) IDE Controller
/0/100/1f.2                  storage     82801EB (ICH5) SATA Controller
/0/100/1f.3                  bus         82801EB/ER (ICH5/ICH5R) SMBus Controller
/0/100/1f.5                  multimedia  82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
/0/2            scsi1        storage     
/0/2/0.0.0      /dev/cdrom   disk        DVD Writer 400c
/0/3            scsi2        storage     
/0/3/0.0.0      /dev/sda     disk        250GB MAXTOR STM325082
/0/3/0.0.0/1    /dev/sda1    volume      230GiB partición EXT4
/0/3/0.0.0/2    /dev/sda2    volume      2046MiB Extended partition
/0/3/0.0.0/2/5  /dev/sda5    volume      2046MiB Linux swap / Solaris partition

Podemos saber que tipo de memoria RAM, disco duro, tarjeta gráfica, etc tenemos.

sysinfo

Sysinfo es una herramienta basada en GUI muy sencila que muestra información básica.

hardinfo

Hardinfo, es una herramienta muy completa que muestra casi la misma información que lshw en un entorno basado en GTK.
Referencias

  1. Hardware Lister: http://ezix.org/project/wiki/HardwareLiSter

 

Liberar espacio en Debian/Ubuntu

Introducción

¿Tienes el disco duro hasta los topes? ¿Estás pensando en borrar ficheros multimedia o viejos documentos? Pues espera, que quizás te sorprenda una forma sencilla de liberar espacio de tu distribución basada en Debian.

¿Cómo? Si tienes Debian, Ubuntu o similar su sistema de instalar programas (paquetes) se basa en la herramienta apt. Esta herramienta construye una cache durante el tiempo de vida de tu linux para funcionar y llevar el control de actualizaciones, instalaciones, y toda su gestión.

 

Solucinando los problemas

En primer lugar, si quieres saber cuánta caché tiene tu sistema apt, teclea en consola el siguiente comando:

du -sh /var/cache/apt/archives

Para liberar este espacio ejecuta:

sudo apt-get autoclean
sudo apt-get clean
sudo apt-get autoremove

¿Qué hace cada cosa?

sudo apt-get autoclean: Elimina del cache los paquetes .deb con versiones anteriores a los de los programas que tienes instalados.

sudo apt-get clean: Elimina todos los paquetes del cache. El único inconveniente que podría resultar es que si quieres reinstalar un paquete, tienes que volver a descargarlo.

sudo apt-get autoremove: Borra los paquetes huérfanos, o las dependencias que quedan instaladas después de haber instalado una aplicación y luego eliminarla, por lo que ya no son necesarias.

¡Espero que sea de ayuda!

Instalar soporte para Wifi 802.11n en GNU/Linux Debian

Introducción

Recientemente he rescatado un portatil HP 6730s al cual he instalado GNU/Linux Debian (mi distro favorita) y de base no instala los controladores para la wifi.

Bueno, esto no significa ni que existan ni que no que no sea sencillo instalarlos. Sólo que resulta que estos drivers son software non-free de modo que por defecto Debian no lo añade a las fuentes de apt-get. Debemos añadirlo e instalarlo nosotros mismos. Empecemos:

Instalar controladores de nuevos dispositivos wifi (iwlwifi)

El módulo iwlwifi sobre el cual se puede leer más en [1] y [2] ofrece soporte para los siguientes adaptadores LAN:

  • Intel Wireless WiFi 4965AGN (In Debian 7 “Wheezy”, this device is now supported by the iwlegacy driver (iwl4965 module)).
  • Intel Wireless WiFi 5100AGN, 5300AGN, 5350AGN
  • Intel Wireless WiFi 5150AGN
  • Intel WiFi Link 1000BGN
  • Intel 6000 Series WiFi Adapters (6200AGN and 6300AGN)
  • Intel Wireless WiFi Link 6250AGN Adapter
  • Intel 6005 Series WiFi Adapters
  • Intel 6030 Series WiFi Adapters
  • Intel Wireless WiFi Link 6150BGN 2 Adapter
  • Intel 100 Series WiFi Adapters (100BGN and 130BGN)
  • Intel 2000 Series WiFi Adapters

Como he dicho antes, se necesita usar software non-free. Debemos añadir los repositorios non-free a nuestra fuentes apt en el fichero /etc/apt/sources.list para poder instalar el paquete firmware-iwlwifi:

# Debian 7 "Wheezy"
deb http://http.debian.net/debian/ wheezy main contrib non-free

A continuación actualizamos la lista de paquetes disponibles en las fuentes apt e instalamos el firmware:

# apt-get update && apt-get install firmware-iwlwifi

Este modulo se carga automáticamente para los dispositivos compatibles dados en la lista anterior, recargamos el modulo para no reiniciar y configuramos nuestra wifi como toque.

# modprobe -r iwlwifi ; modprobe iwlwifi

A mi en mi HP 6730s me funciona de maravilla.

Referencias

Usando CURL para depurar mensajes HTTP

Introducción

Todo desarrollador WEB que se precie sabe que debe conocer (sino dominar) el protocolo de comunicación HTTP. Sobre este protocolo se basan todas las comunicaciones en la WEB (esto no es cierto del todo ;_)).

En proyectos anteriores he tenido que realizar varías consultas y envío de datos a través del API de Google usando productos como Contacts, Calendar, etc.

Ahora no voy a explicar cómo funciona el protocolo OAtuh [1], pero si diré que es el mecanismo que usa Google para permitir el acceso a sus APIs de forma segura.

Trabajar con este protocolo y manejar mensajes entre mi aplicación y los distintos servidores de Google ha requerido una depuración muy estricta a nivel HTTP y la mejor herramienta que he podido usar es CURL.

La mágia de CURL

Curl [2], es una herramienta muy conocida entre los administradores de sistemas y muy extendida entre los programadores de PHP.

No quiero perderme en detalles, pero vamos ver un ejemplo donde se realiza una petición a un script PHP que contiene el código:

Este código realiza una redirección a http://www.google.com, pero la pregunta es: Entre mi navegador Web y el servidor, ¿qué mensajes HTTP se transmiten? Si utilizamos la opción -v (verbose) podemos ver los mensajes de información del programa (precedidos por *), los mensajes que se envían al servidor (>) y los mensajes que se reciben del servidor (<).

$ curl -v http://webserver/header_location.php
* About to connect() to webserver port 80 (#0)
* Trying 172.x.y.z... connected
* Connected to webserver (172.x.y.z) port 80 (#0)
> GET /header_location.php HTTP/1.1
> User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1
> Host: webserver
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Mon, 04 Nov 2013 17:07:30 GMT
< Server: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6 PHP/5.2.4-2ubuntu5.27 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g
< X-Powered-By: PHP/5.2.4-2ubuntu5.27
< Location: http://www.google.com/
< Content-Length: 0
< Content-Type: text/html
<
* Connection #0 to host webserver left intact
* Closing connection #0

Bueno, ahora sabemos que este script/página nos envía a google, pero … ¿se puede automatizar el proceso para ver todos los mensajes HTTP hasta que se sirve la página WEB? Sí, usando la opción -L.

Usando un comando cómo:

$ curl -v -L http://webserver/header_location.php

Referencias

  1. Oauth: http://es.wikipedia.org/wiki/OAuth
  2. CURL Homepage: http://curl.haxx.se/

CHMOD: Cambiar los permisos de todos los directorios o sólo de ficheros

Hoy me he instaldo el Android Studio para cacharrear un par de aplicaciones que estoy probando. Como uso linux me he descargado el fichero TGZ del servidor de Google. Google sugiere que lo descomprimas donde quieras, pero claro a mi me gusta ser ordenado.

Podrías ponerlo en mi carpeta $HOME pero no creo que se muy correcto. Prefiero situarlo en el directorio /opt, claro debo descomprimirlo y a todos los directorios les doy permiso 775. ¿Cómo hacerlo de un plumazo? He pensado que es una buena ocasión para poner un par de ejemplos.

Modificar los permisos de los ficheros según su tipo:

  • Directorios:
    find /home/pruebas -type d -exec chmod -R 775 {} \;
  • Ficheros regulares (del mismo modo, pero …):
    find /home/pruebas -type f -exec chmod -R 775 {} \;

Para más opciones leed la referencia que adjunto.

Referencias

Página de manual del comando find: http://unixhelp.ed.ac.uk/CGI/man-cgi?find

Test de velocidad de disco duro

Hace un tiempo que he detectado que las prestaciones de mi disco duro han bajado. Además de buscar fallos físicos he querido ver la tasa de velocidad real del mismo. Mediante el siguiente comando:

time dd if=/dev/zero of=TEST bs=4k count=512000

Podemos obtener un informe sobre el funcionamiento del disco, en mi caso:

$ time dd if=/dev/zero of=TEST bs=4k count=512000
512000+0 registros leídos
512000+0 registros escritos
2097152000 bytes (2,1 GB) copiados, 14,8617 s, 141 MB/s

real	0m14.873s
user	0m0.140s
sys	0m5.280s

Así, en el caso de mi disco duro su velocidad en el test ha sido de 141 MB/s.

Referencias