<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux / PHP / Java / Designer</title>
	<atom:link href="http://blog.scriptseguro.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.scriptseguro.com.br</link>
	<description>As melhores dicas estão aqui.</description>
	<lastBuildDate>Sat, 16 Jan 2010 01:47:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iniciando com vraptor 3</title>
		<link>http://blog.scriptseguro.com.br/iniciando-com-vraptor-3/</link>
		<comments>http://blog.scriptseguro.com.br/iniciando-com-vraptor-3/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 11:57:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=542</guid>
		<description><![CDATA[Artigo retirado do blog: http://wbotelhos.wordpress.com
Olá pessoal,
Pra quem esta acompanhando a área de Java não é novidade alguma que o VRaptor esta explodindo de sucesso e boas referências. Hoje trabalho em três projetos consideravelmente grandes na Giran utilizando-o, e posso dizer que estou super satisfeito e admirado.
Conhecendo a framework
O VRaptor é um framework MVC que trabalha [...]]]></description>
			<content:encoded><![CDATA[<p>Artigo retirado do blog: <a href="http://wbotelhos.wordpress.com" target="_blank">http://wbotelhos.wordpress.com</a></p>
<p>Olá pessoal,</p>
<p>Pra quem esta acompanhando a área de Java não é novidade alguma que o <a href="http://vraptor.caelum.com.br/" target="blank">VRaptor</a> esta explodindo de sucesso e boas referências. Hoje trabalho em três projetos consideravelmente grandes na <a href="http://giran.com.br" target="blank">Giran</a> utilizando-o, e posso dizer que estou super satisfeito e admirado.</p>
<p><strong>Conhecendo a framework</strong></p>
<p>O VRaptor é um framework <a href="http://pt.wikipedia.org/wiki/MVC" target="blank">MVC</a> que trabalha com os métodos de seus controllers de forma exposta e de maneira <strong><a href="http://pt.wikipedia.org/wiki/RESTful" target="blank">RESTFul</a></strong>, ou seja, conseguimos acessar um método público, por exemplo, através da URI: <code>/usuario/cadastrar</code> de forma fácil e intuitiva. A seguir há uma lista resumida de algumas características:</p>
<p>- <a href="http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_depend%C3%AAncia" target="blank">Injeção de Dependência</a>;<br />
- Cast automático;<br />
- Conversores;<br />
- Interceptadores;<br />
- Integração com Spring, Hibernate e JPA;<br />
- Facilidade de Testes de Unidade;<br />
- Validações;<br />
- Redirecionamentos;<br />
- URI parametrizada;<br />
- Entre outras mais...</p>
<p>E o melhor de tudo, é open source, brasileira e tem uma <a href="http://groups.google.com/group/caelum-vraptor" target="blank">lista de discussão</a> com pessoas dispostas a ajudar além de poder acompanhar o desenvolvimento da framework.</p>
<p><strong>Objetivo</strong></p>
<p>Criar um <a href="http://pt.wikipedia.org/wiki/CRUD" target="blank">CRUD</a> de Usuário utilizando a <a href="http://vraptor.caelum.com.br/download.jsp" target="blank">última versão</a> do VRaptor 3 simulando a persistência no banco.</p>
<p><strong>Configurando o projeto</strong>:</p>
<p>Depois de fazer o download do (blank project for Eclipse WTP) e descompactar o arquivo vraptor-blank-project-3.x.x.zip na sua workspace, iremos renomear os arquivos <code>classpath-example</code> e <code>project-example</code> para <code>.classpath</code> e <code>.project</code> respectivamente.</p>
<p>Se o projeto for aberto, será criado ambos os arquivos iniciados com ponto (ocultos), então terá de deletá-los e fazer o procedimento citado. No Unbuntu basta apertar (Ctrl + H) para ver os arquivos ocultos.</p>
<blockquote><p>Baixei o blank project mais recente e reparei que já estão ambos os arquivos configurados e podem ser utilizados, porém as libs ficarão quebradas, pois estão configuradas com o caminho do <code>${USER}</code> do <a href="http://twitter.com/lucascs" target="blank">lucascs</a>. Então é só <em>clicar com o botão no projeto -&gt; ir em properties -&gt; Java Build Path e na aba Libraries</em> remover as libs com um 'x' vermelho indicando referência quebrada.</p></blockquote>
<p>Agora precisaremos configurar o <code>web.xml</code> para enxergar o caminho do nosso pacote principal. No meu caso <code>com.wordpress.wbotelhos</code>, logo todos as outras pastas: Model, Controller, Dao, Repository etc.. estarão abaixo deste pacote e é ele que devemos mapear:</p>
<pre class="brush: java">

&lt;span&gt; &lt;/span&gt;br.com.caelum.vraptor.packages &lt;span&gt; &lt;/span&gt;com.wordpress.wbotelhos
</pre>
<p><strong>Criando o controller</strong></p>
<p>Criaremos o pacote <code>com.wordpress.wbotelhos.controller</code> e dentro um <code>IndexController</code>. (o blank project já contém o mesmo)</p>
<pre class="brush: java">
@Resource
public class IndexController {

@Path(&quot;/&quot;)
public void index() {
}

}
</pre>
<p>Todos os nossos controllers terão o nome NomePasta<strong>Controller</strong> e serão anotados com <code>@Resource</code> para expor seus recursos e tornar os métodos públicos acessíveis atavés da URI. No exemplo acima o caminho "<code>/</code>" irá executar o método <code>index</code>, tendo como regra o redirecionamento para uma página de mesmo nome do método, contido dentro de uma pasta de mesmo nome do controller <code>WEB-INF/jsp/<strong>index</strong>/<strong>index</strong>.jsp.</code> Todas as nossas páginas ficarão dentro de <code>WEB-INF/jsp/pasta</code>, onde pasta é o nome da entidade na qual queremos trabalhar.</p>
<p><strong>@Path</strong></p>
<p>O VRaptor é uma framework Action Based, logo os métodos são acessados via ações da URI, e estas devem ser únicas.<br />
A anotação Path indica a URI a ser acessada para que possamos executar um método. Por convenção o utilizado é o seguinte: <code>@Path("nomeEntidade/nomeMetodo")</code>:</p>
<pre class="brush: java">
@Path(&quot;/usuario/listarTodos&quot;)
public void listar() {
// O método não tem que ter o mesmo nome.
}
</pre>
<p><strong>Methods</strong></p>
<p>O acesso a um método é feito através das operações HTTP mais comuns como o <code>GET</code>, <code>POST</code>, <code>PUT</code> e <code>DELETE</code> que normalmente são combinadas a um CRUD.</p>
<p>Podemos fazer um esqueminha do tipo:<br />
<strong>GET</strong> - Listar dados e acessar links;<br />
<strong>POST</strong> - Salvar uma entidade;<br />
<strong>PUT</strong> - Atualizar uma entidade; e<br />
<strong>DELETE</strong> - Excluir uma entidade.</p>
<p>Mesmo que um método tenha o mesmo Path ele pode se diferenciar através do método executado:</p>
<pre class="brush: java">
@Post
@Path(&quot;/usuario&quot;)
public void salvar() {
}

@Put
@Path(&quot;/usuario&quot;)
public void editar() {
}
</pre>
<p>Por padrão o acesso de um método é composto por <code>nomeController/nomeMetodo</code> via <code>@Get</code>, não sendo necessário neste caso anotar, porém recomendo sempre explicitar, evitando confudir o método de acesso assim como o caminho.</p>
<p><strong>Criando a página inicial</strong></p>
<p>Agora criaremos uma página chamada <code>index.jsp</code> dentro de uma pasta chamada <code>index</code> contendo um menu para a navegação:</p>
<pre class="brush: java">
...
&lt; %@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&gt;
...
&lt;a href=&quot;&lt;c:url value=&#039;/usuario/novo&#039;&gt;&lt;/a&gt;&quot;&gt;Novo usuário
...
</pre>
<p>Utilize sempre a tag URL da biblioteca core para que as URLs sejam montadas corretamente.</p>
<p>Pronto! Podemos testar nossa aplicação. Adicione o projeto ao servidor e verá que o nome estará <strong>vraptor-blank-project</strong>. Esse é o nome default e é através dele que iremos acessár a aplicação: <code>http://localhost:8080/vraptor-blank-project/</code>. Mas queremos usar outro nome, então irei mostrar como trocar, pois renomear a pasta do projeto apenas não irá resolver.</p>
<p><strong>Trocando o nome de deploy e o context-root da aplicação</strong>:</p>
<p>- Visualize os arquivos ocultos e dentro da pasta do projeto conterá uma outra chamada <code>.settings</code>;<br />
- Abra o arquivo <code>org.eclipse.wst.common.component</code> em um editor de texto;<br />
- Altere a tag "<code>deploy-name</code>" para alterar o nome visualmente ao escolher a aplicação para deploy;<br />
- Altere a propriedade "<code>context-root</code>" para alterar o contexto de acesso da aplicação;<br />
- Faça o deploy e verá as alterações, podendo escolher o nome que achar melhor.</p>
<p><strong>Criando a página de cadastro do usuario</strong> (novo.jsp)</p>
<p>Criaremos 1 Controller + 1 Dao + 1 Pasta contendo as páginas.</p>
<pre class="brush: java">
...

&lt;form action=&quot;&lt;c:url value=&#039;/usuario&#039;/&gt;&quot; method=&quot;post&quot;&gt;
Nome: &lt;input name=&quot;usuario.nome&quot; type=&quot;text&quot; value=&quot;${usuario.nome}&quot; /&gt;

Senha: &lt;input name=&quot;usuario.senha&quot; type=&quot;text&quot; value=&quot;${usuario.senha}&quot; /&gt;

E-mail: &lt;input name=&quot;usuario.email&quot; type=&quot;text&quot; value=&quot;${usuario.email}&quot; /&gt;

&lt;input type=&quot;submit&quot; value=&quot;Salvar&quot; /&gt;
...
</pre>
<p>A action do formulário acessa <code>/usuario</code> via <code>POST</code>.<br />
Através do parâmetro <code>name</code>, setamos os valores nos atributos do objeto <code>usuario</code>.<br />
Através do parâmetro <code>value</code>, recuperamos o objeto <code>usuario</code> e utilizamos seus atributos para popular os campos.</p>
<p><strong>Criando o modelo do usuário</strong></p>
<pre class="brush: java">
private Integer id;
private String nome;
private String senha;
private String email;

// Getters e Setters.
</pre>
<p>Lembre-se que atributo <code>name="usuario.nome"</code> acessa de fato o objeto <code>Usuario</code> e tanto o nome quanto os atributos do objeto devem existir.</p>
<p><strong>Criando o controller do usuário</strong></p>
<p>De acordo com a ação do nosso formulário, criaremos um método acessado pela URI <code>/usuario</code> via <code>POST</code>.</p>
<pre class="brush: java">
@Post
@Path(&quot;/usuario&quot;)
public void salvar() {
}
</pre>
<p>Ainda falta o objeto no qual seto os valores dos campos do formulário. Diferente do <code>useBean</code> do JSP os valores são setados em um objeto presente no próprio controller, falicitando assim o uso do mesmo. Este objeto assim como qualquer que formos trabalhar devem estar presentes no construtor do método invocado, podendo ser mais do que um:</p>
<pre class="brush: java">
@Post
@Path(&quot;/usuario&quot;)
public void salvar(Usuario usuario) {
}
</pre>
<p>Com o objeto alimentado a partir do formulário podemos persistí-lo.</p>
<p><strong>Trabalhando com redirecionamento</strong>:</p>
<p>Ao tentarmos salvar um usuário teremos um erro 404, pois seremos redirecionados para uma página com o mesmo nome do método: <code>WEB-INF/jsp/usuario/salvar.jsp</code>, mas como queremos manter o nome do método, porém sermos redirecionados para a página <code>listagem.jsp</code> teremos de fazer o redirecionamento ao final do método.</p>
<p>Temos dois tipos de redirecionamentos:</p>
<p><strong>Results.logic()</strong></p>
<p>Redirecionamento para um método qualquer dos controllers. Devemos passar a classe do controller que iremos utilizar:</p>
<pre class="brush: java">
result.use(Results.logic()).redirectTo(UsuarioController.class).listagem();
</pre>
<p><code>UsuarioController.class</code> pode ser substituido por <code>getClass()</code> indicado a própria classe, ou qualquer outro <code>Controller.class</code>.</p>
<p><strong>Results.page()</strong></p>
<p>Redirecionamento para uma página. Indicamos o caminho da página na qual queremos ser redirecionados (redirect) ou encaminhados (forward):</p>
<pre class="brush: java">
result.use(Results.page()).forward(&quot;WEB-INF/jsp/listagem.jsp&quot;);
</pre>
<p>Para maiores informações sobre a diferença dos dois tipos leia <a href="http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/" target="blank">este artigo</a> do <a href="http://twitter.com/rponte" target="blank">Rafael Ponte</a>. (:</p>
<p>Então teríamos nosso controller assim:</p>
<pre class="brush: java">
@Resource
public class UsuarioController {

private Result result;

@Get
@Path(&quot;/usuario/novo&quot;)
public void novo() {
}

@Post
@Path(&quot;/usuario&quot;)
public void salvar(Usuario usuario) {
result.use(Results.page()).forward(&quot;WEB-INF/jsp/usuario/listagem.jsp&quot;);
}
}
</pre>
<p>Colocamos o caminho das páginas a partir da pasta <code>WEB-INF</code>.</p>
<p><strong>Injeção de dependência</strong></p>
<p>Certamente se formos utilizar o método <code>salvar</code> seria lançado um <code>NullPointerException</code>, pois o objeto <code>result</code> não esta instanciado. Uma grande facilidade que temos é a injeção de dependência na qual injetamos o objeto através do contrutor da classe e a framework trata de controlar o que é necessário para intanciá-lo.</p>
<pre class="brush: java">
public UsuarioController(Result result) {
this.result = result;
}
</pre>
<p>Então agora já temos nosso <code>result</code> instanciado. Da mesma forma se quiséssemos trabalhar com outros controllers, por exemplo, apenas injetaríamos os mesmos.</p>
<blockquote><p>Por boas práticas recomenda-se criar interfaces com as assinaturas de suas classes e na injeção passá-las em vez das classes concretas, falicitando deste modo os testes de unidades, além de ter uma interface externa de acesso para sua aplicação.</p></blockquote>
<p><strong>Criando o Dao</strong></p>
<p>Precisamos da camada de persistência e esta camada deve ser anotada como <code>@Component</code>. Componentes são instâncias de classes utilizadas pela sua aplicação para executar tarefas ou armazenar estados em diferentes formas. O Dao é um exemplo clássico.</p>
<p>Para o nosso exemplo iremos colocar a classe como escopo de sessão para que possamos manter o estado dos nossos dados. Os escopos existentes são:</p>
<p><strong>RequestScoped</strong>: estará disponível apenas durante a requisição;<br />
<strong>ApplicationScoped</strong>: será apenas um por aplicação;<br />
<strong>SessionScoped</strong>: será o mesmo durante uma http session; e<br />
<strong>PrototypeScoped</strong>: instanciado sempre que requisitado.</p>
<pre class="brush: java">
@SessionScoped
@Component
public class UsuarioDao {

private List usuarioList = new ArrayList();
private Integer id = 1;

public void salvar(Usuario usuario) {
usuarioList.add(usuario);
usuario.setId(id++);
}

}
</pre>
<p><strong>Listando os dados</strong>: (listagem.jsp)</p>
<p>Para podermos listar nossas informações salvas, devemos passar estes dados através do <code>request</code> que o VRator encapsula assim como o <code>response</code>, tornando esta tarefa mais fácil. O Result será utilizado para incluir os dados da seguinte forma:</p>
<pre class="brush: java">
result.include(&quot;usuarioList&quot;, usuarioList);
</pre>
<p>Para recuperarmos a lista do request podemos utilizar <a href="http://en.wikipedia.org/wiki/Expression_Language" target="blank">EL</a> da seguinte forma: <code>${usuarioList}</code>.</p>
<pre class="brush: java">
...
&lt;table border=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Senha&lt;/th&gt;
&lt;th&gt;E-mail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;${item.nome}&lt;/td&gt;
&lt;td&gt;${item.senha}&lt;/td&gt;
&lt;td&gt;${item.email}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
...
</pre>
<p>No caso acima nós que incluímos a lista no request, porém por padrão o retorno já é colocado no request. O nome do retorno é formado pelo tipo da lista caso tenha mais o nome "List": <code>public List listar();</code> seria capturado como <code>${usuarioList}</code> e se for apenas um objeto basta capturar o nome começando em minísculo: <code>public Usuario consultar();</code> seria capturado como <code>${usuario}</code>.</p>
<p>Vamos adicionar o método que retorna a lista no Dao:</p>
<pre class="brush: java">
public List loadAll() {
return usuarioList;
}
</pre>
<p>E também no Controller:</p>
<pre class="brush: java">
@Get
@Path(&quot;/usuario&quot;)
public List listagem() {
return usuarioDao.loadAll();
}
</pre>
<p>No método acima estou usando o default e deixando ele colocar o <code>usuarioList</code> no <code>resquest</code> assim como fazer o redirecionamento para <code>listagem.jsp</code>.</p>
<p><strong>Criando a lógica para editar</strong></p>
<p>Vamos adicionar uma coluna na tabela da listagem de dados para conter um link para a edição:</p>
<pre class="brush: java">
...

&lt;form action=&quot;&lt;c:url value=&#039;/usuario&#039;/&gt;&quot; method=&quot;post&quot;&gt;
&lt;input name=&quot;_method&quot; type=&quot;hidden&quot; value=&quot;PUT&quot; /&gt;
&lt;input name=&quot;usuario.id&quot; type=&quot;hidden&quot; value=&quot;${item.id}&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Editar&quot; /&gt;
...
</pre>
<p>Como nosso método editar é acessado via <code>PUT</code> teremos de fazer o formulário utilizá-lo, já que só há o suporte como <code>GET</code> e <code>POST</code> hoje em dia. Para isso criamos um campo <code>hidden</code> (que não aparece na tela) sobrescrevendo o atributo <code>_method</code> com o valor <code>PUT</code>, atributo no qual indica qual método que o formulário executará. O atributo id do objeto usuario também esta escondido servindo apenas para indicar qual usuário queremos editar.</p>
<p>No nosso controller teremos o seguinte método:</p>
<pre class="brush: java">
@Put
@Path(&quot;/usuario&quot;)
public void editar(Usuario usuario) {
Usuario entity = usuarioDao.loadById(usuario);
result.use(Results.logic()).redirectTo(getClass()).novo(entity);
}
</pre>
<p>Repare que após recuperarmos o usuário que queremos editar fazemos uma chamada ao método <code>novo()</code>, pois é ele que redireciona para nosso formulário, porém preciso levar meu usuário consultado para a tela, logo passo o mesmo para o método que foi refatorado para incluir o usuário no request:</p>
<pre class="brush: java">
@Get
@Path(&quot;/usuario/novo&quot;)
public void novo(Usuario usuario) {
result.include(&quot;usuario&quot;, usuario);
}
</pre>
<p>No nosso Dao também iremos adicionar o método que consulta o usuário pelo ID:</p>
<pre class="brush: java">
public Usuario loadById(Usuario usuario) {
Usuario usuarioDelete = null;

for (Usuario item : usuarioList) {
if (item.getId() == usuario.getId()) {
usuarioDelete = item;
break;
}
}

removerItem(usuarioDelete); // *
return usuarioDelete;
}
</pre>
<blockquote><p>* <code>removerItem(usuarioDelete)</code> foi utilizado aqui apenas por não usármos um banco de dado real e o editar ser na verdade um remover e logo em seguida um salvar.</p></blockquote>
<p>Procuro o usuário com o ID passado e o guardo, logo em seguida removo ele da lista:</p>
<pre class="brush: java">
private void removerItem(Usuario usuarioDelete) {
if (usuarioList.remove(usuarioDelete)) {
id--;
}
}
</pre>
<blockquote><p>Se desistirmos de salvar o usuário lá no formulário o mesmo já terá sido removido, mas o exemplo é simbólico.</p></blockquote>
<p><strong>Criando a lógica de exclusão</strong></p>
<p>O método para deletar segui o mesmo raciocínio do editar, só não tendo que retornar os dados para a tela através do <code>request</code>.<br />
Vamos adicionar uma coluna na tabela da listagem de dados para conter um link para a remoção:</p>
<pre class="brush: java">

&lt;form action=&quot;&lt;c:url value=&quot;/usuario&quot;/&gt;&quot; method=&quot;post&quot;&gt;
&lt;input name=&quot;_method&quot; type=&quot;hidden&quot; value=&quot;DELETE/&gt;&lt;br /&gt;         &lt;input type=&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Excluir&quot; /&gt;
</pre>
<p>Vamos criar um método anotado com <code>@Delete</code> no controller:</p>
<pre class="brush: java">
@Delete
@Path(&quot;/usuario&quot;)
public void remover(Usuario usuario) {
usuarioDao.remover(usuario);
result.use(Results.logic()).redirectTo(getClass()).listagem();
}
</pre>
<p>E então repassaremos para o nosso Dao remover o objeto:</p>
<pre class="brush: java">
public void remover(Usuario usuario) {
Usuario usuarioDelete = null;

for (Usuario item : usuarioList) {
if (item.getId() == usuario.getId()) {
usuarioDelete = item;
break;
}
}

removerItem(usuarioDelete);
}
</pre>
<p>No método acima busco pelo ID, ao achar guardo o objeto e o removo da lista. Em uma situação real removeríamos o objeto do banco de dados de acordo com o ID passado.</p>
<p><strong>Conclusão</strong></p>
<p>De forma fácil conseguimos criar um CRUD sem nos preocupar com requisições, conversões de dados e redirecionamentos. Podemos fazer isso e muito mais com o VRaptor. E se esta preocupado com a parte visual é só da uma olhada no <a href="http://jqueryui.com/" target="blank">jQuery UI</a>.</p>
<p>Para quem quiser se aprofundar mais no VRaptor, acompanhe a <a href="http://groups.google.com/group/caelum-vraptor" target="blank">lista de discussão</a>, de uma olhada na <a href="http://vraptor.caelum.com.br/documentacao" target="blank">documentação oficial</a> disponível em português ou continue acompanhando os artigos aqui no <a href="http://wbotelhos.wordpress.com" target="blank">Blog</a>.</p>
<p><strong>Link do projeto</strong>:</p>
<p><a href="http://github.com/washingtonbotelho/iniciando-com-vraptor-3" target="blank">http://github.com/washingtonbotelho/iniciando-com-vraptor-3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/iniciando-com-vraptor-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tags de selecao com jsf</title>
		<link>http://blog.scriptseguro.com.br/tags-de-selecao-com-jsf/</link>
		<comments>http://blog.scriptseguro.com.br/tags-de-selecao-com-jsf/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 11:53:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=540</guid>
		<description><![CDATA[Artigo retirado do blog: http://wbotelhos.wordpress.com
Olá galera! (:
Após rascunhar vários temas, resolvir falar um pouco sobre as tags de seleção do JSF.
Para aqueles que não sabem, temos sete tags de seleção:
&#60;h:selectBooleanCheckbox/&#62;;
&#60;h:selectManyCheckbox/&#62;;
&#60;h:selectOneRadio/&#62;;
&#60;h:selectOneListbox/&#62;;
&#60;h:selectManyListbox/&#62;;
&#60;h:selectOneMenu/&#62;; e
&#60;h:selectManyMenu/&#62;.
Todas as tags de seleção começam com o nome select e se dividem em 4 (quatro) tipos: CheckBox, Radio, List e Menu. Cada um destes [...]]]></description>
			<content:encoded><![CDATA[<p>Artigo retirado do blog: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/wbotelhos.wordpress.com');" href="http://wbotelhos.wordpress.com/" target="_blank">http://wbotelhos.wordpress.com</a></p>
<p>Olá galera! (:</p>
<p>Após rascunhar vários temas, resolvir falar um pouco sobre as tags de seleção do JSF.</p>
<p>Para aqueles que não sabem, temos sete tags de seleção:<br />
<code>&lt;h:selectBooleanCheckbox/&gt;;<br />
&lt;h:selectManyCheckbox/&gt;;<br />
&lt;h:selectOneRadio/&gt;;<br />
&lt;h:selectOneListbox/&gt;;<br />
&lt;h:selectManyListbox/&gt;;<br />
&lt;h:selectOneMenu/&gt;; e<br />
&lt;h:selectManyMenu/&gt;</code>.</p>
<p>Todas as tags de seleção começam com o nome <strong>select</strong> e se dividem em 4 (quatro) tipos: <code>CheckBox</code>, <code>Radio</code>, <code>List</code> e <code>Menu</code>. Cada um destes menos o <code>Radio</code> possuem duas formas, uma de seleção única (<code>One</code>) e outra de seleção múltipla (<code>Many</code>).</p>
<p>A tag &lt;h:selectBooleanCheckbox/&gt; é a tag mais simples, no qual apresenta uma única opção de escolha que poderá ser vinculada a um atributo booleano, veja um exemplo:</p>
<p><strong>selectBooleanCheckbox</strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Ativo?:&quot;/&gt;
&lt;h :selectBooleanCheckbox value=&quot;#{bean.ativo}&quot;/&gt;
</pre>
<p>Temos uma opção, onde se pode marcar como verdadeira ou falsa, no caso, se uma pessoa esta ativa ou não. O valor estará vinculado ao atributo "ativo" contido no backing bean chamado "bean". Teremos um atributo booleano e os métodos <code>get</code> e <code>set</code> para recuperar e atribuir os valores da seleção:</p>
<pre class="brush: java">
public class Bean {

private boolean ativo;

public boolean isAtivo() {
return ativo;
}

public void setAtivo(boolean ativo) {
this.ativo = ativo;
}
}
</pre>
<p>Esta tag tem apenas um item de seleção, porém as outras possuem mais de um, nos quais devem ser especificados. Uma maneira direta de especificá-los é utilizar a tag <code>&lt;f:selectItem/&gt;</code>. Você poderá usar os dois atributos básico desta tag que é o valor e o nome do item:</p>
<pre class="brush: java">
&lt;f :selectItem itemValue=&quot;M&quot; itemLabel=&quot;Masculino&quot;/&gt;
</pre>
<p>O valor 'M' é passado como parâmetro de requisição quando o formulário é submetido.</p>
<p>Vejamos um conjunto de botões de rádio utilizando a tag <code>&lt;h:selectOneRadio/&gt;</code> em conjunto com a tag <code>&lt;f:selectItem/&gt;</code>:</p>
<p><strong>selectOneRadio</strong></p>
<pre class="brush: java">
&amp;lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Sexo:&quot;/&amp;gt;
&amp;lt;h :selectOneRadio value=&quot;#{bean.sexo}&quot; layout=&quot;pageDirection&quot;&amp;gt;
&lt;f :selectItem itemValue=&quot;M&quot; itemLabel=&quot;Masculino&quot;/&gt;
&amp;lt;f :selectItem itemValue=&quot;F&quot; itemLabel=&quot;Feminino&quot;/&amp;gt;
&amp;lt;/h&amp;gt;
</pre>
<p>Um importante atributo do <code>selectOneRadio</code> e do <code>selectManyCheckbox</code> além de <code>border</code> para especificar uma borda, <code>enabledClass</code> e <code>disabledClass</code> para aplicar um estilo quando o componente estiver habilitado e desabilitado respectivamente, é o <code>layout</code>, que especifica como será dipostos os menus: horizontal ou vertical. Por padrão o componente é <code>lineDirection</code> (horizontal), mas podemos colocá-lo como <code>pageDirection</code> (vertical).</p>
<p>Podemos vincular um único <code>selectItem</code> a um atributo <code>SelectItem</code> do backing bean:</p>
<pre class="brush: java">
&lt;f :selectItem value=&quot;#{bean.femininoItem}&quot;/&gt;
</pre>
<pre class="brush: java">
public class Bean {

private SelectItem femininoItem ;

public Bean() {
femininoItem = new SelectItem(&quot;F&quot;, &quot;Feminino&quot;);
}

public SelectItem getFemininoItem() {
return femininoItem;
}

public void setFemininoItem(SelectItem femininoItem) {
this.femininoItem = femininoItem;
}
}
</pre>
<p>Veja que Sexo possue duas opções, logo utilizei a tag de Item duas vezes, porém esta opção seria um tanto inviável para menus com muitos itens de seleção ou dinâmicos, nos quais os valores não são fixos. A maneira para contornarmos esta restrição é utilizar a tag composta <code>&lt;h:selectItems/&gt;</code>.</p>
<p>Esta tag deverá estar vinculada a um backing bean com um atributo que seja um único <code>SelectItem</code>, <code>Collecion</code>, <code>Array</code> ou um <code>Map</code> com duas entradas representando os rótulos e os valores de <code>SelectItem</code>, além de um atributo no qual você colocará o(s) valor(es) selecionado(s).</p>
<p>Vejamos um conjunto de caixas de seleção, nas quais posso selecionar uma ou mais opções:</p>
<p><strong>selectManyCheckbox</strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Matérias:&quot;/&gt;
&lt;h :selectManyCheckbox value=&quot;#{bean.materias}&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.materiasItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>Cada entrada do mapa será convertida para uma instância de SelectItem. A chave será o rótulo e o valor de entrada será o valor do item. Como no mapa não explicitamos o SelectItem, não conseguimos utilizar outros atributos desta tag como a descrição por exemplo.</p>
<p>Ao utilizarmos um mapa devemos ter em mente que:<br />
- O LinkedHashMap colocará os itens na ordem de inserção;<br />
- O TreeMap será ordenado em ordem alfabética; e<br />
- HashMap será ordenado de forma aleatória.</p>
<p>Backing bean utilizando um mapa:</p>
<pre class="brush: java">
public class Bean {

private String[] materias;
private Map&lt;string , Object&gt; materiasItems;

public Bean() { // &quot;public&quot; se faz necessário.
materiasItems = new LinkedHashMap&lt;/string&gt;&lt;string , Object&gt;();
materiasItems.put(&quot;Português&quot;, &quot;pt&quot;);
materiasItems.put(&quot;Inglês&quot;, &quot;en&quot;);
}

public Map&lt;/string&gt;&lt;string , Object&gt; getMateriasItems() {
return materiasItems;
}

public void setMateriasItems(Map&lt;/string&gt;&lt;string , Object&gt; materiasItems) {
this.materiasItems = materiasItems;
}
}
</pre>
<p>O primeiro parâmetro do <code>Mapa</code> representará o rótulo do <code>SelectItem</code> e o segundo o valor.<br />
Para você lembrar o que poderá ser especificado para <code>selectItem</code> basta lembrar de <strong>SCAM</strong>:<br />
- <code>SelectItem</code>;<br />
- <code>Collection</code>;<br />
- <code>Array</code>; e<br />
- <code>Map</code>.</p>
<p>Repare que estou inicializando o mapa no construtor padrão do backing bean, mas na maioria das vezes buscaremos de um banco de dados.</p>
<p>Agora que estamos familiarizados com o modo de inserir os itens e os possiveis elementos para adicioná-lo, vejamos os restantes das tags de caixa de listagem e menu:</p>
<p><strong>selectOneListbox</strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Ano:&quot;/&gt;
&lt;h :selectOneListbox value=&quot;#{bean.ano}&quot; size=&quot;7&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.anosItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>Um atributo interessante é o <code>size</code>, ele indicará quantos itens serão visíveis na caixa de seleção. Caso você especifique um valor menor do que o total de itens, será adicionado um scroller, caso não especifique o atributo a caixa de seleção se ajustará à quantidade de itens, que no caso é o comportalmente padrão.</p>
<p>Backing bean utilizando uma coleção:</p>
<pre class="brush: java">
public class Bean {

private int ano;
private Collection&lt;selectitem&gt; anosItems;

public Bean() {
anosItems = new ArrayList&lt;/selectitem&gt;&lt;selectitem&gt;();
for (int i = 1990; i &lt; = 2000; i++) {
anosItems.add(new SelectItem(i));
}
}

public Collection&lt;selectItem&gt; getAnosItems() {
return anosItems;
}

public void setAnosItems(Collection&lt;/selectitem&gt;&lt;selectitem&gt; anosItems) {
this.anosItems = anosItems;
}
}
</pre>
<p><strong>selectManyListbox</strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Dias:&quot;/&gt;
&lt;h :h:selectManyListbox value=&quot;#{bean.diasSemana}&quot; style=&quot;height: 110px;&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.diasSemanaItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>Quando esta tag é renderizada para HTML, a única diferença dela para a tag <code>OneList</code> é o atributo <code>muiltiple</code> para indicar a possibilidade de múltiplas escolhas.</p>
<p>* Para selecionar mais de um item basta clicar segurar e selecioná-los, porém para seleções não consecutivas se faz necessário segurar a tecla <strong>Ctrl</strong>.</p>
<p>Backing bean utilizando um array:</p>
<pre class="brush: java">
public class Bean {

private String[] diasSemana;
private SelectItem[] diasSemanaItems = {
new SelectItem(&quot;Domingo&quot;),
new SelectItem(&quot;Segunda&quot;),
new SelectItem(&quot;Terça&quot;),
new SelectItem(&quot;Quarta&quot;),
new SelectItem(&quot;Quinta&quot;),
new SelectItem(&quot;Sexta&quot;),
new SelectItem(&quot;Sábado&quot;)
};

public String[] getDiasSemana() {
return diasSemana;
}

public void setDiasSemana(String[] diasSemana) {
this.diasSemana = diasSemana;
}
}
</pre>
<p><strong>selectOneMenu </strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Aprovado:&quot;/&gt;
&lt;h :selectOneMenu value=&quot;#{bean.aprovado}&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.aprovadoItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>Os dois tipos de menus também têm uma diferença muito simples: o <code>OneMenu</code> simplesmente adiciona o atributo <code>size="1"</code> para indicar que só aparecerá um item, com isso o navegador em vez de criar um <code>scoller</code> cria um botao <code>dropdown</code> pelo fato da tag ser <code>Menu</code>.</p>
<p>Backing bean utilizando um array:</p>
<pre class="brush: java">
public class Bean {

private String aprovado;
private SelectItem[] aprovadoItems = {
new SelectItem(&quot;Sim&quot;),
new SelectItem(&quot;Não&quot;)
};

public String getAprovado() {
return aprovado;
}

public void setAprovado(String aprovado) {
this.aprovado = aprovado;
}
}
</pre>
<p><strong>selectManyMenu </strong></p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Requisitos:&quot;/&gt;
&lt;h :selectManyMenu value=&quot;#{bean.requisitos}&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.requisitosItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>O menu de múltiplas escolha tem um pequeno problema: se é um <code>Menu</code>, ele terá o <code>size="1"</code>, se é <code>Many</code> terá o atributo <code>multiple</code>. Mas repare só, eu posso selecionar várias opções, mas só enxergarei um item por vez na tela. Sim, realmente assim será, pois os navegadores não criam um menu <code>dropdown</code> no qual se pode selecionar mais de uma opção, até mesmo porque no clique o <code>dropdown</code> é desativado e setado a escolha do usuário. Em vez disso o navegador coloca um <code>scroller</code> minúsculo no qual se deve selecionar um item e passar para o próximo não tendo uma visualização de todas as opções. Outros navegadores nem mesmo colocam o <code>scroller</code> o que nos obrigam a navegarmos pelos itens através do teclado.</p>
<p>Backing bean utilizando um array:</p>
<pre class="brush: java">
public class Bean {

private String[] requisitos;
private SelectItem[] requisitosItems = {
new SelectItem(&quot;Bacharel&quot;),
new SelectItem(&quot;Pós Graduação&quot;),
new SelectItem(&quot;Mestrado&quot;),
new SelectItem(&quot;Doutorado&quot;)
};

public String[] getRequisitos() {
return requisitos;
}

public void setRequisitos(String[] requisitos) {
this.requisitos = requisitos;
}
}
</pre>
<p>Para todas as tags vista menos a <code>selectBooleanCheckbox</code> podemos fazer agrupamentos de itens.</p>
<p><strong>SelectItemGroup</strong></p>
<p>Agora trabalharemos com grupos de <code>SelectItem</code> em vez do <code>array</code>:</p>
<pre class="brush: java">
private SelectItemGroup meuGrupo = new SelectItemGroup(&quot;Nome&quot;, &quot;Descrição&quot;, true, selectItems);
</pre>
<p>Temos como atributo o nome do grupo, a descrição, se está ativo ou não e o <code>array</code> de <code>SelectItem</code>.</p>
<p>Vejamos um exemplo utilizando <code>selectManyListbox</code>:</p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Currículo:&quot;/&gt;
&lt;h :selectManyListbox value=&quot;#{bean.curriculo}&quot;&gt;
&lt;f :selectItems value=&quot;#{bean.curriculoItems}&quot;/&gt;
&lt;/h&gt;
</pre>
<p>Teremos um <code>array</code> de <code>SelectItem</code> e um de resultado da mesma forma que fizemos antes, porém em vez do <code>array</code> de <code>SelectItem</code> receber instâncias de <code>SelectItem</code>, receberá vários <code>SelectItemGroup</code> que por sua vez possue as instâncias de <code>SelectItem</code>. Isto é possível porque <code>SelectItemGroup</code> estende <code>SelectItem</code>.</p>
<pre class="brush: java">
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;

public class Bean {

private SelectItem[] javaItems = {
new SelectItem(&quot;Java SE&quot;),
new SelectItem(&quot;Java EE&quot;),
new SelectItem(&quot;JSP&quot;)
};
private SelectItem[] conhecimentosItems = {
new SelectItem(&quot;JSF&quot;),
new SelectItem(&quot;Hibernate&quot;),
new SelectItem(&quot;EJB&quot;),
new SelectItem(&quot;Facelets&quot;)
};
//
private SelectItemGroup javaGroup = new SelectItemGroup(&quot;Java&quot;, &quot;Linguagens Java&quot;, true, javaItems);
private SelectItemGroup requisitosGroup = new SelectItemGroup(&quot;Requisitos&quot;, &quot;Conhecimentos&quot;, true, conhecimentosItems);
//
private String[] curriculo;
private SelectItem[] curriculoItems = {javaGroup, requisitosGroup};

public SelectItem[] getConhecimentosItems() {
return conhecimentosItems;
}

public void setConhecimentosItems(SelectItem[] conhecimentosItems) {
this.conhecimentosItems = conhecimentosItems;
}

public SelectItem[] getJavaItems() {
return javaItems;
}

public void setJavaItems(SelectItem[] javaItems) {
this.javaItems = javaItems;
}

public String[] getCurriculo() {
return curriculo;
}

public void setCurriculo(String[] curriculo) {
this.curriculo = curriculo;
}

public SelectItem[] getCurriculoItems() {
return curriculoItems;
}

public void setCurriculoItems(SelectItem[] curriculoItems) {
this.curriculoItems = curriculoItems;
}
}
</pre>
<p>Agora já sabemos manipular todas as tags de seleção do JSF, falta saber como apresentar os resultados. Os resultados mantidos em um vetor por poderem ser mais que um valor, não podem ser impressos diretamente igual um valor vindo de <code>selectOneBooleanCheckbox</code> e armazenado em uma <code>int</code> por exemplo:</p>
<pre class="brush: java">
&lt;h <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utputText value=&quot;Ativo?:&quot;/&gt;
&lt;h :selectBooleanCheckbox value=&quot;#{bean.ativo}&quot;/&gt;
</pre>
<p>Teremos então de pegar cada valor do vetor, montar uma string e ai sim retorná-la. Podemos fazer um método que concatena todos os valores do vetor e retorna uma String montada:</p>
<pre class="brush: java">
private String concatenar(Object[] vet) {
if (vet == null) {
return &quot;&quot;;
}

StringBuilder builder = new StringBuilder();

for (Object ite : vet) {
if (builder.length() &gt; 0) {
builder.append(&quot;, &quot;);
}
builder.append(ite.toString());
}

return builder.toString();
}
</pre>
<p>Também precisaremos de um método <code>get</code> para retornar a String concatenada:</p>
<pre class="brush: java">
public String getDiasSemanaDisplay() {
return concatenar(diasSemana);
}
</pre>
<p>Então para todos os atributos que possuem mais que um valor teremos de ter um método <code>get</code> alternativo para apresentação dos mesmos. Mas não omita o <code>get</code> que retorna o vetor, pois ele é necessário para renderização do valor selecionado no componente.</p>
<p><strong>Conclusão:</strong></p>
<p>Em um formulário utilizamos estas tags várias vezes sendo estas essenciais para qualquer tipo de aplicação.<br />
Todas elas suportam formatação de estilo com CSS, mas o foco o artigo é apresentá-las de forma simples e didática. É claro que estas tags possuem vários recursos interessantes, mas deixaremos para um próximo artigo.</p>
<p>Espero que tenham gostado deste meu primeiro post apesar de ter ficado um pouco extenso por ter abordado todas as tags de seleção. Espero que este artigo sirva como um ponta pé para o aprendizado de vocês.</p>
<p><strong>Projeto completo</strong>: <a title="NB 6.7, JSF 1.2 e JSTL 1.1" href="http://www.moviecollection.com.br/downloads/tags-selecao-jsf-blog.rar">Download</a></p>
<p>Até a próxima! (:</p>
<p>Créditos: http://wbotelhos.wordpress.com/2009/07/24/tags-de-selecao-com-jsf/</selectitem></string></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/tags-de-selecao-com-jsf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>validando formularios jsf com javascript</title>
		<link>http://blog.scriptseguro.com.br/validando-formularios-jsf-com-javascript/</link>
		<comments>http://blog.scriptseguro.com.br/validando-formularios-jsf-com-javascript/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 11:50:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[validando formularios jsf com javascript]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=536</guid>
		<description><![CDATA[Artigo retirado do blog: http://wbotelhos.wordpress.com
Olá pessoal! =)
Bem, hoje vou mostrar como validar um formulário JSF com Javascript. A princípio é simples, porém existe um detalhe e este detalhe no final se torna um conceito necessário para todos aqueles desenvolvedores JSF, chamado de Naming Container.
Para que possamos validar um campo, este deve conter um identificador ID [...]]]></description>
			<content:encoded><![CDATA[<p>Artigo retirado do blog: <a onclick="javascript:pageTracker._trackPageview('/outbound/article/wbotelhos.wordpress.com');" href="http://wbotelhos.wordpress.com/" target="_blank">http://wbotelhos.wordpress.com</a></p>
<p>Olá pessoal! =)</p>
<p>Bem, hoje vou mostrar como validar um formulário JSF com <a href="http://pt.wikipedia.org/wiki/Javascript" target="blank">Javascript</a>. A princípio é simples, porém existe um detalhe e este detalhe no final se torna um conceito necessário para todos aqueles desenvolvedores JSF, chamado de <strong>Naming Container</strong>.</p>
<p>Para que possamos validar um campo, este deve conter um identificador <em>ID</em> para servir de "âncora" para nosso script.</p>
<blockquote><p>Vale lembrar que o ID é uma identificação única, logo se tivermos dois componentes com o mesmo ID o JSF acusará um erro, e lançará uma exceção: "Duplicate component id". Já no HTML não ocorre o erro. Falaremos mais sobre <code>id</code>, <code>class</code> e <code>name</code> em outra oportunidade.</p></blockquote>
<p>1. Criaremos um fomulário com os campos usuario, senha e confirmação de senha;<br />
2. Identicaremos os componentes;<br />
3. Criaremos um script que validará o formulário.</p>
<p><strong>Formulário:</strong></p>
<pre class="brush: java">
// &lt; &lt; Atenção!
...

...
</pre>
<p>Montamos o formulário com os três campos e suas respectivas identificações e um botão que chama uma função javascript de nome <code>validar passando o formulário corrente como parâmetro. Agora devemos declarar o script na página:</p>
<pre class="brush: java">

&lt;script src=&quot;script.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>E então poderemos criar nosso script utilizando os ids como referência e assim capturando os valores dos campos, mas é ai que acabamos vacilando. Se tentarmos capturar o valor do campo "usuario" do modo descrito abaixo, não dará certo, pois o JSF trabalha com o conceito de hierarquia dos componente, ou seja, o Naming Container:</p>
<pre class="brush: java">
function validar(form) {
var usuario = form[&quot;usuario&quot;].value;
...
}
</pre>
<p>Veja que estamos buscando o id de nome "usuario", porém nosso código gerou algo como:</p>
<pre class="brush: java">

&lt;form id=&quot;j_id_jsp_1070816059_1&quot;&gt; &lt;input id=&quot;j_id_jsp_1070816059_1:usuario&quot; name=&quot;j_id_jsp_1070816059_1:usuario&quot; /&gt;
&lt;/form&gt;</pre>
<p>Veja que foi concatenado ao nosso ID "usuario" um ID especial <strong>j_id_jsp_1070816059_1</strong>. Mas de onde veio este ID? Veio do componente mais externo, que por ser um naming container, repassou sua ID para seus componentes internos e é por isso que nosso script não iria funcionar já que a ID final ficou: "<strong>j_id_jsp_1070816059_1:usuario</strong>". O JSF gera um ID não muito legível, assim como um <code>name</code> automaticamente caso nós não o especifiquemos. Logo devemos especificá-lo para conseguirmos manipulá-lo.</p>
<pre class="brush: java">

...
</pre>
<p>Desta forma como já sabemos que os IDs serão concatenados do componente mais "externo" até o nosso componente mais "interno" e já especificamos um ID para o form, teríamos acesso ao campo da seguiente forma:</p>
<pre class="brush: javascript">
function validar(form) {
var usuario = form[&quot;form:usuario&quot;].value;
...
}
</pre>
<p>Alguns poderiam pensar ser possível fazer o acesso ao valor do campo da seguinte forma:</p>
<pre class="brush: java">
var usuario = documents.forms.form.usuario.value;
</pre>
<p>Porém como vimos temos o sinal de dois pontos ':' entre as IDs, o que nos impossibilita tal ação. Porém temos formas mais elegantes de acesso aos dados, utilizando o <code>getElementById()</code> e evitando passar o formulário como parâmetro:</p>
<pre class="brush: java">
var usuario = document.getElementById(&#039;form:usuario&#039;).value;
</pre>
<p>Você pode estar se questionando o porquê de sempre termos de indicar o ID do componente mais externo, sendo que se tivéssemos mais outros componentes naming containers teríamos de fazer várias concatenações de IDs. Mas o JSF já deu um jeitinho bem legal de resolver isso com apenas um atributo chamado <code><strong>prependId</strong></code>. Basta inserirmos ele na tag <code>&lt;h:form&gt;</code> e a seu ID não será herdada pelos componentes internos:</p>
<pre class="brush: java">

...
</pre>
<p>Neste caso indicamos que o <code>prependId</code> será falso, ou seja, o <em>prepend</em> que da idéia de anterior (componente anterior, externo, pai) não passará seu ID adiante. Por padrão este atributo é true. Vale lembrar que mesmo o ID não sendo passado para os componentes internos, o formulário continua com um ID, seja ele gerado automaticamente ou por você próprio ficando assim:</p>
<pre class="brush: java">

&lt;form id=&quot;j_id_jsp_1070816059_1&quot;&gt; &lt;input id=&quot;usuario&quot; name=&quot;usuario&quot; /&gt;
&lt;/form&gt;</pre>
<p>Desta forma já podemos acessar os valores de forma fácil e moderna, não precisando de passar o formulário como parâmetro e acessando os valores dos campos diretamente:</p>
<p><strong>Formulário:</strong></p>
<pre class="brush: java">

...

...
</pre>
<p><strong>Javascript:</strong></p>
<pre class="brush: javascript">
function validar() {
var usuario = document.getElementById(&#039;usuario&#039;);
var senha = document.getElementById(&#039;senha&#039;);
var confirmar = document.getElementById(&#039;confirmar&#039;);

if (usuario.value == &#039;&#039; || senha.value == &#039;&#039; || confirmar.value == &#039;&#039;) {
alert(&#039;Por favor, preencha todos os campos!&#039;);
return false;
} else if (senha.value != confirmar.value) {
alert(&#039;Ops! A senha não confere.&#039;);
confirmar.focus();
return false;
}

alert(&quot;Ok! Seu formulário esta válido! (:&quot;);
return true;
}</pre>
<p>Neste script primeiramente capturo os dados a partir de seus IDs, agora solitários, e com isso pego os valores dos campos e comparo se algum deles esta vazio, apresentando uma mensagem para o usuário e retornando <code>false</code> caso seja verdade ou se a senha não for igual a senha de confirmação, no qual, dou um foco no campo e também alerto o usuário. Caso contrário apenas aviso o usuário que o formulário esta ok e retorno <strong>true</strong> para o método <code>onSubmit</code> do formulário que diante disso submete o mesmo.</p>
<p><strong>Conclusão:</strong><br />
O Javascript dominou a web e é usado em todas aplicações hoje em dia e com JSF não é diferente, aqui ele também esta presente e não só podemos como devemos usufruir deste recurso. O JSF tem seus próprios validadores nos quais passam pelo <a href="http://www.ibm.com/developerworks/library/j-jsf2/" target="blank">ciclo de vida</a> do JSF fazendo uma requisição ao servidor, porém a grande jogada do javascript é exatamente não fazer requisições ao servidor economizando recursos, mas sim ser executado do lado do cliente.</p>
<p>Mas cuidado, como o javascript roda do lado do cliente ele pode ser facilmente desabilitado ou bloqueado, então o ideal seria uma validação tanto <em><a href="http://pt.wikipedia.org/wiki/Server-side" target="blank">client side</a></em> como <em><a href="http://pt.wikipedia.org/wiki/Client_Side_Scripts">server side</a></em>.</p>
<p><strong>Link do Projeto (Git)</strong>:<br />
<a href="http://github.com/washingtonbotelho/validando-formulario-jsf-com-javascript" target="blank">http://github.com/washingtonbotelho/validando-formulario-jsf-com-javascript</a></p>
<p>Fonte: http://wbotelhos.wordpress.com/2009/08/03/validando-formularios-jsf-com-javascript/</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/validando-formularios-jsf-com-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resolvendo  &#8220;Unable to umount, device is busy&#8221;</title>
		<link>http://blog.scriptseguro.com.br/resolvendo-unable-to-umount-device-is-busy/</link>
		<comments>http://blog.scriptseguro.com.br/resolvendo-unable-to-umount-device-is-busy/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 22:11:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA["Unable to umount]]></category>
		<category><![CDATA[device is busy"]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=534</guid>
		<description><![CDATA[Ao tentar desmontar um volume retorna o erro  "Unable to umount, device is busy", uma soluçao para isto é que você pode esta dentro do diretório em que pretende desmontar, ou algum outro usuário. Tente um "ps aux&#124;grep NOME_DO_VOLUME" veja se existe algum processo rodando caso sim, de um "kill -9 N_PROCESSO".
Ou ainda execulte
umount [...]]]></description>
			<content:encoded><![CDATA[<p>Ao tentar desmontar um volume retorna o erro  "Unable to umount, device is busy", uma soluçao para isto é que você pode esta dentro do diretório em que pretende desmontar, ou algum outro usuário. Tente um "ps aux|grep NOME_DO_VOLUME" veja se existe algum processo rodando caso sim, de um "kill -9 N_PROCESSO".</p>
<p>Ou ainda execulte</p>
<p>umount -l /PASTA</p>
<p>até galera...!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/resolvendo-unable-to-umount-device-is-busy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aparência de Mac no seu GNOME, Usando o Mac4lin</title>
		<link>http://blog.scriptseguro.com.br/aparencia-de-mac-no-seu-gnome-usando-o-mac4lin/</link>
		<comments>http://blog.scriptseguro.com.br/aparencia-de-mac-no-seu-gnome-usando-o-mac4lin/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 10:16:29 +0000</pubDate>
		<dc:creator>Rodrigo Martins</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Video-Aulas]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=531</guid>
		<description><![CDATA[


Essa é um artigo requentado, não faz muito tempo, pouco antes do lançamento do incrivel, fenomenal, magnifico sistema operacional da Apple, Mac OS X Leopard, eu demonstrei como é possivel deixar o GNOME com cara de Mac, alias até melhor em alguns aspectos.Novamente vou repetir o artigo, dessa vez com a versão 0.4 do pacote [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div>
<div>Essa é um artigo requentado, não faz muito tempo, pouco antes do lançamento do incrivel, fenomenal, magnifico sistema operacional da Apple, Mac OS X Leopard, eu demonstrei como é possivel deixar o GNOME com cara de Mac, alias até melhor em alguns aspectos.Novamente vou repetir o artigo, dessa vez com a versão 0.4 do pacote Mac4Lin.</div>
<div>No final do artigo voce encontrará dois videos demonstrando o Look and Feel desse Tema. O vídeo demonstrativo pega pesado usando o WINE (com msoffice2003) e o vmware (virtualizando o windows xp), também demonstra o comportamento desse tema com acesso ao menu do GNOME, acesso ao cairo-dock, troca de tarefas, meta-desktop (cubo) e as firulas do compiz.</div>
<div><span id="more-531"></span></div>
<div>
<h4><strong>1) Obtendo os pacotes-temas para o GNOME</strong></h4>
<p>Primeiramente vá ao endereço <a title="Mac4Linux" href="http://sourceforge.net/projects/mac4lin" target="_blank">http://sourceforge.net/projects/mac4lin</a>, você precisará baixar de lá 4 arquivos :</p>
<blockquote><p>Mac4Lin_Part1_v0.4.tar.gz  &lt;– descompactar<br />
Mac4Lin_Icons_Part2_v0.4.tar.gz<br />
Mac4Lin_Wallpapers_Part3_v0.4.tar.gz  &lt;– descompactar</p>
<p>Mac4Lin_Documentation_2.pdf  &lt;– apenas a documentação em inglês de como processar a instalação</p></blockquote>
<p>Extraia todos os arquivos marcados para ‘descompactar’ no mesmo diretório, ao extraí-los serão criadas as seguintes pastas :</p>
<blockquote><p>Mac4Lin_v0.4<br />
Wallpapers</p></blockquote>
<h4><strong>2) E no principio era apenas o terminal…<br />
</strong></h4>
<p>Primeiramente vamos precisar dum terminal com acesso de `root`, dê um ALT+F2 e execute “gksu gnome-terminal”, após a carga do terminal, vamos precisar de instalar os pacotes `gnome-art`, `usplash` e `startupmanager` que são importantes para aplicação desse passo a passo.</p>
<blockquote>
<pre>apt-get install gnome-art usplash startupmanager</pre>
</blockquote>
<address> </address>
<h4><strong>3) Instalando novas fontes</strong></h4>
<p>Agora que voce tem um terminal com aceesso de “root”, vá até a pasta “Mac4Lin_v0.3/Fonts” que foi descompactada e a seguir execute :</p>
<blockquote>
<pre>tar zxvf /onde/descompactei/o/arquivo/Mac4Lin_v0.4/Fonts/OSX_Fonts.tar.gz -C /usr/share/fonts/truetype</pre>
</blockquote>
<p>Voce estará instalando em seu sistema as seguintes fontes :</p>
<blockquote><p>OSX Fonts/Lucida Grande.ttf<br />
OSX Fonts/AppleGaramond.ttf<br />
OSX Fonts/AppleGaramond-Bold.ttf<br />
OSX Fonts/lucon.ttf<br />
OSX Fonts/LITHOGRL.TTF<br />
OSX Fonts/HardGothicNormal.ttf<br />
OSX Fonts/AppleGaramond-BoldItalic.ttf<br />
OSX Fonts/Lucida Grande Bold.ttf<br />
OSX Fonts/Aquabase.ttf<br />
OSX Fonts/AppleGaramond-LightItalic.ttf<br />
OSX Fonts/AppleGaramond-Light.ttf<br />
OSX Fonts/AppleGaramond-Italic.ttf</p></blockquote>
<p>Precisaremos de algumas fontes microsoftianas, por isso também execute :</p>
<blockquote>
<pre>apt-get install -y msttcorefonts</pre>
</blockquote>
<p>Por fim, devemos catalogar as novas fontes instaladas com o comando :</p>
<blockquote>
<pre>fc-cache -f -v</pre>
<pre>dpkg-reconfigure fontconfig</pre>
</blockquote>
<p>Vamos prosseguir e alterar as fontes usadas no GNOME, carregue o Preferências de Aparência em Sistema-&gt;Preferências-&gt;Aparência (vamos chama-lo daqui em diante de gerenciador de temas), após isso vá até a orelha “Fontes”, ela deverá ficar assim :</p>
<blockquote><p>Fonte de aplicações : Bitstream Vera Sans Roman, tamanho 8,59961.<br />
Fonte de documentos : Aquabase, Tamanho 9.<br />
Área de Trabalho : Trebuchet MS Negrito, tamanho 9.<br />
Fonte do título de janelas : Lúcida Grande Bold, tamanho 9.<br />
Fonte de largura fixa : Bitstream Vera Sans Mono Roman, tamanho 10.</p></blockquote>
<p><strong>Alerta : </strong>Antes de fazerem tal modificação, atente-se de que deve anotar as fontes que estão sendo usadas no seu sistema para o caso de não alcançarem o efeito desejado e quiser retornar, além disso a renderização é necessária, no meu caso “Suavização de Subpixel”, para você poderá ser outra.</p>
<h4><strong>4) Instalando novos cursores </strong></h4>
<p>Carregue o gerenciador de temas, após isso vá até a pasta recém descompactada “Mac4Lin_v0.4/GTK Cursor Theme” e arraste o arquivo `Mac4Lin_Cursors_v0.4.tar.gz` para dentro da janela do gerenciador de temas. Cada vez que você arrastar e soltar um .tar.gz com um tema dentro, o gerenciador de temas vai questiona-lo se deseja aplicar este tema, o mais indicado é responder ’sim’ daqui para frente.</p>
<p>Tela de configuração cursor :</p>
<p><a title="Escolhendo o cursor com estilo de Mac OS X." href="http://hamacker.files.wordpress.com/2007/10/mac4lin-cursor.png"><img src="http://hamacker.files.wordpress.com/2007/10/mac4lin-cursor.png" alt="Escolhendo o cursor com estilo de Mac OS X." /></a></p>
<p><strong>5) Instalalando e configurando os sons</strong></p>
<p>Novamente vá até a pasta recém descompactada “Mac4Lin_v0.3/Sounds’ , lá você encontrará o arquivo “OSX_Sounds_v0.3.tar.gz” que possui uma coleção de sons .wav temático do OS X. Para instala-lo :</p>
<blockquote>
<pre>tar zxvf /onde/descompactei/o/arquivo/Mac4Lin_v0.4/Sounds/MacOSX_Sounds.tar.gz -C /usr/share/sounds</pre>
</blockquote>
<p>Agora volte para o menu em Sistema-&gt;Preferencias-&gt;Som, escolha a orelha “Sons” e lá voce encontrará uma tela semelhante a :</p>
<pre><a title="Preferencias de som" href="http://hamacker.files.wordpress.com/2007/10/mac4lin-sons.png"><img src="http://hamacker.files.wordpress.com/2007/10/mac4lin-sons.png" alt="Preferencias de som" /></a></pre>
<p>Clique em cada caixa de seleção de musica e escolha os efeitos sonoros conforme mostrado acima, os efeitos sonoros exclusivos estarão na pasta <strong>/usr/share/sounds/MacOSX_Sounds/</strong>. Obviamente a idéia acima foi apenas um exemplo, há muitos outros arquivos de som que podem ser combinados.</p>
<p><strong>Alerta :</strong> Se você já possui uma coleção de sons já configurado não esqueça de anota-las antes dessa modificação, isto é requerido caso você não goste da combinação acima.</p>
<h4><strong>6) Instalando o tema versão Metacity (padrão do gnome) </strong></h4>
<p>Se você usa outro gerenciador de janelas como por exemplo o emerald então pule este passo.</p>
<p>Vá até a pasta recém descompactada “Mac4Lin_v0.4/GTK Metacity Theme’ , lá há dois temas incluídos :</p>
<blockquote><p>Mac4Lin_GTK_Graphite_v0.4.tar.gz</p>
<p>Mac4Lin_GTK_v0.4.tar.gz</p></blockquote>
<p>Existem também outros dois com nome semelhante porém com o sufixo “Mac4Lin_GTK_<strong>MacMenu</strong>“, estes só podem ser utilizados se voce aplicou um patch que transformou o menu do gnome exatamente como no Mac, onde os menus dos aplicativos também vão flutuar no painel superior.</p>
<p>O procedimento para instalar estes dois temas é igual a qualquer outro, apenas arraste um ou os dois temas para dentro do gerenciador de temas.</p>
<h4><strong>7) Instalando novos ícones </strong></h4>
<p>Carregue novamente o gerenciador de tema, após isso vá até a pasta onde voce copiou o arquivo “<strong>Mac4Lin_Icons_Part2_v0.4.tar.gz</strong>” e arraste-o para dentro da janela do gerenciador de temas. Quando você arrastar e soltar então o gerenciador de temas vai questiona-lo se deseja aplicar este tema, responda ’sim’.</p>
<p>Para exibir ícones na area de desktop como “Meu Computador”, “Minha Pasta Pessoal”, “Servidores de Rede” e “Lixeira”, faça assim, dê um ALT+F2 e execute “gconf-editor” e a seguir procure por essa chave apps-&gt;nautilus-&gt;desktop e habilite as seguintes entradas conforme sua necessidade de exibir tais ícones na area de desktop :</p>
<ul>
<li>Computer Icon Visible = Meu Computador</li>
<li>Home Icon Visible = Minha Pasta Pessoal</li>
<li>Network Icon Visible = Servidores de Rede</li>
<li>Trash Icon Visible = Lixeira</li>
</ul>
<p>Exemplo da aparencia da tela com os ícones temáticos :</p>
<p><a title="Gnome com aparencia de Mac OSX" href="http://hamacker.files.wordpress.com/2008/01/gnome-com-aparencia-de-macosx.png"><img src="http://hamacker.files.wordpress.com/2008/01/gnome-com-aparencia-de-macosx.thumbnail.png" alt="Gnome com aparencia de Mac OSX" /></a></p>
<h4><strong> <img src='http://blog.scriptseguro.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> Instalando novos papeis de parede</strong></h4>
<p>Carregue novamente o gerenciador de tema, escolha a orelha <strong>“Plano de Fundo”</strong> e após isso vá até a pasta recém descompactada “<strong>Wallpapers/</strong>″ e arraste todos os arquivos (use o mouse para selecionar todos) para dentro da janela onde exibe todos <strong>Planos de Fundos</strong>. Quando voce arrastar e soltar então todos os papeis de paredes utilizados no Mac OS X estarão relacionados. Selecione uma imagem qualquer da relação que satisfaça seu gosto pessoal, todas são excelentes imagens.</p>
<h4><strong>9) Instalando o tema para o Emerald </strong></h4>
<p>Se você não usa o gerenciador de janelas Emerald, pule este tema.</p>
<p>Carregue o gerenciador de temas do Emerald, vá em Sistema-&gt;Preferências-&gt;Emerald Theme Manager, a seguir vá em “Temas” e clique no botão “Importar”, e ao ser questionado para selecionar o arquivo então escolha-o dentre a récem descompactada pasta “<strong>Mac4Lin_v0.4/Emerald Theme/…</strong>” , lá voce encontrará dois ótimos temas, selecione um deles.</p>
<h4><strong>10) Tema para o gerenciador de login (GDM) </strong></h4>
<p>Carregue o gerenciador de login, vá em Sistema-&gt;Administração-&gt;Janela de Inicio de Sessão, em seguida selecione a orelha <strong>“Local”</strong>, também na opção <strong>“Tema”</strong> escolha a opção <strong>“Apenas selecionado”</strong>. Você perceberá que logo abaixo há uma relação de temas a serem selecionados, a partir daí apenas arraste o conteúdo da pasta recém descompactada “<strong>Mac4Lin_v0.4/GDM Theme/Mac4Lin_GDM_v0.4.tar.gz</strong>” para a janela onde há essa relação de temas. Você será questionado se deseja realmente instalar este tema, escolha “sim” e a seguir verá como opção de tema, um item chamado “Mac OS X Leopard” na relação, agora é só seleciona-lo e aplicar. Na próxima vez que fizer o seu login notará uma diferença agradável. Esse tema para o GDM está uma obra prima.</p>
<h4><strong>11) Tema para o splash screen do GNOME<br />
</strong></h4>
<p>Carregue o gerenciador de splash screen do gnome, vá em <strong>Sistema-&gt;Preferencias-&gt;Splash Screen</strong>, a seguir ative a opção “<strong>Mostrar splash screen no inicio</strong>” (em inglês : Show splash screen on startup). Após isso ative o botão “Exibir splash screen no inicio” (em inglês : “Show splash screen on startup”) e em seguida clique no botão “+ Instalar” (em inglês : “+ Install”) e selecione os 3 arquivos que estão na pasta recém descompactada “<strong>Mac4Lin_v0.4/GTK Login Splash/</strong>”. Esse procedimento é chato porque você não pode arrastar e soltar todos de uma única vez, tem que incluir individualmente os 4 arquivos de splash-screen. Após incluir todos, selecione uma que lhe agrade na tela principal e clique no botão “Ativar” (em inglês : “Activate)” em baixo. Na próxima vez que fizer o seu login notará a diferença.</p>
<h4><strong>12) Tema para o Firefox</strong></h4>
<p>Antes de instalar os temas é preciso instalar algumas extensões que acompanham o tema, para instala-los carregue o Firefox e vá em Ferramentas-&gt;Complementos e a seguir selecione a orelha “Extensões” (ou “Complementos” em algumas versões), e arraste todos os arquivos que encontrar na pasta recém descompactada “<strong>Mac4Lin_v0.4/Firefox Addons/Extensions/</strong>” com as seguintes extensões :</p>
<blockquote><p>custom_buttons.xpi<br />
fission-0.8.8.xpi<br />
stop_reload_button.xpi</p></blockquote>
<p>Se voce está usando o GNOME com o patch-menu do Mac ou também acha que o menu do Firefox é muito consumista de espaço, também vai gostar de instalar essa extensão :</p>
<blockquote><p>hide_menubar.xpi</p></blockquote>
<p>Basicamente o que ela faz é ocultar a barra de menu do Firefox, sem o patch de menu do MacOSX voce só voltará a ve-lá na opção de personalizar a barra de icones (onde fica voltar, avançar, reload,…).</p>
<p>Para a janela do Firefox contendo os complementos, e então instale todas essas extensões. Achei essas extensões bem agradáveis, o status de progressão por exemplo se utiliza da própria barra de URL.</p>
<p>Então por fim arraste também o arquivo-tema “FireFox Safari Skin – Vfox2.jar” que se encontra em “<strong>Mac4Lin_v0.4/Firefox Addons/Extensions/FireFox Safari Theme – Vfox2.jar</strong>” e aplique o novo tema. Reinicie o firefox se desejar saber como ficou a aparência dele. O Firefox depois de re-estilizado fica assim :</p>
<p><a title="Tema do apple Mac OS X aplicado no firefox." href="http://hamacker.files.wordpress.com/2007/10/mac4lin-firefox.png"><img src="http://hamacker.files.wordpress.com/2007/10/mac4lin-firefox.thumbnail.png" alt="Tema do apple Mac OS X aplicado no firefox." /></a></p>
<h4><strong>13) Instalando o Cairo-Dock (somente para usuários do compiz/XGL)<br />
</strong></h4>
<div>
<div>O Cairo-Dock é uma dock com algumas semelhanças com o dock do Mac OSX, mas possui vários temas e plugins, onde cada combinação produz um resultado totalmente novo em suas características.Infelizmente não é possível instala-lo a partir de nenhum repositório. Porém, há pacotes prontos onde é mantido o projeto.Acesse a página : <a title="Cairo-Dock - Files" href="http://developer.berlios.de/project/showfiles.php?group_id=8724">http://developer.berlios.de/project/showfiles.php?group_id=8724</a></p>
<p>E salve os seguintes arquivos :</p>
<blockquote><p>cairo-dock-plug-ins_[versao]_i686-32bits.deb<br />
cairo-dock_[versao]_i686-32bits.deb</p></blockquote>
<p>No terminal, execute :</p>
<blockquote><p>sudo apt-get -y install libglitz-glx1   libglitz1<br />
cd /onde/salvei/os/pacotes/do/cairo<br />
sudo dpkg -i  cairo-dock*.deb<br />
sudo apt-get install -f</p></blockquote>
<p>Para experimenta-lo vá ao menu do GNOME-&gt;Ferramentas do Sistema-&gt;Cairo Dock.<br />
Na primeira vez em que ele é carregado é mandatório a seleção de um tema, escolha “_MacOSX_” que é mais adequado para imitar o sistema da Apple. A parte mais importante é que ao selecionar um tema deixe também marcado as opções “<strong>Use the new theme’s behaviours”</strong> e “<strong>Use the new theme’s lauchers”</strong> para não manter as caracteristicas de temas anteriores :</p>
<p><img src="http://hamacker.files.wordpress.com/2008/04/ubuntuparadise-cairodock-selecionar-tema.png" alt="ubuntuparadise-cairodock-selecionar-tema.png" /></p>
<p>Após carregar o cairo-dock, vá até a dock que estiver sendo exibida e com um clique  botão-direito selecione  <strong>Cairo-dock-&gt;Check Updates,</strong> depois repita a mesma operação, porém <strong>Cairo-dock-&gt;M</strong><strong>anage Themes</strong>, é nesse momento que você selecionará a guia “<strong>Themes</strong>” e na relação de “<strong>List of themes</strong>”  o tema exemplo “<strong>_MacOSX_</strong>“, deixe também marcado as opções “<strong>Use the new theme’s behaviours”</strong> e “<strong>Use the new theme’s lauchers</strong>“. Uma amostra de como ficará a dock :</p>
<p><img src="http://hamacker.files.wordpress.com/2008/01/cairo-dock-com-aparencia-de-macosx.png" alt="Cairo-Dock com a aparencia de MacOSX" /></p>
<p>Para manter o Cairo-Dock carregado sempre que sua sessão do GNOME iniciar, acesse o menu do GNOME-&gt;Sistema-&gt;Preferencias-&gt;Sessões, então clique no botão “Adicionar” e preencha os campos nome, comando e comentário com <strong>cairo-dock.</strong></p>
<p>Além dos temas variados, há também muitos plugins. Um deles carrega na dock a previsão do tempo, só que para funcionar precisa especificar o código da localidade a ser observada. Como eu descubro esse código ? É simples, basta acessar o endereço : http://br.weather.com e lá procurar a cidade ou localidade desejada, se eu pesquisar por ‘São Paulo’  serei redirecionado para a página : http://br.weather.com/weather/local/<strong>BRXX0232</strong>?x=0&amp;y=0</p>
<p>O código em negrito acima é o código da localidade a ser usada para este plugin :</p>
<p><img src="http://hamacker.files.wordpress.com/2008/04/ubuntuparadise-cairodock-previsao-tempo.png" alt="" width="510" height="344" /></p>
<p>No caso do plugin acima você pode ainda detalhar alguns efeitos como o “carrocel” para exibir de forma giratória as previsões do tempo futuras :</p>
<p>Na minha opinião, cada tema do cairo-dock é mais  bonito que o outro e cada um deles tem suas surpresas.</p></div>
</div>
<p><strong>14) Telas de boot (usplash e grub)</strong></p>
<p>Também é possivel modificar a tela de seleção de boot do grub e o splash screen quando o sistema inicia-se. Antes de prosseguir atente-se para o seguinte fato, o aplicativo que voce está preste a instalar é capaz de personalizar o grub de uma forma bastante abrangente que pode esbarrar em limites conhecidos por sua placa de video, portanto, use as instruções a seguir por sua conta e risco.</p>
<p>O startup-manager é um excelente front-end para configurar o sistema de boot, o grub. No entanto, dependendo das configurações que voce utilizar poderá até mesmo incapacitar o sistema de boot de sua máquina, por isso vamos fazer uma cópia da configuração atual do GRUB :</p>
<blockquote>
<pre>sudo cp /boot/grub/menu.lst /boot/grub.menu.lst.copy</pre>
</blockquote>
<p>Vá em <strong>Sistemas-&gt;Administração-&gt;Startup-Manager</strong>, eis a tela a seguir :</p>
<p><a title="Tela do Startup Manager." href="http://hamacker.files.wordpress.com/2007/10/mac4lin-startupmanager1.png"><img src="http://hamacker.files.wordpress.com/2007/10/mac4lin-startupmanager1.png" alt="Tela do Startup Manager." /></a><a title="Tela do Startup Manager (aparencia)." href="http://hamacker.files.wordpress.com/2007/10/mac4lin-startupmanager2.png"><img src="http://hamacker.files.wordpress.com/2007/10/mac4lin-startupmanager2.png" alt="Tela do Startup Manager (aparencia)." /></a></p>
<p>O primeiro ajuste é ir até a guia <strong>“Boot Options”</strong> e habilitar as opções :</p>
<blockquote><p>Show bootloader menu<br />
Show boot splash<br />
Show text during boot</p></blockquote>
<p>Após isso vá até a guia “<strong>Appearance</strong>”, habilite a opção “<strong>Use colors in bootloaders menu</strong>”.</p>
<p>Clique no botão “<strong>Manage bootloaders themes…</strong>” e a seguir no botão “<strong>Adicionar</strong>” e adicione todos as imagens .xpm.gz alistados na pasta recém descompactada em “<strong>Mac4Lin_v0.4/Grub Splash/*.xpm.gz</strong>”, a seguir habilite a opção “<strong>Use Background image for bootloader menu</strong>” e finalmente na caixa “<strong>Grub Background Image</strong>” voce seleciona uma das telas que voce adicionou, por exemplo, <strong>mac1.xpm.gz</strong>.Também clique no botão “<strong>Manage usplash themes…</strong>” e a seguir no botão “<strong>Adicionar</strong>” e adicione todos os temas (arquivos com a extensão .so) alistados na pasta recém descompactada em “<strong>Mac4Lin_v0.4/Usplash/*.so</strong>”, a seguir em “<strong>Usplash Theme</strong>” seleciona um dos temas que voce adicionou, por exemplo, <strong>osx-splash.so</strong>.</p>
<p>A combinação acima é apenas um exemplo, para verificar o seu funcionamento reinicie o computador. Novamente vale a pena ressaltar de que dependendo da combinação em “<strong>Boot Options</strong>”, o GRUB e o tema dele podem falhar se sua placa de video não portar tais resoluções indicadas no modo de <a title="Modo de v�deo Vesa" href="http://en.wikipedia.org/wiki/VESA_BIOS_Extensions" target="_blank">vídeo vesa</a>.</p>
<h4><strong>15) Confira a aplicação do tema </strong></h4>
<p>Gerenciador de temas não é muito confiável quando voce pede para ele aplicar os temas e cursores automáticamente. Portanto, sugiro você verificar como o seu tema ficou no final. Acesse o menu do GNOME e vá em Sistemas-&gt;Preferencias-&gt;Aparência e confirma se o tema selecionado e chamado de “Personalizado” está configurado conforme indicado abaixo e faça as mudanças necessárias :</p>
<p>Tema : Personalizado (duplo clique nele)</p>
<blockquote><p>Controles : Mac4Lin_GTK_(qualquer um dos temas acima)_V0.4</p>
<p>Cores : n/a</p>
<p>Margem da Janela : Mac4Lin_GTK_(qualquer um dos temas acima)</p>
<p>Ícones : Mac4Lin_Icons_v0.4</p>
<p>Cursor : Mac4Lin Cursors v.0.4</p></blockquote>
<p>Se tudo está conforme esperado, então feche o gnome-terminal.</p>
<p>No final seu GNOME ficará mais ou menos assim :</p>
<p><a title="Gnome com aparencia de Mac OSX" href="http://hamacker.files.wordpress.com/2008/01/gnome-com-aparencia-de-macosx.png"><span style="text-align: center"> </span></a></p>
<p>Um pouco mais do Look and Feel do mac4Linux usando aplicações consideradas criticas nesse ambiente OpenGL tais como wine (usando o msoffice2003) e vmware(virtualização), claro que é util para demonstrar a troca de programas, meta-desktops (cubo) e firulas do compiz :</p>
<p><span style="text-align: center"></span></p>
<p><strong>Conclusão :</strong></p>
<h4><strong> </strong></h4>
<p>Ainda existem alguns outros ajustes que voce poderia fazer como por exemplo configurar o exaile(conjugado com o AWN), Pidgin e XMMS, infelizmente não dá para mencionar todas as possibilidades, mas se voce estiver interessado então leia PDF que acompanha o Mac4Lin descrevendo passo a passo todos os itens que mencionei e ainda mais alguns outros.</p>
<p>By Rodrigo Martins</p>
<p>Paz e bem</p></div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/aparencia-de-mac-no-seu-gnome-usando-o-mac4lin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google lança linguagem de programação &#8220;Go&#8221;</title>
		<link>http://blog.scriptseguro.com.br/google-lanca-linguagem-de-programacao-go/</link>
		<comments>http://blog.scriptseguro.com.br/google-lanca-linguagem-de-programacao-go/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 13:36:31 +0000</pubDate>
		<dc:creator>Rodrigo Martins</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Video-Aulas]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=525</guid>
		<description><![CDATA[A Google, não para de inventar, agora foi uma linguagem de Programação (LP). O que vem por ai??? Existe a promessa de um Sistema Operacional (SO), e toda a tecnologia de nuvem, será uma grande inovação da Informatica, e a promessa de um futuro melhor para os internaltas...
Google acaba de anunciar o lançamento de uma [...]]]></description>
			<content:encoded><![CDATA[<p>A Google, não para de inventar, agora foi uma linguagem de Programação (LP). O que vem por ai??? Existe a promessa de um Sistema Operacional (SO), e toda a tecnologia de nuvem, será uma grande inovação da Informatica, e a promessa de um futuro melhor para os internaltas...</p>
<blockquote><p>Google acaba de anunciar o lançamento de uma nova linguagem de programação de código aberto chamado Go. A empresa diz que o Go é experimental, e que combina os benefícios de desempenho e de segurança associados à utilização de uma linguagem compilada como C + + com a velocidade de uma linguagem dinâmica como Python.</p></blockquote>
<div><strong> Site do Go escreveu: </strong></p>
<blockquote><p>Go attempts to combine the development speed of working in a dynamic language like Python with the performance and safety of a compiled language like C or C++.</p></blockquote>
</div>
<p>Fonte: <a href="http://www.techcrunch.com/2009/11/10/google-go-language/" target="_blank">techcrunch.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/google-lanca-linguagem-de-programacao-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando o VirtualBox por linha de comando Criando uma máquina virtual</title>
		<link>http://blog.scriptseguro.com.br/usando-o-virtualbox-por-linha-de-comando-criando-uma-maquina-virtual/</link>
		<comments>http://blog.scriptseguro.com.br/usando-o-virtualbox-por-linha-de-comando-criando-uma-maquina-virtual/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:58:47 +0000</pubDate>
		<dc:creator>Rodrigo Martins</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=521</guid>
		<description><![CDATA[Para utilizar o VirtualBox por linha de comando usaremos o comando VBoxManage.
Para exemplos de comandos com o VBoxManage use o comando:
$ VBoxManage --help
Ou então visite esta página do manual do VirtualBox:

 http://www.virtualbox.org/manual/UserManual.html#vboxmanage


Vamos criar agora uma máquina virtual com 512MB de RAM e 20GB de HD e instalar o Ubuntu 9.04 de uma imagem que está [...]]]></description>
			<content:encoded><![CDATA[<p>Para utilizar o VirtualBox por linha de comando usaremos o comando <em>VBoxManage</em>.</p>
<p>Para exemplos de comandos com o VBoxManage use o comando:</p>
<p><strong>$ VBoxManage --help</strong></p>
<p>Ou então visite esta página do manual do VirtualBox:</p>
<ul>
<li> <a href="http://www.virtualbox.org/manual/UserManual.html#vboxmanage">http://www.virtualbox.org/manual/UserManual.html#vboxmanage</a></li>
</ul>
<p><span id="more-521"></span><br />
Vamos criar agora uma máquina virtual com 512MB de RAM e 20GB de HD e instalar o Ubuntu 9.04 de uma imagem que está em /home/rodrigo/ubuntu-9.04-i386.iso.</p>
<p><strong>$ VBoxManage createvm -name "Ubuntu 9.04" -register<br />
$ VBoxManage modifyvm "Ubuntu 9.04" -memory "512MB" -acpi on -boot1 dvd -nic1 nat<br />
$ VBoxManage createvdi -filename "Ubuntu_9_04.vdi" -size 20000 -register<br />
$ VBoxManage modifyvm "Ubuntu 9.04" -hda "Ubuntu_9_04.vdi"<br />
$ VBoxManage registerimage dvd /home/rodrigo/ubuntu-9.04-i386.iso<br />
$ VBoxManage modifyvm "Ubuntu 9.04" -dvd /home/rodrigo/ubuntu-9.04-i386.iso</strong></p>
<h1>Algumas utilidades</h1>
<p>Para listar quais  <span style="color: #006600"><span style="text-decoration: underline">máquinas virtu</span></span><span style="color: #006600"><span style="text-decoration: underline">a</span></span><span style="color: #006600"><span style="text-decoration: underline">is</span></span> estão registradas no sistema use:</p>
<p><strong>$ VBoxManage list vms</strong></p>
<p>Para listar informações de uma máquina virtual específica use:</p>
<p><strong>$ VBoxManage showvminfo "Ubuntu 9.04"</strong></p>
<p>Depois de criada, ainda se pode modificar a máquina virtual, nesse exemplo modificaremos a memória:</p>
<p><strong>$ VBoxManage modifyvm "Ubuntu 9.04" -memory "1024MB"</strong></p>
<p>Outro exemplo de modificação da máquina virtual, onde mudaremos novamente a memória, colocaremos o drive de DVD como boot primário e desativaremos o suporte a USB:</p>
<p><strong>$ VBoxManage modifyvm "Ubuntu 9.04" -memory 512 -boot1 dvd -usb off</strong></p>
<p>Adicionar pastas compartilhadas:</p>
<p><strong>$ VBoxManage sharedfolder add "Ubuntu 9.04" -name "VirtualFiles" -hostpath "/home/rodrigo/arquivos"</strong></p>
<p>Para clonar um HD virtual use:</p>
<p><strong>$ VBoxManage clonevdi /home/rodrigo/.VirtualBox/Ubuntu_9_04.vdi /home/rodrigo/.VirtualBox/Ubuntu_9_04-COPIA.vdi</strong></p>
<p>O comando VBoxManage oferece diversas possibilidades, para ver a lista use:</p>
<p><strong>$ VBoxManage --help</strong></p>
<p><strong>By Rodrigo Martins </strong></p>
<p><strong>Paz e Bem<br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/usando-o-virtualbox-por-linha-de-comando-criando-uma-maquina-virtual/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Migrar para o Linux pode representar boa economia para sua empresa</title>
		<link>http://blog.scriptseguro.com.br/migrar-para-o-linux-pode-representar-boa-economia-para-sua-empresa/</link>
		<comments>http://blog.scriptseguro.com.br/migrar-para-o-linux-pode-representar-boa-economia-para-sua-empresa/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:55:03 +0000</pubDate>
		<dc:creator>Rodrigo Martins</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=518</guid>
		<description><![CDATA[Se o preço do Windows e de outros aplicativos empurram as contas de sua empresa para o vermelho, considere usar open source.
O Windows Vista foi lançado sob tímidos aplausos, seguidos por vendas fracas. Até o dia 30 de junho passado, empresas com pouca verba que não quisessem gastar com upgrade de hardware compatível com o [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Se o preço do Windows e de outros aplicativos empurram as contas de sua empresa para o vermelho, considere usar open source.</p></blockquote>
<p>O Windows Vista foi lançado sob tímidos aplausos, seguidos por vendas fracas. Até o dia 30 de junho passado, empresas com pouca verba que não quisessem gastar com upgrade de hardware compatível com o Vista ainda podiam adquirir o confiável Windows XP.</p>
<p><span id="more-518"></span></p>
<p>Mas, agora, o XP está disponível apenas na forma de downgrade a partir do Windows Vista. Ou seja, caso você queira usar o sistema operacional antigo, terá de pagar por uma cópia da versão mais nova e, só então, instalar o bom e velho XP usando a licença do Vista.</p>
<p>Se isso parece mau uso do precioso orçamento de TI da sua pequena empresa, e você ainda procura uma alternativa para o Windows Vista, você não precisa de nada além do Linux.</p>
<p>A razão? Existem várias: as versões mais recentes são grátis, fáceis de instalar, e altamente personalizáveis; o Linux tira proveito de seu hardware disponível sem sobrecarregá-lo; e inclui aplicativos e utilitários de sobra - claro, todos gratuitos também.</p>
<p>Migrar do Windows para o Linux pode acarretar em alguns gastos com funcionários e suporte técnico necessário para as configurações do novo sistema, além da instalação dos utilitários e aplicativos. Mesmo assim, a economia em futuros upgrades de hardware e software pode ser significativa.</p>
<p><strong>Sem licenças, sem taxas, sem dor de cabeça</strong><br />
Apesar de ser possível comprar uma versão comercial na caixa do Linux que inclui suporte, a distribuição do sistema operacional também está disponível gratuitamente sob as condições de <span>GPL (Gnu Gereral Public License)</span> de código aberto. Depois de decidir qual delas se quer usar, pode-se simplesmente baixá-lo, gravar num CD e instalá-lo em quantos computadores quiser.</p>
<p>A taxa de licenciamento do programa é zero, contra os cerca de 600 reais por máquina da versão completa do Windows Vista Business Edition. E, além disso, o Linux não tem as solicitações de ativação invasivas da Microsoft.</p>
<p>Além dos diversos outros aplicativos gratuitos, a maioria das versões do Linux vem com uma cópia do OpenOffice.org.</p>
<p>Ainda que não seja um substituto nos mínimos detalhes para o Microsoft Office, o OpenOffice.org sem dúvida dá conta do recado – e com uma economia de 1.600 reais por PC em relação ao Office Professional 2007 (versão completa). O pacote fica devendo um equivalente para o Microsoft Outlook, mas quase todos os Linux incluem o gratuito Evolution PIM da Novell.</p>
<p>Algumas aplicações baseadas em Windows, como AutoCAD, não possuem substitutos no Linux, mas para muitos usuários as (poucas) funcionalidades que faltam não justificam gastar uma pequena fortuna por um Windows e um Office. Além do que, se for o caso, basta saber que vários aplicativos de Windows irão rodar com velocidade normal no Linux por meio do utilitário <span>Wine </span>incluso na maioria das versões.</p>
<p>E mesmo para aqueles que não funcionam com o Wine, há mais duas opções: instalar uma cópia do Windows usando um dos utilitários grátis de virtualização que existem, como o <span>KVM </span>(baseado no kernel do Linux) e o <span>VMWare Server</span>, ou você pode particionar seu HD e ter os dois sistemas – Linux e Windows – instalados.</p>
<p>Na maioria dos casos, o mesmo disco contém aplicativos para servidor, incluindo o Apache Web Server, o gerenciador de banco de dados MySQL, virtualização e suporte para aplicativos CRM de empresas com a Oracle, Sybase e SAP.</p>
<p>O software de rede Samba emula os recursos de rede do Windows Server incrivelmente – e de graça – enquanto o Windows Server 2008 custa a partir de 2 mil reais (por cinco licenças). Dá até pra substituir o caríssimo Exchange pelo gratuito <span>Zimbra Collaboration Suite</span>, de código aberto.</p>
<p>Não importa se o Linux em questão é uma distribuição para desktop ou para servidores. Uma ou outra são reconhecidas por uma característica importante e que é um dos principais problemas do Windows: segurança.</p>
<p>Isso náão quer dizer que o Linux é magicamente imune a vírus, worms e outros ataques de Internet. O que ocorre é que a grande maioria das ameaças existentes visam o Windows e seus aplicativos - a <span>maioria das ameaças na web têm o Windows como alvo</span>.</p>
<p><strong>Diversos Linux</strong><br />
Duas edições do Linux nunca serão as mesmas, diferindo principalmente em quão amigáveis são os instaladores, se incluem versões experimentais de softwares e utilitários e quanto ao oferecimento de acesso a atualizações.</p>
<p>Os dois gerenciadores de janelas mais populares do Linux (programa que controla o visual e comportamento da interface gráfica do X Window) são o <span>Gnome </span>e o <span>KDE</span>. Algumas versões escolhem por instalar uma ou outra – o <span>Ubuntu </span>opta pela primeira, por exemplo, e o <span>OpenSuSe</span>, pela segunda.</p>
<p>Em todo caso, você pode instalar ambos (e diversos outros) em seu sistema e escolher qual usar quando logar. Diversos gerenciadores de janelas, principalmente o <span>Xfce </span>e o <span>BlackBox</span>, requerem menos memória e processamento gráfico do que o Gnome e o KDE, tornando-os boas escolhas para hardware antigo.</p>
<p>Distribuições mais leves do Linux, como <span>Puppy Linux</span>, reduzem o sistema operacional a seus elementos mais básicos, dando vida até ao PC mais ancião.</p>
<p>As versões também diferem em relação à compatibilidade com seu hardware em particular, principalmente em aparelhos de rede sem fio e adaptadores de tela.</p>
<p>Talvez a maneira mais fácil de avaliar essa compatibilidade com seu hardware, sem ter que instalar de fato o Linux, seja baixando, gravando e inicializando com um live-CD. O Ubuntu, o OpenSuSe, o <span>Gentoo </span>e centenas de outras distribuições do Linux vêm em versões <span>live-CD</span>.</p>
<p><strong>Obtenha ajuda se precisar</strong><br />
A realidade sobre suporte com sistema operacional é que custa muito dinheiro, seja da Microsoft, Apple, Novell ou Canonical. Uma cópia do Vista vem com 90 dias de suporte técnico via telefone, e-mail ou chat, contando a partir do dia que você ativa o produto. Após isso, a Microsoft cobra US$ 90 por problema.</p>
<p>Versões comerciais do Linux oferecem opções de suporte similares, porém mais baratas. <span>A versão de 60 dólares</span>, empacotada, do OpenSuSe 11.0 vem com 90 dias de suporte de instalação. Para serviços de longo prazo, escolha o SuSE Linux Enterprise Desktop (atualmente na versão 10) por 50 dólares anuais.</p>
<p>Ou então vá de Ubuntu e compre um contrato de suporte da fabricante Canonical, por a partir de <span>250 dólares por ano</span>.</p>
<p>Se você já se vira sem a equipe de suporte da Windows, um ano pode ser o máximo de serviço pago que vai precisar no Linux. Usuários do Ubuntu brincam que buscar por suporte técnico no Google geralmente traz os mesmo resultados do que procurar ajuda nos fóruns da Canonical.</p>
<p>O Linux é diferente do Windows, mas não é nenhum bicho de sete cabeças. O investimento humano que você faz em largar as custosas licenças do Windows e do Office pagam por si só rapidamente.</p>
<p>E o mais importante: você estará livre para rodar os softwares de desktop e servidor que quiser, no hardware pelo qual você pode pagar.</p>
<p>By Rodrigo Martins</p>
<p>Paz e bem</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/migrar-para-o-linux-pode-representar-boa-economia-para-sua-empresa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cinco razões que fazem o Ubuntu 9.10 melhor que o Windows 7</title>
		<link>http://blog.scriptseguro.com.br/cinco-razoes-que-fazem-o-ubuntu-9-10-melhor-que-o-windows-7/</link>
		<comments>http://blog.scriptseguro.com.br/cinco-razoes-que-fazem-o-ubuntu-9-10-melhor-que-o-windows-7/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:47:50 +0000</pubDate>
		<dc:creator>Rodrigo Martins</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=515</guid>
		<description><![CDATA[Nova versão do Linux (e praticamente qualquer outra distribuição) faz tudo que se precisa no PC, por menos dinheiro e problemas.
Mesmo reconhecendo que a Microsoft fez um bom trabalho com o Windows 7, que o novo sistema operacional está mais leve e é mais seguro que as versões anteriores já lançadas pela empresa, o que [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Nova versão do <em>Linux</em> (e praticamente qualquer outra distribuição) faz tudo que se precisa no PC, por menos dinheiro e problemas.</strong></p></blockquote>
<p>Mesmo reconhecendo que a Microsoft fez um bom trabalho com o Windows 7, que o novo sistema operacional está mais leve e é mais seguro que as versões anteriores já lançadas pela empresa, o que faz, então, um grande número de usuários continuar preferindo usar o Linux (sem contar os novos adeptos) e defender a plataforma open source com unhas e dentes?</p>
<p><span id="more-515"></span></p>
<p>Se os motivos listados abaixo lhe soam repetitivos, é porque eles continuam a ser os principais atrativos do sistema operacional Linux que a Microsoft ainda não conseguiu vencer.</p>
<p><strong>Segurança</strong><br />
Está provado: o Windows 7 é, realmente, o Windows mais seguro já criado pela Microsoft. Mas é melhor do que o Vista? Sim, é. Mais rápido do que o Windows XP? Hum... não muito. Ele conta com toneladas de aplicativos para ele? Sim.</p>
<p>Mas o Windows 7 vai continuar enfrentando a infindável batalha dos malwares e ainda carrega muito de um modelo de segurança a era pré-internet? Sim, infelizmente a resposta é sim.</p>
<p>É possível manter um PC com Windows seguro, a partir de hábitos seguros e munidos das ferramentas adequadas. Isto é um pouco mais fácil para aqueles usuários com mais experiência em computadores e que não se deixam enganar facilmente pelos novos truques que os criminosos virtuais vem empregando.</p>
<p>O problema é que nem todo mundo tem esse conhecimento e mesmo os que têm não querem passar o tempo todo atentos a esse tipo de situação, não querem ter de se preocupar se serão hackeados enquanto fazem compras na web ou ter de pensar duas vezes antes de visitar um site ou clicar em um link que chegue pelo correio eletrônico.</p>
<p>No Linux, felizmente, esses problemas simplesmente não existem e os usuários podem usar seus computadores sem este tipo de preocupação.</p>
<p><strong>Preço</strong><br />
Ok. Aqui vamos nós, uma vez mais, entrar na discussão sobre preço. Temos o novíssimo Ubuntu 9.10 funcionando perfeitamente em um PC da HP com processador Intel Pentium IV de 1,4 GHz e meros 512 MB de memória RAM, equipamento comprado em 2000. Seria impensável - e impossível - rodar qualquer versão decente do Windows 7 nesse equipamento.</p>
<p>Mas vamos deixar a questão do hardware de lado por um momento e pensar no preço do software. A versão mais barata do Windows 7 (Home Basic Full), no Brasil custa 329 reais - não existe a opção de atualização, embora a Microsoft possa lançá-la no início do próximo ano. Em contrapartida, o preço do Ubuntu 9.10 é... zero. Basta baixá-lo, instalar e começar a usar.</p>
<p><strong>Atualização mais fácil</strong><br />
Para atualizar o Ubuntu no PC mencionado acima, foram necessários os seguintes passos: baixar o arquivo e queimá-lo em um CD; iniciar o PC a partir deste disco e instalar o Ubuntu 9.10 nele. O tempo total para realizar isso foi inferior a uma hora.</p>
<p>A instalação do Windows 7 a partir do XP é um processo muito mais complexo e, em nossos testes, consumiu cerca de oito horas. Uma forma de encurtar esse processo é contar com o auxílio de alguns programas extras com o <span>Windows Easy Transfer</span> e o <span>PCmover,</span> além do disco de instalação do sistema operacional propriamente dito.</p>
<p>Definitivamente, esse não é um processo simples, a não ser que você goste muito de lidar com tecnologia e decida fazer isso por sua conta e risco. Se realmente quer usar o Windows 7, o melhor a fazer é comprar um PC novo já com o sistema operacional instalado.</p>
<p><strong>Compatibilidade de hardware</strong><br />
Ainda existe uma ilusão persistente de que o Linux suporta apenas um limitado conjunto de periféricos. Este é um conceito totalmente incorreto. O Ubuntu Linux é capaz de lidar com praticamente qualquer hardware disponível no mercado. Tudo bem que existem alguns itens específicos, em particular algumas placas gráficas e chipsets, para os quais será necessário baixar um driver adicional para poder obter o melhor desempenho gráfico possível.</p>
<p>Mas o que isso tem a ver com a comparação entre o Windows 7 e o Ubuntu? Muito. Ainda que a Microsoft tenha feito um trabalho muito melhor no quesito suporte a hardware com o novo Windows do que vimos no Vista, ainda existem alguns falhas de suporte com relação a alguns dispositivos bem comuns.</p>
<p>Por exemplo, o problema de sincronização do iPhone com o Windows 7 que parece resultado de um combinação entre a versão 64 bits do novo sistema operacional e algumas placas-mãe de alto desempenho que utilizam o chipset Intel P55 Express.</p>
<p>Ou que tal isso: as impressoras da HP ainda não possuem drivers compatíveis com o Windows 7. As informações mais recentes da consultoria IDC dão conta de que a HP detém 54% do mercado norte-americanos de impressoras. É inacreditável</p>
<p><strong>Aplicativos</strong><br />
O senso comum sugere que o Windows tem a vantagem de possuir o maior número de aplicativos disponíveis do que a plataforma Linux. E de fato tem, é fato.</p>
<p>Mas quantos desses os usuários realmente precisam e utilizam? É claro que se o que o usuário realmente precisa são recursos que só existem, digamos, no Adobe Photoshop, então ele não tem qualquer motivo de pensar em usar o Ubuntu nem qualquer outra distribuição Linux. Nesse caso, a pergunta seria: então por que não escolher rodas o Snow Leopard em um Mac? Mas esta é outra discussão.</p>
<p>Entretanto, com exceção de jogos, nada parece apontar em favor do sistema operacional da Microsoft. O Ubuntu (e várias outras distribuições também) vem com uma suíte de aplicativos de produtividade gratuita que faz praticamente tudo que o Office da Microsoft é capaz de fazer.</p>
<p>Quer um cliente de e-mail? O Outlook Express não vem mais com o Windows 7 (embora se ainda seja possível baixá-lo do site da Microsoft). Já o Ubuntu oferece o Evolution, um dos melhores utilitários de e-mail já desenvolvidos.</p>
<p>Precisa fazer backup do seu PC? As duas plataformas oferecem isso, mas apenas o Ubuntu proporciona um serviço online, o <span>Ubuntu One</span>, com 2 GB de capacidade disponível (gratuito) e 50GB no serviço pago.</p>
<p>Caso necessite de uma ferramenta que não tenha vindo com a distribuição, basta visitar o <span>Ubuntu Software Center</span>, a “loja” do Ubuntu. As aspas estão aí porque tudo o que está lá é gratuito.</p>
<p>No caso do Windows, todo mundo conhece o caminho das pedras. Ou você compra o aplicativo que precisa (seja em uma loja física ou online) ou procura por algo que sirva no Download.com ou Tucows, por exemplo. Só não se esqueça de ter seu cartão de crédito em mão, afinal um bom software para Windows dificilmente será gratuito.</p>
<p>Não esperamos, mesmo, convencer fãs de carteirinha do Windows a trocar de plataforma. Nosso objetivo é acrescentar um pouco mais de lenha na discussão e colocar os usuários para pensar. Se puder, experimente o Ubuntu - e pode-se fazer isso mesmo sem mexer em nada na sua instalação Windows atual.</p>
<p>Quem sabe você não acabe descobrindo que esta distribuição (ou qualquer outra) do Linux é capaz de fazer tudo o que você precisa em um computador com muito menos problemas e sem precisar gastar nada.</p>
<p>By Rodrigo Martins</p>
<p>Paz e bem</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/cinco-razoes-que-fazem-o-ubuntu-9-10-melhor-que-o-windows-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando programas 32bits em CentOS 64bits</title>
		<link>http://blog.scriptseguro.com.br/instalando-programas-32bits-em-centos-64bits/</link>
		<comments>http://blog.scriptseguro.com.br/instalando-programas-32bits-em-centos-64bits/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 15:32:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.scriptseguro.com.br/?p=513</guid>
		<description><![CDATA[Acesse o terminal como root, execute o comando:
# yum install glibc.i686
Após isso basta execultar sua aplicação.. =)
Simples mais difícil de se localizar esta informação na web, estou a 2hors...
]]></description>
			<content:encoded><![CDATA[<p>Acesse o terminal como root, execute o comando:</p>
<p><strong># yum install glibc.i686</strong></p>
<p>Após isso basta execultar sua aplicação.. =)</p>
<p>Simples mais difícil de se localizar esta informação na web, estou a 2hors...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scriptseguro.com.br/instalando-programas-32bits-em-centos-64bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
