Como iniciar com Scrum - Bate papo com um futuro Scrum Master
O que todos deveriam saber sobre Mysql
Nestes tempos de desenvolvimento com frameworks que tentam (e conseguem) facilitar muito nossa vida abstraindo detalhes de baixo nível, muitas vezes deixamos de nos preocupar com o que se passa lá por baixo.
Grails e Cloud: desenvolvimento, deploy, execução e monitoramento. Ciclo completo com Grails na Nuvem.
No início havia muitas dúvidas se o Grails iria ser útil para aplicações grandes, ou de grande porte. Mas peraí, o que é uma aplicação grande? eBay é gigante. Se considerarmos uma medida, aí acho que podemos definir grande. Page-views por mês, por exemplo, pode ser uma medida, já que é fácil de saber, de monitorar, etc.
Um eBay tem algo em torno de 15 bilhões de page-views por mês. A globo.com tem uns 2 bilhões de page-views/mês. Um Peladeiro.com.br tem 1,2 milhão de page-views/mês. O Peladeiro é pequeno, Globo.com é grande, eBay é gigante. Pelo menos na minha opinião, sem muito exercício científico.
Além da medida de grande número de acessos, há também: grande volume de dados, necessidade de alta disponibilidade e redundância, escalabilidade, hot swap, cluster failover, etc, etc....
Aí voltamos a pergunta original: o Grails é bom para isso? Dá pra confiar que uma aplicação grails serve para uma demanda de uma aplicação de grande porte?
Enviando emails formatados com Html e CSS - será que vai certinho?
Muito bom esta tabela que mostra o que cada cliente de email consegue mostrar corretamente em termos de CSS nos emails Html que vc envia.
http://www.campaignmonitor.com/css/
Ou seja, não adianta referenciar um arquivo CSS na tag link lá no header, pois nem todos os clientes levam isso em consideração. E nem tag style no header, e nem..... olhe o link acima.
Abcs
Felipe
Serviços do Grails, Transações e Rollback automático
Comprei o livro recente que saiu do Glen Smith, o Grails in Action. E, claro, comecei a ler. Ainda não terminei. Mas já valeu a compra e a dedicação de ler só pelo fato que eu descobri e não sabia:
Manubia.com.br - Controle Financeiro com Grails e, agora, com jQuery
É pessoal....
- jQuery tem um mundo plugins que resolvem diversos problemas que a gente precisa ficar catando pela web quando usamos Prototype + Scriptaculous.
- o jQuery tem um projeto inteiro dedicado a interface gráfica: jQuery UI
- formatação de campos de um formulário (formatar valor numérico com pontos e vírgulas, de forma internacionalizada): Masked Input Plugin
- Calendário tipo Date Picker para campos de datas: jQuery UI DatePicker
- Plugin para manipulação de comboboxes (select boxes).
- No final das contas, a gente escreve menos código JavaScript do que com Prototype. Parece que fica mais limpo o código.
- Tem um site dedicado aos plugins
- De acordo com alguns benchmarks (um aqui, outro aqui), o jQuery tem uma performance melhor do que o Prototype (ou seja, os usuários é que ganham).
- Eu tenho tudo que preciso em uma biblioteca só, não preciso usar parte de uma, parte de outra, etc... (pelo menos por enquanto, vamos ver até quando).
Filtro do Grails para impor SSL (https) a determinadas páginas
Olá pessoal,
/**
* Created by IntelliJ IDEA.
* User: danielhonig
* Date: Jan 23, 2009
* Time: 4:27:10 PM
* To change this template use File | Settings | File Templates.
*/
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class SSLFilters {
// Set these to your HTTP/HTTPS ports
def defaultPortHTTP = 80
def defaultPortHTTPS = 443
static def SSLRequiredMap = ConfigurationHolder.config.SSLRequiredMap
def shouldUseSSL(controllerName, actionName) {
// User actions use SSL
if (SSLRequiredMap[controllerName]!=null) {
//If * then all actions are secured
if (SSLRequiredMap[controllerName][0] == '*')
return true
//else look for specific action
if (SSLRequiredMap[controllerName].contains(actionName))
return true
}
false
}
def filters = {
sslFilter(controller: "*", action: "*"){
before = {
def controller = controllerName
def action = actionName
log.debug("SSLFilter: ${params?.controller}.${params?.action}")
def url = null
// SSL off by default
def useSSL = shouldUseSSL(controllerName,actionName)
log.debug("${controller}.${action}, useSSL:$useSSL")
// Get redirected url
url = getRedirectURL(request, params, useSSL);
// If redirect url returned, redirect to it
if (url) {
redirect(url: url)
return false;
}
return true;
}
}
}
def getRedirectURL = {request, params, ssl ->
log.debug("getRedirectURL: $ssl")
// Are we there already?
if (request.isSecure() == ssl)
return null;
def protocol
def port
// Otherwise we need to flip
if (ssl) {
protocol = 'https'
// If using the standard ports, don't include them on the URL
port = defaultPortHTTPS
if (port == "443")
port = ""
else
port = ":${port}"
}
else {
protocol = 'http'
// If using the standard ports, don't include them on the URL
port = defaultPortHTTP
if (port == "80")
port = ""
else
port = ":${port}"
}
log.debug("Flip protocol to $protocol")
def url = request.forwardURI
def server = request.serverName
def args = paramsAsUrl(params)
url = "$protocol://$server$port$url$args"
log.debug("getRedirectURL - redirect to $url")
return url;
}
def paramsAsUrl = {params ->
int ii = 0
String args = ""
params.each
{k, v ->
if (['controller', 'action', 'id'].find {k == it})
return;
if (ii)
args += "&"
else
args += "?"
args += "$k=$v"
ii++
}
return args
}
}
Controle Financeiro e Planejamento Financeiro com Grails e Prototype
Mês passado eu e um grande amigo, e meu sócio neste projeto, lançamos um site para controle financeiro pessoal: www.manubia.com.br
Instalador para Mac de uma aplicação Java
Excelente artigo de como criar um installer para Mac de uma aplicação Java. Como esse artigo me salvou legal, copio ele aqui, só pra não perder.
How to Create a Mac OS X Installer for a Java Application
(Updated for Mac OS X 10.5 — Leopard)
With some simple steps you can turn your Java Swing program (.jar) into a proper Mac OS X application with a native installer. The instructions below step you through the process from scratch with a sample program called
ICONS
↓
1) Install Xcode
Before continuing to the next step, it's a good idea to perform a "Software Update..." to make sure your OS files are current.
2) Launch Unix Terminal
3) Make Project Folder
cd ItsShowtime
4) Write Some Java Code
ShowTime.java
import java.util.Calendar; import javax.swing.*; public class ShowTime { public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle("It's Showtime!"); f.getContentPane().add(new JLabel( Calendar.getInstance().getTime().toString())); f.pack(); f.setVisible(true); } }Use
5) Compile Java Program
ls -la
6) Make Executable JAR
MainClass.txt
Main-Class: ShowTimeExit Pico and use the following "jar" command to create the "ShowTime.jar" file:
ls -la
While the manual commands for steps #5 and #6 above work fine, you can automate them using Ant with this build.xml file.
7) Create Application Icon
Download and save (
Then move the file into the "ItsShowtime" folder with the following command:
Steps:
- Use "Finder" to navigate into the "Developer:Applications:Utilities" folder and double-click "Icon Composer".
- Go back to "Finder" and navigate to your "ItsShowtime" folder (which is in your home folder).
- Drag the "ShowTime.png" image file into the "128" box on the "Icon Composer" screen. When prompted about sizes, choose "Copy to all smaller sizes" and then click the "Import" button.
- Go into the "File" menu and select the "Save" option. Then deselect the "Hide extension" option and save as "ShowTime.icns".
- Quit "IconComposer".
8) Bundle the JAR
Steps:
- For the "Main Class:", use the "Choose..." button and go to and choose "ShowTime.jar".
- Check the "Use Macintosh Menu Bar" option.
- Use the "Choose Icon..." button to choose the "SnapBackup.icns" file (you'll need to navigate to the very top-level folder and then into the "Users" folder and your home folder to eventually find the "ItsShowtime" folder).
- Click the "Properties" tab and enter "1.0" into the "Version:" field.
- Also enter "1.0" into the "Get-Info String:" filed.
- Click the "Create Application..." button.
- Navigate into the "ItsShowtime" folder.
- In the "File:" field, enter "Show Time".
- Click the "Create" button.
- Quit "Jar Bundler".
9) Create Mac Installer
Steps:
- In the "Organization:" field on the "Install Properties" window, enter "com.centerkey". Then click "OK".
- In the "Title:" field enter "Show Time".
- Go to the "Project" menu and select "Add Contents...". Navigate to "ItsShowtime" folder and select "Show Time".
- Click on the "Contents" tab. Check the "Include root in package" option and click the "Apply Recommendations" button.
- Now click the "Build" (hammer) button. In the "Save As:" field, enter "ShowTimeInstaller.pkg". Click the "Save" button and then the "Return" button.
- Go to the "File" menu and select "Save". In the "Save As:" field, enter "ShowTime.pmdoc" and then click "Save".
- Quit "PackageMaker".
10) Put Installer on a Web Page
Logging com Grails 1.1
Hoje fiquei tentando entender a configuração do Logging no grails 1.1...pois mudou um pouco.
Tem um bom exemplo aqui, que eu reproduzo abaixo.
log4j = {
appenders {
console name:'console', threshold:Level.ERROR,
layout:pattern(conversionPattern: '%p %d{ISO8601} %c{4} %m%n')
rollingFile name:"rollingFileTrace", threshold:Level।TRACE, maxFileSize:1048576,
file:logFile+'Trace।log', layout:pattern(conversionPattern: '%p %d{ISO8601} %c{5} %m%n')
rollingFile name:"rollingFileDebug", threshold:Level।DEBUG, maxFileSize:1048576,
file:logFile+'Debug.log', layout:pattern(conversionPattern: '%p %d{ISO8601} %c{5} %m%n')
rollingFile name:"rollingFileError", threshold:Level.ERROR, maxFileSize:1048576,
file:logFile+'Error.log', layout:pattern(conversionPattern: '%p %d{ISO8601} %c{5} %m%n')
}
error console, rollingFileDebug, rollingFileError, rollingFileTrace:
'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails."web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails."web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core / classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
'org.springframework'
debug rollingFileDebug, rollingFileTrace:'org.hibernate',
'com.britetab',
'BootStrap',
'org.apache.ddlutils'
trace rollingFileTrace:'org.hibernate.SQL',
'org.hibernate.type',
'flex.messaging.services'
warn console,rollingFileDebug,rollingFileTrace:'org.mortbay.log',
'org.hibernate.tool.hbm2ddl'
root {
trace 'rollingFileTrace'
debug 'rollingFileDebug','rollingFileTrace'
error 'console','rollingFileError','rollingFileDebug','rollingFileTrace'
additivity = true
}
}
Infraestrutura e arquitetura do Digg
Muito interessante a apresentação de Joe Stump, que é o arquiteto líder do Digg.
- 35.000.000 milhões de Uniques por mês
- 3.500.000 de usuários
- 15.000 requests / segundo
- Centenas de servidores
Web Sites de Alta Performance, Parte 3: Faça menos Requests HTTP
- Uso de Image Maps:
Image Map permite que se tenha apenas uma imagem com múltiplos links nesta imagem. Ou seja, não é necessário, ao criar uma toolbar por exemplo, ter várias imagens, uma para cada link. É possível ter apenas uma imagem maior, cujas partes desta imagem possuem diferentes links. Isso é feito através do uso de Image Map. - Combinar arquivos em um único:
Ao invés de fazer 4 requisições para 4 diferentes arquivos de JavaScript (JS), você pode combinar os 4 arquivos em um único, e fazer apenas uma requição Http. Em sendo um engenheiro de software, isso me parece estranho, pois vai contra a modularização. Mas, se pudermos ter esta modularização em tempo de desenvolvimento, e e combinar estes arquivos em tempo de deploy, teremos assim o melhor dos dois mundos.
A mesma coisa vale para arquivos CSS: é possível combinar os diferentes arquivos CSS em um único. Combinar arquivos pode ser desafiador quando os scripts e arquivos css variam de página para página, mas tentar fazer esta junção em um único arquivo pode ser vantajoso. Se você conseguir fazer esta combinação automaticamente como parte do seu processo de Deploy, isso pode ficar transparente para o desenvolvedor, e assim conseguir fazer menos Requests HTTP, melhorando a performance final da sua página.
Numa situação ideal, sua página poderia ter apenas um arquivo javascript e um arquivo CSS.
Em algumas situações em que a página faz uso de diferentes bibliotecas javascript e ainda possui scripts próprios, a combinação pode dar ganhos em torno de 40% no carregamento da página. - CSS Sprites
CSS sprites é uma técnica usada para se criar apenas um arquivo de imagem que conbina várias imagens que serão usadas independentes umas das outras através de estilos CSS. Ou seja, existe apenas um arquivo de imagem que é resultado da combinação de algumas imagens a serem usadas independentemente. Para conseguir usar cada parte da grande imagem de forma a mostrar apenas a parte que interessa de cada vez, usa-se estilos CSS. Por exemplo:
Desta forma, podemos ter uma imagem grande de, por exemplo, 200px por 200px, mas estamos apresentando apenas uma parte dela, de 26 por 26 px.
O uso de CSS Sprites, combinado com o uso de Cache de imagens, é uma excelente forma de usar múltiplos ícones em uma página, porém fazendo apenas um Request para carregar a única imagem grande. Você pode ver mais a respeito deste assunto no artigo de Dave Shea chamado "CSS Sprites: Image Slicing's Kiss of Death".
Web Sites de Alta Performance, Parte 2: Visão Geral de HTTP
Web Sites de Alta Performance, Parte 1: A Regra do 80-20 da uma Página Web
Este post é o primeiro de uma série que irei denominar de Web Sites de Alta Performance. Esta série é inspirada e baseada no livro High Performance Web Sites de Steve Souders, na posição de Chief Performance Yahoo!. O livro é fino, leve e bastante objetivo. Esta série tem o objetivo de resumir as técnicas apontadas por Souders.
É possível ver muito claramente quais são todos os recursos carregados pelo browser para que a página final seja apresentada corretamente para o usuário: Html da página em si, imagens, arquivos CSS, arquivos Javascript. Cada recurso desse é um request feito ao servidor para que ele seja encontrado e baixado. Uma ferramenta de análise desses recursos sendo baixados é muito importante para podermos ver como nossa página está hoje e como ela estará depois de aplicadas as técnicas que serão expostas nesta série de posts do meu blog. Acho que o Firefox também deve ter algum plugin que fornece este tipo de informação.
- Request de cada componente;
- Requests que não ocorrem em paralelo (scripts não são baixados em paralelo);
- Parse de Html, CSS e Javascript;
- Renderização final
Servindo JavaScript e CSS com velocidade
Vale a leitura.