Mnemonic's Fike

Da genialidade à imbecilidade o limite é uma curva

Building Debian images by jigdo

| Comments

A friend asked me how to got a Debian Old Image, she wanted to download Debian Squeeze DVD image. Unfortunately, it’s impossible to download by Debian-CD mirror because Squeeze isn’t more maintainer. So, it’s possible to get a Image by Debian-CD primary server but it’s locate in Sweden. Nothing problem, right? Well, She lives in Brazil and the download time is a little bit more than 8 hours.

A good tool to “download” a Debian image is the Jigdo. It’s a program to synchronize repositories and generate Images. It get packages and build a image locally in your computer.

I made a simple test, I used jigdo to “download” the first Squeeze DVD by brazilian repository (Unicamp) and compare with a download image by PR (Primary Server). The difference was huge, PS download took a long time to finish (8 hours) and Unicamp mirror took 100 minutes.

Well, let’s go to practice.

Install jigdo

1
#aptitude install jigdo

Downloading and building image

The jigdo file (.jigdo) is simple list with all packages and hash of a instalation image. You need it to start the downloads. In this case, I used jigdo file to build first Squeeze DVD.

1
$jigdo-lite http://cdimage.debian.org/cdimage/archive/6.0.10/amd64/jigdo-dvd/debian-6.0.10-amd64-DVD-1.jigdo

Before to begin download, jidgo need some arguments. Fill arguments of your preference but remember that the argument more important is the mirror. If you have doubt what’s mirror is more fast, you can use netselect-apt to discovery. For my test, I’m used Unicamp mirror (http://debian.las.ic.unicamp.br/debian).

My jigdo-lite conf file.

1
2
3
4
5
6
7
8
9
$cat ~/.jigdo-lite
-------
jigdo=''
debianMirror='http://debian.las.ic.unicamp.br/debian/'
nonusMirror=''
tmpDir='.'
jigdoOpts='--cache jigdo-file-cache.db'
wgetOpts='--passive-ftp --dot-style=mega --continue --timeout=30'
scanMenu='

Nice, huh?

Take a coffee and forget to download Debian images using others programs (curl, wget, etc.). :)

FISL 16

| Comments

FISL 16 aconteceu algumas semanas atrás… e depois de nem tão rigoroso inverno consegui rascunhar alguma coisas sobre o evento.

Impressões

Como sempre, sempre bom rever os amigos e conhecidos de inúmero projetos que participam. O evento não estava tão lotado como nos últimos anos que participei mas mesmo sim acredito que teve um bom público.

A internet até que funcionou razoavelmente bem, o wifi do evento era usável a maior parte do tempo e também gostei das palestras que assisti. Curti demais participar da Mini-Debconf realizada durante o FISL, fico feliz que em 2015 no Brasil serão (no mínimo) 3 Micro/Mini-Debconf. :)

As minhas apresentações

Este ano fiz duas apresentações no FISL16, uma sobre Web Performance e a outra sobre Management 3.0. A apresentação de de Web Performance foi a última vez que apresentei (acho), fiz algumas pequenas atualizações e acréscimo de exemplos que a deixou com +– 100 lâminas (slides). Já tem material suficiente para escrever um livro (quem sabe…). ;)

A apresentação sobre Management 3.0 é sobre como foi descobrir que usamos (equipe de TI que participei) esse conceito antes de saber que existiu um nome. Eu descobri Management 3.0 depois de participar de um curso de Scrum com Manoel Pimentel, isso foi alguns anos depois que já não era mais gerente. Ele me ajudou bastante para avaliar os erros e acertos como gerente. Recomendo para quem se interessar desempenhar o papel de líder de equipe ou chefia a estudar um pouco mais sobre tema.

Um milhão de usuários simultâneos

Um milhao de usuários simultâneos

O vídeo da apresentação pode ser acessado por aqui e aqui.

Management 3.0

Management 3.0 – a vida pós-agilidade

O vídeo da apresentação pode ser acessado por aqui.

Eventos em Maio de 2015

| Comments

Essa semana estarei participando de dois eventos como palestrante.

Devcamp

O Devcamp é a “A maior conferência de desenvolvimento de software do interior São Paulo” e esterei apresentando sobre a minha experiência em migrar para Docker. Docker é novo buzzword um projeto de automação de deploys de aplicações dentro de contêineres. Se estiver por lá e quiser tomar um café, estarei a disposição.

Meetup Germinadora

Provavelmente é a última vez que apresente essa palestra sobre Web Performance (“Um milhão de usuários simultâneos”). Não que eu não goste de falar sobre o tema, pelo contrário (gosto bastante)! Tem algumas partes específicas dessa apresentação que quero abordar numa próxima vez.

Se estiver de bobeira por aqui em São Paulo, passe por lá.

Docker 1.6 lançado

| Comments

O lançamento da versão 1.6 veio com boas novidades, algumas delas são do ecossistema mas cabe destacar: Docker Compose, Docker Machine e o Registry. O Compose é o antigo Fig, ele facilita bastante se você trabalho com sistemas em múltiplos containers. O Machine permite criar uma infraestrutura Docker rapidamente, seja numa máquina virtual (exemplo: Virtualbox) ou mesmo numa IaaS (AWS, Digital Ocean, etc.).

As funcionalidades da versão 1.6 que gostei foram:

  • Suporte a Image Labels No Dockerfile pode adicionar um campo extra para usar como identificação sua. Isso permite pesquisar informações de containers e imagens usando esse campo.

  • Logging Drivers Ficou bem mais fácil enviar os logs para um Syslog ou similares. Muita gente tem dificuldade de lidar com os logs do container até essa versão.

  • Alterar as imagens de containers sem recriá-las A partir desta versão é possível alterar algumas coisas numa imagem de container sem a necessidade de gerar novamente.

  • Ulimit A minha favorita, agora é possível alterar alguns parâmetros do ulimit, bom para serviços que usam muito processos como banco de dados.

Para saber mais, acesse o blog do Docker que tem mais informações.

Obs.: Ah, a versão 1.6 está na Experimental no Debian e infezlimente não entrou na Jessie, mas logo estará disponível no Backports.

Obs.2: O original dessa imagem é do blog do Docker.

Debian Jessie (8) lançado

| Comments

O Debian continua executando o plano de dominação do universo. As duas novidades é que a eleição do novo líder do projeto, Neil McGovern, após dois mandatos do Lucas Nussbaum.

A outra novidade é que nova versão estável (Jessie) do Debian foi lançada no dia 25 de Abril de 2015 com a narração da mudança do Wheezy para a Jessie. Se quiser ver como foi o lançamento, use a hashgtag #releasingjessie

São 75 idiomas suportadas na instalação, systemd como sistema de inicialização padrão, MySQL, MariaDB, Samba 4.1, PostgreSQL 9.4, etc. São mais de 43 mil pacotes a partir de 21 mil (pacotes) fonte. Suporte a numa nova arquitetura (ARM64). O tempo de freezing desta versão foi relativamente curto, 171 dias.

Pouco? Bom, o restante das novidades você pode ler mais [aqui][debianews].

Quem diria?

Nos anos que trabalhei como consultor de tecnologias em software livre/código aberto, era muito difícil integrar ou substituir sistemas proprietários. Principalmente nos casos de servidores, storages e/ou equipamento de backups.

O trabalho maior não era o técnico, era de reverter o marketing negativo. Coisas como: “Não tem licença, como é que você irá acreditar numa empresa que não é dona do produto”, “A comunidade vai dar suporte? Fica esperando, então!”, “O fornecedor de hardware não suporta o Debian, se quiser use uma distribuição comercial”, “Um Sistema Operacional que só usa tela preta? Isso é anos 80!”

Depois de alguns e bons anos o que mudou? Muita coisa, tanto que a Microsoft participou das festas de lançamento da Jessie.

Configuração de compressão gzip para sites e ranking de CDN

| Comments

Estava lendo um texto do Steve Souders sobre a alteração da configuração padrão gzip na Fastly. Fastly é uma CDN concorrente da Akamai e tem clientes como Twitter, Shopify, The Guardian, Rakuten, etc.

Ele cita como chegaram no template padrão da configuração deles usando os dados do HTTP Archive, este é um projeto que consolida testes executados usando a versão pública do Webpagetest. Os testes são executados em mais ou menos 18 mil URLs e tem relatórios variados, por exemplo: número médio de requisições HTTP por página, crescimento do HTML nas páginas, etc.

Tanto do Steve Souders quanto no site HTTP Archive fazem referência ao Bigqueries com diversas consultas realizadas na base dados do HTTP Archive. Um texto postado no Bigqueries chamou-me a atenção, era sobre o Ranking de CDNs considerandos as páginas mais populares.

Ele considerou apenas as páginas que estavam sendo entregues por alguma CDN e não considerou todas as requisições HTTP das páginas. Usei o BigQuery do Google considerando os dados disponíveis do HTTP Archive no mês de Novembro de 2014 para responder: Quais são as CDNs mais populares ao analisar as requisições HTTP?

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT cdn, num, ROUND(ratio*100) as percent FROM (
  SELECT cdn, COUNT(cdn) as num, RATIO_TO_REPORT(num) OVER() ratio   FROM (
     SELECT CASE
       WHEN _cdn_provider IN ('')
         THEN 'None'
         ELSE 'CDN'
       END as cdn
      FROM httparchive:runs.2014_11_01_requests,
           httparchive:runs.2014_11_15_requests,
           httparchive:runs.2014_11_01_requests_mobile,
           httparchive:runs.2014_11_15_requests_mobile
   ) GROUP BY cdn
) ORDER BY percent DESC

E quais foram as CDNs mais usadas naquele período?

1
2
3
4
5
6
7
8
9
10
SELECT provider, round(100*ratio) as percent, num
FROM (SELECT REGEXP_REPLACE(_cdn_provider,r'^$', 'None') as provider, count(*) as num, RATIO_TO_REPORT(num) OVER() ratio
 FROM httparchive:runs.2014_11_01_requests,
      httparchive:runs.2014_11_15_requests,
      httparchive:runs.2014_11_01_requests_mobile,
      httparchive:runs.2014_11_15_requests_mobile
 WHERE  _cdn_provider != ''
GROUP BY provider
)
ORDER BY num desc LIMIT 10

A surpresa no ranking é o Google, porque ele seria considerado uma CDN?

Para tentar entender, outra consulta buscando os principais hostnames/domínios que estão na CDN do Google.

1
2
3
4
5
6
7
8
9
SELECT req_host, count(req_host) as num
FROM httparchive:runs.2014_11_01_requests,
     httparchive:runs.2014_11_15_requests,
     httparchive:runs.2014_11_01_requests_mobile,
     httparchive:runs.2014_11_15_requests_mobile
WHERE _cdn_provider = 'Google'
GROUP BY req_host
ORDER BY num DESC
LIMIT 20

Basicamente, a CDN da Google entrega seus próprios serviços: Analytics, Adsense, Doubleclick, Youtube, etc. Os hostnames fonts.googleapis.com, ajax.googleapis.com estão relacionados a iniciativas do Goolgle de hospedar alguns frameworks javascripts e webfonts gratuitamente.

Então, o Google poderia ser considerado um fornecedor de CDN? Um pouco difícil de definir porque não existe um documento canonical (RFC) que defina CDN. A Wikipedia tem artigo sobre CDN e a primeira frase tem uma boa definição

A content delivery network or content distribution network (CDN) is a large distributed system of servers deployed in multiple data centers across the Internet. The goal of a CDN is to serve content to end-users with high availability and high performance. CDNs serve a large fraction of the Internet content today, including web objects (text, graphics and scripts), downloadable objects (media files, software, documents), applications (e-commerce, portals), live streaming media, on-demand streaming media, and social networks.

Se a for usado a definição da Wikipedia para CDN, pode-se afirmar que alguns serviços do Google são uma CDN. Entretanto, se descartar o Google como CDN e consideramos que as demais restantes são CDNs que seus usuários paguem para entregar o seu conteúdo. Como ficaria o ranking com as 15 mais usadas?

1
2
3
4
5
6
7
8
9
10
SELECT provider, round(100*ratio) as percent, num
FROM (SELECT REGEXP_REPLACE(_cdn_provider,r'^$', 'None') as provider, count(*) as num, RATIO_TO_REPORT(num) OVER() ratio
  FROM httparchive:runs.2014_11_01_requests,
       httparchive:runs.2014_11_15_requests,
       httparchive:runs.2014_11_01_requests_mobile,
       httparchive:runs.2014_11_15_requests_mobile
  WHERE _cdn_provider != 'Google' AND _cdn_provider != ''
GROUP BY provider
)
ORDER BY num desc

Dentre as acima listadas, as que tem ou tera ponto de presença no Brasil: Akamai, Cloudflare, EdgeCast, CloudFront, Fastly, MaxCDN (NetDNA), CDNetwokrs, ChinaNetCenter, Level3, Incapsula e Highwinds.

Voltando ao início e aoEu texto do Souders sobre compressão, ele propôs que habilite/configure a compressão quando as respostas HTTP tiverem :

Extensions: js css html json ico eot otf ttf

Ou

Content-Type: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon

A configuração padrão na Akamai é:

Content-Type: text/html text/css application/x-javascript text/xml text/plain application/json text/javascript *

Fazendo consulta similar ao do Souders para saber “Quais os content-types mais mais recorrentes acima de 1 mil recorrências e que tiveram compressão habilitada?”.

1
2
3
4
5
6
7
8
SELECT content_type, round(100*ratio) as percent, num
FROM
  (SELECT count(resp_content_type) as num,
    REGEXP_REPLACE(resp_content_type,r';.*', '') as content_type, RATIO_TO_REPORT(num) OVER() ratio
    FROM httparchive:runs.2014_11_01_requests
    WHERE NOT (resp_content_type contains 'image' OR resp_content_type contains 'audio' OR resp_content_type = '') AND _gzip_save > 0
    GROUP BY content_type HAVING num > 1000)
ORDER BY num DESC;

Da lista, pode-se descartar alguns: application/octet-stream (formato genérico de arquivos), text/x-component (formato microsoft antigo, não mais usado), application/x-shockwave-flash, font/woff e application/x-www-form-urlencoded. Os três últimos são formatos já com compressão e fazer compressão num servidor web ou CDN é usar o processamento desnecessariamente.

Juntado as listas, a regra a ser configurado no servidor web, proxy reverso ou CDN será:

Extensions: js css html json ico eot otf ttf

Content-Type: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon text/x-js.

Acrescentado o text/x-js na lista de Content-Type, um site poderá ter mais requisições HTTP compressão, consequentemente o site terá o tráfego de rede menor. Claro, sem esquecer de mencionar que o usuário poderá ter uma experência melhor com as páginas do site já que elas poderão ser menores e mais rápidas.

Nas novas configurações na Akamai estou acrescentando os Content-Type e os arquivos para as regras de compressão e cache como abaixo:

Regra de compressão

Regra de Cache

Os resultados e comentários sobre ranking das CDNs estão no texto que publiquei publicado no Bigqueries.

Obs.: As expressões regulares no BigQuery são baseadas no RE2, recomendo fortemente ler a documentação dele.

Links

http://httparchive.org/

http://httparchive.org/trends.php

http://en.wikipedia.org/wiki/Content_delivery_network

http://www.fastly.com/blog/new-gzip-settings-and-deciding-what-to-compress/

http://bigqueri.es/t/whats-the-popularity-of-different-cdns/477

https://cloud.google.com/bigquery/query-reference

https://code.google.com/p/re2/wiki/Syntax

Meetup Docker-SP: Docker na vida real

| Comments

No dia 18 de Novembro estarei no Meetup Docker São Paulo para falar um pouco da migração de serviços de infraestrutura para o Docker.

A apresentação vai ser um pouco diferente que fiz no TDC em Porto Alegre pelo tempo menor disponível para expor. Mas se estiver por lá, podemos conversar um pouco mais sobre containers. :)

A do TDC está logo mais abaixo:

Docker 1.3

| Comments

A versão 1.3 do Docker foi lançada recentemente. Eu gostei dela por duas razões.

Verificação da assinatura digital

O pessoal da DotCloud já tinha anunciado alguns repositórios oficiais de alguma ferramentas e linguagens de programação (C(++)/GCC, PHP, Go, Java, Nodejs, Python, Perl, Ruby, etc.). O Docker verifica se os repositórios oficiais estão íntegros, eles (os repositórios) são assinados com chave criptográficas. (Obs. procurando que tipos de chaves são e como são assinados)

Antes disso eu tinha um pouco de restrição com os repositórios de terceiros. Até então, preferia criar meus templates de containers.

Entrar num container em execução

Nas versões anteriores era um pouco trabalhoso para você entrar num container e analisar um problema que estivesse ocorrendo, exemplo: identificar um problema de permissão num diretório.

Na versões anteriores teria que ser feito assim:

Na criação do container deveria compartilhar os diretórios de log e da aplicação. Supondo que seja um servidor web simples, o dockerfile seria como o abaixo:

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM debian:wheezy

MAINTAINER fike at midstorm.org

RUN apt-get udpate && apt-get install apache2

ADD mysite /var/www/

RUN apt-get autoremove -y && rm -rf /tmp/* /var/tmp/*

ENV APACHE_RUN_USER www-data

ENV APACHE_RUN_GROUP www-data

ENV APACHE_LOG_DIR

VOLUMES ["/var/log/apache2", "/var/www"]

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Criando o container

1
fike@kamino:~$ docker build -t="mysimplesite"  .

Executando

1
fike@kamino:~$ sudo docker run -d -p  80:80 mysimplesite

Putz! Os internautas não estão conseguindo acessar meu site, ele está retornando 403.

Se não tiver uma versão mais recente do util-linux (> 2.27) não poderá usar o nsenter. Outra forma seria executar um segundo container e acessar os diretórios compartilhados do primeiro.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker run -it --volumes-from=$CONTAINERID /bin/bash

Se estiver usando um Fluent ou outro agregador de logs não precisaria disso, certo? Nesse caso, sim. Entretanto pode ocorrer de precisar inspecionar um container para verificar um vazamento de memória ou algo que necessite analisar a aplicação em produção.

Se o problema estiver relacionado a rede, a abordagem era parecida. Um bom exemplo, alterar uma zona DNS no Bind9 usando o rndc.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker run -it --volumes--from=$CONTAINERID --net='container:$CONTAINERID' mysimplesite /bin/bash

No 1.3 é bem mais simples.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker exec -it $CONTAINERID /bin/bash

Eu fui: TDC 2014- Edição POA

| Comments

Participar de eventos é sempre uma boa oportunidade de aprender coisas novas, aumentar o networking e repassar conhecimento ou algumas lições aprendidas. :)

Acredito que o pessoal da organização do TDC gostou da minha apresentação na edição de São Paulo (Você está preparado para um milhão de usuários?) porque eles aprovaram as três proposta que inscrevi.

Gostei bastante desta edição de Porto Alegre porque vi algumas coisas novas bem interessantes. As que destacam: (para mim)

No meu trabalho atual, costumo usar um quadro branco ou papel em detrimento à apresentações em Power Point/LibreOffice Impress para discutir com os clientes produtos e serviços, como também, definição de arquitetura.

Não sabia que isso era chamado de Visual Thinking, eu costumava chamar de “Quer que eu desenhe?” Aliás, alguns meses atrás comecei esboçar uma apresentação falando disso, vou aumentar a prioridade dela no meu TODO.

Nunca iria imaginar que uma apresentação sobre Software Delivery poderia ter encenação teatral, foi animal!

Foi muito interessante porque o Diogo usou o mesmo termo que eu para definir o Docker: “Disruptivo”. Bom, falei sobre ele na apresentação: “Docker na vida real

As outras apresentações foram sobre Web Performance – “Será que seu site está preparado para um milhão de usuários simultâneos?” e “Managenment 3.0 – a vida pós-agilidade


Será que seu site está preparado para um milhão de usuários simultâneos?

Docker na vida real

Managenment 3.0 – a vida pós-agilidade

PGDAY Campinas: Docker e PostgreSQL

| Comments

Fazia um bom tempo que não participava de um evento de PostgreSQL e finalmente a pude participar novamente. Fui no PGDAY Campinas e fiquei muito contente em ver muita coisas nova do PostgreSQL e o ecossistema em volta.

Aliás, teve ligthing talk e puder falar um pouco sobre como usar o PostgreSQL num container Docker.

Ah, já estava esquecendo. A organização do evento estava excelente, coffee-break também. Parabéns para o pessoal que organizou o PGDAY Campinas! :)