quarta-feira, 21 de dezembro de 2022

Python, R e Octave no Jupyter Notebook (rodando no Mac com chip M1)

 1) Crie um ambiente virtual com o gerenciador conda (no caso, optei por especificar a versão do Python que pretendo usar no ambiente):

conda create --name py39 python=3.9


2) Em seguida, ative o ambiente criado:

conda activate py39


3) Instale o Jupyter no ambiente criado:

conda install jupyter


4) Instale o kernel do R

conda install -c conda-forge r-base

Obs.:Após a instalação, você já poderá rodar o R a partir do terminal. Basta digitar “R”. 



5) No terminal, rodando R, instale o IRkernel

install.packages('IRkernel')

IRkernel::installspec()


6) Saia do R, com q() e enter.


7) Instale o kernel do Octave

brew install octave



8) Abra o Jupyter Notebook. Os kernels do Python, R e do Octave estarão disponíveis.




sexta-feira, 18 de novembro de 2022

Boxplot (diagrama de caixa)

O boxplot – ou diagrama de caixa – é uma ferramenta gráfica da estatística descritiva que facilita a análise de variáveis quantitativas. Por ele se obtém informações sobre posição, dispersão, assimetria e valores extremos ou atípicos (outliers).

A construção do boxplot utiliza cinco medidas estatísticas: mínimo, máximo, mediana, primeiro quartil e terceiro quartil.

A caixa é delimitada pelos primeiro e terceiro quartis e é cortada pela mediana. As linhas são conhecidas como caudas da distribuição e indicam os limites superior e inferior da variável, isto é,  maior e menor valores desconsiderados os outliers.

Dado um conjunto ordenado de dados, o 1º quartil (ou quartil inferior) representa o valor observado aos 25% dos valores; o 2º quartil é a mediana (50% das observações são menores e 50% são maiores do que a mediana); e o 3º quartil (ou quartil superior) é o valor que aparece aos 75% da amostra.  

R facilita a criação do boxplot a partir de um vetor, conforme a figura abaixo.



Algoritmo Bubble Sort: implementação em R

O bubble sort é um algoritmo de ordenação simples e pouco eficiente.

Dado um vetor de tamanho n, percorrem-se seus elementos n-1 vezes, comparando-se os elementos adjacentes de 2 a 2. 

Se o segundo elemento desta comparação for menor do que o primeiro, o algoritmo troca a posição de ambos. 

A operação se repete até que todos os elementos estejam ordenados.

Abaixo, a implementação em R, em duas versões.

Observe que, na segunda, o programa testa condição para verificar se foi feita alguma troca na passagem e se encerra antecipadamente no caso de o vetor já estar completamente ordenado.




domingo, 6 de novembro de 2022

Rodando o RStudio no Docker

1. Tendo o Docker Desktop instalado no seu computador(1), baixe a imagem escolhida. No caso, vamos usar a rocker/rstudio. Então, no terminal (prompt de comando), digite:

docker pull rocker/rstudio


2. Instale e rode o contêiner digitando o seguinte comando no prompt de comando:


docker run --name rstudio01 -d -p 8787:8787 -v C:\Users\jepim\Desktop\ufv:/home/rstudio -e PASSWORD=rstudio rocker/rstudio


Obs.:

Nomeie o contêiner como preferir. No caso, usamos rstudio01

Substitua C:\Users\jepim\Desktop\ufv pelo caminho da pasta local que será acessada pelo contêiner


- -name: dá um nome para o contêiner

-d: “detached” (execução em segundo plano, sem os logs)

-p: seleção das portas (local e do contêiner)

-v: volumes (relaciona uma pasta local à uma pasta do contêiner)

-e: define variáveis de ambiente




3. Abra o navegador e acesse o RStudio em http://localhost:8787/


Username > rstudio


Password > rstudio






sexta-feira, 4 de novembro de 2022

Como usar o 'R' no Google Colab

Por padrão, o Google Colab roda o Python nas linhas de código.

Para criar um notebook com o interpretador R, basta usar o seguinte link e editar normalmente o seu código:

https://colab.research.google.com/notebook#create=true&language=r




domingo, 23 de outubro de 2022

Operações básicas com matrizes usando o NumPy

O NumPy (Numerical Python) é bastante eficiente no processamento de arrays.

Seu principal objeto é o N-dimensional array (ndarray) ou tensor. 

Matrizes são tensores com 2 dimensões (tensores de rank 2), de aplicação muito frequente.

Neste notebook reunimos as operações matriciais mais básicas do NumPy para o estudo do tema.

Para saber mais: http://www.opl.ufc.br/pt/post/numpy/

------------------------

import numpy as np


# Criando as matrizes

A = np.array([[1, -2, 3], [2, 0, 4]])

B = np.array([[2, 2, -4], [-1, 1, 0]])

display(A, B)


# Soma de matrizes

display(A+B)


# Subtração de matrizes

display (A-B)


# Multiplicação de uma matriz por um escalar

k = 3

display (k*A)


# Matriz oposta (de A)

display(-A)


# Multiplicação de matrizes

A = np.array([1, 2, 3])

B = np.array([[4], [5], [6]])

display(A, B)

display(A.dot(B))


# Criação de matriz identidade

I = np.identity(3)

display(I)


# Matriz inversa

A = np.array([[3, -2], [-1, 1]])

B = np.array([[1,2],[1,3]])

print('Inversas:')

display(np.linalg.inv(A))

display(np.linalg.inv(B))


# Matriz singular (não tem inversa)

A = np.array([[6, 3], [2, 1]])

display(np.linalg.inv(A))  # LinAlgError: Singular matrix


# Determinante de uma matriz quadrada

A = np.array([[2, 4], [-3, -1]])

display(np.linalg.det(A))

sábado, 22 de outubro de 2022

Descriptografando os dados de login salvos pelo Chrome

O Chrome oferece a facilidade de salvar senhas dos sites visitados.

As senhas são armazenadas no formato do SQLite3 (figura abaixo). No Windows, o banco de dados pode ser localizado em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Default\Login Data.

Selecionando-se os campos action_url, username_value, password_value da tabela logins, obtemos as urls, usuários e senhas (criptografadas em AES).

A criptografia AES é do tipo simétrico. Isso quer dizer que a mesma chave é usada para criptografar e descriptografar o texto. Para aumentar a segurança, o processo de encriptação usa um "vetor de inicialização" (IV),  que corresponderá aos caracteres das posições 4-20 recuperados de password_value. A senha cifrada corresponderá aos caracteres da posição 21-(N-16), sendo N a última posição da "string".

A chave de criptografia/descriptografia está localizada no arquivo JSON existente em C:\Users\<nome do usuário>\AppData\Local\Google\Chrome\User Data\Local State, precedida da chave encrypted_key.

O código publicado no GitHub, escrito em Python, encontra a chave no arquivo Local State e a utiliza para descriptografar as senhas (password_value) da tabela logins do arquivo Login Data (banco de dados do SQLite3). 

Repositório: https://github.com/jespimentel/chrome-passwords

Referências: 



quarta-feira, 12 de outubro de 2022

Lista de datas com Python

O Python possui nativamente o módulo datetime, para trabalhar com datas e tempo.

O problema a ser resolvido demandava a criação de uma lista de datas (em formato ISO 8601) que compreendesse todos os dias entre uma data informada e o dia de hoje.

Foram usadas os seguintes métodos:

datetime.now(): para retornar a data/hora corrente;

datetime.strptime(): para retornar um data/hora no formato informado; 

datetime.timedelta(): para retornar a diferença entre datas.

Depois de obtida a diferença de dias entre a data fornecida e a atual (n), cria-se a lista a partir de um iterador finito (for ... in ...), que incrementa 1 dia a partir da data inicial e até o dia n+1.





sexta-feira, 17 de junho de 2022

Um esboço de jurimetria na relação do MPSP com o STJ (com Python, Pandas e Requests)


Jurimetria:

A jurimetria é aplicação de estatística e softwares voltados à análise de dados a assuntos ligados ao Direito e às decisões dos tribunais. Suas métricas servem de base à tomada de decisões, insights e à atuação estratégia dos atores da Justiça. 

Recursos Especiais (todos os assuntos):


Habeas Corpus (somente criminais):

_____

Obs.:  

1) A pesquisa foi automatizada. Os números mencionados no texto podem não ser exatos.

2) Os scripts rodaram em 17 jun. 2022. É a data que deve ser considerada ao se verificar quais REsp e HCs já possuíam decisões monocráticas.

3) Os códigos foram escritos em Python. Foram utilizadas as bibliotecas pandas (para as operações com o dataframe), matplotlib (para os gráficos), requests (para as requisições http ao site do STJ) e beautifulsoup (para a extração dos dados dos documentos html recuperados). A engine xlsxwriter foi usada para gravar o arquivo Excel em unicode.

Jupyter notebooks completos estão disponíveis para download em:

Confira os demais projetos.

4) Aparentemente, o “robô” também capturou os dados dos processos em “segredo de justiça”, embora tenha rodado sem autenticação no site do STJ.


segunda-feira, 6 de junho de 2022

O § 2º do art. 1º do PROVIMENTO CSM N°2519/2019: ou como o TJ nos delega serviço sem qualquer objeção do Ministério Público (reflexões para o debate Institucional)

 

 

  1. 1. O PROVIMENTO CSM N°2519/2019 determina a tramitação direta dos inquéritos policiais entre Polícia Civil e Ministério Público, procedimento esse que é estimulado pelo CNJ e CNMP e já tem sido adotado em outros Estados da Federação.  


  1. 2. O TJSP, no entanto, não abriu mão de fiscalizar a tramitação direta (e, por óbvio, o MPSP). Previu no § 2º do art. 1º o “registro das movimentações no sistema eletrônico deste Tribunal”. Para efetivar esse comando, “disponibilizou” o SAJ Judiciário a usuários do MP, para que nele cadastremos o andamento dos feitos (em redundância, portanto, com os registros feitos no SIS MP Integrado). 


  1. 3. O trabalho acrescido não é trivial. O CAOCrim, o CTIC e os funcionários da Barra Funda, cientes disso, elaboraram um valioso material para a instrução dos nossos funcionários (gratidão a todos!). Vale a pena dar uma olhada nos documentos gerados pela Administração para se ter uma ideia do tamanho do desafio (Cf.: https://bit.ly/3szqSLF. Acesso restrito ao público interno).   


  1. 4. Não há qualquer sentido, porém, no trabalho adicional que o TJSP impõe ao MPSP, por, pelo menos, duas razões: 


  1. a) O SIS MP Integrado foi preparado para controlar o trâmite direto dos inquéritos policiais, nos termos do art. 2º, § 1º, da Resolução nº 1.178/2019-PGJ/CGMP (Protocolado nº 89.112/2018); 


  1. b) O SIS MP Integrado possui banco de dados estruturado. Para cumprir a PROVIMENTO (se entendermos que o ato do TJ cria obrigações para o MPSP), bastaria que o CTIC criasse scripts (consultas SQL) para gerar os relatórios das movimentações de inquéritos policiais e encaminhá-los ao TJSP. O investimento no desenvolvimento dessa funcionalidade pouparia o trabalho de inúmeros Oficiais de Promotoria, já bastante onerados com as rotinas administrativas “tradicionais”. É verdade que o TJSP também precisaria investir algum esforço (a meu, ver pequeno) para importar esses dados no SAJ, mas o ônus se justifica no desejo do Judiciário de controlar o fluxo de procedimentos externos (e, agora, estranhos) à Instituição. 


  1. 5. Tenho notado gente minimizando o problema, afinal “os inquéritos policiais físicos estão em extinção”. É uma meia-verdade. No dia 05/06/2022, a Promotoria de Justiça de Piracicaba possuía, no chamado “acervo vivo”, cerca de 1657 inquéritos físicos em andamento (dos 4.542 existentes). Em porcentagem: 36% do total de IPs. Suponho que esse cenário se repita em outras localidades.


  2. 6. Em conclusão: vamos conviver com IPs físicos por alguns anos ainda e isso justifica, a meu ver, refletirmos mais detidamente (e com urgência) sobre o problema.


06/06/2022 

José Eduardo de S. Pimentel 

--------------- 

Obs.  


1) A arte foi feita com números de IPs físicos do “acervo vivo” da Promotoria de Justiça de Piracicaba, com uso da ferramenta on line WordArt.com. 

2) Os números do “acervo vivo” são aproximados. Para saber mais sobre a forma de cálculo, consulte: https://github.com/jespimentel/acervo_sis_mp_integrado, com dados da Promotoria de Justiça de Piracicaba na data da implementação da tramitação direta. 

 

domingo, 27 de março de 2022

Criptografia

Introdução

A palavra criptografia tem origem no Grego e significa "escrita secreta".

Há distinção entre cifra e código. Na cifragem, a transformação ocorre caractere por caractere ou bit por bit. É o que se faz hoje em dia. No código, as palavras são substituídas por palavras ou símbolos. Exemplo de uso de código: os EUA recrutaram índios navajos na 2a. Guerra Mundial que transmitiam, na língua deles, as ordens militares aos marines.

 

Terminologia


  • Texto simples (plaintext):  mensagem a ser criptografada;
  • Texto cifrado (ciphertext): mensagem na saída do processo de criptografia; 
  • Algoritmo de cifragem: função parametrizada por uma chave;
  • Chave: é a informação (protocolo conhecido pelo remetente e destinatário) que, aplicada ao algoritmo, permite criptografar ou decifrar a mensagem;
  • Criptologia: arte de criar mensagens cifradas (criptografia);
  • Criptoanálise: arte de solucionar mensagens cifradas;
  • Fator de trabalho: é o nível de dificuldade para decifrar a mensagem. Aumenta exponencialmente conforme o tamanho da chave.

 

Algoritmo

Questão interessante na criptografia é que, em regra, o algoritmo é conhecido de todos. Pelo princípio de Kerckhoff se estabelece que:

  • "Todos os algoritmos devem ser públicos: apenas as chaves são secretas".

 

Criptografia simétrica

Na criptografia simétrica uma mesma chave é usada para codificar e decodificar a mensagem.

Métodos:

  • substituição;
  • transposição;
  • multiplicação de matrizes.

 

Criptografia assimétrica (ou de chave pública)

Utiliza um par de chaves (pública e privada) para a codificação e a decodificação das mensagens. 

Aplicações:

  • assinatura digital;
  • autenticação.

 

Hash

É um algoritmo usado para mapear (resumir) dados de qualquer tamanho em dados pequenos e de tamanho fixo. 

Outra denominação: Message Digest (MD), ou “sumário da mensagem”.

Aplicações:

  • busca de elementos em base de dados;
  • verificação de integridade de dados grandes; e
  • armazenamento de senhas com segurança.

 

Fonte: TANENBAUM, Andrew S.; WETHERALL, David. Redes de computadores. 5a. ed. Trad. Daniel Vieira. São Paulo: Pearson Prentice Hall, 2011, p. 481-506.