quarta-feira, 26 de dezembro de 2012

Acessando posições de lista JSTL

Vamos supor que você queira acessar uma posição específica da sua lista com JSTL, em casa posição da lista existe um objeto da classe Pessoa, que possui os seguintes atributos:

class Pessoa{
 private String id;
 private String nome;
 private String email;

 /*getters e setters*/
}

Vamos supor também que na sua jsp você queira acessar especificamente a primeira posição da lista, somente a primeira posição e você não quer utilizar um <c:forEach>. Como fazer isso sem iterar a lista ? Devo por no request o objeto na primeira posição da lista ? E se quiser um outro objeto da lista ? Devo settar no request também ?

A solução para isso é mais simples do que parece, vamos supor que você setou a lista request com o nome de lista. Na JSP, você deverá acessar a primeira posição desta forma:

${lista[0]}

Desta forma você terá acesso ao objeto da classe Pessoa, que está na primeira posição mas, se você quiser acessar o nome, ou o email ou o id ?

Para acessar o nome: ${lista[0]}.nome
Para acessar o email: ${lista[0]}.email
Para acessar o id: ${lista[0]}.id
Leia Mais ››

quarta-feira, 19 de dezembro de 2012

Configuração de SSL no Apache

Esse post é sobre como gerar os certificados SSL no CentOS utilizando o OpenSSL e ativá-los no Apache para permitir conexões criptogradas ao seu servidor Web, para isso precisamos inicialmente instalar os pacotes necessários (caso ainda não estejam instalados):

# yum install mod_ssl openssl

Agora iremos gerar a chave privada:

# openssl genrsa -out ca.key 1024

Gere o arquivo CSR:
# openssl req -new -key ca.key -out ca.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:BR
State or Province Name (full name) [Berkshire]:Rio de Janeiro
Locality Name (eg, city) [Newbury]:Rio de Janeiro
Organization Name (eg, company) [My Company Ltd]:Exemplo
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your servers hostname) []:www.exemplo.com
Email Address []:admin@exemplo.com

Please enter the following extra attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

OBS.: Common Name deverá ser a URL do serviço, nesse exemplo www.exemplo.com.

Assine o arquivo CSR utilizando a chave privada para gerar o certificado:

# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Mova os arquivos para a localização correta:

# mv ca.crt /etc/pki/tls/certs
# mv ca.key /etc/pki/tls/private/ca.key
# mv ca.csr /etc/pki/tls/private/ca.csr

Caso não utilize Virtual Host no seu servidor Apache, basta alterar as linhas abaixo no arquivo de configuração do SSL:

# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

E reinicie o serviço:

# /etc/init.d/httpd restart

Caso utilize Virtual Host será necessário alterar o arquivo de configuração do Virtual Host ao invés do arquivo de configuração do SSL, abra o arquivo e adicione no início do arquivo:

# vim /etc/httpd/conf.d/meu_vhost.conf

NameVirtualHost *:443

E após a configuração do <VirtualHost *:80> adicione a entrada referente ao SSL:

# vim /etc/httpd/conf.d/meu_vhost.conf


SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

AllowOverride All

DocumentRoot /var/www/vhosts/exemplo.com/htdocs
ServerName www.exemplo.com

Feito isso reinicie o serviço:

# /etc/init.d/httpd restart

Pronto! Basta acessar seu servidor ou Virtual Host pelo seu navegador/browser preferido utilizando https para verificar o certificado criado!
Leia Mais ››

segunda-feira, 17 de dezembro de 2012

Ferramentas para JSON

Galera, olá de novo, um dia tava precisando pegar uns dados que estavam vindo do servidor pra montar uma select, ai de primeira instância pensei em XML, só que isso me daria muito trabalho, pois precisaria de uma biblioteca java pra converter minha lista de objetos em um array xml sem ter grande trabalho. Então resolvi desistir porque não tava afim de xml, precisava de algo novo, ai pensei "porque não JSON ?"

Então, procurei um tutorial para aprender como é a estrutura do JSON e achei esse, que é muito bom.

http://www.devmedia.com.br/introducao-ao-formato-json/25275
 
Depois de ter aprendido a estrutura do JSON, começei a minha construção. Depois de construído minha string JSON ia para dentro de um método javascript e, precisava convertê-las em objetos javascript para assim conseguir trabalhar com mais facilidade. Mais um problema. Então pensei "como vou fazer isso?". Lembrei que existe um método do jquery que já faz isso pra mim sem problema algum e com a maior facilidade, esse método que é o método

$.parseJSON ou jQuery.parseJSON

documentação: http://api.jquery.com/jQuery.parseJSON/

Na transformação da string em codificação JSON, tomei alguns erros, logo precisava de alguma ferramenta web de conversão para ver qual era o problema e, achei duas muito boas:

http://json.parser.online.fr/

http://jsonviewer.stack.hu/

Outra referência muito boa de JSON:

http://www.json.org/

And always, have a nice day :D

Leia Mais ››

terça-feira, 11 de dezembro de 2012

Instalando e configurando o OpenLDAP

Tutorial aplicado em servidor CentOS 6.3 x64, para outras distribuições as configurações de apache e instalação de pacotes sofrerão mudanças.
1) Conceitos:

slapd: este é daemon isolado do LDAP. Ele escuta por conexões LDAP na porta 389 (636 para SSL)

2) Instalação
# yum install -y openldap-servers openldap-clients pam_ldap nss-pam-ldapd

3) Criar uma senha para o LDAP
# slappasswd
Anote essa senha em algum arquivo de texto. A senha é algo como {SSHA}LwxaxndI3HZUj29FYy2LFt/e3AlnUWzz.
Você precisará dela posteriormente.

4) Crie o arquivo ”/etc/openldap/slapd.conf”
# cd /etc/openldap
# vi slapd.conf

5) No arquivo slapd.conf, copiar e colar o seguinte texto. Atente-se aos campos em vermelho, fazendo as devidas alterações. Lembrando de alterar a senha no campo “rootpw” para a senha gerada anteriormente
database bdb
suffix "dc=empresa,dc=edu,dc=br"
rootdn "cn=Manager,dc=empresa,dc=edu,dc=br"
# Senhas em texto plano, especialmente para o rootdn, devem
# ser evitados. Veja slappasswd (8) e slapd.conf (5) para mais detalhes.
# Uso de autenticação forte incentivado.
rootpw digite_a_senha_gerada_aqui
directory /var/lib/ldap

6) Testar as configurações
# slaptest -u

7) Editar o arquivo “/etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif“
# vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif
Altere
olcSuffix: dc=my-domain,dc=com
para:
olcSuffix: dc=empresa,dc=edu,dc=br
Altere também:
olcRootDN: cn=Manager,dc=my-domain,dc=com
para:
olcRootDN: cn=Manager,dc=empresa,dc=edu,dc=br
Adicionar neste mesmo arquivo as linhas de comando a seguir:
olcRootPW: digite_a_senha_gerada_aqui
olcTLSCertificateFile: /etc/pki/tls/certs/slapdcert.pem
olcTLSCertificateKeyFile: /etc/pki/tls/certs/slapdkey.pem

8) Editar o arquivo “/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif“
# vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
substitua:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
l,cn=auth" read by dn.base="cn=manager,dc=my-domain,dc=com" read by * none
por:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" read by dn.base="cn=Manager,dc=empresa,dc=edu,dc=br" read by * none

9) Atualize as bases de dados
# updatedb

OBS: Para utilizar esse comando instale o mlocate, yum install mlocate -y

10) Atualize as permissões do diretório /var/lib/ldap/
# chown -R ldap:ldap /var/lib/ldap/

11) Crie o arquivo /var/lib/ldap/DB_CONFIG
# vi /var/lib/ldap/DB_CONFIG
E nele copie e cole o texto abaixo:
# $OpenLDAP: pkg/ldap/servers/slapd/DB_CONFIG,v 1.3.2.3 2007/08/31 23:13:57 quanah Exp $
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See Sleepycat Berkeley DB documentation
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
# in particular:

# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.

# one 0.25 GB cache
set_cachesize 0 268435456 1

# Data Directory
#set_data_dir db

# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
#set_lg_dir logs

# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option).

12) habilitar TLS encryption
# vi /etc/sysconfig/ldap
Substitua
SLAPD_LDAPS=no
por
SLAPD_LDAPS=yes

13) Gerar os certificados de autenticação
# openssl req -new -x509 -nodes -out /etc/pki/tls/certs/slapdcert.pem -keyout /etc/pki/tls/certs/slapdkey.pem -days 365
A seguir lhe serão feitas algumas perguntas. Preencha os campos da seguinte forma:
Country Name (2 letter code) [XX]:br State or Province Name (full name) []:ce
Locality Name (eg, city) [Default City]:fortaleza
Organization Name (eg, company) [Default Company Ltd]:nome de sua empresa
Organizational Unit Name (eg, section) []:diretoria de ti
Common Name (eg, your name or your server's hostname) []:ti
Email Address []:seuemail@email.com.br

14) Mude as permissões do certificado
# chown -Rf root:ldap /etc/pki/tls/certs/$cert.pem; chmod -Rf 750 /etc/pki/tls/certs/$key.pem

15) testar as configurações
# slaptest -u

Deverá aparecer a mensagem “config file testing succeeded”
16) Iniciar o slapd
# /etc/init.d/slapd start

17) Verifique o status do servidor LDAP com o comando:
# /etc/init.d/slapd status

18) Criar o arquivo “base.ldif” dentro de “/etc/openldap”
# vi /etc/openldap/base.ldif

19) Copie e cole o seguinte texto:
dn: dc=empresa,dc=edu,dc=br dc: empresa
objectClass: top
objectClass: domain

dn: ou=People,dc=empresa,dc=edu,dc=br
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=empresa,dc=edu,dc=br
ou: Group
objectClass: top
objectClass: organizationalUnit

20) Ao finalizar digite:
# ldapadd -x -W -D "cn=Manager,dc=empresa,dc=edu,dc=br" -f base.ldif
O comando pedirá a senha do LDAP para inserir os dados. Digite-a. A saída do comando deve ser:
adding new entry "dc=empresa,dc=edu,dc=br"
adding new entry "ou=People,dc=empresa,dc=edu,dc=br"
adding new entry "ou=Group,dc=empresa,dc=edu,dc=br"

21) digite o comando a seguir para ver como ficou!
# ldapsearch -x -b "dc=empresa,dc=edu,dc=br"

22) Criar o arquivo “groups.ldif” dentro de “/etc/openldap”
# vi /etc/openldap/groups.ldif
Insira o seguinte texto:
# criar o grupo group1 na Group

dn: cn=group1,ou=Group,dc=empresa,dc=edu,dc=br objectClass: posixGroup
objectClass: top
cn: group1
description: generic group 1
userPassword: digite_a_senha_gerada_aqui
gidNumber: 1001

# criar o grupo group2 na Group

dn: cn=group2,ou=Group,dc=empresa,dc=edu,dc=br objectClass: posixGroup
objectClass: top
cn: group2
description: generic group 2
userPassword: digite_a_senha_gerada_aqui
gidNumber: 4

23) Digite o comando:
# ldapadd -x -W -D "cn=Manager,dc=empresa,dc=edu,dc=br" -f groups.ldif
A saída do comando deve ser:
adding new entry "cn=ldapusers,ou=Group,dc=empresa,dc=edu,dc=br"
adding new entry "cn=ldapadm,ou=Group,dc=empresa,dc=edu,dc=br"
Obs: para excluir basta digitar:
# ldapdelete -x -W -D "cn=Manager,dc=empresa,dc=edu,dc=br"
"cn=group1,ou=Group,dc=empresa,dc=edu,dc=br"
# ldapdelete -x -W -D "cn=Manager,dc=empresa,dc=edu,dc=br"
"cn=group2,ou=Group,dc=empresa,dc=edu,dc=br"

24) Criar o arquivo “newpeople.ldif” dentro de “/etc/openldap”
# vi /etc/openldap/newpeople.ldif
Insira o seguinte texto:
dn: uid=group1,ou=Group,dc=empresa,dc=edu,dc=br
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ti
uid: ti
uidNumber: 3000
gidNumber: 1001
homeDirectory: /home/ti
loginShell: /bin/bash
gecos: Ti,Analista de Sistemas,Diretoria de TI,85-12345678
userPassword: digite_a_senha_gerada_aqui
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0

25) digite o comando:
# ldapadd -x -W -D "cn=Manager,dc=empresa,dc=edu,dc=br" -f newpeople.ldif
A saída deve ser:
adding new entry "uid=blah,ou=People,dc=empresa,dc=edu,dc=br"

26) Buscas no ldap
# ldapsearch -x -b "dc=empresa,dc=edu,dc=br"
27) Instalando EPEL e PHPLDAPADMIN
# yum install -y php php-cli php-commom php-ldap
# yum --enablerepo=epel -y install phpldapadmin
# /etc/init.d/httpd restart

28) Configurar ldapadmin:

No arquivo /etc/httpd/conf.d/phpldapadmin.conf, adicione o range de ip ou lista de ip's com permissão de acesso a pagina de administração do ldap.

Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs

<Directory /usr/share/phpldapadmin/htdocs>
  Order Deny,Allow
  Deny from all
  Allow from 127.0.0.1 10.0.0.0/24   # IP address you allow
  Allow from ::1
</Directory>

29) Liberar as portas 389 para o serviço slapd e 80 para o apache no iptables do servidor:

iptables -A INPUT -s 10.0.0.0/24 -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

30) Acesse o navegador e digite:
Leia Mais ››

segunda-feira, 10 de dezembro de 2012

Ireport corta texto

Mais uma vez desenvolvendo um relatório me deparei com um problemão, quando mandava uma string muito grande para ser exibida no report, a string vinha cortada, o texto não vinha completo. Pesquisando que nem um doido, descobri que isso era causado pela fonte que estava usando e pelo fato de uma propriedade não estar marcada.

A configuração de fonte que estava usando era: Tahoma - 8pt no report e no pdf era Sans-Serif - 8pt e isso era parte do problema. Para que funcionasse perfeitamente a exibição dos dados, tinha de mudar a fonte do report para Arial. Existe uma compatibilidade entre fontes por causa do espaçamento delas.

Um outro ponto que foi chave na solução do problema, foi marcar a seguinte propriedade:

"net.sf.jasperreports.print.keep.full.text

Property used to determine whether the fill process must preserve the original text for text elements that are not able to fit their entire contents. When this property is set, the engine saves the original text in the JRPrintText print text object, along with the index at which the text is to be truncated by the print object."


Essa propriedade está disponibilizada quando você dá um duplo clique em cima de seu parâmetro, field ou variável que representa a string. Existe um espaço para propriedades especiais que nem essa, clique no botão "Edit parameter properties" ou "Edit field properties, uma janela abrirá e nela você verá uma lista de propriedade e dois campos. Clique na propriedade descrita acima, automaticamente o primeiro campo será preenchido e no segundo campo informe que o valor dela será true.

Pronto, isso soluciona o problema. Espero ter ajudado.

http://www.guj.com.br/java/129174-jasper--ireport-cortando-texto
Leia Mais ››

quarta-feira, 21 de novembro de 2012

Tamanho de lista Struts 1

Isso sempre foi um pouco problemático pra mim pq é uma coisa simples mas não sabia como acessar o método size() da lista. A soluçao q usava era por no request, via form-bean ou não, o tamnho da lista e na jsp eu manipulava normalmente mas, existe uma solução do struts para isso.


<bean:size id="tamanhodalista" name="meuform" property="lista" />
<bean:write name="tamanhodalista" />

Desse jeito você conseguirá recuperar o tamanho da lista sem ter que usar request ou seu form-bean.
Leia Mais ››

terça-feira, 16 de outubro de 2012

Conversão de tipos em JavaScript

Como converter uma string em um boolean ? Pesquisei sobre o problema e cheguei a uma solução muito boa. O operador == realiza conversões implícitas. Veja exemplo abaixo:

var a = "true";
var b = ( a == "true" );

A variável b será um boolean com o valor true caso a variável a seja igual a true mas, caso seja false, a variável b será false. Se você tentar passar a String("true" ou "false") para o construtor da classe Boolean, não irá funcionar pois, se a objeto boolean não tiver um valor inicial, ou se um desses valores abaixo forem passados:
  • 0
  • -0
  • null
  • ""
  • false
  • undefined
  • NaN
o objeto é setado como falso. Para qualquer outro valor é setado true!

Se alguém souber como faz conversões usando o operador ==, comenta ai embaixo.

Fonte: http://www.w3schools.com/js/js_obj_boolean.asp
http://stackoverflow.com/questions/263965/how-can-i-convert-a-string-to-boolean-in-javascript
Leia Mais ››

quarta-feira, 22 de agosto de 2012

Como redefinir a senha de root do MySQL

Quebrei muito a cabeça para tentar redefinir a senha de roor do MySQL, achei várias formas na internet mas o que funcionou comigo foi desinstalar o MySQL(recomendo olhar o post "Como desinstalar o MySQL") e após desinstalar, instalar de novo e redefinir a senha no momento de configuração.

Caso esteja falando alguma besteira, deixe seu comentário abaixo :p
Leia Mais ››

Como desinstalar o MySQL

Uns dias atrás tava tentando desinstalar o MySQL, aí tentei fazer de várias formas, apaguei a pasta do computador, procurei tudo o que tinha escrito "MySQL" e nada funcionava. Então resolvi remover a instância do MySQL com o programa MySQLInstanceConfig.exe que fica dentro da seguinte pasta:

C:\Program Files\MySQL\MySQL Server 5.1\bin (Windows)

Com esse programinha removi a instância e depois com o próprio instalador desistalei o MySQL e ele fez todo o trabalho de remover tudo da máquina.

Espero que isso sempre funcione :p
Leia Mais ››

quinta-feira, 9 de agosto de 2012

O que é tabindex e pra que serve ?

Tabindex é um atributo como qualquer outro das tags html, muito usado nas tags "input". O tabindex serve para controlar a ordem em que o cursor percorrerá os campos de um formulário ao se utilizar a tecla TAB. Este atributo pode ser utilizado em hyperlinks e elementos de formulário(inputs, selects, entre outros).

Quando se constrói um formulário em html e não se especifica o tabindex, a ordem do cursor será de cima para baixo, da esquerda para a direita, ou seja, o padrão. Mas, quando o tabindex é especificado através de números (ordem que o cursor deverá percorrer), o controle de movimentação do cursor é feito. Após o término da especificação do tabindex, o padrão volta a ser adotado.

Segue exemplo de formulário que usa o tabindex.

<html>
    <head>
   
    </head>
    <body>
        <form>
            Formulário de assinatura de revista
            <br/>
            <br/>
            Nome: <input type="text" name="nome" tabindex="1" size="35" value="" /> <br/>
            Idade: <input type="text" name="idade" tabindex="3" size="35" value="" /> <br/>
            Sexo: <input type="radio" tabindex="2" name="sexo" value="M" /> Masculino &nbsp <input type="radio" name="sexo" value="F" /> Feminino <br/>
            Tipo de Pagamento:
            <select name="tiposPagamento">
                <option value="1">A vista</option>
                <option value="2">Parcelado no crédito</option>
                <option value="3">Cheque</option>
            </select>
        </form>
    </body>
</html>

Referência: http://warau.nied.unicamp.br/warauv2/?q=node/30


Leia Mais ››

terça-feira, 24 de julho de 2012

Carregar arquivo(dump) .sql no banco MySQL

Eis a solução via cmd ou shell. O comando mysql no windows só pode ser executado dentro da pasta bin do MySQL no Program Files(Arquivos de programas).

mysql -u USUARIO -p nome_banco < nome_arquivo

É importante citar que o banco que sofrerá o dump precisa estar criado.
Leia Mais ››

terça-feira, 17 de julho de 2012

Espaços em branco em navegadores

Isso me deu uma grande dor de cabeça, porque estava tentando bloquear espaços em branco em campos de input. Em qualquer outro navagador que não seja o IE espaços em branco são tratados da forma correta, ou seja,

" "

, logo é possível bloquear esse caracter através de uma simples codificação javascript mas, no IE esse mesmo espaço em branco citado acima é interpretado dessa forma:

""

ou seja, o "trim" é automático.

Compartilho isso porque tive uma grande dor de cabeça para perceber o mesmo. Contudo, se você deseja bloquear espaços em brancos recomendo o jQuery.trim(), que funciona muito bem e em qualquer browser.
Leia Mais ››

sexta-feira, 13 de julho de 2012

Fazer backup de banco MYSQL(mysqldump)

Depois de uma p*** trabalheira consegui fazer, segue comando:

mysqldump -h localhost -u seuusuario -p nomedoseubanco > arquivodedestino

Lembrem-se de que para rodar o mysqldump do windows é necessário ir na pasta aonde está instalado o mysql. Geralmente fica em "Program Files"
Leia Mais ››

domingo, 17 de junho de 2012

Criação de checkbox no struts 2

A criação de chekbox no struts 2 é bem fácil. Para se criar uma checkbox é só utilizar a tag e criar um atributo na sua action do tipo boolean ou Boolean.

Exemplo:

Na action

public class ClasseAction{
private Boolean recebeEmail;

public Boolean getRecebeEmail(){
 return this.recebeEmail;
}

public Boolean setRecebeEmail(Boolean recebeEmail){
 this.recebeEmail = recebeEmail;
}}

Na jsp

<s:checkbox name="recebeEmail" />

É importante citar que o nome do atributo na action não pode ser nomeado como isRecebeEmail, como é de padrão para atributos booleanos, visto que a checkbox não irá funcionar corretamente se o atributo for nomeado assim. A tag s:scheckbox so precisa de ter seu atributo name definido, onde o name tem de ser igual ao atributo da action. O atributo fieldValue e value da tag checkbox não precisam ser definidos tambem porque o fieldValue é por padrão true, só será necessário defini-lo se houver a necessidade de muda-lo e, o atributo value também não precisa ser definido pois o próprio struts se encarrega de criar esse value. Esses dois atributos servem para deixar a checkbox "cheked". Se o value for igual ao fieldValue, a checkbox fica "checked" senão não fica.

Espero ter ajudado.
Leia Mais ››

quinta-feira, 16 de fevereiro de 2012

Como usar MaskFormatter sem preencher toda a máscara ?

No sistema que estou desenvolvendo para a minha conclusão de graduação, estou usando Swing no NetBeans 7.0.1 e me deparei com uma situção bem chata no desenvolvimento do projeto. Havia uma tela com campos que precisava validar a entrada de dados, alguns campos só tinham que aceitar números, outros poderiam aceitar qualquer caracter e por ai vai. Comecei a pesquisar e percebi que muitas pessoas utilizavam o componente JFormattedTextField para esse tipo de trabalho, então comecei a fazer minhas experiências e no começo obtive sucesso mas, depois percebi que quando nao preenchia toda a máscara a informação que estava na caixa de texto sumia. Mais uma vez pesquisei sobre o assunto e encontrei a solução e vou compartilha-lá com vocês.

Nesse meu caso eu "setava" a máscara via minha codificação, assim tendo um trabalhão. Quando se trabalha com swing existem duas certezas, a primeira é: tem se conhecer bem OO e java e a segunda é: ter paciência pra escrever bastante código. Tendo essas duas certezas na cabeça, o segredo é saber utilizar bem os recursos que a ferramente provê e isso o NetBeans faz bem.

Para esse tipo de problema com máscara o NetBeans disponibiliza um editor com máscaras prontas(numérica, moeda, data, entre outros) e nos livram dessas dores de cabeça, para usar esse editor siga os seguintes passos:

clique com botão direito do mouse em cima do JFormattedTextField > Propriedades > formatterFactory > clique no botão de alteralção > o editor vai ser aberto.

Espero ter ajudado, fiz esse post em cima desse endereço

http://javafree.uol.com.br/topic-862647-Mascaras-no-NetBeans.html

Dêem sua opinião galera.
Leia Mais ››

quinta-feira, 9 de fevereiro de 2012

Mudando cores no iReport

Um certo dia, estava construindo um relatório no iReport (uso o 3.0.0) e tive que resolver o seguinte problema:
Tinha uma listagens de participantes de uma gincana e nessa listagem que constituía uma tabela, havia uma coluna com o título de "Vencedor". Nessa coluna era marcado quem era o vencedor da gincana. Quando o participante era vencedor a linha em que ele estava na tabela tinha de ficar verde, caso contrário continua na cor normal.

Para resolver esse problema, logo pensei que teria de criar uma regra para isso mas, o problema que enfrentava era que não sabia mudar a cor dinamicamente de text field em tempo de execução. Então, começei a pesquisar sobre o assunto e achei duas soluções que irei compartilhar.

A primeira solução é uma solução que funciona mas, não é a melhor de todas. Essa solução consiste em alterar a expressão de campo de texto. Para fazer isso é necessário seguir o seguinte caminho:

clicar com o botão direito no text field independente em que banda ele estiver > propriedades > Campo texto > Expressão de Campo de Texto.

Na área de "Expressão de Campo de Texto", você põe sua regra mudando a cor do campo, no meu caso fiz:
($f{flagVencedor.byteValue() == 0}) "" ? : ""

Logo após por sua regra, é necessário ir na aba "Todos", encontrar a propriedade "Texto estilizado" e marcar o checkbox. Pronto, vai funcionar. Essa regra avalia o field "flagVencedor", se esse field for igual a 0, não escreve nada pois 0 significa que o participante não é vencedor, caso contrário, escreve "Vencedor".

Essa primeira solução não é a melhor de todas pois, primeiramente, você quando faz isso não está utilizando uma solução da ferramenta, ou seja, em versões futuras do ireport é capaz de que o que você fez falhar se os report construidos migrarem. O que foi escrito na expressão de campo de texto é uma tag que faz parte do xml construído pelo ireport, fazendo desse jeito a mudança de cor você delega a responsabilidade de mudanças do XML para uma outra funcionalidade que tem somente responsabilidade de exibir valores.

A segunda solução é uma solução mais refinada, simples e com menos probabilidade de dar erros. A segunda solução consistem em criar um estilo pelo próprio iReport e associá-lo à seu text field. Para criar esse estilo é necessário seguir o seguinte caminho.

Vá no menu Formatar > Estilos > Janela será aberta, clique em "Novo".

Logo após clicar em "Novo", uma janela será aberta, com várias propriedades que podem ser mudadas. Um espaço no lado direito chamado "Condições do estilo" será mostrado. Por default, a condição "Padrão" já é mostrada. Essa condição constitui uma condição que qualquer elemento do ireport adota implicitamente. Então, qualquer propriedade mudada ali vai afetar qualquer elemento que esteja no seu report. Como não é isso que queremos, vamos adicionar uma nova condição de estilo, clique em "Adicionar". Quando clicado, o editor de expressões será aberto e sua regra pode ser posta. Após por sua regra, aplique-a.

Agora que temos a nova condição criada, clique nela e mude as propriedades desejadas e, depois clique em OK. Pronto, seu estilo foi criado com sucesso. Agora vá no seu textfield e, realize a seguinte ação.

Clique com botão direito > Propriedades > Aba Todos > Na propriedade estilo ponha o estilo que você criou.

Pronto, o estilo que você criou está sendo aplicado. Compile o report e, faça seu teste.

E ai o que achou desse lixo ? Sugestões ? Comentários ? Deixe sua opinião.
Leia Mais ››

terça-feira, 24 de janeiro de 2012

Diferenças de MIME Type entre navegadores

Um certo dia trabalhando até mais tarde, percebi que o módulo de anexo do sistema em que trabalho parou de funcionar quando realizei um teste no Opera. Assustado com esse fato, porque não tinha realizado nenhuma alteração na funcionalidade do upload de arquivo, começei a "debugar" o código e percebi que quando recuperava o content-type de uma imagem com extensão .jpg no server-side sendo que a requisição tinha sido enviada pelo IE, era retornado "image/pjpeg" e quando usava Opera ou outro navegador era retornado "image/jpeg", ou seja, dependendo de que navegador se utilize existe uma diferença de MIME types.

Para entendermos melhor o assunto vamos entender como as coisas funcionam. Os MIME types são similares às extensões dos arquivos mas mais universalmente aceitos, os MIME types são usados para indentificar o tipo da informacão que o arquivo contém. Enquanto a extensão do arquivo .html é informalmente entendida como uma página HTML, não existe exigência que um arquivo com a extensão .html signifique de fato que o arquivo é uma página HTML. Páginas HTML podem ter diferentes extensões.

No protocolo HTTP usado pelo browsers para se comunicar com os servidores, a extensão do arquivo da URL não é usado para determinar o tipo da informação que o servidor irá retornar, De fato, pode não existir a extensão do arquivo no final da URL.

Ao invés de usar a extensão do arquivo para se guiar, o servidor especifica o correto MIME type usando o header Content-type quando ele responde à requisição feita pelo browser.

Abaixo segue uma lista completa de MIME type

Conteúdo do post encontrado nos site:

http://www.boutell.com/newfaq/definitions/mimetype.html
http://reference.sitepoint.com/html/mime-types-full


Table 1. Complete list of MIME types
Suffixes applicable Media type and subtype(s)
.3dm x-world/x-3dmf
.3dmf x-world/x-3dmf
.a application/octet-stream
.aab application/x-authorware-bin
.aam application/x-authorware-map
.aas application/x-authorware-seg
.abc text/vnd.abc
.acgi text/html
.afl video/animaflex
.ai application/postscript
.aif audio/aiff
.aif audio/x-aiff
.aifc audio/aiff
.aifc audio/x-aiff
.aiff audio/aiff
.aiff audio/x-aiff
.aim application/x-aim
.aip text/x-audiosoft-intra
.ani application/x-navi-animation
.aos application/x-nokia-9000-communicator-add-on-software
.aps application/mime
.arc application/octet-stream
.arj application/arj
.arj application/octet-stream
.art image/x-jg
.asf video/x-ms-asf
.asm text/x-asm
.asp text/asp
.asx application/x-mplayer2
.asx video/x-ms-asf
.asx video/x-ms-asf-plugin
.au audio/basic
.au audio/x-au
.avi application/x-troff-msvideo
.avi video/avi
.avi video/msvideo
.avi video/x-msvideo
.avs video/avs-video
.bcpio application/x-bcpio
.bin application/mac-binary
.bin application/macbinary
.bin application/octet-stream
.bin application/x-binary
.bin application/x-macbinary
.bm image/bmp
.bmp image/bmp
.bmp image/x-windows-bmp
.boo application/book
.book application/book
.boz application/x-bzip2
.bsh application/x-bsh
.bz application/x-bzip
.bz2 application/x-bzip2
.c text/plain
.c text/x-c
.c++ text/plain
.cat application/vnd.ms-pki.seccat
.cc text/plain
.cc text/x-c
.ccad application/clariscad
.cco application/x-cocoa
.cdf application/cdf
.cdf application/x-cdf
.cdf application/x-netcdf
.cer application/pkix-cert
.cer application/x-x509-ca-cert
.cha application/x-chat
.chat application/x-chat
.class application/java
.class application/java-byte-code
.class application/x-java-class
.com application/octet-stream
.com text/plain
.conf text/plain
.cpio application/x-cpio
.cpp text/x-c
.cpt application/mac-compactpro
.cpt application/x-compactpro
.cpt application/x-cpt
.crl application/pkcs-crl
.crl application/pkix-crl
.crt application/pkix-cert
.crt application/x-x509-ca-cert
.crt application/x-x509-user-cert
.csh application/x-csh
.csh text/x-script.csh
.css application/x-pointplus
.css text/css
.cxx text/plain
.dcr application/x-director
.deepv application/x-deepv
.def text/plain
.der application/x-x509-ca-cert
.dif video/x-dv
.dir application/x-director
.dl video/dl
.dl video/x-dl
.doc application/msword
.dot application/msword
.dp application/commonground
.drw application/drafting
.dump application/octet-stream
.dv video/x-dv
.dvi application/x-dvi
.dwf drawing/x-dwf (old)
.dwf model/vnd.dwf
.dwg application/acad
.dwg image/vnd.dwg
.dwg image/x-dwg
.dxf application/dxf
.dxf image/vnd.dwg
.dxf image/x-dwg
.dxr application/x-director
.el text/x-script.elisp
.elc application/x-bytecode.elisp (compiled elisp)
.elc application/x-elc
.env application/x-envoy
.eps application/postscript
.es application/x-esrehber
.etx text/x-setext
.evy application/envoy
.evy application/x-envoy
.exe application/octet-stream
.f text/plain
.f text/x-fortran
.f77 text/x-fortran
.f90 text/plain
.f90 text/x-fortran
.fdf application/vnd.fdf
.fif application/fractals
.fif image/fif
.fli video/fli
.fli video/x-fli
.flo image/florian
.flx text/vnd.fmi.flexstor
.fmf video/x-atomic3d-feature
.for text/plain
.for text/x-fortran
.fpx image/vnd.fpx
.fpx image/vnd.net-fpx
.frl application/freeloader
.funk audio/make
.g text/plain
.g3 image/g3fax
.gif image/gif
.gl video/gl
.gl video/x-gl
.gsd audio/x-gsm
.gsm audio/x-gsm
.gsp application/x-gsp
.gss application/x-gss
.gtar application/x-gtar
.gz application/x-compressed
.gz application/x-gzip
.gzip application/x-gzip
.gzip multipart/x-gzip
.h text/plain
.h text/x-h
.hdf application/x-hdf
.help application/x-helpfile
.hgl application/vnd.hp-hpgl
.hh text/plain
.hh text/x-h
.hlb text/x-script
.hlp application/hlp
.hlp application/x-helpfile
.hlp application/x-winhelp
.hpg application/vnd.hp-hpgl
.hpgl application/vnd.hp-hpgl
.hqx application/binhex
.hqx application/binhex4
.hqx application/mac-binhex
.hqx application/mac-binhex40
.hqx application/x-binhex40
.hqx application/x-mac-binhex40
.hta application/hta
.htc text/x-component
.htm text/html
.html text/html
.htmls text/html
.htt text/webviewhtml
.htx text/html
.ice x-conference/x-cooltalk
.ico image/x-icon
.idc text/plain
.ief image/ief
.iefs image/ief
.iges application/iges
.iges model/iges
.igs application/iges
.igs model/iges
.ima application/x-ima
.imap application/x-httpd-imap
.inf application/inf
.ins application/x-internett-signup
.ip application/x-ip2
.isu video/x-isvideo
.it audio/it
.iv application/x-inventor
.ivr i-world/i-vrml
.ivy application/x-livescreen
.jam audio/x-jam
.jav text/plain
.jav text/x-java-source
.java text/plain
.java text/x-java-source
.jcm application/x-java-commerce
.jfif image/jpeg
.jfif image/pjpeg
.jfif-tbnl image/jpeg
.jpe image/jpeg
.jpe image/pjpeg
.jpeg image/jpeg
.jpeg image/pjpeg
.jpg image/jpeg
.jpg image/pjpeg
.jps image/x-jps
.js application/x-javascript
.js application/javascript
.js application/ecmascript
.js text/javascript
.js text/ecmascript
.jut image/jutvision
.kar audio/midi
.kar music/x-karaoke
.ksh application/x-ksh
.ksh text/x-script.ksh
.la audio/nspaudio
.la audio/x-nspaudio
.lam audio/x-liveaudio
.latex application/x-latex
.lha application/lha
.lha application/octet-stream
.lha application/x-lha
.lhx application/octet-stream
.list text/plain
.lma audio/nspaudio
.lma audio/x-nspaudio
.log text/plain
.lsp application/x-lisp
.lsp text/x-script.lisp
.lst text/plain
.lsx text/x-la-asf
.ltx application/x-latex
.lzh application/octet-stream
.lzh application/x-lzh
.lzx application/lzx
.lzx application/octet-stream
.lzx application/x-lzx
.m text/plain
.m text/x-m
.m1v video/mpeg
.m2a audio/mpeg
.m2v video/mpeg
.m3u audio/x-mpequrl
.man application/x-troff-man
.map application/x-navimap
.mar text/plain
.mbd application/mbedlet
.mc$ application/x-magic-cap-package-1.0
.mcd application/mcad
.mcd application/x-mathcad
.mcf image/vasa
.mcf text/mcf
.mcp application/netmc
.me application/x-troff-me
.mht message/rfc822
.mhtml message/rfc822
.mid application/x-midi
.mid audio/midi
.mid audio/x-mid
.mid audio/x-midi
.mid music/crescendo
.mid x-music/x-midi
.midi application/x-midi
.midi audio/midi
.midi audio/x-mid
.midi audio/x-midi
.midi music/crescendo
.midi x-music/x-midi
.mif application/x-frame
.mif application/x-mif
.mime message/rfc822
.mime www/mime
.mjf audio/x-vnd.audioexplosion.mjuicemediafile
.mjpg video/x-motion-jpeg
.mm application/base64
.mm application/x-meme
.mme application/base64
.mod audio/mod
.mod audio/x-mod
.moov video/quicktime
.mov video/quicktime
.movie video/x-sgi-movie
.mp2 audio/mpeg
.mp2 audio/x-mpeg
.mp2 video/mpeg
.mp2 video/x-mpeg
.mp2 video/x-mpeq2a
.mp3 audio/mpeg3
.mp3 audio/x-mpeg-3
.mp3 video/mpeg
.mp3 video/x-mpeg
.mpa audio/mpeg
.mpa video/mpeg
.mpc application/x-project
.mpe video/mpeg
.mpeg video/mpeg
.mpg audio/mpeg
.mpg video/mpeg
.mpga audio/mpeg
.mpp application/vnd.ms-project
.mpt application/x-project
.mpv application/x-project
.mpx application/x-project
.mrc application/marc
.ms application/x-troff-ms
.mv video/x-sgi-movie
.my audio/make
.mzz application/x-vnd.audioexplosion.mzz
.nap image/naplps
.naplps image/naplps
.nc application/x-netcdf
.ncm application/vnd.nokia.configuration-message
.nif image/x-niff
.niff image/x-niff
.nix application/x-mix-transfer
.nsc application/x-conference
.nvd application/x-navidoc
.o application/octet-stream
.oda application/oda
.omc application/x-omc
.omcd application/x-omcdatamaker
.omcr application/x-omcregerator
.p text/x-pascal
.p10 application/pkcs10
.p10 application/x-pkcs10
.p12 application/pkcs-12
.p12 application/x-pkcs12
.p7a application/x-pkcs7-signature
.p7c application/pkcs7-mime
.p7c application/x-pkcs7-mime
.p7m application/pkcs7-mime
.p7m application/x-pkcs7-mime
.p7r application/x-pkcs7-certreqresp
.p7s application/pkcs7-signature
.part application/pro_eng
.pas text/pascal
.pbm image/x-portable-bitmap
.pcl application/vnd.hp-pcl
.pcl application/x-pcl
.pct image/x-pict
.pcx image/x-pcx
.pdb chemical/x-pdb
.pdf application/pdf
.pfunk audio/make
.pfunk audio/make.my.funk
.pgm image/x-portable-graymap
.pgm image/x-portable-greymap
.pic image/pict
.pict image/pict
.pkg application/x-newton-compatible-pkg
.pko application/vnd.ms-pki.pko
.pl text/plain
.pl text/x-script.perl
.plx application/x-pixclscript
.pm image/x-xpixmap
.pm text/x-script.perl-module
.pm4 application/x-pagemaker
.pm5 application/x-pagemaker
.png image/png
.pnm application/x-portable-anymap
.pnm image/x-portable-anymap
.pot application/mspowerpoint
.pot application/vnd.ms-powerpoint
.pov model/x-pov
.ppa application/vnd.ms-powerpoint
.ppm image/x-portable-pixmap
.pps application/mspowerpoint
.pps application/vnd.ms-powerpoint
.ppt application/mspowerpoint
.ppt application/powerpoint
.ppt application/vnd.ms-powerpoint
.ppt application/x-mspowerpoint
.ppz application/mspowerpoint
.pre application/x-freelance
.prt application/pro_eng
.ps application/postscript
.psd application/octet-stream
.pvu paleovu/x-pv
.pwz application/vnd.ms-powerpoint
.py text/x-script.phyton
.pyc applicaiton/x-bytecode.python
.qcp audio/vnd.qcelp
.qd3 x-world/x-3dmf
.qd3d x-world/x-3dmf
.qif image/x-quicktime
.qt video/quicktime
.qtc video/x-qtc
.qti image/x-quicktime
.qtif image/x-quicktime
.ra audio/x-pn-realaudio
.ra audio/x-pn-realaudio-plugin
.ra audio/x-realaudio
.ram audio/x-pn-realaudio
.ras application/x-cmu-raster
.ras image/cmu-raster
.ras image/x-cmu-raster
.rast image/cmu-raster
.rexx text/x-script.rexx
.rf image/vnd.rn-realflash
.rgb image/x-rgb
.rm application/vnd.rn-realmedia
.rm audio/x-pn-realaudio
.rmi audio/mid
.rmm audio/x-pn-realaudio
.rmp audio/x-pn-realaudio
.rmp audio/x-pn-realaudio-plugin
.rng application/ringing-tones
.rng application/vnd.nokia.ringing-tone
.rnx application/vnd.rn-realplayer
.roff application/x-troff
.rp image/vnd.rn-realpix
.rpm audio/x-pn-realaudio-plugin
.rt text/richtext
.rt text/vnd.rn-realtext
.rtf application/rtf
.rtf application/x-rtf
.rtf text/richtext
.rtx application/rtf
.rtx text/richtext
.rv video/vnd.rn-realvideo
.s text/x-asm
.s3m audio/s3m
.saveme application/octet-stream
.sbk application/x-tbook
.scm application/x-lotusscreencam
.scm text/x-script.guile
.scm text/x-script.scheme
.scm video/x-scm
.sdml text/plain
.sdp application/sdp
.sdp application/x-sdp
.sdr application/sounder
.sea application/sea
.sea application/x-sea
.set application/set
.sgm text/sgml
.sgm text/x-sgml
.sgml text/sgml
.sgml text/x-sgml
.sh application/x-bsh
.sh application/x-sh
.sh application/x-shar
.sh text/x-script.sh
.shar application/x-bsh
.shar application/x-shar
.shtml text/html
.shtml text/x-server-parsed-html
.sid audio/x-psid
.sit application/x-sit
.sit application/x-stuffit
.skd application/x-koan
.skm application/x-koan
.skp application/x-koan
.skt application/x-koan
.sl application/x-seelogo
.smi application/smil
.smil application/smil
.snd audio/basic
.snd audio/x-adpcm
.sol application/solids
.spc application/x-pkcs7-certificates
.spc text/x-speech
.spl application/futuresplash
.spr application/x-sprite
.sprite application/x-sprite
.src application/x-wais-source
.ssi text/x-server-parsed-html
.ssm application/streamingmedia
.sst application/vnd.ms-pki.certstore
.step application/step
.stl application/sla
.stl application/vnd.ms-pki.stl
.stl application/x-navistyle
.stp application/step
.sv4cpio application/x-sv4cpio
.sv4crc application/x-sv4crc
.svf image/vnd.dwg
.svf image/x-dwg
.svr application/x-world
.svr x-world/x-svr
.swf application/x-shockwave-flash
.t application/x-troff
.talk text/x-speech
.tar application/x-tar
.tbk application/toolbook
.tbk application/x-tbook
.tcl application/x-tcl
.tcl text/x-script.tcl
.tcsh text/x-script.tcsh
.tex application/x-tex
.texi application/x-texinfo
.texinfo application/x-texinfo
.text application/plain
.text text/plain
.tgz application/gnutar
.tgz application/x-compressed
.tif image/tiff
.tif image/x-tiff
.tiff image/tiff
.tiff image/x-tiff
.tr application/x-troff
.tsi audio/tsp-audio
.tsp application/dsptype
.tsp audio/tsplayer
.tsv text/tab-separated-values
.turbot image/florian
.txt text/plain
.uil text/x-uil
.uni text/uri-list
.unis text/uri-list
.unv application/i-deas
.uri text/uri-list
.uris text/uri-list
.ustar application/x-ustar
.ustar multipart/x-ustar
.uu application/octet-stream
.uu text/x-uuencode
.uue text/x-uuencode
.vcd application/x-cdlink
.vcs text/x-vcalendar
.vda application/vda
.vdo video/vdo
.vew application/groupwise
.viv video/vivo
.viv video/vnd.vivo
.vivo video/vivo
.vivo video/vnd.vivo
.vmd application/vocaltec-media-desc
.vmf application/vocaltec-media-file
.voc audio/voc
.voc audio/x-voc
.vos video/vosaic
.vox audio/voxware
.vqe audio/x-twinvq-plugin
.vqf audio/x-twinvq
.vql audio/x-twinvq-plugin
.vrml application/x-vrml
.vrml model/vrml
.vrml x-world/x-vrml
.vrt x-world/x-vrt
.vsd application/x-visio
.vst application/x-visio
.vsw application/x-visio
.w60 application/wordperfect6.0
.w61 application/wordperfect6.1
.w6w application/msword
.wav audio/wav
.wav audio/x-wav
.wb1 application/x-qpro
.wbmp image/vnd.wap.wbmp
.web application/vnd.xara
.wiz application/msword
.wk1 application/x-123
.wmf windows/metafile
.wml text/vnd.wap.wml
.wmlc application/vnd.wap.wmlc
.wmls text/vnd.wap.wmlscript
.wmlsc application/vnd.wap.wmlscriptc
.word application/msword
.wp application/wordperfect
.wp5 application/wordperfect
.wp5 application/wordperfect6.0
.wp6 application/wordperfect
.wpd application/wordperfect
.wpd application/x-wpwin
.wq1 application/x-lotus
.wri application/mswrite
.wri application/x-wri
.wrl application/x-world
.wrl model/vrml
.wrl x-world/x-vrml
.wrz model/vrml
.wrz x-world/x-vrml
.wsc text/scriplet
.wsrc application/x-wais-source
.wtk application/x-wintalk
.xbm image/x-xbitmap
.xbm image/x-xbm
.xbm image/xbm
.xdr video/x-amt-demorun
.xgz xgl/drawing
.xif image/vnd.xiff
.xl application/excel
.xla application/excel
.xla application/x-excel
.xla application/x-msexcel
.xlb application/excel
.xlb application/vnd.ms-excel
.xlb application/x-excel
.xlc application/excel
.xlc application/vnd.ms-excel
.xlc application/x-excel
.xld application/excel
.xld application/x-excel
.xlk application/excel
.xlk application/x-excel
.xll application/excel
.xll application/vnd.ms-excel
.xll application/x-excel
.xlm application/excel
.xlm application/vnd.ms-excel
.xlm application/x-excel
.xls application/excel
.xls application/vnd.ms-excel
.xls application/x-excel
.xls application/x-msexcel
.xlt application/excel
.xlt application/x-excel
.xlv application/excel
.xlv application/x-excel
.xlw application/excel
.xlw application/vnd.ms-excel
.xlw application/x-excel
.xlw application/x-msexcel
.xm audio/xm
.xml application/xml
.xml text/xml
.xmz xgl/movie
.xpix application/x-vnd.ls-xpix
.xpm image/x-xpixmap
.xpm image/xpm
.x-png image/png
.xsr video/x-amt-showrun
.xwd image/x-xwd
.xwd image/x-xwindowdump
.xyz chemical/x-pdb
.z application/x-compress
.z application/x-compressed
.zip application/x-compressed
.zip application/x-zip-compressed
.zip application/zip
.zip multipart/x-zip
.zoo application/octet-stream
.zsh text/x-script.zsh
Leia Mais ››