Juan Carlos Clemente
1986-06-13
zetta
Website Photo
zetta

Fetch ‘n’ Stretch

June 5th, 2008

Fetch n Stretch

Me entero desde Su.Doku.Es de este juego que me hizo recordar los tiempos donde todos tenian un nokia con el clásico juego Snake, aunque la verdad tambien me remonta mas allá, cuando jugaba con el tetris ( de esos de 10,000 juegos de tepito)

Muy recomendado para matar la producción =)

Via : Su.DoKu.Es

BeSlimed

May 30th, 2008

BeSlimed

BeSlimed es un juego muy entretenido creado en MooTools, la verdad está bueno para matar unos minutos del tiempo en oficina =P

OpenSolaris

May 30th, 2008
Open Solaris Logo

Hoy me llegó por correo el CD de OpenSolaris (Si me resistí a bajarlo y preferí pedirlo por correo).

La espera valió la pena en este momento estoy instalandola en una virtualización de la PC de escritorio y al momento me ha gustado mucho, la verdad es que no fue nada dificil pues como ya estoy muy a acostumbrado al GNOME y OpenSolaris lo trae fue de hecho igual que instalar un Ubuntu en la computadora.

Me dan ganas de sacarle copias y regalarlas en el metro =P, espero poco a poco poder escribir mas acerca de openSolaris que sinceramente este ha sido mi primer acercamiento =D

Download Day 2008

May 29th, 2008

Establece un récord mundial Guinness
Disfruta una web mejor

Download Day 2008

Parece un buen trato, ¿verdad? Todo lo que tienes que hacer es descargar Firefox 3 durante el Download Day para ayudar a establecer el récord del software con más descargas durante 24 horas – es así de fácil. No te estamos pidiendo que te tragues una espada o que mantengas en equilibrio 30 cucharas sobre tu cara, aunque eso también sería bastante impresionante

Por cierto, la fecha oficial de lanzamiento de Firefox 3 se publicará aquí pronto – ¡así que visítanos a menudo! Únete a nuestra comunidad hoy.

Me uno a la reciente propuesta de la gente en Mozilla, esperemos que mucha mas gente se una a este movimiento por lo pronto a la hora de mi registro solo somos 886 personas registradas en México, ojalá que se unan mas mexicanos a este movimiento. Estados Unidos encabeza esta lista con 16,935 personas

Via Picando Codigo

Crear un Tunel SSH para Firefox

May 27th, 2008

Cada dia me vuelvo mas desconfiado con esto de estar enviando información a internet, y con esto de utilizar la laptop en cualquier red (de hecho ahorita me encontré con una linksys abierta que me dejó conectarme a internet) como que me da cosa estar navegando y enviando datos a lo loco =P

Es por eso que para poder navegar de una manera mas segura creo un tunel hacia ctrl-zetta.com y al firefox lo conecto atravéz de un “proxy” que no es mas que la conexión ssh que tengo habilitada, y pues asi sin mas ahora en lugar de YO “dar la cara” ahora la da el server jejeje.

Como le hacemos??

Es algo muy sencillo, primero que nada tenemos que conectarnos via SSH con nuestro servidor como lo hariamos usualmente

1
$ssh -l myusername -D 9999 -C myserver.com

Con el parámetro D especificamos un puerto por donde estaremos enviando el tráfico (y como va encriptado.. pues ya no preocupa, bueno ya no me preocupa mucho jejeje) el parámetro C es solo para comprimir

Teniendo esta conexión creada ya tenemos listo nuestro “proxy” ya solo nos falta decirle a Firefox que se conecte a él.

Nos vamos a Edit->Preferences->Advanced->Network->Settings (lo siento tengo instalado firefox en inglés)

Seleccionamos configuración manual de proxy y ahi en SOCKS Host: ponemos localhost y el puerto que hayamos seleccionado en la conexion ssh, para este ejemplo seria 9999

Seleccionamos Socks vs (deberia estarlo por default) y

No Proxy for: localhost, 127.0.0.1 (que tambien por default viene, o en la mia asi venia jeje)

Y ya!!!! ve a Whats my Ip para que veas que tu IP ahora ya no es tu IP =P

Para no tener que andar cambiando las preferencias del firefox a cada rato instalen esta extensión

SwitchProxy Tool 1.4.1

Dividir archivos en Linux

May 20th, 2008

Hay una aplicación muy buena para dividir archivos muy grandes en pequeñas partes, muy útil si queremos subir un archivo muy grande por ejemplo en Rapidshare =).

1
zetta@ctrl-zetta.com:~$  split -b [tamaño en bytes] archivo.tgz

y para unirlos simplemente concatenamos nuestros archivos con el siempre util cat por ejemplo

1
zetta@ctrl-zetta.com:~$  cat archivo.tgz.0 archivo.tgz.1  archivo.tgz.2 >  archivo.tgz

wordpress plugin.codecolorer.mod(spoiler)

October 25th, 2007

Hace un par de díias un amigo me dijo que la página se comenzaba a ver muy fea y cada vez se entendia menos, pues se veia código por todas partes, me sugirió crear spoilers en los cuadros de có para que ya no se vea tan feo, he aqui lo que hice

Primero que nada estaba utilizando el plugin de codecolorer hay que buscar el archivo codecolorer.php y modificar algunas lineas

Los números de línea son un estimado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//declaramos una varibale al inicio de la clase //->linea 75
var $uniqueId = 0;

//dentro de la funcion init()  //linea ->
$this->uniqueId = time();

///modifique la funcion addContainer()  y ahora quedo asi

function addContainer($html, $options, $num_lines) {
if($num_lines > $options['lines'])
$style = ' style="height:' . ($options['lines'] * $options['line_height']) . 'px; visibility: hidden;  display: none; "';
elseif($num_lines == 1)
$style = ' style="height:' . intval(2.5 * $options['line_height']) . 'px; visibility: hidden; display: none; "';
else
$style = ' style=" visibility: hidden; display: none; " ';
$this->uniqueId++;

$result = '
<p class="spoiler"><a onclick="spoiler(\''
.$this-&gt;uniqueId.'\'); return false;" href="#">Mostrar/Ocultar código '.$options['lang'].'</a>';
$result .= '
<div id="'
.$this-&gt;uniqueId.'" class="codecolorer-container ' . $options['lang'] . '">' . $html . '</div>
'
;

return $result;
}

La funcion de javascript para que se muestren los bloques

1
2
3
4
5
6
7
8
9
10
11
function spoiler(a){
var tar = document.getElementById(a);
if( tar.style.visibility == 'hidden' ){
tar.style.visibility = 'visible';
tar.style.display = 'block';
}else{
tar.style.visibility = 'hidden';
tar.style.display = 'none';
}
return;
}

y para que no se vea tan mal el link un poquito de css

1
2
.spoiler a, .spoiler a:link, .spoiler a:visited{ color: #FFF; }
.spoiler a:hover{ color: #EEE; }

La idea era hacerlo con mootools, pero despues me dio un poco de pereza jeje

function validMail.php

October 8th, 2007

Muchas veces tengo que comprobar si un correo que escriben en algun formulario es un correo válido, algunas otras veces esto se complica pues algunas expresiones regulares pueden ser fácilmente engañadas con un a@a.a, con esta función podemos verificar mas a fondo si este es un correo real.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
validMail():Boolean
@email -&gt; string: email a comparar
@validate -&gt; Boolean: conectarse al servidor a buscar dicho usuario
*/

function validMail($email,$validate = false) {
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
return false;
if ($validate){
list ( $Username, $Domain ) = split ("@",$email);
if (getmxrr($Domain, $MXHost))
$ConnectAddress = $MXHost[0];
else
$ConnectAddress = $Domain;
$Connect = fsockopen( $ConnectAddress, 25 );
if ($Connect) {
if (ereg("^220", $Out = fgets($Connect, 1024))) {
fputs ($Connect, "HELO $HTTP_HOST\r\n");
$Out = fgets ( $Connect, 1024 );
fputs ($Connect, "MAIL FROM: &lt;{$email}&gt;\r\n");
$From = fgets ( $Connect, 1024 );
fputs ($Connect, "RCPT TO: &lt;{$email}&gt;\r\n");
$To = fgets ($Connect, 1024);
fputs ($Connect, "QUIT\r\n");
fclose($Connect);
if (!ereg ("^250", $From) || !ereg ( "^250", $To )) {
return false;
}
}else{
return false;
}
}else{
return false;
}
}
return true;
}

?&gt;

javascript slideShow con Scriptaculous

July 27th, 2007

Hace tiempo que hice un script con script.aculo.us y php para crear un SlideShow

Aqui puedes ver el Demo

Ademáas del framework de scriptaculous necesitamos este codigo

zetta.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
if(!Array.prototype.push){
Array.prototype.push =  function(){
var i;
for(i=0; j=arguments[i]; i++) this[this.length] = j;
return this.length;
};
};
Effect.BlindRight = function(element) {
element = $(element);
element.makeClipping();
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: true,
scaleY: false,
restoreAfterFinish: true,
afterFinishInternal: function(effect) {
effect.element.hide();
effect.element.undoClipping();
}
}, arguments[1] || {})
);
};
Effect.BlindLeft = function(element) {
element = $(element);
var elementDimensions = element.getDimensions();
return new Effect.Scale(element, 100,
Object.extend({ scaleContent: true,
scaleY: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) {
effect.element.makeClipping();
effect.element.setStyle({width: '0px'});
effect.element.show();
},
afterFinishInternal: function(effect) {
effect.element.undoClipping();
}
}, arguments[1] || {})
);
};
Effect.Jump = function(element) {
element = $(element);
var oldStyle = {
top: element.getStyle('top'),
left: element.getStyle('left') };
return new Effect.Move(element,
{ y:  20, x: 0, duration: 0.05, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ y: -40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ y:  40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ y: -40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ y:  40, x: 0, duration: 0.1,  afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ y: -20, x: 0, duration: 0.05, afterFinishInternal: function(effect) {
effect.element.undoPositioned();
effect.element.setStyle(oldStyle);
}}) }}) }}) }}) }}) }});
};
Object.extend(Element, {
getWidth: function(element) {
element = $(element);
return element.offsetWidth;
},
setWidth: function(element,w) {
element = $(element);
element.style.width = w +"px";
},
setHeight: function(element,h) {
element = $(element);
element.style.height = h +"px";
},
setTop: function(element,t) {
element = $(element);
element.style.top = t +"px";
},
setSrc: function(element,src) {
element = $(element);
element.src = src;
},
setHref: function(element,href) {
element = $(element);
element.href = href;
},
setInnerHTML: function(element,content) {
element = $(element);
element.innerHTML = content;
}
});

var zetta = {
identifier : {},
type : {},
inplaced : Array(),
load : function(){
imagenes = document.getElementsByTagName('img');
for (var a = 0; (elemento = imagenes[a]); a++) {
if (elemento.className.match("transition")){
var settings = elemento.className;
elemento.setAttribute("settings",settings);
elemento.className = null;
dupNode = elemento.cloneNode(true);
padre = elemento.parentNode;
var tDiv = document.createElement("div");
tDiv.appendChild(dupNode);
padre.replaceChild(tDiv, elemento);
tDiv.setAttribute("width",dupNode.getAttribute("width"));
tDiv.setAttribute("height",dupNode.getAttribute("height"));
tDiv.style.display = "inline";
//alert(settings);
//var time = settings.split("_");
//time = time[4];
setTimeout("zetta.transition('"+dupNode.id+"');",(( time = settings.split("_")[4] )*1000)+(a*132));
}
}
},
transition : function(target){
to = document.getElementById(target);
if(to == null)
return false;
target = ($(target));
var u = 'transition/transition.php?target=' + target.id + "&amp;url=" + target.src.replace('http://','') + "&amp;settings=" + target.getAttribute("settings");
uno = new  Ajax.Request( u ,{ onComplete : function (){ eval(uno.transport.responseText); } })
},
_transition : function(element,img,effect,time){
var daTime = time
var daEffect = effect
imgPreloader = new Image();
imgPreloader.onload=function(){
var ran =  Math.round(3*Math.random());
i = (daEffect == "jump") ? 0 :( (daEffect == "shake") ? 1 :( (daEffect == "pulsate") ? 2 :( (daEffect == "fade") ? 3 :( ran ) ) ) );
switch (i){
case 0:
Effect.Jump(element);
setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",500);
break;
case 1:
Effect.Shake(element);
setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",500);
break;
case 2:
Effect.Pulsate(element, {duration : 1.0});
setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",1000);
break;
default:
Effect.Fade(element);
setTimeout("zetta._conditional('"+element+"',\"Element.setSrc('"+element+"', '"+img+"');\");",1200);
setTimeout("zetta._conditional('"+element+"',\"Effect.Appear('"+element+"');\");",1215);
}
setTimeout("zetta._conditional('"+element+"',\"zetta.transition('"+element+"');\");",(time*1172));
}
imgPreloader.src = img;
},
_conditional : function(target,code){
to = document.getElementById(target);
if(to == null)
return false;
eval(code);
}
};
window.onload = zetta.load;

y un php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function ext($file_name){
ereg("(.+)\.(.+)", basename($file_name), $regs);
return strtolower($regs[2]);
}
if($_GET['target'] and $_GET['settings'] and $_GET['url']){

$var = explode("_", $_GET['settings']);
$im = array();
if ($gestor = opendir("{$var[1]}/")) {
while (false !== ($archivo = readdir($gestor))) {
if ($archivo != "." &amp;&amp; $archivo != ".." and ( ext($archivo) == "png" or ext($archivo) == "jpg" or ext($archivo) == "gif")) {
$im[] = rawurlencode($archivo);
}
}
closedir($gestor);
}
$ims = array_merge($im,$im);

if($var[2] == "random"){
shuffle($im);
$d = current($im);
}else{
$oldFile = explode("/", $_GET['url']);
$oldFile = $oldFile[count($oldFile)-1];
for($i=0; $i
if($ims[$i] == $oldFile){
$d = $ims[$i+1];
break;
}
}

}

$img = "transition/{$var[1]}/{$d}";
echo  "zetta._transition('{$_GET['target']}','{$img}','{$var[3]}',{$var[4]})";

}
?&gt;

Para utilizar en tu header coloca esto

1
2
<script src="js/prototype.js" type="text/javascript"></script>
 <script src="js/scriptaculous.js" type="text/javascript"></script>

y para mandar llamar solo pon una imagen con clase (class) “transition_
Ejemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<img id="h1D7ugF5RL" class="transition_stewie_linear_random_2" src="transition/stewie/st1.jpg" alt="Demo Imagen" width="150" height="170" />

class="transition_[folder]_[mode]_[effect]_[wait]"

folder:String    // folder donde estan las imagenes

mode:String      // modo de busqueda de las imagenes
random
linear

effect:String   // efecto al hacer la transicion
jump
shake
pulsate
fade
random

wait:Number     //tiempo de espera entre los cambios en segundos

A mi se me hace que pesa mucho, pero espero pronto hacer una version mas ligera con mootols

Descargar transition.zip

sudo que insulta

July 25th, 2007

Todas las personas que desarrollamos cualquier tipo de aplicación tenemos que pensar en los mensajes de los diferentes errores que suceden (en lo personal soy muy pelado). Los desarrolladores de sudo no se quedan atrá porque este programita también te insulta cuando no pones bien tu contraseña de administrador, aunque esta opción viene desactivada por default, para activarla debes

  • Ejecutar: sudo visudo
  • Encuentra la linea que comienza con Defaults
  • Añade ,insults y guarda
  • Reinicia tu sesión y ejecuta sudo de nuevo pero equivocate
screenshot1.png