Para hacer que un menú nos indique cual es la opción activa, o la sección en que nos encontramos en una página web podemos hacer uso de los selectores de jquery y la función addClass y removeClass.
A continuación anexo el código que permite hacer esto.
$(document).ready(function(){
//selector a la clase opcion para darle función al evento click
$(".opcion").click(function(){
//eliminamos la clase activa por si una opción la contiene
$(".opcion").removeClass("opcionActiva");
//asignamos la clase opcionActiva a la opción presionada
$(this).addClass("opcionActiva")
})
})
Simplemente hago uso de addClass y removeClass de jquery para añadir o remover la clase de CSS opcionActiva.
La función addClass sirve para agregar una clase de css a un elemento y la función removeClass sirve para lo contrario.
Este tema es un poco rebuscado, ya que muchos de los que trabajan en el ambiente de contratar personal desconocen los aspectos técnicos y es por ello que se crea la problemática de no poder diferenciar un programador experto tan fácilmente.
Yo soy de los que tienen la idea que un currículum es una carta de mentiras donde uno puede ser un súper héroe pero existen puntos clave que te sugiero puedas tomar en cuenta para detectar si un programador es senior o no:
El currículum: el currículum es un medio que presta a la persona a cometer mitomanía pero igual puede la persona misma ahorcarse sola por medio de este. Un currículum lleno de lenguajes de programación es la primera señal de que la persona no tiene nada de senior, así de simple.Es más factible un currículum lleno de herramientas, frameworks o librerías que se engloben a 2 o 3 lenguajes de programación, que todo un libro de colección de lenguajes de programación que no lo hace un experto solo un mentirosillo.
El trabajar en equipo: es poco común que una persona indique en una entrevista de trabajo, cuanto y como ha trabajado en equipo. El trabajar en equipo es de las cosas primordiales, la mayoría de desarrollos son en equipo, y si la persona demuestra que ha trabajado con equipos en lugar de ser un programador solitario (esos programadores que se sienten estrellas) es otro punto extra para demostrar que es un programador senior, un programador senior no es un súper hombre es solo una persona que sabe hacer las cosas bien.
Arquitectura de Software: el conocer conceptos fundamentales de la arquitectura de software, desde básicos como el UML, tipos de arquitecturas, patrones de diseño es tan importante como el saber programar, y a un nivel de senior es algo que debe conocerse por ley.
Base de datos: un senior sabe diseñar una base de datos de cero, también sabe utilizar procedimientos, triggers y funciones en un lenguaje relacional, eso es básico, no digo que sea un DBA pero si tener el nivel de diseñar bien la estructura de la base de datos. Si no sabe hacer esto, esta lejísimos de ser un senior.
Tipos de sistemas: las personas pueden ser senior cuando han resuelto distintos tipos de sistemas, si una persona se la ha pasado haciendo puntos de venta que siempre es lo mismo, el mismo tipo de problema, eso lo aleja demasiado a ser un senior. Un programador senior ha creado sistemas distintos, viéndose en la problemática de diferentes escenarios a los cuales pudo resolver.
Modelo de procesos: si la persona no conoce un modelo de procesos ya sea CMMI, MoProSoft u otro, es probable que no realice software de calidad (es probable porque he conocido personas que no utilizan nada de esto pero crean su propio modelo de procesos sin saberlo y su software es bueno, no excelente pero si es bueno). El no separar el desarrollo del software en procesos indica un sinónimo de ser novato.
Control de versiones: un senior sabe y conoce distintos programas o herramientas de control de versiones de código, si la persona en su vida ha utilizado esto, está lejos de ser un senior. También está lejos de ser un senior una persona que conoce programas de control de versiones pero no le sirve de mucho, nunca sube sus avances (he conocido muchos así y que han perdido hasta 3 semanas de trabajo porque se descompuso su computadora).
Documentar: las personas que no documentan no respetan su trabajo, por lo tanto no son senior (abre un software creado por ti sin documentar hace 2 años, y veras a que me refiero). Documentar el software es tan importante como codificar (esto incluye los comentarios en el código), no documentar el software es crear algo que más tarde nadie sabrá cómo se realizó y se deberá invertir tiempo en ingeniería inversa (como los platillos de marcianos de Roswell).
Honestidad: la honestidad de decir: “No, ese tiempo de entrega es imposible”, la honestidad de decirle al líder de proyecto o al cliente: “eso no está dentro del presupuesto”. La honestidad de saber las limitaciones personales representadas al tiempo del desarrollo son más benéficas que decir si a todo, se beneficia el cliente por no esperar algo que no se le dará, se beneficia el equipo de desarrollo por no involucrarse en tareas imposibles respecto al tiempo, y se beneficia la empresa ya que no quedara mal con nadie. Un senior es honesto en este aspecto.
Existen algunos otros puntos, pero estos para mi son lo primordial para identificar a un senior de un mentirosillo.
En php existe un módulo llamado imap dedicado a las conexiones a correos, este módulo contiene un conjunto de funciones que nos ayudan a realizar esta tarea fácilmente.
Pero antes tenemos que cambiar la siguiente configuración en nuestra cuenta de Gmail para permitir a una aplicación externa conectarse.
Primero(con sesión creada en gmail para hacer estos cambios claro) debemos activar la opción de permitir conexiones de aplicaciones externas en la siguiente liga:
Seleccionamos Activar y Guardar.
La segunda configuración es para que Gmail nos permita conectarnos por el protocolo IMAP. Basta con que vayamos a la configuración de Gmail y seleccionemos la siguiente opción y demos guardar.
En el siguiente código, realizo la conexión a una cuenta de Gmail por medio del protocolo imap y a la vez obtengo los asuntos de los correos.
Clase
class ObtieneMails{
//usuario de gmail, email a donde deseamos conectarnos
var $user="[email protected]";
//password de nuestro email
var $password="tuPasswordDeGmail";
//inforrmación necesaria para conectarnos al INBOX de gmail,
//incluye el servidor, el puerto 993 que es para imap, e indicamos que no valide con ssl
var $mailbox="{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX";
var $fecha="01-MAR-2015"; //desde que fecha sincronizara
//metodo que realiza todo el trabajo
function obtenerAsuntosDelMails(){
//realizamos la conexión por medio de nuestras credenciales
$inbox = imap_open($this->mailbox,$this->user,$this->password) or die('Cannot connect to Gmail: ' . imap_last_error());
//con la instrucción SINCE mas la fecha entre apostrofes ('')
//indicamos que deseamos los mails desde una fecha en especifico
//imap_search sirve para realizar un filtrado de los mails.
$emails=imap_search($inbox,'SINCE "'.$this->fecha.'"');
//comprbamos si existen mails con el la busqueda otorgada
if($emails) {
//ahora recorremos los mails
foreach($emails as $email_number)
{
//leemos las cabeceras de mail por mail enviando el inbox de nuestra conexión
//enviando el identificdor del mail
$overview=imap_fetch_overview($inbox,$email_number);
//ahora recorremos las cabeceras para obtener el asunto
foreach($overview as $over){
//comprobamos que exista el asunto (subject) en la cabecera
//y si es asi continuamos
if(isset($over->subject)){
//aqui pasa algo curioso
//el asunto vendra con caracteres raros
//para ello anexo una función que lo limpia y lo muestra ya legible
//en lenguaje mortal
$asunto=$this->fix_text_subject($over->subject);
//y aqui simplemente hacemos un echo para mostrar el asunto
echo utf8_decode($asunto)."n";
}
}
}
}
}
//arregla texto de asunto
function fix_text_subject($str)
{
$subject = '';
$subject_array = imap_mime_header_decode($str);
foreach ($subject_array AS $obj)
$subject .= utf8_encode(rtrim($obj->text, "t"));
return $subject;
}
}
Ejecución
//creamos el objeto
$oObtieneMails= new ObtieneMails();
//ejecutamos el metodo
$oObtieneMails->obtenerAsuntosDelMails();
la función imap_search contiene muchísimas variantes para realizar filtrados en los correos y todos los pueden ver dando clic aquí.
Para realizar una petición Post enviando contenido Json en php, podemos utilizar la curl_init() la cual nos crea una sesión de tipo cURL con la cual podemos establecer conexión a una url.
Junto con la función curl_init(), debemos utilizar la función curl_setopt() en la cual enviaremos las opciones de nuestra petición y el contenido json. Y también utilizaremos la función curl_exec() que es la que se encarga de mandar el mensaje.
Y para dejar todo esto claro a continuación un código sencillo en el cual voy comentando paso a paso que se está realizando:
//url de la petición
$url = 'https://pato.com/login';
//inicializamos el objeto CUrl
$ch = curl_init($url);
//el json simulamos una petición de un login
$jsonData = array(
'usuario' => 'pato', //código fijo
'password' => 'pato123456'
);
//creamos el json a partir de nuestro arreglo
$jsonDataEncoded = json_encode($jsonData);
//Indicamos que nuestra petición sera Post
curl_setopt($ch, CURLOPT_POST, 1);
//para que la peticion no imprima el resultado como un echo comun, y podamos manipularlo
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//Adjuntamos el json a nuestra petición
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);
//Agregamos los encabezados del contenido
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//ignorar el certificado, servidor de desarrollo
//utilicen estas dos lineas si su petición es tipo https y estan en servidor de desarrollo
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
//curl_setopt($process, CURLOPT_SSL_VERIFYHOST, FALSE);
//Ejecutamos la petición
$result = curl_exec($ch);
Nota: La línea comentada: «curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)» sirve para peticiones a servidores https desde un servidor de desarrollo el cual no tiene modo seguro.
Para realizar un movimiento del scroll en el navegador de forma animada, vamos a hacer uso de la función anímate de jquery(puedes visitar mi entrada donde hablo a fondo de esta función) y también haremos uso de la función offset para obtener el valor de nuestro elemento destino.
El siguiente código hace posible la animación del scroll de una manera rápida y fácil:
Html
<!-- menu para dar clic -->
<div style="height:50%; width:120px; position:fixed; top:100px; font-size:20px; background:#000; color:#fff; opacity:.5; padding:10px;">
<a href="#opcion1" class="scroll">Ir a opcion 1</a><br />
<a href="#opcion2" class="scroll">Ir a opcion 2</a><br />
<a href="#opcion3" class="scroll">Ir a opcion 3</a><br />
<a href="#opcion4" class="scroll">Ir a opcion 4</a><br />
<a href="#opcion5" class="scroll">Ir a opcion 5</a><br />
<a href="#opcion6" class="scroll">Ir a opcion 6</a><br />
</div>
<!-- los elementos destino -->
<div style="height:500px; background:#fff;">
<p id="opcion1">Un pato</p>
</div>
<div style="height:500px; background:#eee;">
<p id="opcion2">Dos pato</p>
</div>
<div style="height:500px; background:#ddd;">
<p id="opcion3">Tres pato</p>
</div>
<div style="height:500px; background:#ccc;">
<p id="opcion4">Cuatro pato</p>
</div>
<div style="height:500px; background:#bbb;">
<p id="opcion5">Cinco pato</p>
</div>
<div style="height:500px; background:#aaa;">
<p id="opcion6">Seis pato</p>
</div>
Javascript
$(document).ready(function(){
$(".scroll").click(function(event){
//bloqueamos la función del anchor original
event.preventDefault();
//dirigimos de manera animada al id del anchor
$('html,body').animate({
//le indicamos al scroll vertical que se dirija al objeto con el id
//guardado en el anchor a su posición top.
scrollTop:$(this.hash).offset().top
},1000);
});
});
La función prompt(), es una función de alerta de javascript, la cual tiene un comportamiento de mostrar un mensaje y a su vez un input text(caja de texto) en el cual el usuario puede capturar un texto. El texto capturado puede ser guardado en una variable y con esta realizar la acción deseada.
Se utiliza de la siguiente manera:
//El primer parametro es el texto a mostrar, el segundo es el texto por defecto en el input text
var texto = prompt("¿Cual es tu nombre?", "Texto por defecto");
//comparamos el texto obtenido, sea distinto a el texto por defecto
if(texto!="Texto por defecto")
alert("Tu nombre es: "+texto)
La función confirm() de javascript nos permite abrir una alerta en la cual tenemos la opción de confirmar o rechazar alguna pregunta, y dependiendo de la respuesta podemos hacer una acción u otra.
Se utiliza de la siguiente manera:
//la función confirm nos regresa true si es seleccionado si, sino nos regresa false.
if(confirm("¿Eres un pato?")){
alert("cua cua")
}else{
alert("no eres pato")
}
O podemos descargarla mediante Nuget poniendo su nombre (SpreadsheetLight).
Esta librería tiene una dependencia y es importante agregar la librería DocumentFormat.OpenXml pero tiene que ser la versión 2.0 ya que la más nueva 2.5 no me corrió. Para eso pueden dar clic en este enlace http://www.microsoft.com/en-us/download/details.aspx?id=5124y pueden descargar la versión 2.0. Ya instalado ese paquete ya solo van a la ruta donde se instaló que casi siempre es c:/Program Files/Open Xml SDK/V2.0/ y ya de ahí solo la agregan a sus referencias al proyecto.
A continuación pongo la siguiente clase como ejemplo con sus comentarios paso por paso.
using SpreadsheetLight;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CreacionDeExcelSinOffice
{
class CreadorExcel
{
private string rutaArchivoCompleta = "";
public CreadorExcel(string nombreArchivo)
{
//obtenemos la ruta de nuestro programa y concatenamos el nombre del archivo a crear
rutaArchivoCompleta = AppDomain.CurrentDomain.BaseDirectory + "/" + nombreArchivo;
}
public void CrearExcel()
{
try
{
//creamos el objeto SLDocument el cual creara el excel
SLDocument sl = new SLDocument();
//creamos las celdas en diagonal
//utilizando la función setcellvalue pueden navegar sobre el documento
//primer parametro es la fila el segundo la columna y el tercero el dato de la celda
for (int i = 1; i <= 10; ++i) sl.SetCellValue(i, i, "patito "+i);
//Guardar como, y aqui ponemos la ruta de nuestro archivo
sl.SaveAs(rutaArchivoCompleta);
}catch(Exception ex){
Console.WriteLine("Ocurrio una Excepción: "+ex.Message);
}
}
}
}
Y de esta manera hacemos uso de la anterior clase.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CreacionDeExcelSinOffice
{
class Program
{
static void Main(string[] args)
{
//creamos la clase enviandole el nombre del archivo que deseemos
CreadorExcel oCreadorExcel = new CreadorExcel("patito.xlsx");
//ejecutamos el metodo que crea el excel
oCreadorExcel.CrearExcel();
//Esto ultimo solo para verificar que todo fue bien.
Console.WriteLine("Se creo el archivo, presiona una tecla para terminar");
Console.ReadKey();
}
}
}