segunda-feira, 30 de março de 2009

jMonthCalendar

Artigo Original por ByteCyclist

jMonthCalendar é um calendário completo que suporta eventos. Você simplesmente inicializa o calendário com um array de opções e eventos e ele cuida do resto. O plugin tem pontos de extenções que permite ao desenvolvedor a interagir com o calendário quando a ele está prestes a mudar de mês, depois que ele mudou de mês e quando bolhas de eventos são clicadas. jMonthCalendar agora suporta extenções de passagem do mouse em pontos, sobre eventos e engatilha um evento como um alert(); Por padrão cada evento deve ter uma URL associada que irá direcionar para a página de detalhes.

Google Code Home: http://code.google.com/p/jmonthcalendar/
Downloads: http://code.google.com/p/jmonthcalendar/downloads/list
jQuery Project Home Page
Download 1.2.0 directly

Recursos
  • Compátivel jQuery 1.3.0
  • Habilidade de carregar eventos
  • Extenções configuráveis: onMonthChanging, onMonthChanged, onEventClick
  • Links dos eventos para página de detalhes por padrão
Usos e Códigos de Exemplo

A forma mais simples de usar o plugin é usar este html em algum lugar da sua página:

<div id="jMonthCalendar"></div>

E usar este Javascript:

$().ready(function() {

var options = { };
var events = [ ];

$.jMonthCalendar.Initialize(options, events);
});

Se você quer fazer alguma coisa mais avançada, é necessário mexer nas opções configuráveis que o componente lhe oferece através da variável options. Você pode ver como podem ser definidas funções customizadas em pontos específicos. Pode-se ver também que o nome dos meses podem ser traduzidos facilmente. Note o novo onEventBlockOver e onEventBlockOut; isto irá permitir você sinalizar um alerta ou um pop-up do estilo balão.

var options = {
height: 650,
width: 980,

navHeight: 25,
labelHeight: 25,
firstDayOfWeek: 0,

navLinks: {
p:'Prev',
n:'Next',

t:'Today'
},
onMonthChanging: function(dateIn) { return true; },

onMonthChanged: function(dateIn) { return true; },
onEventClick: function(event) { return true; },

onEventBlockOver: function(event) { return true; },
onEventBlockOut: function(event) { return true; },

onDayLinkClick: function(date) { return true; },
onDayCellClick: function(date) { return true; },

locale: {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],

daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],

daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],

months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],

monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],

weekMin: 'wk'
}
};

Para os eventos, esta é a forma como eu posso definir o que vai ser executado, caso você queira fazer alguma coisa diferente pode modificar o fonte do plugin ou simplesmente mapear para este array. Eu estou planejanto usar este plugin em uma aplicação MVC e irei simplesmente serializar meu objeto para JSON.

var events = [

{ "EventID": 1, "StartDate": new Date(2009, 1, 12), "Title": "10:00 pm - EventTitle1", "URL": "#", "Description": "This is a sample event description", "CssClass": "Birthday" },

{ "EventID": 2, "Date": "2009-02-28T00:00:00.0000000", "Title": "9:30 pm - this is a much longer title", "URL": "#", "Description": "This is a sample event description", "CssClass": "Meeting" },

];

Você não está limitado a apenas carregar eventos quando o calendário é inicializado. Você pode usar chamadas AJAX para buscar mais eventos do seu servidor baseados na data que o calendário está mostrando. Nota: Você deve usar a chamada AJAX no evento onMonthChanging. Este evento é disparado antes do calendário desenhar os eventos.

//Set a function to get more events, this could be an AJAX call to the server as well.
var options = {
onMonthChanging: function(dateIn) {

//this could be an Ajax call to the backend to get this months events
var events = [
{ "EventID": 1, "StartDate": new Date(2009, 1, 1), "Title": "10:00 pm - EventTitle1", "URL": "#", "Description": "", "CssClass": "Birthday" },

{ "EventID": 2, "StartDate": new Date(2009, 1, 2), "Title": "9:30 pm - this is a much longer title", "URL": "#", "Description": "", "CssClass": "Meeting" }

];
$.jMonthCalendar.ReplaceEventCollection(events);
return true;

}
}; //on a button click, add more the the calendar.
$("#Button").click(function() {
//extraEvents could be a call to the server or anything else that can produce a JSON array

$.jMonthCalendar.AddEvents(extraEvents);
}); //you could also set/change the month from an external source
$("#ChangeMonth").click(function() {

$.jMonthCalendar.ChangeMonth(new Date(2008, 4, 7));

});
Demonstração

Abrir em nova janela

sexta-feira, 27 de março de 2009

6 Ferramentas para ser um Desenvolvedor Web Efetivo

Artigo original por GeekDaily

Nos últimos anos o Rails ajudou muito na popularidade do Ruby explodir. Uma das grandes razões para isto é o tempo que o Rails pode poupar. Trabalhando com um framework bem definido, várias decisões de desenvolvimento são simplificadas, o que torna mais fácil e mais organizado o trabalho. Utilizando boas ferramentas como ORM, Teste de unidade, Mocking e muitas outras faz com que melhore muito a qualidade e eficiencia do desenvolvedor.

Sempre existiu a e provavelmente sempre vai existir a questão sobre qual é a melhor plataforma, mas o que eu quero mostrar para você é que esta questão é praticamente irrelevante. Independente de qual plataforma você escolha, sempre vai existir ferramentas semelhantes entre elas. Os componentes mais comuns para mim que me ajuda a produzir códigos com alta qualidade mais rápido são uma boa IDE, facilidade de executar testes de unidade e mocking, uma ORM, um framework MVC e uma boa biblioteca JavaScript.

Eu sou um desenvolvedor .Net por conta do mercado e um desenvolvedor PHP em alguns momentos por escolha. Gosto dos dois ambientes por diferentes razões. O que vou falar aqui é sobre cada um desses componentes em poucos detalhes e explicar porque eu acho que eles são importantes e então no final do artigo irei colocar uma lista de cada um desses componentes para várias linguagens (.Net, Java, PHP, Python e Ruby). Eu decidi por colocar na lista somente componentes grátis ou de código aberto porque eles são mais fáceis de alguém testar e todos nós gostamos de economizar nosso suado dinheiro.

O Ambiente de Desenvolvimento Integrado (IDE)

Para mim este é o mais importante. Certamente você pode programar no Notepad e compilar via linha de comando, mas provavelmente isto será mais trabalhoso e você terá que ter uma disciplina muito grande para manter tudo organizado. Com uma boa IDE você tem uma gerência do seu projeto muito fácil (todos os seus arquivos são agrupados juntos), reconhecimento de sintaxe, compilação (se disponível) e o auto completar.

As IDEs estão constantemente ficando mais sofisticadas e os plugins permitem várias outras funcionalidades serem incorporadas, como SVN.

A minha IDE favorita é o Visual Studio. Existem outros bons programas como o NetBeans e Ecplipse, mas por algum motivo eu tenho uma opinião parcial a favor do Visual Studio.

Teste de Unidade e Mocking

Estes dois itens andam de mãos dadas. Nenhuma aplicação está completa sem um teste bem feito. Existem várias pessoas em ambos os lados da cerca quando o assunto é teste. Eu sei, eu fui sético muito tempo. Apenas me sentia estranho perder tempo escrevendo código que iria testar o código que eu mesmo estava escrevendo. Finalmente eu decidi dar o braço a torcer e isto mudou a forma com que eu programava. Quando você está focando em como testar o seu código você simplesmente escreve um código mais claro e é legal saber rapidamente se o que você mudou estraga alguma coisa.

Mapeamento Objeto-Relacional (ORM)

Se você alguma vez já usou um ORM saberá que ele pode lhe poupar muito tempo. Uma das resistencias que tive antes de mudar para um ORM foi a performance. Eu queria saber se usando um ORM a minha aplicação seria mais lenta, mas eu estava fazendo a pergunta errada. Eu deveria estar perguntando se a pequena perda de performance pagaria o grande tempo poupado. A resposta para isto definitivamente é SIM! Raramente em uma aplicação o ORM será a fonte da má performance e se for, ele poderá ser refatorado para melhorar ou você poderá usar códigos SQL se for necessário.

Tudo se resume em não se preocupar em performance antes de realmente existir. Sim é importante manter a performance em mente, mas usando um ORM não deverá ser a causa da sua preocupação.

MVC Framework

o MVC ficou bastante popular em parte graças ao Rails e é revolução para os desenvolvedores web. A chave para a sua popularidade é que ele separa os diferentes conceitos da sua aplicação em partes separadas. Esta separação permite facilitar o teste, melhorar o design e faz a manutenção da sua aplicação ser mais fácil.

Biblioteca JavaScript

Parece que existe uma biblioteca JavaScript para qualquer coisa hoje em dia. Eu me lembro que a não muito tempo não existia tantas e o uso do JavaScript não tinha explodido. Uma biblioteca JavaScript é importante para a sua produtividade. A biblioteca não deve compensar a falta de conhecimento em JavaScript, você deve ter um conhecimento sólido, mas deve ter um bom compreendimento dela. A biblioteca irá tomar conta da compatibilidade entre navegadores e as operações de nível mais baixo, deixando você ter foco no que precisa ser feito.

ASP.Net
IDE: Visual Studio 2008 Express
Teste de Unidade: NUnit
Mocking: Rhino Mocks
ORM: NHibernate
MVC: ASP.NET MVC
JavaScript: jQuery

Java
IDE: NetBeans
Teste de Unidade: JUnit
Mocking: EasyMock
ORM: Hibernate
MVC: Struts
JavaScript: jQuery

PHP
IDE: PHPEclipse
Teste de Unidade: PHPUnit
Mocking: PHPMock
ORM: Propel
MVC: Symfony
JavaScript: jQuery

Python
IDE: PyDev
Teste de Unidade: PyUnit
Mocking: PythonMock
ORM: SQLObject
MVC: Django
JavaScript: jQuery

Ruby
IDE: RadRails
Teste de Unidade: Test::Unit
Mocking: Mocha
ORM: Sequel
MVC: Rails
JavaScript: jQuery

quarta-feira, 25 de março de 2009

Criando um Formulário em Ajax de Login com jQuery

Artigo original escrito por Justin

Neste artigo eu quero mostrar como usar o jQuery para crirar uma tela de login com AJAX. Eu vou utilizar uma aplicação ASP.NET MVC para esta demonstração. Vou estar modificando a pequena aplicação padrão que é criada quando abrimos uma nova aplicação MVC. Então vamos em frente e crie uma aplicação MVC. Eu vou explicar o passo a passo, então quando este artigo estiver pronto, você terá uma aplicação em funcionamento.

create-mvc-app

Passo 1

Abra o LogOnUserControl.ascx. Ele está em /Views/Shared/. O que queremos é modificar o link para incluir um atributo onclick que irá disparar o a função login() e associar um id ao link. O código deve se parecer com este:

   1: <%= Html.ActionLink("Log On", "LogOn", "Account", null,


   2: new { onclick = "return login();", id = "login_link" })%>


Passo 2

Abra a página Site.Master, também localizada em /Views/Shared/, inclua os links para o stylesheet, o jQuery e o JavaScript na ssão head do documento.


   1: <link type="text/css" rel="stylesheet" href="../../Content/login.css" />


   2: <script type="text/javascript" src="../../Scripts/jquery-1.2.6.min.js"></script>


   3: <script type="text/javascript" src="../../Scripts/login.js"></script>


Vamos em frente e criar um arquivo chamado login.css em /Content/ e um login.js em /Scripts/. Deixe eles vazios por enquanto.

Passo 3

Ainda na Site.Master, insira o seguinte código no final da página, logo antes de fechar a tag body. Este é o nosso formulário de login que iremos usar. O código contem uma div com o id lightbox que irá cobrir a tela para causar a impressão de que nosso login é modal. O lightbox criará um fundo preto transparente.

Adicionalmente aos elementos input do formulário existe também uma div chamada message que servirá como uma área para as mensagens de retorno ao usuário.

<div id="lightbox"></div>
<div id="login_outer_container">
<div id="login_form">
<div id="message"></div>
<fieldset>
<legend>Login Information</legend>
<p>
<label for="username">Username:</label>
<%
   = Html.TextBox("username")

%>

<%


   = Html.ValidationMessage("username")

%>

</p>

<p>

<label for=”password”>Password:</label>

<%


   = Html.Password("password")

%>

<%


   = Html.ValidationMessage("password")

%>

</p>

<p>

<%


   = Html.CheckBox("rememberMe")

%> <label class=”inline” for=”rememberMe”>Remember me?</label>

</p>

<p>

<input type=”button” value=”Log On” onclick=”submitForm();” />

<input type=”button” value=”Cancel” onclick=”cancelLogin();” />

</p>

</fieldset>

</div>

</div>


Passo 4


Insira o seguinte código ao login.css. Este será o estilo para os elementos do nosso formulário.


   1: #lightbox {


   2: position: absolute;


   3: top: 0;


   4: left: 0;


   5: width: 100%;


   6: background: black;


   7: filter: alpha(opacity=60);


   8: opacity: 0.6;


   9: display: none;


  10: }


  11: 


  12: #login_outer_container {


  13: position: absolute;


  14: top: 50%;


  15: left: 50%;


  16: }


  17: 


  18: #login_form {


  19: position: relative;


  20: top: -125px;


  21: left: -200px;


  22: width: 400px;


  23: height: 250px;


  24: display: none;


  25: background: white;


  26: padding: 10px;


  27: border: 1px solid #424242;


  28: }


  29: #message {


  30: display: none;


  31: border: 1px solid #b8b8b8;


  32: background: #f6f3f6;


  33: padding: 5px;


  34: color: Red;


  35: }


  36: 


Passo 5

Agora é onde a mágica realmente acontece. Vamos inserir código ao login.js. Eu vou explicar lentamente o que cada função está fazendo e porque isso interessa para a nossa aplicação.

A primeira função que vamos criar é a login() que mencionamos mais ceso. Nesta função nós vamos pegar o elemento lightbox e associar a ele algumas propriedados de estilo. Note que nós estamos atribuindo um atributo filter da mesma forma que fizemos no login.css. Por algum motivo o IE perde este atributo e temos que colocar novamente. Nós também estamos dizendo ao lightbox para aparecer lentamente.

Depois nós pegamos o elemento principal do form e mandamos também aparece lentamente.

No final, nós retornamos false para prevenir que o link nos mande para o seu href. Nós não queremos que a página recarregue.


   1: function login() {


   2: $('#lightbox')


   3: .css({


   4: 'height': $(document).height(),


   5: //reset opacity because IE loses it on open 


   6: 'filter': 'alpha(opacity=60)'


   7: })


   8: .fadeIn('slow');


   9: $('#login_form').fadeIn('slow');


  10: return false;


  11: }


Agora quando um usuário clica no link [ Log On ] um impressionante forumlário de login irá aparecer bem no centro da tela.

Note como nós definimos a altura do lightbox para a altura atual do documento. Se o usuário redimencionar a janela do navegador isso irá fazer com que o lightbox fique muito grande e aparecerá barras de rolagem ou com que fique muito pequeno também, tudo dependendo de como a tela será redimencionada. Para corrigir este problema nós vamos criar uma função que irá definir a altura do lightbox para a altura atual do documento e definir um evento que irá disparar nossa função sempre que a janela seja redimencionada.


   1: function adjustLightbox() {


   2: $('#lightbox').css({ 'height': $(document).height() });


   3: };


   4: 


   5: var resizeTimer = null;


   6: $(window).bind('resize', function() {


   7: if (resizeTimer) clearTimeout(resizeTimer);


   8: resizeTimer = setTimeout(adjustLightbox, 100);


   9: });


  10: 


Quando nós criamos o código do nosso formulário de login, adicionamos um botão que chamava a função cancelLogin() no evento onclick. Se o usuário clicar neste botão nós queremos cancelar o login, limpar o formulário e voltar para a tela principal. Vamos criar esta função.

Primeiro esta função irá dizer ao lightbox e ao formulário principal para lentamente desaparacer e voltar a tela principal.

Depois nós limpamos os valores de todos os elementos input que não são botões e nos certificamos de que o checkbox remember me não está marcado.

Ao final, nós limpamos o elemento de mensagem e escondemos ele também.


   1: function cancelLogin() {


   2: $('#lightbox').fadeOut('slow');


   3: $('#login_form').fadeOut('slow');


   4: $('#login_form input[type!=button]').val('');


   5: $('#login_form input[type=checkbox]').each(function(i) {


   6: this.checked = false;


   7: });


   8: $('#message').html('').css({ 'display' : 'none' });


   9: }


Isto nos leva a nossa última função que irá submeter o formulário quando o usuário clicar em submit. Primeiro criamos a função submitForm. Esta função está associada ao evento onclick do botão submit em nosso HTML.


   1: function submitForm() {


   2: 


   3: }


   4: 


A primeira coisa que queremos fazer é pegar os valores do formulário, username, password e remember me.


   1: var username = $('#username').value;


   2: var password = $('#password').value;


   3: var rememberMe = $('#rememberMe').checked ? 'true' : 'false';



Neste ponto você pode fazer qualquer tipo de validação nestes valores. Eu não vou incluir nenhuma validação nesta demonstração.

Agora iremos criar uma string com os dados dos três valores.


   1: var dataString = 'username=' + username + '&password=' + password + '&rememberMe='


   2:  + rememberMe;


Finalmente nós iremos configurar a chamada AJAX ao servidor para autenticar o usuário. Nós usaremos a string com os dados que acabamos de criar para passar ao nosso request. Nós temos que configurar também as chamadas de retorno em caso de sucesso ou falha.

Se a chamada foi bem sucedida, chamaremos a função cancelLogin() para fechar o formulário e mudar o link Log On para mostrar Log Off.

Se a chamada falhar, mostraremos uma mensagem de erro ao usuário.


   1: $.ajax({


   2: type: 'POST',


   3: url: '/Account/LogOn',


   4: data: dataString,


   5: success: function() {


   6: cancelLogin();


   7: $('#login_link').html('Log Off').href = '/Account/LogOff';


   8: },


   9: error: function() {


  10: $('#message').html('Failed to login')


  11: .css({ 'display': 'block' });


  12: }


  13: });


Com isso nós terminamos a aplicação. Você deve ter agora um formulário de login funcional.

O que vou achar neste blog?

O objetivo deste blog é reunir artigos que acho interessante e podem ser úteis para mim no futuro.

Então o que vai existir aqui é muito desenvolvimento Web em ASP.NET, AJAX e JavaScript principalmente. Também gosto muito de arquitetura DDD.

Além de ser um blog para reunir o que tem de interessante nesses assuntos, também estou fazendo a tradução deles, pois quase não existem blogs de tecnologia em lingua portuguesa.