muy interesante no vi muchos tutos de twitter bootstrap, y siempre es útil para aquellos como yo que decimos "como odio diseñar" o necesitan un diseño rápido.
saludos!
saludos!

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCitarYo:
che despues
mirá esto
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
quizá vos sepas
amigo mio:
En el conjunto de los números naturales, todo número tiene su sucesivo, el que sigue del 2 es el 3, el que sigue de 6 es el 7, se consideran discretos, xq están limitados, en el conjunto de los números racionales esto no pasa, entre dos números hay infinitos números decimales, entre 2 y 3 puede estar 2,5 2,159 2,0000005 y así... No tiene limite, a estos números se les denomina densos, siendo que justamente no se puede determinar el siguiente de un número!!! Terrible!!!!!
yo:
en otras palabras ambos numeros son pi?
solo que uno es más detallado que otro?
amigo:
Los números racionales o fraccionarios son divisiones de dos números naturales, pero están los que tienen resto cero y los que no, que dan con coma y siempre se puede seguír dividiendo, ósea que sí hay dos pi distintos, significa que vienen de divisiones distintas... Aunque parecidas!
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Entiendo...
como deciamos no hace falta declararlas, aunque tampoco esta de mas, de cualquier forma hay que estar atento con private, protected y public. Me paso que muchas veces puse private y al usar la clase y a su vez funcion en otro archivo no aparecia nada, no funcionaba, obviamente porque estaba privada, y buen.. hasta que te das cuenta puede pasar 1 segundo como 10 minutos o inclusive mas... si te toca un mal dia xD.
Buena explicacion.
Saludos!
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
te hago una consulta aparte...
porque cuando creas una variable siempre le das valor null. En el caso de que no lo hagas y solamente lo cree, no va a tener ningun valor. Ademas de que las variables que usas son privadas, asi que no se va a poder utilizar en otro lado, de cualquier forma, las utilizas en la misma clase obviamente. Pero la pregunta es... les pones un valor nulo por algun motivo o porque te acostumbraste/te gusta asi?.
saludos

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Saludos brother, gracias por tu respuesta, pero creo que uno como diseñador y programador tiene que tomar encuenta hasta el más minimo detalle, para el buen funcionamiento del producto, como dijiste, hoy en dia sigue habiendo personas que usan versiones antiguas de esos navegadores y uno tiene que incluir esos detalle en un proyecto.
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Saludos amigos, después de mucho tiempo regresando por un pequeño problemita, ando modificando un sitio web y me muestra el siguiente mensaje de error:CitarEs posible que esta pagina web no funcione correctamente debido a errores.
Llamada inesperada a un método o a un acceso de propiedad
httpErrorPagesScripts.js Línea: 264 Carácter: 5
Código: 0
URI: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
quisiera saber si es problema del mal uso de JavaScript o de las Clases y funciones usadas con PHP?
esto solo sucede en Internet Explore 8 o inferior
gracias de ante mano.
<?php
include('Property.php');
include('ClassIPNInterface.php');
// creamos el objeto, automáticamente la clase enviará una notificación a paypal de que recibimos la notificación y eso
$ipn = new ClassIPN();
// vemos si ubo un error al realizar el aviso a paypal
if($ipn->error == true)
{
// mostramos el error
echo $ipn->error_msg;
} else { // si no ocurrió ningún error
// aquí guardamos en la base de datos, y actualizamos la tabla que tenga los pagos y le damos la plata al cliente o le ponemos una notificación de que se realizó el pago.
// podemos usar las siguientes variables:
$ipn->item_name(); // nombre del producto
$ipn->payment_status(); // el estado del pago cuando se realizó esta notificacion
$ipn->payment_amount(); // el dinero que pagó por el producto
$ipn->transaction_id(); // el numero de transacción único, recomiendo que revisen en la db antes de hacer nada si ya había un pago con este numero de transacción para no tener duplicados.
$ipn->client_email(); // el email de la persona que pagó
}
<?php
interface IIPN
{
public function __construct();
public function get_item_name();
public function set_item_name($value);
public function get_payment_status();
public function set_payment_status($value);
public function get_payment_amount();
public function set_payment_amount($value);
public function get_payment_currency();
public function set_payment_currency($value);
public function get_transaction_id();
public function set_transaction_id($value);
public function get_receiver_email();
public function set_receiver_email($value);
public function get_client_email();
public function set_client_email($value);
}
include('ClassIPN.php');<?php
class IPN implements IIPN
{
// usamos mi trait Property
use Property;
// atributos privados
private $notify_validate_request_content = null;
private $notify_validate_request_header = null;
// variables.
private $item_name = null; // nombre del producto
private $payment_status = null; // estado del pago
private $payment_amount = null; // precio pagado
private $payment_currency = null; // ?
private $transaction_id = null; // id de transacción de paypal
private $receiver_email = null; // nuestro mail
private $client_email = null; // mail del que compró
private $error = false;
private $error_msg = null;
public function __construct()
{
$this->vars_extract();
$this->notify_validate_request_content = $this->request_content_generate();
$this->notify_validate_request_header = $this->request_header_generate();
$this->notify_validate_request();
}
private function request_content_generate()
{
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
return $req;
}
private function request_header_generate()
{
$header = null;
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($this->notify_validate_request_content) . "\r\n\r\n";
return $header;
}
private function notify_validate_request()
{
try
{
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
if(!$fp) throw new exception('No es posible conectar con www.paypal.com');
fputs ($fp, $this->notify_validate_request_header . $this->notify_validate_request_content);
while (!feof($fp))
{
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{
return true;
}
else
{
throw new exception('Ocurrió un error con la transaccion');
}
}
} catch(Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
return false;
}
}
private function vars_extract()
{
$this->item_name = $_REQUEST['item_name'];
$this->payment_status = $_REQUEST['payment_status'];
$this->payment_amount = $_REQUEST['mc_gross'];
$this->payment_currency = $_REQUEST['mc_currency'];
$this->transaction_id = $_REQUEST['txn_id'];
$this->receiver_email = $_REQUEST['receiver_email'];
$this->client_email = $_REQUEST['payer_email'];
}
public function get_item_name() { return $this->item_name; }
public function set_item_name($value) { ; }
public function get_payment_status() { return $this->payment_status; }
public function set_payment_status($value) { ; }
public function get_payment_amount() { return $this->payment_amount; }
public function set_payment_amount($value) { ; }
public function get_payment_currency() { return $this->payment_currency; }
public function set_payment_currency($value) { ; }
public function get_transaction_id() { return $this->transaction_id; }
public function set_transaction_id($value) { ; }
public function get_receiver_email() { return $this->receiver_email; }
public function set_receiver_email($value) { ; }
public function get_client_email() { return $this->client_email; }
public function set_client_email($value) { ; }
}<?php
// se requiere Trait Property
Interface IFileClass
{
/*
* @ $location = carpeta donde se guarda el archivo
* @ $name = nombre del archivo con extensión incluida
*/
public function __construct($location = null, $name = null);
/*
* @ $name = nombre que verá el usuario cuando se le descargue el archivo
*/
public function download_file($name);
/*
* @ $nombre_campo = nombre del campo file del formulario para cargar archivo
* @ $carpeta = carpeta donde se subirá el archivo
* @ $uniqid = agregar o no un id único para que no se repitan los archivos
* @ $namecrypt = encriptar nombre del archivo para imposibilitar descarga (se encrypta en md5)
* @ $extension_valida = arreglo con extensiones válidas
* @ $file_type = MIME/TYPE del archivo
* @ $kbmax = Máximos kb que se permiten en la subida (dejar en 0 si no se quiere poner limite)
* @ $dir = cuando se devuelva la ruta del archivo devolverla con la carpeta o sin la carpeta de su ubicación (osea solo el nombre o toda la ruta completa)
* ésta función devuelve falso si ubo algún error, o la dirección o nombre del archivo (según lo especificado) de lo que se subió.
*/
public function upload_file($nombre_campo, $carpeta, $uniqid = false, $namecrypt = false, $extension_valida = array('rar'), $file_type = null, $kbmax = 0, $dir = true);
// devuelve si un nombre de archivo tiene o no una extensión X.
public function validate_extension($filename, $extension);
public function get_name();
public function set_name($value);
public function get_peso();
public function set_peso($value);
public function get_type();
public function set_type($value);
public function get_location();
public function set_location($value);
public function get_error();
public function set_error($value);
public function get_error_msg();
public function set_error_msg($value);
}
include('FileClass.php');<?php
Class FileClass implements IFileClass
{
use Property;
protected $kb = 1024;
protected $mb = 1024;
protected $gb = 1024;
private $name = null;
private $peso = null;
private $type = null;
private $location = null;
private $error = false;
private $error_msg = null;
public function __construct($location = null, $name = null)
{
try
{
if(!empty($location))
{
if(empty($name)) throw new exception('El nombre del fichero es requerido');
if(!file_exists($location.$name)) throw new exception('El fichero no existe');
$this->name = $name;
$this->location = $location;
$this->peso = filesize($location.$name);
}
} catch(Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
}
}
public function download_file($name)
{
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"{$name}\"\n");
$fp=fopen($this->location.$this->name, "r");
fpassthru($fp);
die();
}
public function upload_file($nombre_campo, $carpeta, $uniqid = false, $namecrypt = false, $extension_valida = array('rar'), $file_type = null, $kbmax = 0, $dir = true)
{
try
{
$this->name = $_FILES[$nombre_campo]['name'];
$this->size = $_FILES[$nombre_campo]['size'];
$this->type = $_FILES[$nombre_campo]['type'];
$this->location = $carpeta;
if(empty($_FILES[$nombre_campo])) throw new exception('Archivo no seleccionado');
$id = null;
if($uniqid) $id = uniqid(microtime());
$this->name = $id.$this->name;
// verificamos si la extensión es válida
$valido = false;
for($i = 0; $i<count($extension_valida); $i++)
if($this->validate_extension($this->name, $extension_valida[$i]))
$valido = true;
if(!$valido) throw new exception('El archivo es de una extensión inválida');
// verificamos si el tipo de archivo es valido
if(!empty($file_type) && $this->type!=$file_type) throw new exception('El tipo de archivo es inválido');
// verificamos si tiene el tamaño correcto
if($kbmax>0 && $this->size > $kbmax*$this->kb) throw new exception('El archivo pesa demaciado');
// lo encryptamos si es preciso
if($namecrypt)
$this->name = 'file_'.md5($this->name).'.cab';
// verificamos que el directorio tenga los permisos
//------------ TODO
// ahora lo vamos a mover
if (!move_uploaded_file($_FILES[$nombre_campo]['tmp_name'], $this->location.$this->name)) throw new exception('No se puede mover fichero subido a carpeta especificada');
// retornamos el directorio donde se guardó
if($dir)
return $this->location.$this->name;
else
return $this->name;
} catch (Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
return false;
}
}
public Function validate_extension($filename, $extension)
{
$ext_init = strlen($filename) - strlen($extension);
$last_ext = null;
for($i=$ext_init; $i<strlen($filename); $i++)
$last_ext.=$filename[$i];
if($last_ext == $extension)
return true;
else
return false;
}
public function get_name() { return $this->name; }
public function set_name($value) { $this->name = $value; }
public function get_peso() { return $this->peso; }
public function set_peso($value) { ; }
public function get_type() { return $this->type; }
public function set_type($value) { ; }
public function get_location() { return $this->location; }
public function set_location($value) { $this->location = $value; }
public function get_error() { return $this->error; }
public function set_error($value) { ; }
public function get_error_msg() { return $this->error_msg; }
public function set_error_msg($value) { ; }
}
// INCLUIMOS LOS ARCHIVOS NECESARIOS
include('Property.php');
include('ClassMailerInterface.php');
$emisor = '[email protected]'; // mi mail
$emisor_alias = 'Roberto Gomez';
$receptor = '[email protected]'; // el mail de la persona que recibirá el mail xD
$receptor_alias = 'José perez';
$asunto = 'Hola josé';
$mensaje = 'Hola josé, como andas? todo bien? saludos!';
// creamos un nuevo mail
$mail = new ClassMailer($emisor, $receptor, $asunto, $mensaje, $emisor_alias, $receptor_alias);
// si no hay error
if(!$mail->error)
{
$mail->send(); // enviamos el mail
}
else // si hay error
{
echo $mail->error_message; // mostramos el error
}
<?php
interface IClassMailer
{
// devuelve verdadero si $email es válido, o falso si $email no es válido
public function validar_email($email);
// enviar email preconfigurado
public function send();
// retorna verdadero o falso dependiendo de si se envió el email
// setters and getters
public function get_receptor();
public function set_receptor($value);
public function get_receptor_alias();
public function set_receptor_alias($value);
public function get_emisor();
public function set_emisor($value);
public function get_emisor_alias();
public function set_emisor_alias($value);
public function get_asunto();
public function set_asunto($value);
public function get_charset();
public function set_charset($value);
public function get_content_type();
public function set_content_type($value);
public function get_mime_version();
public function set_mime_version($value);
public function get_mensaje();
public function set_mensaje($value);
public function get_error();
public function set_error($value);
public function get_error_message();
public function set_error_message($value);
}
include('ClassMailer.php');
<?php
Class ClassMailer implements IClassMailer
{
// uses
use Property;
// atributes
private $receptor = null;
private $receptor_alias = null;
private $emisor = null;
private $emisor_alias = null;
private $asunto = null;
private $charset = 'UTF-8';
private $content_type = 'text/html';
protected $mime_version = '1.0';
private $mensaje = null;
protected $error = false;
protected $error_message = null;
public function __construct($emisor, $receptor, $asunto, $mensaje, $emisor_alias = null, $receptor_alias = null)
{
try
{
if(!$this->validar_email($emisor)) Throw new exception('Invalid mail $emisor');
if(!$this->validar_email($receptor)) Throw new exception('Invalid mail $receptor');
$asunto = trim($asunto);
if(empty($asunto) && strlen($asunto)<3) throw new exception('Invalid subject $asunto');
$mensaje = trim(utf8_encode($mensaje));
if(empty($mensaje) && strlen($mensaje)<10) throw new exception('Invalid menssage $mensaje');
$this->receptor = $receptor;
$this->emisor = $emisor;
$this->asunto = $asunto;
$this->mensaje = $mensaje;
if(!empty($emisor_alias))
{
$emisor_alias = trim($emisor_alias);
if(strlen($emisor_alias)>3)
$this->emisor_alias = $emisor_alias;
else
throw new exception('Emisor Alias is invalid');
}
if(!empty($receptor_alias))
{
$emisor_alias = trim($receptor_alias);
if(strlen($receptor_alias)>3)
$this->receptor_alias = $receptor_alias;
else
throw new exception('Receptor Alias is invalid');
}
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function validar_email($email)
{
return preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i',$email);
}
public function send()
{
if(!$this->error)
{
mail($this->receptor, $this->asunto, $this->mensaje, $this->fabricar_cabeceras());
} else { return false; }
}
private function fabricar_cabeceras()
{
$cabeceras = null;
$cabeceras = 'MIME-Version: ' . $this->mime_version . "\r\n";
$cabeceras .= 'Content-type: ' . $this->content_type . '; charset=' . $this->charset . "\r\n";
if(!empty($this->receptor_alias))
{
$cabeceras .= 'To: ' . $this->receptor_alias . ' <' . $this->receptor . '>' . "\r\n";
} else {
$cabeceras .= 'To: ' . $this->receptor . "\r\n";
}
if(!empty($this->emisor_alias))
{
$cabeceras .= 'From: ' . $this->emisor_alias . ' <' . $this->emisor . '>' . "\r\n";
} else {
$cabeceras .= 'From: ' . $this->emisor . "\r\n";
}
return $cabeceras;
}
public function get_receptor() { return $this->receptor; }
public function set_receptor($value)
{
try
{
$receptor = $value;
if(!$this->validar_email($receptor)) Throw new exception('Invalid mail $receptor');
$this->receptor = $receptor;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_receptor_alias() { return $this->receptor_alias;}
public function set_receptor_alias($value)
{
try
{
$receptor_alias = $value;
$receptor_alias = trim($receptor_alias);
if(!strlen($receptor_alias)>3) throw new exception('Receptor Alias is invalid');
$this->receptor_alias = $receptor_alias;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_emisor() { return $this->emisor; }
public function set_emisor($value)
{
try
{
$emisor = $value;
if(!$this->validar_email($emisor)) Throw new exception('Invalid mail $emisor');
$this->emisor = $emisor;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_emisor_alias() { return $this->emisor_alias; }
public function set_emisor_alias($value)
{
try
{
$emisor_alias = $value;
$emisor_alias = trim($emisor_alias);
if(!strlen($emisor_alias)>3) throw new exception('Emisor Alias is invalid');
$this->emisor_alias = $emisor_alias;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_asunto() { return $this->asunto; }
public function set_asunto($value)
{
try
{
$asunto = value;
$asunto = trim($asunto);
if(empty($asunto) && strlen($asunto)<3) throw new exception('Invalid subject $asunto');
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_charset() { return $this->charset; }
public function set_charset($value)
{
$this->charset = $value;
}
public function get_content_type() { return $this->content_type; }
public function set_content_type($value)
{
$this->content_type = $value;
}
public function get_mime_version() { return $this->mime_version; }
public function set_mime_version($value) { ; } // no podemos cambiar el mime_version
public function get_mensaje() { return $this->mensaje; }
public function set_mensaje($value)
{
try
{
$mensaje = $value;
$mensaje = trim(utf8_encode($mensaje));
if(empty($mensaje) && strlen($mensaje)<10) throw new exception('Invalid menssage $mensaje');
$this->mensaje = $mensaje;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}
public function get_error() { return $this->error; }
public function set_error($value) { ; } // no permitimos setear un error
public function get_error_message() { return $this->error_message; }
public function set_error_message($value) { ; } // no permitimos setear un mensaje de error
}
porque tanto código en mi post no entra y queda cortado.<?php
include('Property.php');
// esta clase requiere Property!
// Interface
interface IErrorClass
{
// arrojar error
public function error_dispatch();
// setters y getters
public function get_message();
public function set_message($value);
public function get_error_level();
public function set_error_level($value);
}
class ErrorClass implements IErrorClass
{
use Property;
private $message = null;
private $errors = array( NULL, 1024, 512, 256 );
private $error_level = 1;
public function __construct($message = null, $error_level = 1)
{
$this->error_level_control($error_level);
$this->message_control($message);
$this->message = $message;
$this->error_level = $error_level;
}
private function error_level_control($lvl)
{
if(!isset($this->errors[$lvl]))
{
$this->error_level = 3;
$this->message = 'Invalid error type specified';
$this->error_dispatch();
}
return true;
}
private function message_control(&$message)
{
$message = htmlentities($message);
$message = utf8_encode($message);
return true;
}
public function error_dispatch()
{
trigger_error($this->message, $this->errors[$this->error_level]);
}
public function get_message()
{
return $this->message;
}
public function set_message($value)
{
$this->message_control($value);
$this->message = $value;
}
public function get_error_level()
{
return $this->error_level;
}
public function set_error_level($value)
{
$this->error_level_control($value);
$this->error_level = $value;
}
}
// ejemplo de uso
$error = new ErrorClass();
$error->error_level = 1; // solo se pueden asignar valores de 1 a 3, cuanto mayor es el numero el error va a ser de mayor tipo (E_NOTICE = 1, E_WARNING = 2, E_FATAL = 3)
// si se asigna un valor no permitido tirará FATAL ERROR
$error->message = 'Probando errores';
$error->error_dispatch();<?php
trait Singleton
{
static private $instancia = null;
static public function GetInstancia()
{
if(!(self::$instancia instanceof __CLASS__))
{
self::$instancia = new __CLASS__;
}
return self::$instancia;
}
public function __clone()
{
trigger_error('No es posible realizar la clonación', E_USER_ERROR);
}
}class miclase
{
use Singleton;
... resto del código
}class miclase
{
use Singleton, Property;
... resto del código
}You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Mira te explico bien, el tema es que deberias aprender MySQL y un poco mas de PHP
pero mira es asi...
Tomas el ID mediante GET desde la URL asi:Código: text $idnoticia = (int) $_GET['id'];
la url de noticias seria algo asi: elarchivo.php?id=1
para mostrar la noticia correspondiente tenes que hacer una consulta a mysql de la siguiente forma...Código: text $query = 'SELECT id, mes, dia, categoria, titulo from noticias WHERE id=$id';
Bien hasta ahi?.
Bien ahora te digo tu error... lo tienes en el archivo noticias.php
en este codigo:Código: text while($row = mysql_fetch_array($result))
{
echo $contenido;
}
esta totalmente erroneo la variable de $contenido, primero que no existe y segundo que no se muestra asi los datos.
Lo que tenes q poner es:Código: text while($row = mysql_fetch_array($result))
{
echo $row['titulo_noticia'];
echo $row['contenido_noticia'];
}
Y es que mas que eso no se puede explicar, porque ya con lo que te explique tiene que funcionar.
$row = mysql_fetch_array($result)
echo $row['titulo_noticia'];
echo $row['contenido_noticia'];
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Lo que quiero hacer es que cuando de click en el titulo me muestre la noticia completa bro en una pagina nueva
Cuando doy clic en el titulo de la noticia se haber noticias.php y en ella se imprime la noticia el titulo y el id
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Lo quise mandar a noticias.php pero me arrojo otro error , asi es como estan los codigos bro
index.phpCódigo: text <?php
include ('start_connection.php');
$query = 'SELECT id, mes, dia, categoria, titulo from noticias';
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo '<article class="slide">
<time datetime="2013-02-04">'.$row['mes'].'<span>'.$row['dia'].'</span></time>
<div class="holder">
<h2 class="text-green">'.$row['categoria'].'</h2>
<p><a class="ejemplo_4" href="noticias.php?id='.$row['id'].'">'.$row['titulo'].'</a></p>
</div>
</article>';
}
include ('close_connection.php');
?>
noticias.phpCódigo: text <?php
include ('start_connection.php');
$id = (int)$_GET['id'];
$query = 'SELECT id, mes, dia, categoria, titulo from noticias WHERE id=$id';
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo $contenido;
}
include ('close_connection.php');
?>