Aumentar max_map_count no Linux

Para aumentar o parâmetro max_map_count

1.Adicione a seguinte linha para o arquivo /etc/sysctl.conf:

Por exemplo:

2.Reload a config como root:

3.Check o novo valor:

Dica: Elastic Search rodando através de um Docker pede esta configuração.

Listar os maiores arquivos em um pasta no Linux

De tanto o pessoal do trabalho me pedir esse comando vou deixa-lo ele aqui disponível, rs, :)

Logue como root

root@ip-10-0-0-1:/home# find . -type f -exec du -Sh {} + | sort -rh | head -n 15

1 – O comando lista sempre os maiores arquivos da pasta atual recursivamente. Por ex: se vc rodar ele na pasta home, listará as maiores arquivos desse diretório e também os maiores arquivos que estão dentro dos diretórios filhos e assim or diante.

2 – O número 15 no final indica a quantidade de arquivos que vc deseja encontrar. Troque por 30 por ex e será listado os 30 maiores arquivos.

Fontes:
http://go2linux.garron.me/linux/2010/11/how-list-or-find-largest-files-and-directories-folders-linux-free-disk-space-850
http://stackoverflow.com/questions/12522269/bash-how-to-find-the-largest-file-in-a-directory-and-its-subdirectories
http://www.codecoffee.com/tipsforlinux/articles/22.html
http://ask.xmodulo.com/find-biggest-files-directories-linux.html
https://dzone.com/articles/find-all-large-files-linux  (muito bom)

JavaScript: O que são Closures

Closure (“clausura” em português) é uma função que tem acesso as variáveis do escopo pai, ou seja, do “escopo léxico” que ela está contida (ex: o corpo de uma função, um bloco delimitador). O closure tem três cadeias de escopo: o seu próprio escopo; escopo externo, tendo acesso as variáveis da função exterior; e o escopo que tem acesso as variáveis globais.

Em JavaScript apenas funções possuem um novo contexto léxico.

Um exemplo clássico de um Closure é a criação de um contador sem o uso de uma variável global. Por ex:

Se você tentasse fazer algo do tipo:

Você poderia pensar que o valor de counter no final seria 3. Mas não, ele será sempre 1.

Mas se retornarmos um “função” no lugar de “counter”, teremos assim nossa closure.

Dessa forma a variável add possui a função function () {return counter += 1;} com acesso ao escopo da função pai (onde foi declarado a variável counter).

Portanto quando chamamos add(),  estamos chamando a função function () {return counter += 1;}, que por sua vez incrementa a variável ‘counter’.

Não muito semelhante, mas equivalente, algo parecido, também possibilita ter funções com variáveis privadas, como no exemplo abaixo:

Como demonstrado no exemplo acima, a variável private,  “vive” apenas dentro da função e apenas de lá que seu valor pode ser acessado e alterado.

Closure para fazer currying

Currying é uma técnica para transformar uma função que recebe múltiplos parâmetros em uma outra com muito menos parâmetros.

Outra explicação muito boa retirada do insubstituível stackoverflow:
“Currying” é um função que “captura” alguns parâmetros para outras funções e retorna uma função (uma “closure”) que aceita o restante dos parâmetros.

Imagine a função greet:

Com um pequeno ajuste poderíamos fazer uma função para cumprimentar qualquer pessoa sem ter que passar o valor “Hello” para o argumento novamente.

Valeu, ;)

Abaixo segue as fontes de onde me inspirei para fazer este post:

https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Closures
https://www.w3schools.com/js/js_function_closures.asp
https://pt.stackoverflow.com/questions/1859/como-funcionam-closures-em-javascript/1860#1860
https://www.turbosite.com.br/blog/entenda-o-que-sao-closures-em-javascript/
https://www.sitepoint.com/currying-in-functional-javascript/ 

JavaScript: A função da palavra chave “this” e os métodos call, apply e bind

Este post foi escrito como parte de uma série de estudos (resumos) que estou fazendo sobre JavaScript, por isso foi imensamente inspirado na documentação oficial, o que explica muitas similaridades entre os textos. Mas é possível também encontrar aqui alguns pequenos pontos que aprendi que não estão no texto original.
Texto original: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/this

Em JavaScript o this tem um comportamento um pouco diferente das outras linguagens. Seu valor na maioria dos casos depende muito de como uma função é chamada, podendo assim ter seu valor trocado (bem estranho isso), mas é assim mesmo que ele funciona, o que confere muitos poderes para quem está utilizando e com grandes poderes vem grandes bugs :)

Sintaxe:

Em Contexto Global

Em um contexto global a palavra chave this tem o mesmo valor do objeto global (window):

O exemplo acima nos mostra que this é igual a window no contexto global

Em Contexto de função

Dentro de uma função o valor do this depende de como ela é chamada. Vamos aos cenários possíveis.

Para funções declaradas no escopo global:

Neste cenário o valor de this é sempre igual a window:

Mas se utilizamos o modo estrito no contexto da função, o valor de this neste caso será undefined, isso acontece porque neste modo, precisamos explicitamente especificar “quem” chamou a função. Por ex:

Para funções arrow

Nas funções arrow o this é definido pelo contexto ao qual está inserido, mesmo se chamado utilizando os métodos call, apply ou bind.

Como visto no exemplo acima, não importa o que se faça, o valor de this será sempre “window” para este cenário, pois a arrow function foi definida no escopo global.

Se tivéssemos definido a arrow function dentro de uma outra função, como abaixo:

O valor de this neste caso será referenciado ao contexto da função Pessoa.
IMPORTANTE: Interessante também demonstrar que SEM a arrow function o valor de this seria diferente, por ex:

Isto acontece porque antes das arrow functions, toda nova função definia seu próprio valor de this (um novo objeto no caso de um construtor, undefined em chamadas de funções com strict mode, o objeto de contexto se a função é chamada como um “método de objeto”, etc.). Este comportamento é importuno com um estilo de programação orientado a objeto.

Explicação retirada de: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Como método de um objeto

Para funções (métodos) de objetos, o valor do this faz referencia ao próprio objeto no qual se originou a chamada.

No exemplo acima o this faz referencia ao próprio objeto “obj”.

Interessante lembrar que independente de onde a função foi definida e que se ela for referenciada para dentro de um objeto, o resultado será o mesmo. por ex:

Como visto acima a função independent foi definida primariamente fora do objeto ”obj” e referenciada logo após para a propriedade “obj.f” e no final obtivemos o mesmo resultado.

É importante lembrar também que o this se refere sempre ao membro mais imediato, como no exemplo abaixo:

this neste caso se refere ao objeto “b”, por isso retornou 42.

Na cadeia de protótipos (prototype chain) do objeto

Neste caso, o this sempre assume o valor da “instância” que fez por sua vez referencia ao objeto original.

Como visto no exemplo acima “p” é uma instância de “o” e por isso this se refere a “p”  

Em construtores

Quando uma função é usada como um construtor por intermédio da palavra new, o this vai se referir ao novo objeto criado (nova instancia).

Métodos call, apply e bind

Toda função que possui a palavra this dentro de seu corpo, pode usar um dos três métodos.

O this nos manipuladores de eventos no DOM

Para funções utilizadas como manipuladores de eventos, o this se refere sempre ao objeto no qual registrou o evento.

 

  

Migrando do Django 1.10 para o Django 1.11.8

Bora lá então:

Primeiro erro:

Se você está usando uma versão um pouco antiga de django-filter, o erro abaixo pode acontecer:

Django 1.11 compatibility issue – cannot import name flatatt

Para corrigi-lo, basta instalar a ultima versão.

Fonte: https://github.com/carltongibson/django-filter/issues/673

Segundo Erro:

context must be a dict rather than Context.

Basta remover a Classe Context

Ficando assim:

Referencia: https://stackoverflow.com/questions/43787700/django-1-11-typeerror-context-must-be-a-dict-rather-than-context

Terceiro Erro:

Se você está usando django-widget-tweaks e estiver mudando o tipo do campo em um formulário, como no exemplo abaixo:

apenas attr:"type:hidden" não irá funcionar, a explicação para isso está neste link: https://github.com/jazzband/django-widget-tweaks/issues/52

Então para corrigir isso será necessário mudar o tipo do campo no próprio form, dessa forma:

Outras maneiras de mudar o tipo do campo: http://nanvel.name/2014/03/django-change-modelform-widget

Quarto Erro: 

Incompatibilidade de Pickled Objects

1 – Pickled model instance’s Django version 1.10 does not match the current version 1.11.8.
2 - Pickled queryset instance’s Django version 1.10 does not match the current version 1.11.8.

Para corrigir este erro será necessário limpar o seu sistema de cache, seja ele, Redis, Memcached, etc

Fonte: https://docs.djangoproject.com/en/2.0/howto/upgrade-version/#deployment

Quinto Erro:

Se você está usando django-select2, abaixo da versão 5.11.1, o erro build_attrs() takes at most 2 arguments (3 given), pode acontecer:

Para corrigir este erro, atualize o versão para 5.11.1 (obs: a versão 6.0.0 dá suporte apenas para Django 2.0 e Python >= 3.6)

Após esta atualização, o seguinte erro também pode acontecer:

ModelSelect2Widget is missing a QuerySet. Define ModelSelect2Widget.model, ModelSelect2Widget.queryset, or override ModelSelect2Widget.get_queryset().

Para corrigir isso, coloque o parametro model ou queryset no widget, como abaixo:

Sexto Erro:

Não teve sexto erro, aeeeeee, uuuuuuufaa, achei que ia ter mais, por isso comecei a escrever este post, pois quando migramos do Django 1.6 para o Django 1.10, milhões de erros surgiram, para conferir veja este link, http://www.mateuspaduaweb.com.br/atualizando-django-1-6-para-1-9-ou-1-10/.
Que bom que os erros pararam por aqui :)

 

Atualizar (sincronizar) um repositório ‘forkado’ a partir do repositório original

Para sincronizar um repositório que você ‘forkou‘ com seu repositório de origem, primeiro precisamos adicionar ao seu GIT local um caminho que aponte para o repositório original:

Primeiro:
Vamos listar nossos repositórios remotos, vinculados a nossas branches locais.

Segundo:
Vamos adicionar um apontamento para o repositório original:

Terceiro:
Listando novamente os repositórios remotos:

Quarto:
(Fetching)
Descendo o repositório original para sua máquina:

Quinto:
Agora nós temos as branches e as tags do repositório original na nossa máquina

Sexto:
Com o código do repositório original na nossa máquina vamos rodar um comando para ver o que será atualizado em nossa branch master antes de fazer o merge.

Dica: sem o –stat acima você consegue ver todo o código que será atualizado, linha por linha.

Sétimo:
Vamos agora fazer o merge com a master local

Feito !!!
Com isso nosso fork está sincronizado com sua origem.

Fontes:
http://digitaldrummerj.me/git-syncing-fork-with-original-repo/
https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository
https://gist.github.com/CristinaSolana/1885435

 

Corrigindo erro “Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem “vboxsf” is not available…”

Se você receber este erro:

“Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem “vboxsf” is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:”

Instale vagrant-vbguest e tudo voltará a funcionar corretamente.

Geralmente este erro acontece toda vez que você atualizar a versão do VirtualBox ou VMware e para não dar mais esse erro voce precisará atualizar também o programa que gerencia a interação entre o host e o guest, como compartilhamento de diretórios e é ai que entra o vagrant-vbguest.

:)

Instalando ElasticSearch com Docker no MAC OS

Primeiramente vamos instalar o Docker, seguindo o link da instalação oficial:

Siga as instruções no link abaixo:
https://docs.docker.com/docker-for-mac/install/

Após a instalação essa será a estrutura do Docker no seu Mac.

docker-for-mac-install

Obs: Docker para Mac não usa VirtualBox, mas HyperKit, uma solução MacOS de virtualização leve construída sobre o Hypervisor.framework do macOS 10.10 Yosemite ou maior.

Checando as versões do Docker Engine, Compose, e Machine

Alguns comandos úteis para testar se está tudo ok com a instalação do Docker:

Para ver se o docker está buscando corretamente as imagens no repositório remoto:

Finalmente vamos instalar o elasticsearch, para isso utilizaremos o docker pull para buscar nossa imagem do elasticsearch no repositório oficial do docker.

Para ver as imagens baixadas pelo docker e disponíveis para uso, use o comando:

Rodando agora a versão de desenvolvimento:

Para ver se está tudo OK digite:

Observe as credenciais -u elastic:changeme acima, elas são padrão na extensão de segurança X-Pack Security que vem dentro na imagem do elasticsearch.

A autenticação pode ser desabilitada passando xpack.security.enabled=false como opção no comando do docker, ficando assim:

Agora é possível utilizar desta forma, sem autenticação:

E como eu não quero ter que lembrar a todo momento esse comando gigante, vamos dar um nome para ele e assim podermos subir a nosso docker de elasticsearch mais facilmente.

Assim é possível rodar apenas digitando:

Finalmente vamos adicionar dados ao nosso ElasticSearch:

Primeiro precisamos adicionar um indice (um indice é um conjunto de documentos):

Agora digite:

e você verá o índice que foi criado:

com o índice criado, vamos criar um documento qualquer:

Você deve ver:

Obtendo o documento criado acima:

Obtendo um documento que não existe:

Removendo um documento:

Bons estudos :)

Links relacionados:
https://docs.docker.com/docker-for-mac/install/
https://docs.docker.com/docker-for-mac/#check-versions-of-docker-engine-compose-and-machine
http://blog.ryanjhouston.com/2017/04/10/elasicsearch-docker-containers.html
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/docker.html#docker-cli-run-prod-mode
https://marekj.github.io/2016/03/22/elasticsearch-mac-osx

Como obter a versão do ElasticSearch

Basta digitar no seu terminal:

Sucesso, :)

Atualizando Django 1.6 para 1.9 ou 1.10

pythondjangoEsses dias atrás recebemos a missão de atualizar o Django em um de nossos projetos para a sua versão mais nova e depois de muito esforço conseguimos. Deixo abaixo, anotado todos os passos que fizemos para conseguir tal resultado, para o caso de alguém também precisar, então vamos lá, :)

O South se foi:

A partir da versão 1.7 do Django, não precisamos mais usar o South, pois este foi “incorporado” dentro do Framework e a sintaxe das novas migrações são um pouco diferentes, por isso não são mais compatíveis com a sintaxe do South, sendo assim temos que gerar “essas novas migrações” e depois aplica-lás como “fakes” para só depois conseguirmos usar o novo módulo de migração.

Primeiro

Tenha certeza que todas suas migrações antigas estejam aplicadas.

- IMPORTANTE: Se você usa controle de versão, faça uma nova branch git checkout -b update_django e comece a trabalhar a partir deste ponto. Caso ocorra algum problema é só voltar para o branch anterior :)

Crie um novo virtualenv, pois muitas apps e bibliotecas serão atualizadas e no caso de precisar voltar tudo, basta mudar para o env antigo.

- Atualize o Django.

- Vamos então fazer um backup das migrações antigas, para isso, cole o comando abaixo no seu terminal sem o $ inicial, :), substituindo o caminho abaixo pelo caminho do diretório que contém suas apps. Rode os comandos abaixo no seu shell.

- Depois do backup feito, criamos novamente as “pastas migrations vazias” dentro de cada app:

- E criamos um arquivo __init__.py dentro de cada pasta migrations:

- Em settings.py retire a app ’south’ de INSTALLED_APPS

Fonte: https://docs.djangoproject.com/en/1.9/topics/migrations/#upgrading-from-south

- IMPORTANTE: Daqui para frente é bem provável que os dois comandos abaixo falharão devido ao fato de que ainda é preciso corrigir os pacotes, erros de importação, e muitos outros que irão surgir devido a atualização do Django. Portanto se preciso, corriga os erros e só depois rode os dois comandos abaixo para finalizar o upgrade das suas migrations

- Rode python manage.py makemigrations. Django verá as pastas migration vazias e criará novas initial migrations no novo formato.

- Rode python manage.py migrate --fake-initial. E pronto, seu projeto está apto a criar novas migrações.

Segundo

Aqui está listado as apps que precisei atualizar, para funcionar com Django 1.10

Abaixo alguns erros que aconteceram comigo :(, mas felizmente deu tudo certo no final :)

Primeiro erro:

Retirar tudo de __init__.py e coloque dentro de um arquivo com o nome de apps.py, pois a partir das novas versões, caso você tente carregar alguma model dentro de __init__.py esta não estará disponível, por isso devemos carregá-la no ready de uma classe que estende AppConfig. O arquivo apps.py deve ficar dentro da app em questão. No exemplo abaixo import integracoes.signals_connectors que estava dentro de __init__.py deve ficar como no exemplo abaixo:

Segundo erro:

Erro: django.core.exceptions.ImproperlyConfigured: Creating a ModelForm without either the ‘fields’ attribute or the ‘exclude’ attribute is prohibited; form CampanhaConfiguracoesGeralAdminForm needs updating.

Em todos os ModelForm coloque o campo fields caso este não exista:

Fonte: https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#selecting-the-fields-to-use

Terceiro erro:

Remover todos os imports from django.conf.urls import patterns

Erro: TypeError: view must be a callable or a list/tuple in the case of include(). 

Ou em urls.py:

Fonte: http://stackoverflow.com/questions/38744285/django-urls-error-view-must-be-a-callable-or-a-list-tuple-in-the-case-of-includexto

Quarto erro:

Em seu settings, mude a configuração do seus templates para:

Fonte: https://docs.djangoproject.com/en/1.10/ref/templates/upgrading/

Quinto erro:

Erro: <class ‘minha_app.admin.MeuAdmin’>: (admin.E111) The value of ‘list_display_links[0]‘ refers to ‘None’, which is not defined in ‘list_display’.

Se dentro de alguma classe admin.ModelAdmin estiver a propriedade list_display_links setada desta forma:

Fonte: http://stackoverflow.com/questions/35184004/how-to-avoid-admin-e111-error-in-django-1-9-2

Sexto erro:

Erro: (urls.E004) Your URL pattern (‘^’, (<module ‘meu_path.urls’ from ‘/home/meu_user/projetos/meu_path/urls.pyc’>, None, None)) is invalid. Ensure that urlpatterns is a list of url() instances. HINT: Try using url() instead of a tuple.

Mude qualquer tupla dentro de urlpatterns

para url() instâncias:

Fonte: http://stackoverflow.com/questions/38786461/django-error-your-url-pattern-is-invalid-ensure-that-urlpatterns-is-a-list-of

Sétimo erro:

Erro: meu.path.suamodel: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.

mude:

para:

Fonte: https://code.djangoproject.com/ticket/24678

Oitavo erro:

Erro: AttributeError: ‘Options’ object has no attribute ‘module_name’ 

Mude:

Para:

Fonte: https://docs.djangoproject.com/en/1.8/internals/deprecation/

Nono erro: 

Erro: … object has no attribute ‘get_query_set’ class ConfigManager(models.Manager):

mude:

para:

Fonte: https://docs.djangoproject.com/en/1.8/releases/1.8/#features-removed-in-1-8

Décimo erro: 

Erro: set_autocommit got an unexpected keyword argument ‘force_begin_transaction_with_broken_autocommit’

Deixe de usar django-transaction-hooks e use o listener transaction.on_commit() nativo do novo Django.

Fonte 1: https://stackoverflow.com/questions/34114408/set-autocommit-got-an-unexpected-keyword-argument-force-begin-transaction-with/34114416#34114416
Fonte 2: https://docs.djangoproject.com/en/1.9/topics/db/transactions/#django.db.transaction.on_commit

Décimo primeiro erro:

Erro: ‘future’ is not a registered tag library. Must be one of:

Remova todos os imports {% load url from future %} de seus templates pois foi depreciado.

Décimo segundo erro:

Erro: Django error: render_to_response() got an unexpected keyword argument ‘context_instance’

Décimo Terceiro erro:

Erro: ‘The number of GET/POST parameters exceeded ‘ TooManyFieldsSent: The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.

Em seu settings.py coloque a propriedade acima para None, assim DATA_UPLOAD_MAX_NUMBER_FIELDS = None

Fonte: https://docs.djangoproject.com/en/1.10/ref/settings/#data-upload-max-number-fields

Se você usa DRF (Django Rest Framework), com certeza você obterá erros abaixo:

Erro: ‘GetProdutoDetailView’ should either include a queryset attribute, or override the get_queryset() method.

Erro: request.DATA has been deprecated in favor of request.data since version 3.0, and has been fully removed as of version 3.2.

Basta substituir request.DATA por request.data em suas API Views.

Fonte: http://www.django-rest-framework.org/topics/3.2-announcement/#deprecations