Una de las cosas que de inicio puede ser complicado con Latex, es la creación de tablas. No es que no sea sencillo, mas que nada en base a lo aprendido se necesita de un buen ejemplo y de ahí partir. Ya que de otra forma puede llevar un poco de tiempo lo que quieres.
Para instalar LaTeX necesitamos instalar el siguiente paquete que contiene todo lo necesario para empezar a trabajar con el mismo.
aptitude install texlive-latex-base
Un excelente editor para LaTeX en KDE es Kile, lo podemos instalar de igual manera con la siguiente sentencia.
aptitude install kile kile-i18n-es
Editor Kile
Vamos a crear un archivo llamado testlatex.tex donde ingresaremos lo siguiente:
Tiene como mes y medio que note que alguien estaba intentando llamar a costa del conmutador y lamentablemente lo logro por cierto tiempo debido a unas lineas que tenia de prueba y que olvide comentar. Así que después de corregir el error, la consola y los logs se llenaron de lineas semejantes a estas, se cansaron de probar una vez que verificaron que el hueco había sido tapado. Cuidado con lineas sueltas que tengan por ahí y que permitan llamar por la PSTN, se pueden llevar una desagradable sorpresa en la factura. Cosa a destacar que al día siguiente TELMEX llamo para ver si nosotros por alguna razón habíamos echo llamadas a este país, ya que es anormal hacer llamadas a este país en un lapso de tiempo tan corto.
[Jul 1 18:24:15] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352943654’ rejected because extension not found.
[Jul 1 18:24:21] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352873548’ rejected because extension not found.
[Jul 1 18:24:42] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352415837’ rejected because extension not found.
[Jul 1 18:24:43] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘000053622226347’ rejected because extension not found.
[Jul 1 18:24:44] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005378361157’ rejected because extension not found.
[Jul 1 18:24:51] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372046125’ rejected because extension not found.
[Jul 1 18:25:12] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352611328’ rejected because extension not found.
[Jul 1 18:25:19] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346399396’ rejected because extension not found.
[Jul 1 18:25:59] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352287086’ rejected because extension not found.
[Jul 1 18:26:06] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343555236’ rejected because extension not found.
[Jul 1 18:26:08] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343555236’ rejected because extension not found.
[Jul 1 18:26:35] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352949012’ rejected because extension not found.
[Jul 1 18:27:07] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352917137’ rejected because extension not found.
[Jul 1 18:27:08] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346324206’ rejected because extension not found.
[Jul 1 18:27:09] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005346324206’ rejected because extension not found.
[Jul 1 18:27:11] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘0000537001934’ rejected because extension not found.
[Jul 1 18:27:49] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352769352’ rejected because extension not found.
[Jul 1 18:27:54] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005352823316’ rejected because extension not found.
[Jul 1 18:27:57] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343572966’ rejected because extension not found.
[Jul 1 18:28:00] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005343572966’ rejected because extension not found.
[Jul 1 18:28:50] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘0000536535345228’ rejected because extension not found.
[Jul 1 18:28:55] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005378333636’ rejected because extension not found.
[Jul 1 18:28:57] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005376833290’ rejected because extension not found.
[Jul 1 18:28:58] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005353130672’ rejected because extension not found.
[Jul 1 18:29:04] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005345812858’ rejected because extension not found.
[Jul 1 18:29:05] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372640160’ rejected because extension not found.
[Jul 1 18:29:07] NOTICE[11038]: chan_sip.c:14035 handle_request_invite: Call from ” to extension ‘00005372640160’ rejected because extension not found.
Es cosa común hoy en día descargar vídeos de youtube (principalmente) por los múltiples clips musicales que se pueden encontrar. En mi caso particular muchas veces lo único que quiero es extraer el audio para agregarlo a mi biblioteca musical y últimamente los he querido almacenar en formato ogg (Vorbis).
Sin embargo al querer crear un disco de audio con K3b agregando los MP3 me marcaba problemas al agregar los archivos al proyecto, formato no soportado. De igual manera estos archivos no eran reproducidos por mi reproductor portátil.
El MP3 es un formato de archivos de audio tan extendido, sobre todo en el usuario final que en alguna ocasión nos pueden dar un archivo de este tipo para integrarlo en nuestro PBX, por lo cual aquí veremos como partiendo de un MP3 convertirlo al formato nativo de asterisk para integrarlo a nuestra música en espera.
El archivo es la música clásica del personaje mas sobresaliente del imperio.
gabriel@trantor:~/Descargas/IPBX$ ls *.mp3
Star_Wars-Imperial_March.mp3
Utilizamos ffmpeg para convertir el archivo mp3 a un formato que asterisk entienda.
gabriel@trantor:~/Descargas/IPBX$ ffmpeg -i Star_Wars-Imperial_March.mp3 -ar 8000 -ac 1 -ab 64 Star_Wars-Imperial_March.wav
FFmpeg version r11872+debian_0.svn20080206-17, Copyright (c) 2000-2008 Fabrice Bellard, et al.
configuration: --enable-gpl --enable-libfaad --enable-pp --enable-swscaler --enable-x11grab --prefix=/usr --enable-libgsm --enable-libtheora --enable-libvorbis --enable-pthreads --disable-strip --enable-libdc1394 --disable-armv5te --disable-armv6 --disable-altivec --disable-vis --enable-shared --disable-static
libavutil version: 49.6.0
libavcodec version: 51.50.0
libavformat version: 52.7.0
libavdevice version: 52.0.0
built on Feb 10 2009 08:13:56, gcc: 4.3.3
Input #0, mp3, from 'Star_Wars-Imperial_March.mp3':
Duration: 00:03:04.3, start: 0.000000, bitrate: 112 kb/s
Stream #0.0: Audio: mp3, 44100 Hz, stereo, 112 kb/s
WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s
Output #0, wav, to 'Star_Wars-Imperial_March.wav':
Stream #0.0: Audio: pcm_s16le, 8000 Hz, mono, 128 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Press [q] to stop encoding
size= 2880kB time=184.3 bitrate= 128.0kbits/s
video:0kB audio:2880kB global headers:0kB muxing overhead 0.001492%
gabriel@trantor:~/Descargas/IPBX$ ls *.wav
Star_Wars-Imperial_March.wav
Creamos un nuevo directorio y copiamos el archivo para la creación de una nueva clase de musica en espera.
trantor:/home/gabriel# mkdir /var/lib/asterisk/moh/custom
trantor:/home/gabriel# cd Descargas/IPBX/
trantor:/home/gabriel/Descargas/IPBX# cp Star_Wars-Imperial_March.wav /var/lib/asterisk/moh/custom/
Especificamos la configuración que consta principalmente del nombre de la clase y el directorio donde se guardaran futuros archivos.
trantor:/home/gabriel/Descargas/IPBX# vim /etc/asterisk/musiconhold.conf
[default]
mode=files
directory=/var/lib/asterisk/moh
[pruebas]
mode=files
directory=/var/lib/asterisk/moh/custom
Recargamos la configuración y verificamos lo anteriormente escrito.
Para probar agregamos la siguiente linea a nuestro dialplan.
trantor:/home/gabriel/Descargas/IPBX# vim /etc/asterisk/extensions.conf
exten => 6000,1,MusicOnHold(pruebas)
Vemos en la consola la ejecución de nuestro archivo y nos imaginamos a Darth Vader caminando en la estrella de la muerte.
*CLI> -- Executing [6000@default:1] MusicOnHold("SIP/5010-08d39190", "pruebas") in new stack
-- Started music on hold, class 'pruebas', on SIP/5010-08d39190
-- Stopped music on hold on SIP/5010-08d39190
== Spawn extension (default, 6000, 1) exited non-zero on 'SIP/5010-08d39190'
Para grabar las llamadas hacia una extensión dada.
exten => 9261,1,Macro(grabarfile,SIP/trantor)
El macro en ejecución.
-- Executing [9261@default:1] Macro("SIP/10.9.201.252-b6909650", "grabarfile|SIP/trantor") in new stack
-- Executing [s@macro-grabarfile:1] Set("SIP/10.9.201.252-b6909650", "calltime=20090511-163021") in new stack
-- Executing [s@macro-grabarfile:2] Set("SIP/10.9.201.252-b6909650", "calldir=/var/spool/asterisk/monitor/8237") in new stack
-- Executing [s@macro-grabarfile:3] System("SIP/10.9.201.252-b6909650", "/bin/mkdir -p /var/spool/asterisk/monitor/8237") in new stack
-- Executing [s@macro-grabarfile:4] MixMonitor("SIP/10.9.201.252-b6909650", "/var/spool/asterisk/monitor/8237/20090511-163021-8237-9261.wav|av(0)V(0)") in new stack
== Begin MixMonitor Recording SIP/10.9.201.252-b6909650
-- Executing [s@macro-grabarfile:5] Dial("SIP/10.9.201.252-b6909650", "SIP/trantor|40") in new stack
-- Called trantor
-- SIP/trantor-08242458 is ringing
-- SIP/trantor-08242458 answered SIP/10.9.201.252-b6909650
== Spawn extension (macro-grabarfile, s, 5) exited non-zero on 'SIP/10.9.201.252-b6909650' in macro 'grabarfile'
== Spawn extension (macro-grabarfile, s, 5) exited non-zero on 'SIP/10.9.201.252-b6909650'
== End MixMonitor Recording SIP/10.9.201.252-b6909650
El archivo en cuestión.
asteriskpbx:/home/gabriel# ls /var/spool/asterisk/monitor/8237/*61.wav
/var/spool/asterisk/monitor/8237/20090511-163021-8237-9261.wav
CakePHP es un framework para PHP basandose en el modelo MVC (modelo vista controlador).
En primera instancia descargamos los paquetes necesarios junto con las dependencias necesarias.
Para tener un poco ordenado nuestros sitios en apache, vamos a crear un virtual host donde almacenaremos todos los archivos de la instalación y en donde realizaremos nuestros pruebas al teclear en un navegador web: http://www.caketest.com
Creamos los siguientes directorios.
Tecleamos en algún navegador la dirección http://www.caketest.com donde deberemos visualizar algo similar a un posible listado de archivos.
Desde la siguiente pagina descargamos la ultima versión estable del framework: http://cakeforge.org/frs/download.php/713/cake_1.2.2.8120.tar.gz
Descomprimimos el archivo y copiamos todo su contenido al directorio htdocs de nuestro host virtual además de darle permisos al directorio tmp.
gabriel@trantor:~/Descargas$ tar xfz cake_1.2.2.8120.tar.gz
gabriel@trantor:~/Descargas$ cd cake_1.2.2.8120/
gabriel@trantor:~/Descargas/cake_1.2.2.8120$ cp -R * /home/gabriel/www/www.caketest.com/htdocs/
gabriel@trantor:~/Descargas/cake_1.2.2.8120$
gabriel@trantor:~/www/www.caketest.com/htdocs/app$ chmod -R 777 tmp/
Actualizando la pagina debemos ver la pagina de información de cake la cual dista de ser colorida.
Activamos mod_rewrite de apache.
gabriel@trantor:~$ sudo a2enmod rewrite
Enabling module rewrite.
Run '/etc/init.d/apache2 restart' to activate new configuration!
gabriel@trantor:~$ sudo /etc/init.d/apache2 restart
Para poder habilitar en nuestras paginas el modulo anterior realizamos unas modificaciones al archivo de configuración de nuestro sitio.
gabriel@trantor:~$ sudo vim /etc/apache2/sites-available/www.caketest.com
En dado caso que no se note una diferencia, se debe verificar la configuración referente a la activación de mod_rewrite ya que es la causa de los muchos errores iniciales.
Creamos nuestra base de datos a utilizar, iniciamos el servico de mysql, y nos conectamos con nuestro usuario (al instalarse mysql mediante aptitude, me pidio la clave para root).
gabriel@trantor:~$ sudo /etc/init.d/mysql start
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..
gabriel@trantor:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 28
Server version: 5.0.51a-24 (Debian)
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)
mysql> create database cake;
Query OK, 1 row affected (0.00 sec)
mysql>
Configuramos el archivo para la conexión de la base de datos a utilizar.
gabriel@trantor:~/www/www.caketest.com/htdocs/app/config$ mv database.php.default database.php
gabriel@trantor:~/www/www.caketest.com/htdocs/app/config$ vim database.php
Finalmente encuentro algo de interés para empezar este pequeño blog. He tenido la oportunidad de que caiga a mis manos una tarjeta openvox D110P para un E1. Por lo cual hay tiempo para probar dos nuevas cosas; la tarjeta en especifico (ya que solo he trabajado con tarjetas Digium) y las librerías de openR2 (en lugar de Unicall).
Se utilizaron las siguientes versiones: asterisk-1.4.18, Zaptel-1.4.11, openr2-1.1.0 y como sistema operativo CentOS 4 (prefiero a la espiral pero en fin).
Antes que nada recomiendo leer un poco este documento que dice todo lo que hay que hacer.
Bueno manos a la obra.
Al obtener los dispositivos de hardware con los que contamos, observamos que satisfactoriamente nuestro sistema detecta la tarjeta instalada.
[root@serverweb IPBX]# wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.11.tar.gz
[root@serverweb IPBX]# tar xzf zaptel-1.4.11.tar.gz
[root@serverweb IPBX]# cd zaptel-1.4.11
[root@serverweb zaptel-1.4.11]# ./configure
[root@serverweb zaptel-1.4.11]# make
[root@serverweb zaptel-1.4.11]# make install
[root@serverweb zaptel-1.4.11]# make config
install -D zaptel.init /etc/rc.d/init.d/zaptel
/usr/bin/install -c -D -m 644 zaptel.sysconfig /etc/sysconfig/zaptel
install -D ifup-hdlc /etc/sysconfig/network-scripts/ifup-hdlc
/sbin/chkconfig --add zaptel
Zaptel has been configured.
If you have any zaptel hardware it is now recommended to
edit /etc/default/zaptel or /etc/sysconfig/zaptel and set there an
optimal value for the variable MODULES .
I think that the zaptel hardware you have on your system is:
pci:0000:01:04.0 wcte11xp- e159:0001 Digium Wildcard TE110P T1/E1 Board
Al final de la instalación se nos menciona el modelo de la tarjeta con la que contamos, en este caso se nos presenta un modelo de Digium (aunque obviamente sabemos que es una openvox).
Configuramos nuestro archivo con los parametros necesarios.
[root@serverweb zaptel-1.4.11]# vim /etc/zaptel.conf
# MFC/R2 requires CAS signaling
# channel 16 is required to transmit ABCD bits so is not used for voice
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101
loadzone=us
defaultzone=us
Iniciamos el servicio de zaptel para cargar los módulos (también lo podemos hacer manualmente).
[root@serverweb zaptel-1.4.11]# service zaptel start
Loading zaptel framework: [ OK ]
Waiting for zap to come online...OK
Loading zaptel hardware modules: tor2.
wct4xxp.
wcte12xp.
wct1xxp.
wcte11xp.
wctdm24xxp.
wcfxo.
wctdm.
wcusb.
Running ztcfg: [ OK ]
Esta en rojo ya que aun no se ha conectado el enlace.
[root@serverweb zaptel-1.4.11]# cat /proc/zaptel/1
Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER) HDB3/ RED
1 WCT1/0/1 CAS RED
2 WCT1/0/2 CAS RED
3 WCT1/0/3 CAS RED
4 WCT1/0/4 CAS RED
5 WCT1/0/5 CAS RED
6 WCT1/0/6 CAS RED
7 WCT1/0/7 CAS RED
8 WCT1/0/8 CAS RED
9 WCT1/0/9 CAS RED
10 WCT1/0/10 CAS RED
11 WCT1/0/11 CAS RED
12 WCT1/0/12 CAS RED
13 WCT1/0/13 CAS RED
14 WCT1/0/14 CAS RED
15 WCT1/0/15 CAS RED
16 WCT1/0/16 HDLCFCS RED
17 WCT1/0/17 CAS RED
18 WCT1/0/18 CAS RED
19 WCT1/0/19 CAS RED
20 WCT1/0/20 CAS RED
21 WCT1/0/21 CAS RED
22 WCT1/0/22 CAS RED
23 WCT1/0/23 CAS RED
24 WCT1/0/24 CAS RED
25 WCT1/0/25 CAS RED
26 WCT1/0/26 CAS RED
27 WCT1/0/27 CAS RED
28 WCT1/0/28 CAS RED
29 WCT1/0/29 CAS RED
30 WCT1/0/30 CAS RED
31 WCT1/0/31 CAS RED
Aunque al iniciar los módulos ya se cargo el archivo de configuración lo volvemos a cargar, para obtener un mensaje mas descriptivo.
[root@serverweb IPBX]# wget http://openr2.googlecode.com/files/openr2-1.1.0.tar.gz
[root@serverweb IPBX]# tar xfz openr2-1.1.0.tar.gz
[root@serverweb IPBX]# cd openr2-1.1.0
[root@serverweb openr2-1.1.0]# ./configure --prefix=/usr
[root@serverweb openr2-1.1.0]# make
[root@serverweb openr2-1.1.0]# make install
Descargamos e instalamos asterisk.
[root@serverweb IPBX]# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.18.tar.gz
[root@serverweb IPBX]# wget http://openr2.googlecode.com/files/openr2-asterisk-1.4.18.patch
[root@serverweb IPBX]# tar xfz asterisk-1.4.18.tar.gz
[root@serverweb IPBX]# cd asterisk-1.4.18
[root@serverweb asterisk-1.4.18]# patch -p0 < ../openr2-asterisk-1.4.18.patch
[root@serverweb asterisk-1.4.18]# ./bootstrap.sh
[root@serverweb asterisk-1.4.18]# ./configure --prefix=/usr
[root@serverweb asterisk-1.4.18]# make
[root@serverweb asterisk-1.4.18]# make install
[root@serverweb asterisk-1.4.18]# make samples
[root@serverweb asterisk-1.4.18]# make config
Aqui es importante resaltar algo que ya menciona el autor de la guia original, la version de autoconf es muy importante, en este caso debe ser la 2.60, ya que menciona que puede o no funcionar, y esto es cierto verifica que version tienes ya que en mi caso tuve que actualizar mi versión de autoconf.
Si la instalación no marca algun incoveniente, entonces asterisk se instalo con el soporte de MFC/R2 usando openr2. Para comprobar que chan_zap.so tiene integrado openr2, ejecutamos el siguiente comando.