Wednesday 5 July 2017

Python Stock Options


Boost C Libraries Bem-vindo ao Boost. org Boost fornece bibliotecas de fontes portáteis C portáveis ​​gratuitas. Enfatizamos as bibliotecas que funcionam bem com a Biblioteca Padrão C. Boost bibliotecas são destinadas a ser amplamente útil, e utilizável em um amplo espectro de aplicações. A licença Boost incentiva o uso comercial e não comercial. Pretendemos estabelecer a prática existente e fornecer implementações de referência para que as bibliotecas Boost sejam adequadas para uma eventual padronização. As bibliotecas Ten Boost estão incluídas no Relatório Técnico da Biblioteca de Comitês de Padrão C (TR1) e no novo Padrão C11. O C11 também inclui várias bibliotecas Boost, além das da TR1. Mais Boost bibliotecas são propostas para padronização no C17. Desde 2006, uma longa conferência anual de uma semana íntima relacionada ao Boost, chamada C Now, foi realizada em Aspen, Colorado, em cada maio. Boost tem participado do Google Summer of Code anual desde 2007. Primeiros passos O Boost funciona em quase todos os sistemas operacionais modernos, incluindo as variantes UNIX e Windows. Siga o Guia de Introdução para baixar e instalar o Boost. Distribuições populares de Linux e Unix, como o Fedora. Debian. E o NetBSD inclui pacotes Boost pré-construídos. Boost também pode estar disponível no servidor interno da sua organização. Antecedentes Leia mais com o material introdutório para ajudá-lo a entender o que Boost é sobre e para ajudar a educar sua organização sobre Boost. O Boost acolhe e prospera a participação de uma variedade de indivíduos e organizações. Muitas vias de participação estão disponíveis na Comunidade Boost. Versão atual 26 de dezembro de 2016 23:43 GMT Versão 1.63.0 Bibliotecas atualizadas: Atômico, Container, Contexto, Fibra, Fusão, Geometria, Hash, Interprocesso, Intrusivo, LexicalCast, Log, Metaparse, Mover, Opcional, Phoenix, Python, Teste , TypeIndex, Units, Unordered. 26 de dezembro de 2016 23:43 GMT Versão 1.62.0 Novas bibliotecas: Fiber, QVM Atualizado Bibliotecas: Chrono, Circular Buffer, Container, Context, Coroutine2, DLL, FunctionalForward, Geometry, Interprocess, Intrusive, Lexical Cast, Log, Math, Phoenix , Regex, Test, Thread, TypeIndex, Unordered, Variant. 28 de setembro de 2016 15:17 GMT Versão 1.61.0 Novas bibliotecas: Compute, DLL, Hana, Metaparse. Bibliotecas Atualizadas: Qualquer, Container, Context, Corretina, Coroutine2, Fusion, Geometry, Interprocess, Intrusive, Lexical Cast, Log, Move, Optional, Test, Variant. 13 de maio de 2016 02:58 GMTPlanet Python Ao navegar em alguns códigos e códigos do Python, recebi recentemente a idéia e escrevi essas duas funções simples de conveniência para introspecção de objetos Python. A função o (para o bject a ttributes) pode ser usada para obter os atributos de qualquer objeto Python: (A razão pela qual eu simplesmente não digito dir (o) em vez de usar o (o) (para algum objeto o) é porque No IPython (embora não na vanilla Python), fazendo apenas dir (o) exibir os atributos em uma linha vertical, então a saída desliza para fora da tela se houver muitos atributos, enquanto a função o () os imprime horizontalmente, então a saída Se encaixa em algumas linhas sem deslocamento.) E executando o () algumas vezes no shell do Python, dá (prompts do shell removidos): O oar de função (para o bject a ttributes r egular, o que significa excluir os métodos especiais ou dunder, Ou seja, aqueles que começam e terminam com um sublinhado duplo) podem ser usados ​​para obter apenas os atributos regulares de qualquer objeto python. A saída da execução: Aqui estão algumas postagens sobre a introspecção de Python. I8217ve escrito sobre o uso de vagabundo para 99,9 do meu trabalho de Pitão aqui aqui (veja aqui e aqui por exemplos). Além de vagabundo, eu uso cadernos jupyter em 99.9 do trabalho que eu faço, então imaginei que eu devia passar um pouco de tempo descrevendo como eu uso jupyter com vagabundo. Primeiro, you8217ll precisa ter vagabundo configurado e funcionando (descrições para linux. MacOS. Windows). Uma vez que você tenha instalado vagabundo, precisamos fazer algumas alterações no VagrantFile para permitir o encaminhamento da porta da máquina virtual vagabunda para o navegador no seu computador. Se você seguiu o Vagrant na publicação do Windows, you8217ll já configurou a configuração que você precisa para vagrant encaminhar a porta necessária para o jupyter. Para aqueles que não leram essa publicação, abaixo estão os ajustes que você precisa fazer. Meu VagrantFile padrão é mostrado na figura 1 abaixo. You8217ll só precisa mudar 1 linha para que o encaminhamento das portas funcione. You8217ll precisa alterar a linha que lê: para o seguinte: Esta linha encaminhará a porta 8888 no convidado para a porta 8888 no host. Se você não estiver usando a porta padrão de 8888 para jupyter, you8217ll precisa mudar 821688888217 para a porta que você deseja. Agora que o VagrantFile está pronto para ir, faça um rápido 8216vagrant up8217 e 8216vagrant ssh8217 para iniciar sua VM vagabunda e faça login nela. Em seguida, configure todos os ambientes virtuais que você deseja precisar (eu uso virtualenv para configurar um ambiente virtual para cada projeto). Você pode ignorar este passo, se desejar, mas é recomendado. Se você configurar um ambiente virtual, vá em frente e crie-o para que você esteja usando um ambiente limpo e depois execute o comando abaixo para instalar o jupyter. Se você não foi, então você pode apenas executar o abaixo para instalar o jupyter. Estás pronto. Jupyter deve estar instalado e pronto para ir. Para executá-lo para que seja acessível do seu navegador, basta executar o seguinte comando: Este comando informa o jupyter para ouvir em qualquer endereço IP. No seu navegador, você deve poder visitar sua nova e nova instância de jupiter (via vagrant) visitando a seguinte url: Agora você está pronto para ir com jupyter vagabundo. Nota: Se você está querendo aprender Jupyter, eu recomendo Aprender o IPython para computação interativa e visualização de dados (link de afiliado amazônico). Eu recomendo a todos os meus clientes que estão apenas começando com jupyter e ipython. A exploração, manipulação e visualização de dados começam com o carregamento de dados, seja de arquivos ou de um URL. Pandas tornou-se a biblioteca go-to para todas as coisas análise de dados em Python, mas se a sua intenção é pular diretamente na exploração e manipulação de dados, a Ferramenta de Importação de Dados Canopy pode ajudar, em vez de ter que aprender os detalhes da programação com os Pandas biblioteca. A Ferramenta de Importação de Dados aproveita o poder das Pandas ao fornecer uma interface de usuário interativa, permitindo que você visualmente explore e experimente o DataFrame (o equivalente das Pandas de uma planilha ou uma tabela SQL), sem precisar conhecer os detalhes da função específica de Pandas Chamadas e argumentos. A Ferramenta de importação de dados acompanha todas as mudanças que você faz (na forma do código Python). Dessa forma, quando terminar de encontrar o fluxo de trabalho correto para o seu conjunto de dados, a Ferramenta possui uma série de ações que você realizou no DataFrame e você pode aplicá-las em futuros conjuntos de dados para futuras discussões de dados mais rápidas. Ao mesmo tempo, a Ferramenta pode ajudá-lo a escolher como usar a biblioteca Pandas, enquanto ainda faz o trabalho. Para cada ação que você executa na interface gráfica, a Ferramenta gera o código PandasPython apropriado, permitindo que você veja e relate as tarefas ao código Pandas correspondente. Com a Ferramenta de importação de dados, o carregamento de dados é tão simples como escolher um arquivo ou colar um URL. Se um arquivo for escolhido, ele determina automaticamente o formato do arquivo, seja ou não o arquivo é compactado, e carrega de forma inteligente o conteúdo do arquivo em um Pandas DataFrame. Isso faz isso levando em consideração várias possibilidades que muitas vezes lançam uma chave de macaco no carregamento de dados inicial: que o arquivo pode conter linhas que são comentários, pode conter uma linha de cabeçalho, os valores em diferentes colunas podem ser de diferentes tipos, e. DateTime ou Boolean, e muitas outras possibilidades também. A Ferramenta de importação de dados torna o carregamento de dados em um Pandas DataFrame tão simples como escolher um arquivo ou colar um URL. Um vislumbre para carregar dados em Pandas DataFrames (The Hard Way) Os seguintes 4 8220inconvenience8221 exemplos mostram problemas típicos (e as soluções manuais) que podem surgir se você estiver escrevendo o código Pandas para carregar dados, que são resolvidos automaticamente pela Data Import Tool. Economizando tempo e frustração e permitindo que você chegue mais rápido ao importante trabalho de análise de dados. Digamos que você deveria carregar os dados do arquivo sozinho. Depois de pesquisar a documentação Pandas um pouco, você encontrará a função pandas. readtable que carrega o conteúdo de um arquivo em um Pandas DataFrame. Mas nunca é tão fácil na prática: pandas. readtable e outras funções que você pode encontrar assumem determinados padrões, o que pode estar em desacordo com os dados em seu arquivo. Inconveniência 1: Os dados na primeira linha serão usados ​​automaticamente como um cabeçalho. Digamos que seu arquivo (como esse: wind. data) usa espaços em branco como separador entre colunas e não possui uma linha contendo nomes de colunas. Pandas. readtable assume, por padrão, que seu arquivo contém uma linha de cabeçalho e usa guias para delimitadores. Se você não disser isso de outra forma, a Pandas usará os dados da primeira linha em seu arquivo como nomes de colunas, o que é claramente errado neste caso. A partir dos documentos, você pode descobrir que esse comportamento pode ser desligado passando o headerNone e use seps para pandas. readtable. Para usar o espaço em branco variável como o separador e para informar os pandas que uma coluna de cabeçalho não existe: Em 1: df pandas. readtable (wind. data, seps) Em 2: df. head () Out2: 61 1 1.1 15.04 14.96 13.17 9.29 13.96 9.87 13.67 10.25 10.83 0 61 1 2 14.71 16.88 10.83 6.50 12.62 7.67 11.50 10.04 9.79 1 61 1 3 18.50 16.88 12.33 10.13 11.17 6.17 11.25 8.04 8.50 12.58 18.50 15.04.1 0 9.67 17.54 13.83 1 7.67 12.75 12.71 Sem o cabeçalho Nem kwarg, você pode Veja que a primeira linha de dados está sendo considerada como nomes de coluna: Em 3: df pandas. readtable (wind. data, headerNone, seps) Em 4: df. head () Out4: 0 1 2 3 4 5 6 7 8 9 10 11 0 61 1 1 15,04 14,96 13,17 9,29 13,96 9,87 13,67 10,25 10,83 1 61 1 2 14,71 16,88 10,83 6,50 12,62 7,67 11,50 10,04 9,79 12 13 14 0 12,58 18,50 15,04 1 9,67 17,54 13,83 O comportamento que esperávamos, depois de dizer aos Pandas que o Arquivo não contém uma linha contendo nomes de coluna usando headerNone e especifique o separador: Inconveniência 2: as linhas comentadas causam a falha na carga de dados. Em seguida, digamos que seu arquivo contém linhas comentadas que começam com a. Pandas não entende isso por padrão e tentar carregar os dados em um DataFrame falhará com um erro ou pior, triunfará sem notificar que uma linha no DataFrame pode conter dados errôneos, a partir da linha comentada. (Isso também pode evitar a inferência correta dos tipos de coluna.) Mais uma vez, você pode dizer pandas. readtable que as linhas comentadas existem no seu arquivo e ignorá-los usando o comentário: Em 1: df pandas. readtable (testdatacomments. txt, sep ,, headerNone ) ------------------------------------------------- -------------------------- CParserError Traceback (último último último contato) ltipython-input-10-b5cd8eee4851gt em ltmodulegt () ---- gt 1 df pandas. readtable (catalysttestsdatatestdatacomments. txt, sep ,, headerNone) (rastreamento) CParserError: erro tokenizing dados. C erro: 1 campos esperados na linha 2, viu 5 Como mencionado anteriormente, se você tiver sorte, os Pandas falharão com um CParserError, reclamando que cada linha contém um número diferente de colunas no arquivo de dados. Escusado será dizer que não é óbvio dizer que esta é uma linha de comentário não identificada: Em 2: df pandas. readtable (testdatacomments. txt, sep ,, comment, headerNone) Em 3: df Out3: 0 1 2 3 4 0 1 False 1.0 um 2015-01-01 1 2 Verdadeiro 2.0 dois 2015-01-02 2 3 Falso 3.0 três 2015-01-03 3 4 Verdadeiro 4.0 quatro 2015-01-04 E podemos ler o conteúdo do arquivo corretamente quando contamos aos pandas que É o personagem em que as linhas comentadas no arquivo começam, como se vê no seguinte arquivo: Inconveniência 3: Dados com formatação de largura fixa fará com que a carga de dados falhe. Agora, digamos que seu arquivo contém dados em um formato de largura fixa. Tentando carregar esses dados usando pandas. readtable falhará. Escavar um pouco e você encontrará a função pandas. readfwf. Qual é a maneira sugerida de carregar dados de arquivos de largura fixa, não pandas. readtable. Em 1: df pandas. readtable (ncaabasketball2016.txt, headerNone) Em 2: df. head () Out2: 0 0 2016-02-25 Ark Little Rock 72 UT Ar. 1 2016-02-25 ULM 66 South. Aqueles de vocês familiarizados com Pandas reconhecerão que o DataFrame acima, criado a partir do arquivo, contém apenas uma coluna, rotulada como 0. O que é claramente errado, porque existem 4 colunas distintas no arquivo. Em 3: df pandas. readtable (ncaabasketball2016.txt, headerNone, seps) ---------------------------------- ----------------------------------------- CParserError Traceback (última chamada última) ltipython - input-28-db4f2f128b37gt em ltmodulegt () ---- gt 1 df pandas. readtable (functionaltestsdatancaabasketball2016.txt, headerNone, seps) (Traceback) CParserError: erro tokenizing dados. C erro: 8 campos esperados na linha 55, viu 9 Se não soubéssemos melhor, nós assumiríamos que o caractere delimiterseparador usado no arquivo era espaço em branco. Podemos dizer aos Pandas que carregem o arquivo novamente, assumindo que o separador era espaço em branco, representado usando o s. Mas, como você pode ver claramente acima, isso levanta um CParserError, reclamando que notou mais colunas de dados em uma linha do que a anterior. Em 4: df pandas. readfwf (ncaabasketball2016.txt, headerNone) Em 5: df. head () Out5: 0 1 2 3 4 5 0 2016-02-25 Ark Little Rock 72 UT Arlington 60 NaN 1 2016-02-25 ULM 66 South Alabama 59 NaN E, finalmente, usando pandas. readfwf em vez de pandas. readtable nos dá um DataFrame que está perto do que esperamos, dados os dados no arquivo. Inconveniência 4: NA não é reconhecido como texto convertido automaticamente para 8216None8217: Finalmente, vamos assumir que você possui dados brutos contendo a string NA. Esse é o caso específico usado para representar a América do Norte. Por padrão, pandas. readcsv interpreta esses valores de seqüência de caracteres para representar Nenhum e converte-os automaticamente para Nenhum. E Pandas faz tudo isso embaixo do capô, sem informar o usuário. Uma das coisas que o Zen of Python diz é que o Explicit é melhor do que o implícito. Nesse espírito, a Ferramenta lista explicitamente os valores que serão interpretados como NoneNaN. O usuário pode remover NA (ou qualquer um dos outros valores) desta lista, para evitar que seja interpretado como Nenhum. Como mostrado no seguinte arquivo: Em 2: df pandas. readtable (testdatanavalues. csv, sep ,, headerNone) Em 3: df Out3: 0 1 2 0 NaN 1 True 1 NaN 2 False 2 NaN 3 False 3 NaN 4 True In 4: df pandas. readtable (testdatanavalues. csv, sep ,, headerNone, keepdefaultnaFalse, navalues) Em 5: df Out5: 0 1 2 0 NA 1 Verdadeiro 1 NA 2 Falso 2 NA 3 Falso 3 NA 4 Verdadeiro Se suas intenções fossem Ir diretamente para a exploração e manipulação de dados, então os pontos acima são alguns dos inconvenientes que você terá que lidar, exigindo que você aprenda os vários argumentos que precisam ser passados ​​para pandas. jovem possível pode carregar seus dados corretamente e chegar a Sua análise. Carregando Dados com a Ferramenta de Importação de Dados (The Easy Way) A Ferramenta de Importação de Dados do Canopy contorna automaticamente vários inconvenientes e erros comuns de carregamento de dados simplesmente configurando os suposições corretas do arquivo na caixa de diálogo Editar Comando. A Ferramenta de importação de dados cuida todos esses problemas para você, permitindo que você avise rapidamente o importante trabalho de exploração e manipulação de dados. Ele automaticamente: Infere se seu arquivo contém uma linha de nomes de colunas ou não Infere inteligentemente se o arquivo contiver quaisquer linhas comentadas e qual o caracter do comentário Infers que delimitador é usado no arquivo ou se o arquivo contém dados em formato de largura fixa . A Ferramenta de Importação de Dados como Recurso de Aprendizagem: Usando o Código PythonPandas Gerado de Auto Até agora, falamos sobre como a Ferramenta pode ajudá-lo a começar a exploração de dados, sem a necessidade de você entender a biblioteca das Pandas e suas complexidades. Mas, se você também estivesse interessado em aprender sobre a biblioteca das Pandas, então o painel do Código Python na Ferramenta de Importação de Dados pode ajudar. Como você pode ver a partir da captura de tela abaixo, a Ferramenta de importação de dados gera o código PandasPython para cada comando que você executa. Desta forma, você pode explorar e aprender sobre a biblioteca Pandas usando a Ferramenta. Veja o código Pandon Pandas subjacente na Ferramenta de importação de dados para ajudar a aprender o código Pandas, sem diminuir o seu trabalho. Finalmente, depois de terminar de carregar os dados do arquivo e manipular o DataFrame, você pode exportar o DataFrame para o console Canopys IPython para posterior análise e visualização. Basta clicar em Usar DataFrame no canto inferior direito e a Ferramenta exportará o painel DataFrame para Canopys IPython, como você pode ver abaixo. Importe os dados limpos no console Canopy IPython para obter mais análise e visualização de dados. Pronto para tentar a Ferramenta de Importação de Dados do Canopy Recursos adicionais: Assista a um vídeo de demonstração de 2 minutos para ver como a Ferramenta de Importação de Dados do Canopy funciona: consulte o Webinar 8220Fast Avançar através da Análise de Dados Dirty Work8221 para obter exemplos de como a Ferramenta de Importação de Dados Canopy acelera dados munging : A FSFE pediu a nossa ajuda como parte da consulta pública em curso sobre a avaliação intercalar do Horizonte 2020, a Free Software Foundation Europe publicou e apresentou à Comissão Europeia o seu documento de posição para o endosso de Software Livre e Padrões Abertos no Horizonte 2020, O maior programa de investigação e inovação da UE. Como o software é uma parte vital da pesquisa científica de hoje, a FSFE acredita que as políticas de Acesso aberto promovidas no âmbito do Horizonte 2020 também devem abranger explicitamente a publicação de software sob as licenças de Software Livre. Desta forma, a UE irá realmente expor a Ciência Aberta. Se você gostaria de contribuir, leia mais sobre como participar da consulta pública e sobre como compartilhar nosso documento de posição, aqui: wiki. fsfe. orgActivitiesOpenScienceInterimEvaluationHorizon2020 Leia mais sobre o documento de posição e como você pode promover o Software Livre na ciência, aqui : Fsfe. orgactivitiespolicyeuHorizon2020-Position-Paper. en. html A consulta, administrada pela Comissão Europeia, está aberta a todos até 15.01.2017. Obrigado por apoiar o Software Livre e os Padrões Abertos na Ciência Postado por Savannah Mercado Kim tem anos de experiência trabalhando com alunos de todas as idades, nível de habilidade e habilidades e ela gostaria de oferecer o que ela sabe sobre mentoria bem-sucedida para sua nova comunidade. Ela é co-organizadora do CodeNewbie-Atlanta, fundadora da JrDevMentoring e autora do blog ldquoTech Talk For Non-Techiesrdquo. Kim também está atualmente cursando Médicos de Administração de Empresas - Empreendedorismo Tecnológico. O seu tema de estudo de doutorado é: Estratégias que alguns gerentes de desenvolvimento de software usam para efetivamente orientar desenvolvedores de software junior. Kim também está trabalhando em seu projeto de paixão JrDevMentoring e MentoringMinute Kim estará apresentando Superando os Desafios do Mentoring às 13:00 Sábado (24) no Quarto 200. O mentor bem sucedido não acontece, planejou o Itrsquos. Nós vamos discutir o que o mentoring não é, o que é o mentoring, os fatores para uma orientação efetiva e por que o itrsquos é importante para a comunidade de desenvolvedores. Seu software e serviços fornecem inteligência de mercado para hospitais e sistemas de saúde, equipando-os para tomar melhores decisões e maximizar o crescimento estratégico. Como muitos dos encontros anteriores PyLadies Pune, eu também fiz uma sessão neste mês. O básico de programação do sistema foi o tópico da minha sessão. Nós fizemos a sessão por cerca de uma hora, mas como esta sessão de meses também teve uma sessão de convidado durante o hangout, não poderíamos ir mais. Vamos fazer uma oficina de dia inteiro sobre o mesmo tópico no futuro. Convidado de Paul Everitt Em sua sessão, Paul escreveu um jogo muito simples usando o módulo Arcade no PyCharm. Transformei dúvidas dos participantes sobre conversar com ele, ele respondeu àqueles na sessão ao vivo. Você pode assistir a gravação da sessão completa no Youtube. Paul teve que acordar às 6:30 da manhã para levar esta sessão para nós, então todos nós ficamos muito felizes e gratos por ele ter feito isso por nós. Esta foi a primeira vez que a Anwesha não podia participar do encontro devido à saúde Pys. Tivemos cerca de 28 pessoas no encontro, o mais alto até a data. Uma pergunta sobre estilos de importação na lista de correspondência Python-Dev perguntou sobre importações como esta: importar xA0 os xA0 como xA0 o Compreender por que as pessoas fazem isso é uma lição interessante sobre como os módulos funcionam. Um módulo não é mais do que uma coleção de nomes. Quando você define um nome em um arquivo. py, ele se torna um atributo do módulo e, então, é importável a partir do módulo. Uma simplicidade subjacente no Python é que muitas declarações são realmente apenas declarações de atribuição disfarçadas. Todos estes definem o nome X: X xA0 xA0 17 def xA0 X (): xA0 print (quotlookquot) import xA0 X Quando você cria um módulo, você pode fazer o nome X importável desse módulo, atribuindo-o ou definindo-o Como uma função. Você também pode torná-lo importável importando você mesmo. Suponha que seu módulo se pareça com isto: xA0a sua modificação. py importar xA0 os def xA0 doit (): xA0xA0xA0xA0 os. Somethingorother () Este módulo possui dois nomes definidos: doit e os. Alguém mais agora pode fazer isso: xA0someone. py de xA0 yourmodule xA0 import xA0 os xA0orxA0worse, xA0thisxA0importsxA0osxA0andxA0doit: de xA0 yourmodule xA0 import xA0 Isso incomoda algumas pessoas. Os não fazem parte da interface real do seu modelo. Essa primeira importação que mostrei evita que esta vazamento de suas importações na sua interface. A estrela de importação não puxa nomes que começam com sublinhados. (Outra solução é definir tudo em seu módulo.) A maioria das pessoas, no entanto, não se preocupe com esse tipo de vazamento de nomes. A Import-star é desencorajada de qualquer maneira, e as pessoas sabem não importar os de outros módulos. A solução de renomear os para os apenas torna seu código feio para pouco benefício. A parte do tópico de discussão que realmente chamou a atenção foi Daniel Holths piscando a sugestão do padrão do modo ninja malvado da inicialização do módulo: def xA0 ninja (): xA0xA0xA0xA0 global xA0 exportado xA0xA0xA0xA0 import xA0 os xA0xA0xA0xA0 def xA0 exportado (): xA0xA0xA0xA0xA0xA0xA0xA0 os. Dosomething () ninja () del xA0 ninja O que está acontecendo aqui. Lembre-se de que def é uma declaração de atribuição como qualquer outra. Quando usado dentro de uma função, ele define um nome local, como sempre faz a tarefa. Mas uma tarefa em uma função pode definir um nome global se o nome for declarado como global. É um pouco incomum ver uma declaração global sem uma atribuição explícita no nível superior, mas funciona bem. A declaração def define uma função exportada global, porque a declaração global disse. Os é agora um local em nossa função, porque novamente, a declaração de importação é apenas outra forma de atribuição. Então, definimos ninja (), e depois executá-lo imediatamente. Isso define o global exportado, e não define um os global. O único problema é o nome ninja foi definido, que podemos limpar com uma declaração del. Por favor, nunca escreva código dessa maneira. É um tipo de sobre-defensividade que não é necessário no código Python típico. Mas entender o que faz, e por que isso faz isso, é uma boa maneira de flexibilizar sua compreensão do funcionamento de Python. Para saber mais sobre como os nomes (e valores) funcionam em Python, as pessoas parecem gostar da minha conversa PyCon, Nomes e valores de Python. Esta versão melhora a configuração remota do host, adiciona suporte ao desenvolvimento remoto para sistemas Linux de 32 bits e sistemas Linux mais antigos de 64 bits, corrige problemas de estabilidade que afetam alguns usuários e faz muitas outras melhorias. Aposto que você sabe como iterables (coisas que você pode fazer um loop) trabalham em Python, mas como funcionam os iteradores. Vamos discutir um tipo de dados estranho que você encontrará em todos os lugares em Python. Eventos em 2017 Lançamos a programação funcional do mundo real. Divulgação: sou fã de programação funcional em Python. (Isto: packtpubapplication-developmentfunction-python-programming) Os culpados usuais para a programação funcional são map (). filtro(). Funções do gerador e as várias compreensões. Isso é muito agradável e pode levar ao código sucinto e expressivo. A operação de redução, no entanto, às vezes é escorregadia. As reduções óbvias são sum () e prod (). Algumas reduções um pouco menos óbvias são estas três: sum0 lambda s: soma (1 para em s) sum1 lambda s: soma (s) sum2 lambda s: soma (n2 para n em s) O primeiro é essencialmente len (s). Mas afirmou mais formalmente. Ele mostra como podemos adicionar em filtro ou transformações. Se estivesse trabalhando com um objeto coleções. Contro, podemos reescrever estes três para trabalhar com os valores () de um contador. Isso nos permite ter uma biblioteca de estatísticas que funciona com uma seqüência de itens simples ou um contador de itens binários. (Eu deixei isso como um exercício para que o leitor crie os resumos de Counter s.) A questão de verificação de saúde O contexto é um ponto final de segurança de aplicativos RESTful. Quando um cliente faz um GET para a saúde, queremos fornecer o status dos componentes nos quais o aplicativo depende, bem como um resumo. Os detalhes são criados assim: componentes (componente () para componente em COMPONENTLIST) initcomponents thing. initapp (app) para coisa em detalhes de componentes component. health () para componente em initcomponents Temos uma lista de definições de classe para cada componente. Podemos criar instâncias de cada classe. Podemos inicializar estes, fornecendo o aplicativo RESTful. Finalmente, podemos criar uma lista dos vários códigos de status de ponto final de saúde. Existe uma definição de classe para outras APIs RESTful. A verificação de saúde faz um GET transitivo para um ponto final de saúde. Estes são todos mais ou menos idênticos. Existem também definições de classe para o banco de dados e o cache e outros componentes não RESTful. É tudo muito bonito e muito funcional. Observe que as três declarações não estão adjacentes. Eles estão espalhados para se encaixar melhor com a maneira como o Flask funciona. A lista de componentes está em um só lugar. A inicialização ocorre antes da primeira solicitação. Os detalhes são computados conforme solicitado. Além disso. Nós realmente não usamos uma lista simples para os detalhes. Na verdade, é um mapeamento a partir do qual derivaremos um vetor. Deixei esse detalhe porque é uma complicação relativamente simples. Representação da saúde Representamos a saúde com uma enumeração simples de valores: isso fornece a definição essencial de saúde para nossos propósitos. Não arrastamos os detalhes da degradação, é algo que devemos determinar, observando nossos consoles e logs e outras coisas. A degradação é (a) rara e (b) matizada. Algumas degradações são simples aborrecimentos: um dos servidores está sendo reiniciado. Outras degradações são sugestões de que algo mais pode estar acontecendo que precisa de investigação: o servidor primário do banco de dados está desativado e estava em execução em um secundário. Resumindo a Saúde Um subconjunto do vetor de detalhes, então, parece assim: Status. OK, Status. OK, Status. DEGRADED. Como podemos resumir isso. Primeiro, precisamos de algumas regras. Como estes: O método depth () implementa um operador de comparação que define os relacionamentos. Isso pode ser visualizado como uma tabela. Isso nos permite definir uma função que usa reduzir para resumir o vetor de valores de status. A função reduz () aplica um operador binário entre itens em um vetor. Utilizamos lambda a, b: a. depth (b) para transformar o método depth () em um operador binário para que ele possa ser usado com redução. A função summary () é uma redução de profundidade de um vetor de objetos de status. É definido independentemente dos objetos de status reais. As relações entre os níveis de status são incorporadas na definição de classe onde elas pertencem. Os detalhes reais do status são agradavelmente opacos. Nós temos um exemplo de redução de mapa fora da esfera de grandes dados. The Integer Alternative As regras de saúde, como mostrado acima, são complexas. Podem ser simplificados. A resposta é não. Heres uma alternativa - o que não faz o que queremos. Isso funciona em alguns casos, mas isso não funciona em outros. Outra alternativa é mudar a ordem para OK1, DOWN2, DEGRADED3. Isso também não funciona. Vou deixá-lo como um exercício para escrever algumas das várias combinações de valores e ver como isso difere. Representação JSON O detalhe final é JSONificação do vetor de status e o resumo. Isso converte os vários objetos Status em itens de texto que se encaixam na especificação Swagger para nossos pontos finais de saúde. A referência de atributo. name é necessária para obter os rótulos de caracteres do enum. Uma alternativa é personalizar o codificador JSON para reconhecer os objetos Enum e extrair seus nomes. Conclusão Map-Reduce é fácil. Ele se encontra em vários lugares. A idéia ajuda a encapsular as regras de resumo. Em palavras de Mo Luns: sou uma estudante de jornalismo comum da CYU, Pequim. E na verdade, sou novato absoluto na programação do Python quando eu começar a traduzir este livro. Inicialmente, era apenas um capricho, mas quando fiz esse trabalho, percebi que uma decisão desencadeada pelo interesse me levou a ir tão longe. Com a ajuda das traduções dos meus predecessores e da vasta quantidade de informações fornecidas pela Internet desenvolvida, e com a ajuda de meus amigos, mostrei com prudência esta edição de tradução. Eu apenas espero que meu trabalho de tradução ajude outros recém-chegados a aprender Python. Ao mesmo tempo, estou sempre aguardando minha tradução dos comentários e sugestões, e pronto para mudar ou melhorar esse trabalho superficial. Às vezes, recebo pedidos de novos programadores para ajudá-los a aprender a desenvolver ferramentas de linha de comando. Eles pedem qualquer tutorial fácil e howtos. Minha resposta costumava ser o módulo argparse, e o tutorial oficial sobre o mesmo tópico é simples de entender. Mas agora eu recomendo que as pessoas usem o módulo de clique. Como qualquer outro projeto de Armin Ronacher. Tem uma ótima documentação. Nesta publicação, vou escrever um tutorial para iniciantes, você deve ler a documentação para mais detalhes e exemplos. Dicas de instalação e desenvolvimento O uso do virtualenv é altamente recomendado para o desenvolvimento de aplicativos de clique. Eu vou assumir que estamos em um diretório vazio e continuamos a partir daí. Para começar, teremos um simples arquivo hello. py com o seguinte conteúdo: agora precisamos de um arquivo setup. py. Isso nos ajudará a usar o módulo python que estamos escrevendo como uma ferramenta de linha de comando. Também é a maneira recomendada de escrever ferramentas de linha de comando em python, e diretamente usando scripts baseados no shebang. Você pode ver que mencionamos o ponto de partida da nossa ferramenta nos pontos de entrada, olá: cli aponta para a função certa para começar. Podemos então instalar isso no virtualenv localmente. Eu também criarei o virtualenv abaixo para que isso se torne mais fácil para outros. Para saber mais, leia este capítulo mais tarde. Agora, para converter o mesmo script em uma ferramenta baseada em cliques, faremos as seguintes modificações. Agora, quando executamos o comando novamente, não vemos nada alterado visualmente, mas ele possui um argumento de linha de comando --help (o que é opcional). Usando eco para impressão de texto O módulo de clique sugere usar a função de eco para imprimir, em vez da função de impressão padrão. Então, faremos a mudança necessária em nosso código. Boolean flags In a command line tool, we sometimes want to have a boolean option. If the option is provided then do something, if not provided, then do something else. In our example, we will call the flag as --verbose . it is provided, then we will print some extra text. We added another decorator to the cli function. In click. option() decorator, first we passed the flag using --verbose, then marked this option as a boolean flag, and then finally added the help text. By default, any boolean flag is treated as false. Standard options in the command line We can now add more options to our tool. For example, we will have a --name option which will take a string as input. Same option multiple times We may want to take the same option multiple times. Click has a very simple way to do so. In the above example, you can see that we specified the --name as a multiple options. It also means the name parameter in the cli function is now a tuple. Help text for the script We can add help text for the script using python docstrings. For example: Super fast way to accept password with confirmation Click provides a passwordoption() decorator, which can be used to accept a password over hidden prompt and second confirmation prompt. Btw, I am printing the password here as an example, never print the password to stdout in any tool. The output looks like below: To learn the full usage of password prompts, read this section . Must have arguments You can also add arguments to your tool. These are must haves, and if no default value is provided, they are assumed to be strings. In the below example, the script is expecting a county name to be specified. The output looks like: Click has many other useful features, like yes parameter . file path input . I am not going to write about all of those here, but you can always from the upstream documentation . The server part of Autocompeter has been entirely re-written from being Go and Redis to now being Django and ElasticSearch. We live in a hobby-rich world. There is no shortage of pastimes to grow a passion for. There is a shortage of one thing: time to indulge those passions. If youre someone who pours your heart into that one thing that makes your life worthwhile, thats a great deal. But, what if youve got no shortage of interests that draw your attention and you realize you will never have the time for all of them If I look at all the things Id love to do with my life as a rose bush Im tending, I realize that careful pruning is essential for the best outcome. This is a hard lesson to learn, because it can mean cutting beautiful flowers and watching the petals fall to the ground to wither. It has to be done. I have a full time job that takes a lot of my mental energy. I have a wife and a son and family time is very important in my house. I try to read more, and I want to keep up with new developments in my career, and Im trying to make time for simple, intentional relaxing to lower my anxiety and stress. That doesnt leave a lot of room to pursue any of these hobbies. I used to play the guitar, if only a bit. Ive always had my eye on becoming a writer. Software development began as a passion hobby, and now that it is a carrier I still feel that draw to it outside of work. A lot of my life was spent under the assumption that I would end up in some career as an artist, and I was even on a trajectory towards art school in my teens. But there arent enough days in the year, or hours in any of those days, to scratch 100 of those itches. So, Im committing to saying No to myself more often. When Im looking for a small app or tool and cant find just the right thing, Im going to say No to building my own, instead of making the best option work. When NaNoWriMo rolls around next year, Im not going to cause myself anxiety over the Will I Wont I leading up, and Im going to admit that it just doesnt work for me. When I end my work day, Im going to leave the web development at work. I will be saying No to myself on all these interests so I can direct my Yes whole heartedly to one: my blossoming foray into game development. And this is a really deliberate choice Game development is what got me into computers and into programming. But, its also something multi-faceted in a way that few other pursuits are. By throwing myself fully into my game projects, Ill be able to spend time created art, to code outside of work and learn new techniques and paradigms, and to tell stories. Im putting down a lot of interests, and shelving a lot of personal projects. I have dozens of bits of code thatll only collect dust from now on, even though I think of them often and constantly feel the pull to hack on them in the evening or weekends. But, I have convinced myself this is for the best. Im working on making 2017 a big year for me, and I cant do that when Im pulled in a thousand directions. Learning to give up just may be the ticket to finally succeeded. January 08, 2017 On behalf of the Nikola team, I am pleased to announce the immediate availability of Nikola v7.8.2. It adds a ton of new features, while also fixing some bugs. Key Changes A rewrite of all taxonomies (tags, categories, sections, etc.) in a generic fashion, allowing for much greater flexibility (by Felix Fontein) adds new settings, enables new features ( CREATEARCHIVENAVIGATION ) and customizability Automatic cration of yearmonthday directory structures ( NEWPOSTDATEPATH ) Ability to sort posts from within templates ( sortposts ) API changes for post compilers (new compile . compilestring functions) Addition of a generator meta tag to default themes we hope you do not mind a bit of promotion for Nikola What is Nikola Nikola is a static site and blog generator, written in Python. It can use Mako and Jinja2 templates, and input in many popular markup formats, such as reStructuredText and Markdown and can even turn Jupyter (IPython) Notebooks into blog posts It also supports image galleries, and is multilingual. Nikola is flexible, and page builds are extremely fast, courtesy of doit (which is rebuilding only what has been changed). Install using pip install Nikola or download tarballs on GitHub and PyPI . Minor API change: The compilestring compiler method (partially internal) now takes a post argument and returns between two and four values, adding shortcodedeps and shortcode support. See issues 2623 and 2624. Add meta generator tag to default templates to promote Nikola (Issue 2619) Add nikola newpost - d and NEWPOSTDATEPATH to allow automatic creation of yearmonthday (date-based) directory structures (Issue 2513) Allow enabling pretty URLs with per-post setting (Issue 2613) Add a sortposts function (available as Jinja filter in global context), which allows general-purpose timeline sorting (Issue 2602) Allow creating archive navigation (Issue 1639) Accept a page argument for taxonomy paths (Issue 2585) Query strings in magic links are passed as keyword arguments to path handlers (via Issue 2580) Accept arbitrary arguments to path handlers (via Issue 2580) Added new typogrifyoldschool filter (Issue 2574) Improving handling of. dep files, and allowing compilers to specify additional targets for the renderposts task (Issue 2536) rendertemplate and genericrenderer can now create HTML fragments. Allow posts to set custom URLTYPE by using the urltype meta tag (useful for HTML fragments inserted using JavaScript) Plugins can depend on other plugins being installed (Issue 2533) The destination folder in POSTS and PAGES can now be translated (Issue 2116) Pass post object and lang to post compilers (Issue 2531) Pass urltype into templates context. Make thumbnail naming configurable with IMAGETHUMBNAILFORMAT . There is a new plugin category Taxonomy which allows to easily create new taxonomies. All of the existing taxonomies (authors, archives, indexes, page index, sections, tags, and categories) have been converted to the new system. (Issue 2107) Added CATEGORIESINDEXPATH . similar to TAGSINDEXPATH . (Issue 2567) Made INDEXPATH . RSSPATH and AUTHORPATH translatable. (Issue 1914) Added setting SHOWINDEXPAGENAVIGATION which enables a basic page navigation for indexes. (Issue 2299) Added settings DISABLEINDEXESPLUGININDEXANDATOMFEED and DISABLEINDEXESPLUGINRSSFEED to disable specific parts of the classifyindexes taxonomy plugin. (Issue 2591) Work around conflicts between posts and sections trying to render index. html files (via Issue 2613) Make AUTHORPAGESAREINDEXES really work (Issue 2600) WordPress importer now correctly handles ampamp etc. in tags. (Issue 2557) If CODECOLORSCHEME is empty, dont generate code. css (Issue 2597) Dont warn about nikolademo DISQUS account when comments are disabled (Issue 2588) Make data from global context available to templated shortcodes as globaldata (Issue 2488) Dont crash if plugins is a file (Issue 2539) Dont mangle bare links (Issue 2553) genericindexrenderer now always produces output. It previously did not when the post list was empty and INDEXESSTATIC False . (via Issue 2579) Few days back, I wrote about my usage of rkt containers. As rkt does not have any daemon running, the simplest way to have a container running is to start it inside some screen or tmux session. I started following the same path, I used a tmux session. But then I wanted to have better control over the containers, to start or stop them as required. Systemd is the solution for all the other services in the system, that makes it an ideal candidate for this case too. Example of a service file The path of the service file is etcsystemdsystemircbot. service . In the Unit section, I mentioned a super short Description, and link to the documentation of the project. I also mentioned that this service requires network-online. target to be available first. The Service is the part where we define all the required configurations. The first value we mention is the Slice . Slices, a way to do resource control Systemd uses slices to group a number of services, and slices in a hierarchical tree. This is built on top of the Linux Kernel Control Group feature. In a system by default, there are four different slices. -.slice. The root slice. system. slice. All system services are in this slice. machine. slice. All vms and containers are in this slice. user. slice. All user sessions are in this slice. We can see the whole hierarchy using the systemd-cgls command. For example: You can manage various resources using cgroups. Here, in our example service file, I mentioned that memory limit for the service is 500MB. You can read more here on resource management. There is also systemd-cgtop tool, which will give you a top like view for the various resources consumed by the slices. The actual command which we used to run the container is mentioned in ExecStart . Using the service I can now use the standard systemctl commands for this new ircbot service. For example: You can also view the log of the application using journalctl command. The documentation from rkt has more details on systemd and rkt. Due to a chain (or seq uence - pun intended :) of thoughts, I got the idea of writing a simple version of the Unix seq utility (command-line) in Python . (Some Unix versions have a similar command called jot .) Note: I wrote this program just for fun. As the seq Wikipedia page says, modern versions of bash can do the work of seq. But this program may still be useful on Windows - not sure if the CMD shell has seq-like functionality or not. PowerShell probably has it, is my guess.) The seq command lets you specify one or two or three numbers as command-line arguments (some of which are optional): the start, stop and step values, and it outputs all numbers in that range and with that step between them (default step is 1). I have not tried to exactly emulate seq, instead Ive written my own version. One difference is that mine does not support the step argument (so it can only be 1), at least in this version. That can be added later. Another is that I print the numbers with spaces in between them, not newlines. Another is that I dont support floating-point numbers in this version (again, can be added). The seq command has more uses than the above description might suggest (in fact, it is mainly used for other things than just printing a sequence of numbers - after all, who would have a need to do that much). Here is one example, on Unix (from the Wikipedia article about seq): Note that those are backquotes or grave accents around seq 17 in the above code snippet. It uses sh bash syntax, so requires one of them, or a compatible shell. Here is the code for seq1.py : And here are a few runs of seq1.py, and the output of each run, below: There are many other possible uses for seq, if one uses ones imagination, such as rapidly generating various filenames or directory names, with numbers in them (as a prefix, suffix or in the middle), for testing or other purposes, etc.

No comments:

Post a Comment