terça-feira, 23 de fevereiro de 2010

DPEC Erro Root element is missing

Opa,
esse mês gostaria de continuar escrevendo sobre o spring security e como utiliza-lo atravez de anotação, mas acabei compranto um iphone, dai pensei em escrever um tutorial de como turbinalo, mas vou acabar escrevendo sobre um problema enfrentado que me tirou toda a atenção esses mês :(

Server was unable to process request. ---> Root element is missing.

Esse erro é retornado quando é enviado uma DPEC(resumo das notas fiscais eletronicas) ao projeto NF-e. O erro aparentemente é causado por alguma falha na formatação do XML certo?

Não, infelizmente não é o caso. Justifico:

Primeiro e mais estranho - A mesma DPEC uma hora é aceita outra hora o erro ocorre.
Segundo - O exemplo do manual de contiguencia esta tudo errado e nao serve de base para conferencia.
Terceiro - eu testei com 3 (três maneiras diferentes de envio e a mesma coisa acontecia.
Quarto (já tava no desespero), interceptei as mensagem enviado do proprio programa emissor do projeto que é disponibilizado gratuitamente, e estava igual ao do meu sistema.
Quinto - o erro tambem o ocorre no sitema deles kkkkkkkkkkkkkkk (ri alto)
Sexto - enviei email para o suporte, liguei no 0800, liguei ate em sao paulo na prodesp e ninguem sabe me responder o que acontece

Então meus amigos, o que fazer? Rezar paro o sistema não precisar de contingência?
O que aqui no Paraná quase nao acontece (rir alto)

sexta-feira, 15 de janeiro de 2010

Spring Security 3.0

Opa,

de volta das festas, resolvi criar um projeto utilizando maven,
ja tinha visto alguma coisa na pos-graduaçao, mas o desafio
era maior agora, pois quero criar um projeto que vai utilizar
ibatis na parte de persistencia, e Spring MVC para camada web
e Spring Security para controlar as permissoes do usuario e seu login.

Inicialmente coloquei o plugin m2eclipse (http://docs.codehaus.org/display/M2ECLIPSE/Home),
com ele no eclipse eu ja crio o projeto com o artefact para web.

Uma vez criado o projeto, vamos ao famoso pom.xml. Como eu queria utilizar a ultima versao do Spring a 3.0 o arquivo ficou assim:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.mactus</groupId>
<artifactId>projectus</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Gerenciador de Projetos da Mactus Infomatica</name>
<url>http://projectus.mactus.com.br</url>
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Milestone Repository</name>
<url>s3://maven.springframework.org/milestone</url>
</repository>
<repository>
<id>ibatis</id>
<name>Ibatis repo</name>
<url>http://svn.apache.org/repos/asf/ibatis/java/ibatis-2/trunk/ibatis-2-core/</url>
</repository>
<repository>
<id>spring-maven-milestone</id>
<name>Springframework Maven Repository</name>
<url>http://s3.amazonaws.com/maven.springframework.org/milestone</url>
</repository>

</repositories>
<pluginRepositories>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>



<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-acl</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.version}</version>
</dependency>




<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>


</dependencies>
<build>
<finalName>projectus</finalName>
</build>
<properties>
<spring.version>3.0.0.RELEASE</spring.version>
</properties>
</project>



O proximo passo foi colocar as configuraçoes certa em cada xml de configuracao do webproject

web.xml


<web-app>

<display-name>Archetype Created Web Application</display-name>

<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>

<!-- Carrega as configuraçoes do Spring security-->

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-security.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Mapeamento para o String MVC-->

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

<!-- Adicionar filtro para Segurança-->

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Vincular httpsession com o esquema de segurança do Spring-->

<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>

</web-app>


applicationContex-security.xml


<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<http auto-config='true'>

<intercept-url pattern="/login.htm" filters="none" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login.htm" always-use-default-target="false"
authentication-failure-url="/login.htm?authfailed=true" />
<logout invalidate-session="true" logout-success-url="/login.htm?loggedout=true"/>

<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/>
</session-management>

</http>

<!-- Aqui voce pode substituir por um bean que vai no banco de dados e verificao o usuario -->

<authentication-manager>
<authentication-provider>
<user-service>
<user name="user1" password="pass1" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="user2" password="pass2" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>

</beans:beans>


dispatcher-servlet.xml


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />

<context:component-scan base-package="br.com.mactus.web"/>

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

</beans>


Com essas configuraçoes voce ja pode inicial um projeto com autenticacao
para continuar voce vai fazer a parte de dao e service mas dai voce pode escolher
como vai fazer, com jdbc simples, hibernate, toplink... tudo por conta do Spring

Para finalizar vou colocar um exemplo de controller



@Controller
public class MainController {


@RequestMapping(value="/index", method = RequestMethod.GET)
public String index() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getAuthorities().contains("ROLE_ADMIN")) {
return "redirect:homeAdmin.htm";
} else {
return "redirect:home.htm";
}
}

@RequestMapping(value="/login", method = RequestMethod.GET)
public void login() {

}

@RequestMapping(value="/home", method = RequestMethod.GET)
public void home() {

}

@RequestMapping(value="/homeAdmin", method = RequestMethod.GET)
public void homeAdmin() {

}

}




Pra comerçar a brincadeira e´ isso por enquanto..

quinta-feira, 22 de outubro de 2009

Reflexão em Flex

Como diz um amigo meu:
Opa,

ainda estou apanhando com o flex, mas sei que no começo é assim mesmo
igual a irmão mais novo, despois que cresce ja viu ne...

para fazer reflexao em flex é mais ou menos assim:

flash.utils.getQualifiedClassName(obj:Object); // para pegar o qualify name de um obejto

e getDefinitionByName(name:String); // para pegar um objeto a partir de uma string;

exemplos:

var methodRef:Function = Function(flash.utils.getDefinitionByName(method));
methodRef.call(this);

var classReference:myClass;
var klas:Class=getDefinitionByName("myClass") as Class;



então a dica é a seginte: para elaborar um menu eu passava como parametro o objeto da janela que queria abrir para uma funcao showForm, no meu caso. So que mesmo passano o caminho correto recebia o erro:

Variable List is not defined. at global/flash.utils::getDefinitionByName()....

então, o esquema é criar uma variavel do tipo que vc vai instanciar por reflexao para o copilador nao se perder. ( eu sei que no Java isso nao precisa :p)

ex:


var formUsuario:usuario.List;
var formPassaro:passaro.List;
var formAlterarSenha:usuario.AlterarSenha;
new Util().showForm(this, getDefinitionByName(item) as Class);

segunda-feira, 19 de outubro de 2009

Conversao latin1 para utf-8

Uma dica rapida para outubro nao passar em branco.

como uso o postgres desde a versao 6.4
no inicio para aceitar os caracteres do brasil utilizava o latin1
como enconding.

hoje na versao 8.4 o suporte a utf-8 esta se tornando padrao, entao o
que fazer para migrar as bases antigas?

Resposta esta na utilizacao de conversores de codificaçao do arquivo de backup.

para linux faça o seguinte:

- Gere um backup normal com pg_dump:
pg_dump -i banco > backup.sql

- utilize recodificadores de caracteres, no meu caso escolhi o recode (http://www.gnu.org/software/recode/recode.html):
recode l1..utf8 backup.sql

- por final, edite o arquivo para retirar o SET client_encoding = 'LATIN1'; que o pg_dump gera:
vim backup.sql

- feito isso basta importa o backup para o novo banco ja criado com a codificaçao UTF-8
psql banco < backup.sql

sexta-feira, 11 de setembro de 2009

Palestra sobre Java Mobile com Roger Brinkley (Sun Microsystems)

Opa,

Dia 10 de setembro em maringa, mais precisamente no Cesumar, foi realizado uma palestra : "O futuro do desenvolvimento móvel com JavaME", com Roger Brinkley.

Roger Brinkley é o Líder da Comunidade Móvel & Embarcados da Sun Microsystems. É responsável pelo desenvolvimento comunitário relacionado a tecnologias Java ME. Roger possui mais de 30 anos de experiência profissional, sendo mais de 14 na Sun. É um palestrante asssíduo em conferências técnicas ao redor do mundo.

Estive la, com a ajuda (leia-se carona) do pessoal da unimake, e pude conferir de perto, estava na primeira fila, mais sobre o assunto.

O cara é estranho, começou lançando duas bolinhas de brinde da sun, com taco de golf,
pensei, hoje eu ganho brinde, que nada, foram os unicos de todo o encontro.

A desculpa foi que o tudo foi arranjado na hora, e ate o datashow e a tradução falharam.

Roger basicamente comentou sobre tres aspectos: mobile, tv digital, e embarcados.

Em relação a parte movel, ele comentou de um novo projeto chamado phoneME, que vai começar a vir no celulares para daqui uns 6 meses, esse projeto traz recursos avançados para o desenvolvedor inventar moda no celular. Assim ele pode programar para um e rodar em qualquer dispositivo com phoneME e tera o mesmo resultado, a mesma cara no caso. Comentou tambem sobre o lwuit (https://lwuit.dev.java.net/) que é um conjunto de componente para trabalhar com java me.

Na parte da tv digital o fato importante esta que a tecnologia brasileira esta toda em java, ele falou de projeto nos EUA o que pra mim ainda nao vem ao caso.

Por final, os embarcados (brinquedinhos caros), foi a que o pessoal gostou mais. Ele demonstrou o SUN SPOT, uns cubinhos que rodam aplicações java, que da pra inventar um monte de coisa, exemplo que ele demonstrou:

- um spot jogando bola com outro
- um carinho robo que desvia de obstaculos e ate de buraco
- um luva do tipo minority report, que ele usou para manipular imagens
- um dipositivo do tamnaho de uma carteira aberta que recebe dispositivos plug-play

Ja no no pinga-fogo, onde era proibido fazer pergunta sobre a oracle, o destaque foi para a resposta sobre o phoneME em relação o Java FX, a ide nova para programar para java mobile, e o suporte a multi-touch e android.

Do mais, o evento foi muito bom pois revi amigos e professores, e é bom ficar interado um pouco sobre novas tecnologias :)

terça-feira, 18 de agosto de 2009

replicaçao postgres morna quase pelando

Voltamos!

E hoje num dia chuvoso nada melhor que escrever um tutorial
- Ta loko!
- Por que?
- Bom mesmo e´ se funcionar :)

depois de algumas pesquisas(google) de como fazer replicaçao com bando de dados
postgres chegamos a alguns resultados:

Com slony, ´e legal quando voce quer replicar determinadas partes do banco,
e tem o pgadmin que ajuda muito na configuracao. Contras nao replica
objetos largos. qualquer coisa que mexer no master ex. alterar tipo de campo, criar tabela
tem que fazer a mesma coisa no slave, o replicador nao faz automatico.

Com pgcluter precisa de no minimo tres maquinas, em algums casos com maquina virtual
vc coloca pra funcionar tudo na mesma maquina, mas dai nao tem vantagem :(

Ai foi que nosso amigo Edson (unimake), sugeriu o modo standby, no qual o slaver fica sendo atualizado
pelo master em um determinado tempo e no que precisa esta pronto para entrar em produçao.

Em busca de mais detalhes desse modo, descobrimos que existe o modo hot, e warm,
o hot o slave fica no ar e esta apto para consultas, no modo war o slave fica baixado

E com base nesse tutorial (http://www.gulbf.com.br/?q=node/33) estamos fornecendo um modo
de fazer isso.

O ambiente testado foi ubuntu e a versao do postgresql 8.3.

Para facilitar vamos utilizar simbolos para descrever onde o comando deve ser executado:
* na maquina master @
* na maquina slave #

- instalar o postgres:
# @ apt-get install postgresql

- instalar o rsync
# @ apt-get install rsync

- parar o banco
# invoke-rc.d postgresql-8.3 stop

- habilitar a conexao do ssh por chave publica
@ ssh-keygen

- copiar a chave publica para a slave
@ scp .ssh/id_rsa.pub root@192.168.1.x:/root/

- copiar o arquvio para .ssh/authorized_keys se nao existir
# cp /root/id_rsa.pub /root/.ssh/authorized_keys
- ou ediar se exister e colar o conteudo do id_rsa.pub para dentro
# vim .ssh/authorized_keys

- igualar o UID do usuario e do grupo postgres de ambas as maquinas

# vim /etc/group
# find / -group 109 -exec /bin/chown -v .125 {} \;
- onde o 109 era o uid antigo e 125 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

# vim /etc/passwd
- lembrar de alterar o uid do group caso foi alterado acima
# find / -user 104 -exec /bin/chown -v 113 {} \;
- onde o 104 era o uid antigo e 113 ´e o uid novo, caso for diferente o uid do slave em relacao ao master

- mover o diretorio da instalacao e preparar um novo para recever os arquivo do master
# mv main/ main-old/
# mkdir main
# chown postgres:postgres main -R

Tudo pronto so sincronizar e rezar

@ /usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/

Funciono? Graças a Deus?

agora so colocar um scrpt prar a cada intervalo sincronizar


#!/bin/bash
echo 'Iniciando sincronizacao de arquivos...'
/usr/bin/rsync -Cravzp /var/lib/postgresql/8.3/main/ root@192.168.1.x:/var/lib/postgresql/8.3/main/
echo 'Finalizado.'
echo 'Aguardando proxima sincronizacao...'
sleep 60
exec $(pwd)/replica.sh




Entao vou acrescentar mais algumas dicas como forma de melhoria do post

a primeira dela é simples, para poder configurar o rsync para poder conectar em uma porta diferente do ssh. Deve-se utilizar o parametro:
/usr/bin/rsync -Cravzp --rsh='ssh -p2220'

a segunda é tambem relacionada ao rsync. Em alguns casos o servidor slave pode executar o comando de sincronismo sem problemas, assim varias maquinas podem ser sincronizadas ou tambem, por algum motivo de segurança o servidor nao pode acessar o ssh do slave.

a terceira é importante! nao foi colocado nesse post mas é recomendavel habilitar os archives do postgres, assim se o db no master corromper, a replicação é repassada mas pelo logs da pra recuperar

sexta-feira, 29 de maio de 2009

Margem espelho ireport (jasper para os leigos)

Trata-se de uma POG utiliza para gerar relatorios com margem espelhos:
o esquema ´e o seginte:
- cria-se dois relatorios iguais no conteudo, um com a margem certa e outro com a margem recuada
- depois passa pegando uma folha de cada para gerar o relatorio final



Report report = new Report(txDateInitial.getText(), txDateFinal.getText());
report.setBeginBefore(beginBefore);
report.setIsVerso((rbFrente.isSelected() ? Boolean.FALSE: Boolean.TRUE));
report.setFolha(folha);


String pathReportRecto = Util.getResource().getProperty("pathReportRecto");
JasperPrint printRecto = report.getReport(pathReportRecto);

String pathReportVerso = Util.getResource().getProperty("pathReportVerso");
report.setFolha((rbFrente.isSelected() ? folha-1: folha));
JasperPrint printVerso = report.getReport(pathReportVerso);

JasperPrint jasperPrint = new JasperPrint();
jasperPrint.setOrientation(JasperReport.ORIENTATION_LANDSCAPE);
jasperPrint.setName("Protocolo");

if (rbFrente.isSelected()) {
jasperPrint.setPageWidth(printRecto.getPageWidth());
jasperPrint.setPageHeight(printRecto.getPageHeight());
} else {
jasperPrint.setPageWidth(printVerso.getPageWidth());
jasperPrint.setPageHeight(printVerso.getPageHeight());
}

int i = 0;
Iterator<jrprintpage> iterator = printRecto.getPages().iterator();
Iterator<jrprintpage> iterator2 = printVerso.getPages().iterator();

if (rbFrente.isSelected()) {

while ( iterator.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
} else {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
}
i++;
}

} else {
while ( iterator2.hasNext() ){
if (i % 2 == 0) {
jasperPrint.addPage(i, iterator2.next());
if (iterator.hasNext())
iterator.next();
} else {
jasperPrint.addPage(i, iterator.next());
if (iterator2.hasNext())
iterator2.next();
}
i++;
}

}

report.closeConnection();


if (jasperPrint.getPages().size()>0) {
Preview preview = new Preview(jasperPrint);
preview.setVisible(true);
preview.setExtendedState(MAXIMIZED_BOTH);
} else {
JOptionPane.showMessageDialog( this, "Os parametros informados não geraram nenhum relatório.", "Erro", JOptionPane.ERROR_MESSAGE);
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
ex.printStackTrace();
}