Arquivos Estáticos no Django

Resumo

De forma explorativa, este trabalho busca levantar um melhor entendimento sobre a gestão, configuração e a entrega de conteúdo estático em uma aplicação baseada no framework Django, em sua versão 1.11. Além disso busca-se fazer a distinção entre a ideia de arquivos estáticos e arquivos de mídia (media) no escopo do framework.

1. Arquivos Estáticos no Django

Diferente do que ocorre em outras tecnologias, no framework Django a ideia é explicitamente delegar a entrega de conteúdo estático para outras aplicações, tais como web servers e CDNs (Content Delivery Networks). Por padrão uma aplicação Django simplesmente não entrega conteúdo estático, o que pode causar alguma confusão, pelo menos para iniciantes na tecnologia.

Há diferentes aspectos a serem tratados dependendo do ambiente de execução da aplicação, e para entender melhor isso é necessário partir do app staticfiles, que é parte integrante do Django e pode ser ativado no projeto a qualquer momento. Com base nisso será possível discutir melhor sobre a distinção entre arquivos estáticos e arquivos de mídia e finalmente seguir ao tópico da implantação da aplicação Django em produção.

Ao interessado em mais detalhes, um ponto de partida na documentação é o seguinte link: https://docs.djangoproject.com/en/1.11/howto/static-files/.

Por fim, deve-se frisar que toda a discussão a seguir se dá com base na versão 1.11 do framework, e portanto pode ser inválida em outras versões.

Continue lendo

Exemplo webapp Java usando Weld

Recentemente incluí no GitHub um exemplo de aplicação Java baseada em Servlets usando Weld como provedor CDI. Trata-se de um simples CRUD com controle de sessão e interface implementada diretamente em JSP.

Mais detalhes no readme do projeto em < https://github.com/hmagalhaes/bomclima >

Segue um screenshot de uma das interfaces da aplicação:

Screenshot da aplicação de exemplo

Screenshot da aplicação de exemplo

Atom e a linha automática no final do arquivo

TL;DR

Para o interessado em desativar o comportamento, segue passo-a-passo:

  1. acessar menu: Edit > Preferences > Packages;
  2. buscar Pacote “Whitespace”;
  3. acessar opções do pacote e desativar  “Ensure Single Trailling Newline”.

RESUMO

Este texto busca apresentar uma experiência de uso do autor com o editor de texto Atom, mais especificamente, em relação à funcionalidade que garante a presença de um caractere de nova linha (newline, \n) no final do arquivo. Visando a discussão acerca da qualidade de software, o texto analisa alguns aspectos da interação e levanta um referencial sobre a motivação por trás do recurso em destaque. Além disso, é feita uma pequena reflexão sobre os possíveis efeitos na imagem do produto de software a partir dos problemas de usabilidade que este venha a apresentar.

Continue lendo

O valor gerado pelas entregas incrementais em um produto Scrum

Este texto busca versar sobre Scrum, mais especificamente acerca de dois gráficos encontrados no capítulo VIII da obra de Jeff Sutherland, Scrum: A arte de fazer o dobro do trabalho na metade do tempo (SUTHERLAND, 2014). Relacionadas estão as temáticas de MVP (Minimum Viable Product – Produto Viável Mínimo) e o Princípio de Pareto (regra 80/20).

Continue lendo

Usando grunt-connect-proxy com HTTPS

Olá, está tendo problemas com o grunt-connect-proxy para destino HTTPS?

No seu Gruntfile, na configuração do proxy, tente adicionar a opção protocol como está no exemplo a seguir. Atente-se aos dois-pontos que seguem o https, eles fazem a diferença.

{
  context: '/api',
  host: 'mybackend.com',
  port: 443,
  https: true,
  rewrite: {
    '^/api': '/backend/api'
  },
  protocol: 'https:'
}

Este macete funciona pelo menos no grunt-connect-proxy versão 0.2.0, e  no http-proxy versão 1.11.3 — responsável pela implementação do proxy.

A questão é que internamente, o http-proxy utiliza esta opção para definir em qual protocolo deve se comunicar. Isso pode ser constatado no seguinte arquivo do módulo: lib/http-proxy/passes/web-incomming.js. Segue recorte iniciado na linha 108:

var proxyReq = (options.target.protocol === 'https:' ? https : http).request(
    common.setupOutgoing(options.ssl || {}, options, req)
);

Assim, o problema não está na URL e/ou porta utilizada na chamada, mas sim no protocolo. Para debugar melhor o problema, e checar se o request está sendo feito sem criptografia, o interessado pode utilizar o Wireshark.

Até.

Rolagem/Scrolling de tela com teclado no Atom

Olá.

Atom é um editor de texto bem legal feito com Electron, porém até a versão 1.12.2 ainda não conta com um recurso bem básico, presente na maioria dos editores: a rolagem de tela com teclado, onde o cursor fica parado e somente a tela rola. Normalmente isso é feito com Ctrl+Cima / Ctrl+Baixo.

Alternativa

Por enquanto uma alternativa é instalar este pacote: https://atom.io/packages/ctrl-dir-scroll. Basta acessar o menu “Edit > Preferences”, e então na aba Packages, buscar por ctrl-dir-scroll, postado por callum-ramage.

Este pacote irá disponibilizar dois novos comandos para vincular a hotkeys, são eles: ctrl-dir-scroll:scroll-down e ctrl-dir-scroll:scroll-up.Para configurá-los acesse “Edit > Keymap” para abrir o arquivo de mapeamento de hotkeys. Nele, basta adicionar a seguinte configuração lá no final:

'atom-workspace atom-text-editor:not([mini])':
  'ctrl-down': 'ctrl-dir-scroll:scroll-down'
  'ctrl-up': 'ctrl-dir-scroll:scroll-up'

Por padrão Ctrl+Cima e Ctrl+Baixo são configurados para mover linha. Se você não quiser perder este recurso, pode configurar tal como no Eclipse, com Alt+Cima e Alt+Baixo. O resultado é:

'atom-workspace atom-text-editor:not([mini])':
  'alt-down': 'editor:move-line-down'
  'alt-up': 'editor:move-line-up'
  'ctrl-down': 'ctrl-dir-scroll:scroll-down'
  'ctrl-up': 'ctrl-dir-scroll:scroll-up'

Configurando outras hotkeys

Para configurar outras hotkeys, acesse o menu “Edit > Preferences”, aba Keybindings. Lá você pode buscar por hotkey (Ctrl+Down na imagem abaixo) ou pelo nome do comando. Então basta clicar no ícone de prancheta para copiar o comando e finalmente colá-lo no arquivo de configurações para alteração.

keybindings

Até.

Configurando o push/pull simultâneo/paralelo no Docker

Olá.

O push/pull de imagens em versões recentes do Docker conta com a transferência de vários layers em paralelo, o que costuma acelerar bastante o processo. Contudo, em conexões mais restritas a situação pode ser outra, se transformando num transtorno. Isso principalmente na hora de fazer o upload de imagens.

Como há divisão da banda dentre as várias transmissões, a taxa individual de cada transmissão cai, resultando em um maior tempo para a conclusão de qualquer envio. Estando em uma conexão mais instável, isso normalmente resulta em grande frustração, pois o Docker acaba desistindo do envio após várias falhas e nenhum arquivo transmitido. Continue lendo

Novidades

Olá.

Parece que o blog precisa de mais movimento, não é mesmo? Afinal já se passou quase um ano desde a última postagem, feita em 18/12/2015.

Então vale citar uma das últimas novidades, que foi a conquista da minha segunda certificação Oracle no dia 17/10/16. Desta vez foi a Oracle Certified Expert, Java EE 6 Web Component Developer, a qual é voltada ao domínio das aplicações web Java, baseadas no modelo Servlet 3.0.

A Oracle agora publica badges para quem alcança suas certificações, valendo também para as mais antigas. Com isso a minha certificação anterior, de programador Java 6, também ganhou um badge. Ambos podem ser conferidos no meu perfil na plataforma Acclaim. Segue o link: https://www.youracclaim.com/user/hudson-magalhaes

Até.

JPA – EntityManager x EntityManagerFactory x Multithreading

Opa!

Neste post vou falar um pouco sobre EntityManager e EntityManagerFactory em relação a ambiente multithread.

EntityManager não é thread-safe

Diferente do EntityManagerFactory, o EntityManager não é thread-safe. É importante relevar isso principalmente em aplicações web, onde cada requisição do cliente é tratada por um thread diferente.

Neste cenário normalmente são utilizados singletons para prover os serviços, onde pode ser um problema usar injeção de dependência (DI) para injetar um EntityManager como membro de instância dos singletons.

Por isso, o mais indicado é injetar o EntityManagerFactory. Exemplo:

public class UserDAO {
    @PersistenceUnit
    private EntityManagerFactory emf;

    public void persist(User user) {
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
            return em.persist(user);
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
}

Usando a injeção de dependências do Spring

Com o Spring a situação é diferente…

O seguinte post é bem interessante, onde o autor explica o mecanismo de controle de transação do Spring para métodos anotados com @Transactional do Spring:

http://blog.jhades.org/how-does-spring-transactional-really-work/

A parte em que ele fala do EntityManager vem bem a calhar. No caso, ele explica que o Spring não injeta o EntityManager diretamente, invés disso é injetado um proxy. Este proxy, com ajuda de um ThreadLocal, sempre resolve um EntityManager por thread, eliminando o problema do multithreading.

Antes que o leitor possa pensar em ignorar a ideia do proxy e injetar sempre o EntityManagerFactory, quando usando o Spring, o melhor mesmo é injetar direto o EntityManager.

Dentro de um escopo transacional do Spring, a abertura e commit/rollback são controlados pelo container, o que é feito em cima do EntityManager controlado pelo Spring (vinculado ao thread atual).

Se injetamos o EntityManagerFactory e criamos o EntityManager manualmente, o Spring não irá realizar o controle da transação no EntityManager que criamos, mas em algum outro controlado por ele. Neste caso você poderá notar que suas alterações não serão persistidas no banco.

Então o correto, que é até mais simples, é usar direto o EntityManager. Segue exemplo:

public class MyComponent {
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void doStuff() {
        Animal animal = new Animal("Fish");
        Toy toy = new Toy("Ball");

        entityManager.persist(animal);
        entityManager.persist(toy);
    }
}

Como já citado lá naquele post, o mais legal é que se o método inicial da transação chamar outro componente, e este componente também injetar o EntityManager, novamente estaremos trabalhando com o proxy que irá resolver o mesmo EntityManager, possibilitando continuar na mesma transação.

Outras referências:
Tutorial JEE 6 (EntityManager em ambiente gerenciado):
http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#indexterm-1674

A trava de tela não funciona no Xubuntu?

No Xubuntu 14.04, o recurso de “lock screen” (CTRL+ALT+DEL) é acionado pelo script xflock4, que chama um dos “lockers” instalados no sistema. O problema ocorre quando nenhum “locker” é encontrado.

No meu caso, o problema foi que desativei o ligh-locker, que por padrão fica responsável por travar a tela. Para resolver o problema basta reativá-lo, ou então instalar outro locker.

Eu optei por deixar o light-locker desativado, pois ele não estava respeitando as configurações e travando a tela automaticamente enquanto eu assistia filmes… Instalei então o gnome-screensaver:
sudo apt-get install gnome-screensaver

Vasculhando o xflock4, nota-se que podem ser usados os seguintes lockers: light-locker, gnome-screensaver, xcreensaver, xlock e slock.

Referências:
http://unix.stackexchange.com/questions/101806/why-doesnt-my-screen-lock-in-xfce#comment155208_101813
https://wiki.archlinux.org/index.php/Xfce#Lock_the_screen