All posts by josejavierfm

verificar un formulario con verify.notify de manera manual

Si tenemos un formulario y queremos evaluarlo antes de hacer el submit, necesitamos llamar a validate

<script>
function callback(res){
	if (res){
		document.getElementById('formularioquequieroenviar').submit();
	}
}
function comprobar(){
	$('#formularioquequieroenviar').validate(callback);
								
}
</script>
<form id="formularioquequieroenviar" action="xxx.php" method="post">
<input id="numero" name="numero" type="text" placeholder="numero" data-validate="required" />
<input type="button" value="Comprobar" />
</form>

El resultado del callback será el que determine si se hace el submit o no.

Jugando con imagenes en jquery (añadir texto y reemplazar texto )

Añadir automaticamente una leyenda a una imagen con su texto alternativo o poder cambiar las imagenes por un div con el mismo tamaño que la imagen y como contenido el texto alternativo.

Para ello nos hace falta JQuery y estilo css

Dada una imagen

Lo que obtenemos es la misma imagen pero con una leyenda inferior

La otra variante oculta la imagen y en su lugar muestra un hueco del mismo tamaño pero con el texto alternativo como contenido.

El ejemplo completo se puede ver aquí

Como hacer amigos en internet

Vivimos en una sociedad donde las relaciones humanas son cada vez mas difíciles, o por lo menos mas complicadas, dejarme que me explique: Ahora todo es digital, la manera de comunicarnos ha cambiado y hay que adaptarse a ello.
Hace algunos años no existían los móviles, ni con ellos los sms al principio o el whatsapp mas recientemente, tampoco había redes sociales.
Facebook por ejemplo empezó en 2004 pero no fué hasta 2008 cuando se convirtió en lo que es ahora.
A lo largo de los últimos años hemos visto como nacían muchas redes sociales (Instagram, Pinterest, Twitter) y algunas de ellas también morían, como por ejemplo Friendster o myspace.


El tema de los moviles tambien es digno de destacar, hace 20 años los telefonos moviles se utilizaban solo para llamar y muchas veces ni eso, se hacia una “llamada perdida” que dependiendo de la situacion podia significar varias cosas, como ya he llegado o si era de hijos a padres un “llamame tu”.
Ahora los moviles se usan menos para llamar pero mas para la comunicación digital, sobre todo whatsapp, siendo la aplicación mas utilizada en españa.
Pero volvamos al tema principal, antes la unica manera de conocer gente era mediante el trato personal, habia que hablar con la persona y eso podia ser el comienzo de una amistad. Las interacciones se producian en el lugar de trabajo, el gimnasio, o en bares y zonas de ocio, los mas mayores recordarán tambien los recreativos o las plazas llenas de niños jugando.
Ahora todo es digital, cada vez se ven menos niños jugando en la calle, menos balones y menos bicicletas, y un ejemplo se pudo comprobar solo hace unos días, mas concretamente el 25 de diciembre, donde hace 20 años veías gente en la calle estrenando regalos, ahora no había nadie, los chicos solo quieren cosas digitales, consolas, videojuegos, teléfonos móviles y tabletas.
Eso nos lleva otra vez a que si los niños son así, los mayores tambien cambian sus habitos, todo el mundo tiene el movil “a mano”, e Internet es la manera de comunicarnos e informarnos, de interactuar con el entorno, fotos de lo que comemos, de donde vamos y de con quien estamos, etiquetamos todo y comentamos lo que hacen nuestros amigos y conocidos.
Todo esto nos lleva a que cada vez hay menos relaciones personales, incluso entre parejas que estando sentadas juntas se escriben por whatsapp…
Entonces, ¿como se hacen amigos?
Dependiendo de la edad las redes sociales te pueden ayudar, los amigos de tus amigos comentan, tu respondes y puede que surja una conversación, o por el otro lado, si no conoces gente de verdad no puedes añadir a nadie a las redes sociales por lo que no hay manera de empezar a “hablar” aunque sea digitalmente.
Luego está el tema de cuantos amigos tienes y la “calidad” de esas amistades, mucha gente tiene 500 o mas amigos en una red social, pero de verdad los conoces a todos o has hablado con ellos alguna vez.
Entonces descubrimos que una manera de conocer gente puede ser un foro de amistad, donde buscar un tema que te apasione y encontrar gente que también le guste, ese es el punto de partida que necesitamos para conocer gente.

xpath

Partimos del siguiente xml:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="children">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="web">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="web">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

 

y trabajamos con javascript para utilizar xpath y ver los resultados

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>
<p id="resultado"></p>

<script>




var text = "<bookstore><book category='cooking'>  <title lang='en'>Everyday Italian</title>  <author>Giada De Laurentiis</author>  <year>2005</year>  <price>30.00</price></book><book category='children'>  <title lang='en'>Harry Potter</title>  <author>J K. Rowling</author>  <year>2005</year>  <price>29.99</price></book><book category='web'>  <title lang='en'>XQuery Kick Start</title>  <author>James McGovern</author>  <author>Per Bothner</author>  <author>Kurt Cagle</author>  <author>James Linn</author>  <author>Vaidyanathan Nagarajan</author>  <year>2003</year>  <price>49.99</price></book><book category='web'>  <title lang='en'>Learning XML</title>  <author>Erik T. Ray</author>  <year>2003</year>  <price>39.95</price></book></bookstore>";

path = "/bookstore/book/author";
var parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
 showResult(xmlDoc,path);
 showResult(xmlDoc,"//title");
 showResult(xmlDoc,"//book/author[1]");
 showResult(xmlDoc,"//book[@category=\"web\"]/title");

function showResult(xml,path) {
    var txt = "";
    
    if (xml.evaluate) {
        var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
        var result = nodes.iterateNext();
        while (result) {
            txt += result.childNodes[0].nodeValue + "<br>";
            result = nodes.iterateNext();
        } 
    // Code For Internet Explorer
    } else if (window.ActiveXObject || xhttp.responseType == "msxml-document") {
        xml.setProperty("SelectionLanguage", "XPath");
        nodes = xml.selectNodes(path);
        for (i = 0; i < nodes.length; i++) {
            txt += nodes[i].childNodes[0].nodeValue + "<br>";
        }
    }
    document.getElementById('resultado').innerHTML += "<strong>"+path+"</strong><br/>"+txt+"<br>";
}
</script>

</body>
</html>

Y vemos como resultado:

/bookstore/book/author
Giada De Laurentiis
J K. Rowling
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
Erik T. Ray

//title
Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML

//book/author[1]
Giada De Laurentiis
J K. Rowling
James McGovern
Erik T. Ray

//book[@category="web"]/title
XQuery Kick Start
Learning XML

Se puede interactuar y probar desde la url: aquí

Añadir contador de caracteres restantes a caja de texto

La idea es teniendo una caja de texto o un elemento input añadir un contador de los caracteres que faltan y que se vaya actualizando a medida que escribimos.


para ello utilizamos JQuery y la siguiente libreria:

(function($) {
'use strict';

$.fn.countChar = function() {

return this.each(function(i, element) {
$(element).keyup(function updateCharCounter() {

var $me = $(this);
var maxLength = parseInt($me.attr('maxlength'), 10);
var charCount = $me.val().length;
var nombrecajalimite=$me.prop('id')+"_limit";
var cajalimite = $('#'+nombrecajalimite);

cajalimite.text('' + maxLength + '/' + (maxLength - charCount));
});

var $me = $(this),
maxLength = parseInt($me.attr('maxlength'), 10),
charCount = $me.val().length;
var nombrecajalimite=$me.prop('id')+"_limit";
var cajalimite = $('#'+nombrecajalimite);
if (cajalimite){
$me.after('<p id="'+nombrecajalimite+'" class="limit"></p>');
}
cajalimite = $('#'+nombrecajalimite);
cajalimite.text('' + maxLength + '/' + (maxLength - charCount));

});
};


$( "<style>.limit { float: right; clear: both; margin-bottom: 10px; font: 400 0.688em/1.38 'Roboto'; text-align: right; color: #777777;}</style>" ).appendTo( "head" )



}(jQuery));

Con esto lo único que tenemos que hacer es añadir una clase a nuestra caja de texto:

<div class=" clearfix">
<label class="_text">Caja de texto con maxlength = 50</label>
<input id="nickname" class="cuentacaracteres _textfield" size="32" maxlength="50" placeholder="counter.js">
</div>

Y añadir al final del documento la linea que lo enlaza:

<script>

$(document).ready(function (){
'use strict';

// works on one field
$('.cuentacaracteres').countChar();
});
</script>

Generar un zip de backup del servidor FTP

basandome en el código
he modificado la clase para añadirle seguridad (*):

Para ello partimos de una estructura de servidor:

Donde colocamos el fichero zip.php en el raiz

Dentro del fichero configuramos la ruta donde se van a guardar los archivos y las exclusiones que queremos hacer, en este caso los directorios dir2 y dir4 y el propio fichero de generar el zip.

Una vez que invocamos el fichero desde navegador


obtenemos un zip como:


<?php
	//funciones
	function show($str){
		echo $str . "<br/>\n";
		flush();
		ob_flush();
	}
	function secured($nombre,$directorio){
		return str_replace($directorio."/backup",$directorio."/secured_backup",$nombre);
	}
	
	//configuracion
	ini_set('max_execution_time', 5000);
	$maxFilePerArchive = 20000;
	$directorio="zipBk";
	$debug=false;
	//directorios y ficheros que no quieres que se añadan al archivo
	$excludes=array("dir2","dir4","zip.php");
	
	
	//parametros recibidos
	if (isset($_REQUEST['pass'])){
		$password=$_REQUEST['pass'];
	}else{
		$password="";
	}
	if (isset($_REQUEST['delete'])){
		$delete=true;
	}else{
		$delete=false;
	}
	if (isset($_REQUEST['ver'])){
		$ver=true;
	}else{
		$ver=false;
	}
	if (isset($_REQUEST['dias'])){
		$dias=$_REQUEST['dias'];
	}else{
		$dias=2;
	}
	if (isset($_REQUEST['help'])){
		show("Puedes pasar los parametros<br>
		<strong>pass</strong> Para poner password al zip<br>
		<strong>ver</strong> Para ver los archivos que son, pero sin crear el zip<br>
		<strong>delete</strong> Para borrar los archivos zip anteriores, se puede pasar un parametro dias ( indicando el numero de dias de margen para borrar )<br>
		");
		die;
	}
	
	// increase script timeout value
	
	if ($directorio!="" && $directorio!="." && !file_exists($directorio)) {
		mkdir($directorio, 0777, true);
		if($debug){show("Se ha creado el directorio $directorio porque no existia");}
	}
	if ($delete){
		
		show("Borramos los archivos anteriores a 2 dias");
		$ficheros=0;
		$borrados=0;
		$ahora=time();
		foreach (glob($directorio."/*.zip") as $file) {
			if (is_file($file)){
				$ficheros++;
				
				if ($ahora - filemtime($file) >= 60*60*24*$dias){ // 1 days
					$borrados++;
					echo $file;
					unlink($file);
				}
				echo "<br>";
			}
		}
		show("Hemos borrado $borrados archivos");die;
	}
	
	$numFiles = 0;
	$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./"));
	foreach ($iterator as $key=>$value){
		$key=substr($key,2,strlen($key)-1);
		if (! preg_match('/'.$directorio.'\/backup_'.'/', $key) && !preg_match('/'.$directorio.'\/secured_backup_'.'/', $key)){
			if (!(substr($key,-2)==".." || substr($key,-1)==".")){
				if ($excludes){
					$puede=true;
					foreach ($excludes as $exclude)
					{
						if (preg_match('/^'.$exclude.'/', $key))
						{
							$puede = false;
						} 
					}
				}else{
					$puede=true;
				}
				if ($puede){
					$numFiles += 1;
					if ($ver){
						show("Se insertara el archivo $key");
					}
				}
			}
		}
	}
	show( "Comprimiremos $numFiles archivos" );
	if (!$ver){
		$date = getdate();
		$enlaces=array();
		$splitNum = 0;
		$archive = $directorio."/backup_" . $date[0];
		$currentArchive = $archive . "_" . $splitNum . ".zip";
		$enlaces[]=$currentArchive;
		$zip = new ZipArchive();
		if ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {
			die ("No se puede abrir el archivo");
		}
		
		
		$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./"));
		$numFiles = 0;
		$counter = 0;
		
		foreach ($iterator as $key=>$value){
			$counter += 1;
			if ($counter >= $maxFilePerArchive) {
				$zip->close();
				if ($password!=""){
					try{
						system('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);
						unlink($currentArchive);
					}catch(Exception $ex){
					
					}
				}
				$currentArchive = $archive . "_" . $splitNum++ . ".zip";
				$enlaces[]=$currentArchive;
				show( "Limite de ficheros: partimos el archivo, Nuevo archivo es $currentArchive" ); 
				
				$zip = new ZipArchive();
				if ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {
					die ("No se puede crear el archivo");
				}
				
				$counter = 0;
			}
			$key=substr($key,2,strlen($key)-1);
			if (! preg_match('/'.$directorio.'\/backup_'.'/', $key) && !preg_match('/'.$directorio.'\/secured_backup_'.'/', $key)){
				if (substr($key,-2)==".." || substr($key,-1)=="."){
					if ($debug){show( "Excluimos $key" );}
				}else{
					if ($excludes){
						$puede=true;
						foreach ($excludes as $exclude)
						{
							if (preg_match('/^'.$exclude.'/', $key))
							{
								$puede = false;
							} 
						}
					}else{
						$puede=true;
					}
					if ($puede){
						$zip->addFile(realpath($key), $key) or die ("ERROR: No se puede añadir el fichero: $key");
						$numFiles += 1;
						if ($debug){show( "Añadimos $key" );}
					}
				}
				
			} else {
				if($debug){show( "No se comprime el archivo,por ser una copia previa-> $key" );}
			}
		}
		// close and save archive
		$zip->addFromString("LEEME_".time().".txt", "#1 Fichero generado automaticamenta\nPor un proceso para realizar backup de todo el FTP. ");
		$zip->close();
		if ($password!=""){
			try{
				system('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);
				unlink($currentArchive);
			}catch(Exception $ex){
			
			}
		}
		
		if ($password=="" ){
			show( "El fichero no tiene clave, llama al script pasando el parametro ?pass=xxxx para mayor seguridad" );
		}
		if ($password!=""){$enlaces=secured($enlaces);}
		echo "<br>";
		if($enlaces){
			foreach($enlaces as $enlace){
				if (file_exists($enlace)){
					echo "<a href='".$enlace."'>".$enlace."</a><br>";
				}else{
					echo "No se pudo generar el fichero $enlace <br>";
				}
			}
		}
	}
?>

(*) Como la clase ZipArchive de php no soporta clave, se genera un segundo zip mediante llamada al sistema operativo que si que pone contraseña al original y lo borra.

Nociones de economia

Llevo unos días con ganas de aprender algo de economía con la intención de invertir.

Por lo que he leido términos totalmente desconocidos para mi como pueden ser commodities, forwards, los swaps, las OTC, tipos de derivados financieros o los CFDs entre otros.

Entonces esto no parece un tema sencillo, por lo que vamos a intentar ir por partes:

Macroeconomía vs. Microeconomía.

La Macroeconomía estudia el funcionamiento económico a gran escala, así como la repercusión de las políticas económicas en un país, por ejemplo. Se ocupa de analizar:

– La evolución en el corto plazo de la producción, del empleo y de los precios, es decir, de los ciclos económicos.

– La evolución en el largo plazo de la producción y del nivel de vida, es decir, del crecimiento económico.

La Microeconomía estudia el comportamiento de las unidades económicas individuales: individuos, familias, empresas y los mercados en los que operan. Analiza:

– La formación de los precios a partir del cruce entre Oferta y Demanda.

– La asignación de los recursos escasos entre finalidades alternativas.

Hay varias premisas que tenemos que tener clara desde el comienzo:
– Toda inversión tiene un riesgo ( que nadie intente venderte un producto con riesgo 0 )
– Cuanto menor es el riesgo menor será la rentabilidad, o visto de otra forma, cuanto mayor sea el riesgo, mayor tiene a ser su beneficio, aunque también la posibilidad de perder mucho o todo.

Cuando hablamos de riesgo tenemos que ser conscientes de que se puede perder una parte , todo y con algunos productos se puede perder mas de lo invertido.

Otro de los puntos a tener en cuenta es el tiempo que vas a tener la inversión bloqueada, con la imposibilidad de utilizar ese capital. Por lo que necesitas un remanente de dinero con el que no puedes contar en el tiempo que vas a invertir.

Productos de bajo riesgo
Aquí se incluyen los depósitos y las cuentas bancarias de plazo fijo, que a dia de hoy tienen unos intereses muy bajos, por ejemplo ( y según esta web), el valor mas alto es 2% .

Con esto la ganancia que se consigue es bastante baja si tenemos en cuenta que el coste de la vida crece mientras tenemos el dinero bloqueado.

Otro de los productos es la deuda pública, que en el momento de escribir esto tiene valores incluso negativos (web), por lo que no solo no ganamos dinero, sino que nos cuesta.

Productos de alto riesgo
Comprar deuda privada, es el equivalente al punto anterior, pero cambiando la administración por una empresa. Esto tiene un riesgo mayor, pues la empresa puede quebrar y al final quedarnos sin el dinero. Pero también es posible ganar mas dinero si al final todo sale bien.

Otro de los productos que podemos encontrar como de alto riesgo son las acciones. Que son participaciones del capital de una empresa. Si compramos acciones al final lo que obtenemos es una pequeña ( en algunos casos minúscula) parte de la empresa. En este punto podemos hacer referencia a la bolsa y ver unos de los indicadores principales ( que no el único) que es el IBEX

Uno de los ejemplos que mas me gustan es el de las acciones de amazon:

Donde en el año 1997 las acciones valían 1,5 dolares, para pasar en el año 2007 a cerrar con un valor de 97, que podríamos decir que es muy grande, pero es que si lo comparamos con el valor de 2017, donde han pasado la barrera de los 1000 dolares, es casi irrisorio, pero cuantos de nosotros en el año 1997 podríamos pensar en lo que llegaría a ser….

Como caso contrario podemos mostrar el del banco popular,

Donde la gente que invirtiera en 2008 ha visto como sus acciones han pasado de 25 a 0, por lo que han perdido todo su dinero.