2009
09.10

Para saber que tan libre de software privativo estamos, instalaremos al Richard Stallman virtual:

sudo apt-get install vrms

Luego lo ejecutamos y…

Non-free packages installed on Necronomicon

fglrx-modaliases Identifiers supported by the ATI graphics driver
linux-generic Complete Generic Linux kernel
linux-restricted-modules- Non-free Linux 2.6.28 modules helper script
linux-restricted-modules- Restricted Linux modules for generic kernels
linux-restricted-modules- Restricted Linux modules for rt kernels
linux-rt Complete rt Linux kernel
nvidia-173-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-180-kernel-source NVIDIA binary kernel module source
nvidia-180-libvdpau Video Decode and Presentation API for Unix
nvidia-180-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-71-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-96-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-glx-180 NVIDIA binary Xorg driver
rar Archiver for .rar files
skype Skype – Take a deep breath
tangerine-icon-theme Tangerine Icon theme
tremulous-data Tremulous datas
unrar Unarchiver for .rar files (non-free version)
Reason: Modifications problematic

Contrib packages installed on Necronomicon

eclipse-webdav-ftp Eclipse FTP and WebDAV Support
gstreamer0.10-pitfdll GStreamer plugin for using MS Windows binary codecs
msttcorefonts transitional dummy package
nvidia-common Find obsolete NVIDIA drivers
nvidia-settings Tool of configuring the NVIDIA graphics driver
tremulous Aliens vs Humans, team based FPS game with elements of
ttf-mscorefonts-installer Installer for Microsoft TrueType core fonts

Contrib packages with status other than installed on Necronomicon

jetty ( dei) Java servlet engine and webserver

18 non-free packages, 0.8% of 2149 installed packages.
8 contrib packages, 0.4% of 2149 installed packages.
Eso es todo.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 8.0/10 (2 votes cast)
2009
09.09

Csound

Cuando podemos intervenir y manejar a nuestro entero antojo los parámetros del sonido, podemos decir que tenemos un control absoluto de éste. Con éste control, podemos dibujar en el aire una infinidad de nuevos sonidos, experimentando con los más inusuales timbres y alturas.

Mini MoogLa tecnología actual, nos ofrece un enorme abanico de herramientas para manejar el sonido a nuestro entero gusto, dándonos una inagotable fuente de recursos para la composición musical. El saber utilizar provechosamente estos recursos, es fundamental para un músico de estos tiempos.

Una de las herramientas más versátiles y a la vez complejas es Csound, un pseudo lenguaje de programación, que nos permite crear y manipular todo tipo de sonidos. Consiste fundamentalmente en escribir los parámetros de los distintos osciladores que utilizaremos para crear el sonido, y luego escribir el orden, altura y duración que le daremos en el tiempo, tal como si se tratase de una partitura.

A diferencia de los sintetizadores de hardware actuales, donde el número de osciladores y conexiónes está limitado, CSound permite una enorme cantidad de elementos, si queremos, podemos conectar 200 osciladores y reconectarlos con distintas envolventes y formas de onda. El poder de CSound casi no tiene límites, depende casi exclusivamente de la imaginación del compositor.

Una desventaja de usar esta herramienta, es su complejidad, aunque no es algo imposible de lograr, puede volverse una labor un tanto tediosa la composición de piezas complejas, teniendo que lidiar con terminologías y sintaxis a las cuales el músico no siempre está habituado.

La última versión de CSound Aquí

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 7.0/10 (1 vote cast)
2009
09.09

PHP: Clase para conectar MySQL

Siempre que necesitamos conectar una base de datos MySQL con PHP, debemos escribir unas cuantas instrucciones una y otra vez, para evitar esto, lo mejor es usar una clase que maneje nuestra conexión.
El siguiente, es el código de una clase que nos puede ayudar:

 PHP |  copy code |? 
001
002
<?php
003
/*
004
* database.php
005
*
006
* Copyright 2008 Vladimir Zurita <<a href="mailto:vladzur@gmail.com">vladzur@gmail.com</a>>
007
*
008
* This program is free software; you can redistribute it and/or modify
009
* it under the terms of the GNU General Public License as published by
010
* the Free Software Foundation; either version 2 of the License, or
011
* (at your option) any later version.
012
*
013
* This program is distributed in the hope that it will be useful,
014
* but WITHOUT ANY WARRANTY; without even the implied warranty of
015
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016
* GNU General Public License for more details.
017
*
018
* You should have received a copy of the GNU General Public License
019
* along with this program; if not, write to the Free Software
020
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
021
* MA 02110-1301, USA.
022
*/
023
 
024
/********************************************************
025
* DataBase
026
* Author: Vladimir Zurita
027
*
028
* This class makes easier to insert data into a table and connect
029
* a database on MySQL
030
* *******************************************************/
031
 
032
class DataBase {
033
 
034
var $db=array('host'=>'localhost',
035
'user'=>'your_user',
036
'pass'=>'your_password',
037
'dbase'=>'your_database'
038
);
039
 
040
var $link="";
041
 
042
function connect(){
043
 
044
$this->link=mysql_connect($this->db['host'], $this->db['user'], $this->db['pass']);
045
mysql_select_db($this->db['dbase'], $this->link);
046
 
047
}
048
 
049
function close(){
050
mysql_close($this->link);
051
}
052
 
053
function query($ssql=null){
054
 
055
$this->connect();
056
if($result=mysql_query($ssql)){
057
while($row=mysql_fetch_assoc($result)){
058
$output[]=$row;
059
}
060
$this->close();
061
return $output;
062
}
063
return false;
064
}
065
 
066
function save($tabla,$data){
067
$campos=array_keys($data);
068
$desc=$this->describe_tabla($tabla);
069
foreach($campos as $campo){
070
for($i=0;$i<count($desc);$i++){
071
if($campo==$desc[$i]['Field'])$tipo=$desc[$i]['Type'];
072
}
073
if(stristr($tipo,"varchar"))$value.="'".$data[$campo]."', ";
074
if(stristr($tipo,"text"))$value.="'".$data[$campo]."', ";
075
if(stristr($tipo,"int"))$value.=$data[$campo].", ";
076
if(stristr($tipo,"blob"))$value.="'".$data[$campo]."', ";
077
$field.=$campo.", ";
078
}
079
$field=trim($field,", ");
080
$value=trim($value,", ");
081
$sql="INSERT INTO ".$tabla." (".$field.") VALUES (".$value.")";
082
//echo $sql;
083
$this->connect();
084
if($result=mysql_query($sql))return true;
085
$this->close();
086
return false;
087
}
088
 
089
function update($tabla,$data,$condicion){
090
$campos=array_keys($data);
091
$desc=$this->describe_tabla($tabla);
092
foreach($campos as $campo){
093
for($i=0;$i<count($desc);$i++){
094
if($campo==$desc[$i]['Field'])$tipo=$desc[$i]['Type'];
095
}
096
if(stristr($tipo,"varchar"))$value.=$campo."='".$data[$campo]."', ";
097
if(stristr($tipo,"text"))$value.=$campo."='".$data[$campo]."', ";
098
if(stristr($tipo,"int"))$value.=$campo."=".$data[$campo].", ";
099
if(stristr($tipo,"blob"))$value.=$campo."='".$data[$campo]."', ";
100
 
101
}
102
 
103
$value=trim($value,", ");
104
$sql="UPDATE ".$tabla." SET ".$value." WHERE ".$condicion;
105
//echo $sql;
106
$this->connect();
107
if($result=mysql_query($sql)){
108
$this->close();
109
return true;
110
}
111
$this->close();
112
return false;
113
}
114
 
115
function delete($tabla, $condicion){
116
$sql="DELETE ".$tabla." WHERE ".$condicion;
117
$this->connect();
118
if($result=mysql_query($sql)){
119
$this->close();
120
return true;
121
}
122
$this->close();
123
return false;
124
}
125
 
126
function describe_tabla($tabla){
127
$sql="DESCRIBE ".$tabla;
128
$this->connect();
129
$res=mysql_query($sql);
130
while($field=mysql_fetch_assoc($res)){
131
$output[]=array('Field'=>$field['Field'], 'Type'=>$field['Type']);
132
}
133
$this->close();
134
return $output;
135
}
136
 
137
}
138
?>
139

El modo de uso es simple, veamos un ejemplo:

 HTML |  copy code |? 
01
02
<html>
03
<head>
04
<title>sin título</title>
05
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
06
<meta name="generator" content="Geany 0.14" />
07
</head>
08
<body>
09
<form method="post" action="example.php">
10
<fieldset>
11
<input type="text" name="data[name]">
12
<input type="text" name="data[last_name]">
13
<input type="text" name="data[email]">
14
<input type="text" name="data[address]">
15
<button type="submit">Save</button>
16
</fieldset>
17
</form>
18
</body>
19
</html>
20

Y recogemos el formulario con:

 PHP |  copy code |? 
01
02
<?php
03
include("database.php");
04
$DB= new DataBase();
05
if(isset($_POST['data'])){
06
$data=$_POST['data'];
07
$DB->save('user',$data);
08
exit();
09
}
10
?>
11

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 10.0/10 (2 votes cast)
2009
09.09

Para descargar el plugin sigue éste enlace http://www.4shared.com/file/131400156/e521c155/seguridad.html
El plugin se instala en la carpeta /app/plugins/
El uso de este plugin es simple, primero debemos crear dos tablas en nuestra base de datos.

 SQL |  copy code |? 
01
02
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
03
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
04
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
05
 
06
CREATE  TABLE IF NOT EXISTS `perfil` (
07
`id` INT NOT NULL AUTO_INCREMENT ,
08
`nombre` VARCHAR(45) NULL ,
09
PRIMARY KEY (`id`) )
10
ENGINE = InnoDB;
11
 
12
CREATE  TABLE IF NOT EXISTS `permiso` (
13
`id` INT NOT NULL AUTO_INCREMENT ,
14
`autorizado` TINYINT(1) NULL ,
15
`perfil_id` INT NULL ,
16
`controlador` VARCHAR(45) NULL ,
17
`accion` VARCHAR(45) NULL ,
18
PRIMARY KEY (`id`) ,
19
INDEX `fk_permiso_perfil1` (`perfil_id` ASC) ,
20
CONSTRAINT `fk_permiso_perfil1`
21
FOREIGN KEY (`perfil_id` )
22
REFERENCES `perfil` (`id` )
23
ON DELETE NO ACTION
24
ON UPDATE NO ACTION)
25
ENGINE = InnoDB;
26
 
27
SET SQL_MODE=@OLD_SQL_MODE;
28
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
29
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
30

Luego, configurar en nuestro plugin el archivo app/plugins/seguridad/controllers/components/seguridad.php

 PHP |  copy code |? 
1
2
var $excepciones = array('Pages'=&gt;array('display'), 'Login'=&gt;array('index', 'logout', 'admin_index', 'admin_logout') );
3

Aquí debemos poner las acciones y controladores que no deben ser supervisados por el plugin con el formato array(‘Controlador’=>array(‘accion1′, ‘accion2′,…,’accionN’)).
Lo siguiente es añadir el plugin a nuestra aplicación, para esto, ponemos en /app/app_controller.php

 PHP |  copy code |? 
1
2
var $components = array('Seguridad.Seguridad');
3

y la función:

 PHP |  copy code |? 
01
02
public function beforeFilter(){
03
$controlador = $this-&gt;params['controller'];
04
$accion = $this-&gt;params['action'];
05
if($this-&gt;Seguridad-&gt;isException($controlador, $accion)){
06
return true;
07
exit();
08
}
09
if($this-&gt;Seguridad-&gt;checkAuth($controlador, $accion, $perfil['id'])){
10
return true;
11
exit();
12
}
13
$this-&gt;redirect('/pages/denegado');
14
return false;
15
exit();
16
}
17

Ahora vamos a http://nuestro-sitio.com/seguridad/seguridad_perfil y creamos los perfiles necesarios, al editarlos podemos darle la autorización de acceso a la acción correspondiente a cada controlador.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 9.5/10 (2 votes cast)
2009
09.09

Bueno, ahora que ya están jugando este adictivo juego, vamos a dar un paso más, instalar nuestro propio servidor.
Lo primero es tener instalado Urban Terror, si no es así, pueden ver la entrada anterior.
Debemos darle permisos de ejecución el archivo ioUrTded.i386

chmod +x ioUrTded.i386

Para configurar el servidor, debemos editar el archivo server.cfg

gedit server.cfg

Las opciones de configuración, están ampliamente documentadas en el archivo que viene con Urban Terror. Para ejecutar el servidor, deben escribir:

ioUrTded.i386 +set fs_game q3ut4 +set dedicated 2 +set net_port 27960 +set com_hunkmegs 128 +exec server.cfg

Y para ponerlo un poco más elegante, pueden crear un script:

 Bash |  copy code |? 
1
2
#!/bin/bash
3
 
4
while true
5
do
6
/home/usuario/urbanterror/ioUrTded.i386 +set fs_game q3ut4 +set dedicated 2 +set net_port 27960 +set com_hunkmegs 128 +exec server.cfg
7
echo &quot;server caido en `date`&quot; &gt; ultimo_crash.txt
8
done
9

Para que nuestro servidor pueda ser visto desde Internet, debemos abrir el puerto 27960 UDP y TCP.
Para más documentación sobre Urban Terror visiten http://www.urbanterror.net/new_urt_manual/

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 10.0/10 (1 vote cast)
2009
09.08
Urban Terror en Ubuntu

Urban Terror en Ubuntu

Urban Terror es un juego FPS (First Person Shooter) que utiliza el motor gráfico de Quake.

Para instalar Urban Terror en tu Ubuntu, primero debes descargarlo
wget http://files.uaaportal.com/gamefiles/current-version/UrbanTerror_41_FULL.zip
Luego descomprimir, por defecto crea el directorio UrbanTerror/
unzip /home/usuario/UrbanTerror_41_FULL.zip
Ahora ejecutamos
ioUrbanTerror.i386
y a disfrutar…

 

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 9.0/10 (1 vote cast)
2009
09.08

Una herramienta para monitorear tu sistema, debe ser liviana y atractiva, aquí te propongo usar Conky

Se instala fácilmente desde los repositorios.
sudo apt-get install conky
Luego debes crear un archivo de configuración en tu directorio personal, debe llamarse “.conkyrc”. Las configuraciones para este archivo las puedes encontrar en la sección de screenshots del sitio de Conky.

Yo personalmente uso esta configuración:

 Bash |  copy code |? 
01
# maintain spacing between certain elements
02
# Update interval in seconds
03
update_interval 2
04
 
05
 # Create own window instead of using desktop (required in nautilus)
06
own_window yes
07
own_window_transparent yes
08
own_window_type override
09
 
10
# Use double buffering (reduces flicker, may not work for everyone)
11
double_buffer yes
12
 
13
# Minimum size of text area
14
minimum_size 150 5
15
 
16
#send to background
17
background yes
18
 
19
# Draw shades?
20
draw_shades yes
21
 
22
# Draw outlines?
23
draw_outline no # amplifies text
24
 
25
# Draw borders around text
26
draw_borders no
27
 
28
# Stippled borders?
29
stippled_borders 0
30
 
31
# border margins
32
border_margin 1
33
 
34
# border width
35
border_width 1
36
 
37
# Default colors and also border colors, grey90 == #e5e5e5
38
default_color grey90
39
default_shade_color black
40
default_outline_color DarkGrey
41
 
42
# Text alignment, other possible values are commented
43
#alignment top_left
44
alignment top_right
45
#alignment bottom_left
46
#alignment bottom_right
47
#747574
48
 
49
# Gap between borders of screen and text
50
gap_x 9
51
gap_y 60
52
 
53
# Subtract file system buffers from used memory?
54
no_buffers yes
55
 
56
# set to yes if you want all text to be in uppercase
57
uppercase no
58
 
59
# stuff after 'TEXT' will be formatted on screen
60
 
61
TEXT
62
${color #ffcb48}${color #ffcb48}&nbsp; ${nodename} ${machine}
63
${color #98c2c7}Uptime: ${color white}${uptime}
64
 
65
${color #98c2c7}Bateria: ${color white}${battery}
66
 
67
${color #98c2c7}Kernel: ${color white}${kernel}
68
${color #98c2c7}Fecha: ${color white}${time %A,%d %B}
69
${color #98c2c7}Hora: ${color white}${time %k:%M}${alignr}
70
 
71
${color #ffcb48}PROCESANDO$color
72
${color #98c2c7}CPU:${color } $cpu % ${color #78af78}
73
Core 1
74
${cpubar cpu1 4,158}
75
Core 2
76
${cpubar cpu2 4,158}
77
 
78
${color white}USO DE PROCESADOR
79
${color #98c2c7}APLICACION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPU%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
80
${color #e5e5e5}${top name 1}&nbsp;&nbsp; ${top cpu 1}&nbsp;&nbsp; &nbsp;
81
${color #c4c4c4}${top name 2}&nbsp;&nbsp; ${top cpu 2}
82
${color #a3a3a3}${top name 3}&nbsp;&nbsp; ${top cpu 3}
83
${color #828282}${top name 4}&nbsp;&nbsp; ${top cpu 4}
84
 
85
${color white}USO DE MEMORIA
86
${color #98c2c7}APLICACION&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; RAM%
87
${color #e5e5e5}${top_mem name 1}&nbsp;&nbsp; ${top_mem mem 1}
88
${color #c4c4c4}${top_mem name 2}&nbsp;&nbsp; ${top_mem mem 2}
89
${color #a3a3a3}${top_mem name 3}&nbsp;&nbsp; ${top_mem mem 3}
90
${color #828282}${top_mem name 4}&nbsp;&nbsp; ${top_mem mem 4}
91
 
92
${color #98c2c7}[RAM]:${color}$memperc% ${color #78af78}$mem/$memmax
93
${membar 4,158}
94
${color #98c2c7}[SWAP]:${color}$swapperc% $swap/$swapmax
95
${swapbar 4,158}
96
${color #98c2c7}[ROOT]:${color}${color #78af78} ${fs_free /}${color #78af78}/${fs_size /}
97
${fs_bar 4,158 /}

Si pones Conky como carga automática al inicio de tu sesión, debes ponerle un retardo, para que pueda capturar correctamente el area del escritorio donde se mostrará.

 Bash |  copy code |? 
1
#!/bin/sh
2
sleep 30
3
conky

Puedes llamar a este archivo algo como “conky_loader.sh” y luego lo cargas al inicio de tu sesión.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
2009
09.07

WinFFEl uso de ffmpeg para la conversión de archivos de audio y video entre distintos formatos puede ser bastante compleja, debido a la gran cantidad de opciónes que tiene este programa, para facilitarnos un poco las cosas, hay un frontend que puede hacer mucho por nosotros, WinFF.
sudo apt-get install winff
Ahora ya tenemos una manera fácil y automática de convertir nuestros archivos de audio y video entre distintos formatos, pudiendo personalizar nuestras conversiones favoritas.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
2009
09.07

Para poder usar los modelos y tablas en singular, debemos agregar una excepción en la configuración de Cake.

inflections.php

$uninflectedPlural = array('.*');

Ahora podemos usar nombres de tablas sin importar si están en singular o plural, usando en el modelo el mismo nombre de la tabla que hemos creado.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)
2009
09.07

Una de los usos más comunes de las paginaciónes es limitar la visualización de el resultado de una búsqueda.

Cake no da una manera fácil de hacer esta cotidiana tarea, pero se puede solucionar este problema usando “Session”.

function admin_index() {    
 $criteria=null;
 $cond=array();
 if(!empty($this->data)){
 $apellido_paterno=$this->data['Buscar']['apellido_paterno'];
 $nombre=$this->data['Buscar']['nombre'];
 $rut=trim($this->data['Buscar']['rut']);            
 if($apellido_paterno!='')$cond[]="Usuario.apellido_paterno LIKE '%$apellido_paterno%' ";
 if($nombre!='')$cond[]="Usuario.nombre LIKE '%$nombre%' ";
 if($rut!='')$cond[]="Usuario.rut =$rut ";
 if(count($cond)>1){
 $criteria=implode(" AND ",$cond);
 }else{
 $criteria=$cond[0];
 $this->Session->write('Filtro.usuario', $criteria);
 }            
 if(empty($cond))$criteria=null;                
 }
 $filtro = $this->Session->read('Filtro.usuario');
 $this->set('usuario', $this->paginate('Usuario',$filtro));        
}

Éste trozo de código, implementa una búsqueda de usuario por nombre, apellido paterno o RUT (DNI), guardando el filtro en una variable de sesion, para usarlo atravez de las distintas páginas.

Para resetear el filtro, solo debemos borrar la variable de sesión

$this->Session->write('Filtro.usuario', null);

Así podemos mostrar todos los registros sin el filtro de búsqueda.

  • Digg
  • Facebook
  • Delicious
  • Twitter
  • Share/Bookmark
VN:F [1.9.3_1094]
Rating: 0.0/10 (0 votes cast)