🐍 Criando um servidor para o Jupyter Notebook

Crie uma nova configuração:

jupyter notebook --generate-config

No arquivo criado coloque essas duas linhas:

c.NotebookApp.allow_origin = '*' #allow all origi
c.NotebookApp.ip = '0.0.0.0' # listen on all 

E depois no terminal digite comando:

jupyter notebook --ip xx.xx.xx.xx --port 8888

Troque o xx.xx.xx.xx pelo ip da maquina.

Dica de Segurança:

Voce poderá colocar uma senha no seu Notebook digitando o comando abaixo:

c = get_config()
c.NotebookApp.password = u'sha1:6c2164fc2b22:ed55ecf07fc0f985ab46561483c0e888e8964ae6'

Voce poderá gerar sua própria senha sha1 com o seguinte código python:

from IPython.lib import passwd
password = passwd("secret")
password

Referencias:

[1] – https://testnb.readthedocs.io/en/stable/examples/Notebook/Configuring%20the%20Notebook%20and%20Server.html

[2] – https://testnb.readthedocs.io/en/stable/examples/Notebook/Configuring%20the%20Notebook%20and%20Server.html

Hello World em Assembly

Usaremos a sintaxe da Intel para os códigos assembly, que para mim é mais inteligível e fácil de ‘bater’ o olho e reconhecer.

; Como executar!

;nasm -f elf main.s
;ld -m elf_i386 -s -o hello main.o
;./hello


section .text
    global _start

_start:
    mov edx, tamanho    ;Tamanho da Mensagem
    mov ecx, mensagem   ;A messagem
    mov ebx, 1          ; fd (stout)
    mov eax, 4          ; system call (sys_write)
    int 0x80            ; call Kernel

    mov eax,1           ;system call (sys_exit)
    int 0x80            ;call Kernel

section .data
mensagem DB "Hello World", 0x0a
tamanho equ $ - mensagem

Instalando e usando o Ply no Python

Ply é um analisador sintático muito pratico para quem quer fazer esse tipo de coisa no python, onde ele retorna sua saída em forma de tokens, a sua instalação se da de maneira fácil através do pip.

Instalação

$ pip install ply

Exemplo

# ------------------------------------------------------------
# calclex.py
#
# tokenizer for a simple expression evaluator for
# numbers and +,-,*,/
# ------------------------------------------------------------
import ply.lex as lex

# List of token names.   This is always required
tokens = (
'NUMBER',
'PLUS',
'MINUS',
'TIMES',
'DIVIDE',
'LPAREN',
'RPAREN',
)

# Regular expression rules for simple tokens
t_PLUS    = r'\+'
t_MINUS   = r'-'
t_TIMES   = r'\*'
t_DIVIDE  = r'/'
t_LPAREN  = r'\('
t_RPAREN  = r'\)'

# A regular expression rule with some action code
def t_NUMBER(t):
    r'\d+'
    t.value = int(t.value)    
    return t

# Define a rule so we can track line numbers
def t_newline(t):
    r'\n+'
    t.lexer.lineno += len(t.value)

# STRING contendo caracteres a serem ignorados(espaços e tabs)
t_ignore  = ' \t'

# Se deu Erro
def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

# Construindo o LEX
lexer = lex.lex()

# Entrada de Exemplo
data = '''
3 + 4 * 10
+ -20 *2
'''

# Passa a entrada para o analizador
lexer.input(data)

# Tokenize
while True:
    tok = lexer.token()
    if not tok: 
        break      # Termina a entrada
    print(tok)



Referências:

[ 1 ] – https://www.dabeaz.com/ply/ply.html

Multiclassificadores: Bagging

É um sistema que contem vários tipos de classificadores, com diferentes níveis e características, onde suas saídas são combinadas para assim gerar uma predição ou resultado melhor do que cada um individualmente produziria.

Resultado de imagem para bootstrap boot

Bagging

O bagging ou bootstrap aggregation (Uma explicação sobre oque é bootstrap usando Brigadeiros) é um método em que existe vários classificadores do mesmo tipo, onde cada um desses classificadores pega randomicamente uma parte do conjunto de amostra, cada qual gera suas predições onde a mesma é levada em conta em um sistema de média ou votação para produzir uma predição final (Ver Figura 1 e 2).

OBS: Para cada parte do conjunto de amostra obtido randomicamente pelo classificador, essa amostra poderá ou não contem dados repetidos ou omitidos.

O bagging reduz a variação por causa da média/votação, mas com isso aumenta o viés de sua predição.

Figura 1 – Algoritmo de Bagging. Fonte: Letícia Martins Raposo

Figura 2 – Esquema de como o Bagging funciona. Fonte: Geeks For Geeks

Exemplo de Bagging com Python usando o Arvore de Decisão

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB, BernoulliNB
from sklearn.linear_model import LogisticRegression

def CreateDataFrame(N):
 columns = ['a','b','c','y']
 df = pd.DataFrame(columns=columns)
 for i in range(N):
  a = np.random.randint(10)
  b = np.random.randint(20)
  c = np.random.randint(5)
  y = "normal"
  if((a+b+c)>25):
   y="high"
  elif((a+b+c)<12):
   y= "low"
  df.loc[i]= [a, b, c, y]

 return df


df = CreateDataFrame(200)
print(df.head())

X = df[["a","b","c"]]
Y = df[["y"][0]]
#print("Printando o X")
#print(X)

#print("Printando o Y")
#print(Y)

le=LabelEncoder()
y=le.fit_transform(Y)
#print(y)

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=0)

dtc = DecisionTreeClassifier(criterion="entropy")
bag_model=BaggingClassifier(base_estimator=dtc, n_estimators=100, bootstrap=True)
bag_model=bag_model.fit(Xtrain,ytrain)

ytest_pred=bag_model.predict(Xtest)

print(bag_model.score(Xtest, ytest))
print(confusion_matrix(ytest, ytest_pred))

O código acima foi adaptado do site DataTechNotes.

Output:

$ python bagging.py 
   a   b  c       y
0  9   0  1     low
1  3   9  2  normal
2  9   4  4  normal
3  1  17  1  normal
4  2  10  3  normal
0.94
[[ 1  0  1]
 [ 0 13  1]
 [ 0  1 33]]

Exemplo de Bagging com Python usando o Classificador KNN

Referências:

[ 1 ] – https://www.geeksforgeeks.org/ml-bagging-classifier/

[ 2 ] – http://www.peb.ufrj.br/teses/Tese0291_2018_01_20.pdf

[ 3 ] – https://scikit-learn.org/stable/modules/ensemble.html#bagging

[ 4 ] – https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html#pandas.DataFrame

[ 5 ] – https://www.datatechnotes.com/2019/03/classification-with-bagging-classifier.html

Personalizar comandos no Shell

Algumas vezes tenho que usar alguns comandos que simplesmente eu não consigo lembrar, por falta de pratica ou costume, por exemplo o comando de excluir recursivamente no Linux.

Por isso acabei criando um arquivo de texto aonde escrevo todos os comandos que eventualmente eu precise lembrar. Este arquivo se chama chapolin.txt.

Mas toda vez que eu quero visualizar o conteúdo deste arquivo, eu tenho que ficar digitando o comando:

$ cat ~/diretorio/pasta/chapolin.txt

Convenhamos que as vezes isso pode se tornar maçante, mas pois bem, no Linux existe um arquivo chamado ./bashrc que contem as configurações do terminal do usuário aonde você poderá editar para criar seus próprios comandos.

Bashrc

Para editar digite em seu terminal:

$ sudo vim ~/.bashrc

Irá abrir o editor vim para fazer as edições, aperte a tecla end para ir no final do arquivo e depois a tecla “o” para inserir uma nova linha e escreva:

alias chapolin="cat ~/diretorio/pasta/chapolin.txt"

E pronto, a palavra alias é um apelido que voce da para um certo comando, nesse caso quando digitarmos chapolin no terminal ele ira executar o cat.

Referências:

[ 1 ] – https://www.vivaolinux.com.br/dica/Arquivo-.bashrc

Make e Makefile

Resultado de imagem para GNU Make

Make é um utilitário que agiliza a compilação de programas, onde através de um arquivo de configuração (normalmente chamado Makefile), ele encontrara diretivas e regras para executar a compilação.

Sintaxe

O arquivo de configuração (Makefile) tem que ser escrito com uma sintaxe própria, o seu template pode ser definida como:

regra: dependências 
          comando1          
          comando2         
          comando3

regra: É o nome da regra que você quer criar.

dependências: São os pré-requisitos para o programa ser gerado, essas dependências devem ser satisfeitas antes que os comandos daquela determinada regra sejam executados.

comando: É a ordem dos comandos a serem executadas depois que as dependências tiverem sido satisfeitas.

Exemplo

hello.c

#include <stdio.h>
#include <stdlib.h>
int main (){
    printf("Hello World!\n");
    return 0;
}

Para executar:

 
$ gcc hello.c -o hello
$./hello

Makefile

Podemos escrever essa mesma ordem de comandos no arquivo Makefile, que ficaria assim:

hello: hello.c
	gcc hello.c -o hello
        ./hello

Para executar o arquivo, digite o seguinte comando:


$ make
# ou executar
$ make hello

Os dois comandos acima vão executar a mesma coisa, se você digitar só “make” ele irá por padrão rodar somente a primeira regra escrita no Makefile.

Variáveis

No Makefile é possível ter variáveis, você pode escrevê-las da seguinte maneira:


CC := gcc
hello: hello.c
	$(CC) hello.c -o hello
        ./hello

Sua sintaxe é NOME_DA_VARIAVEL := VALOR_DA_VARIAVEL, e para usar nos comandos é só colocar $(NOME_DA_VARIAVEL).

Variáveis Automáticas

Assim como o argv e argc da main do C que serve para pegarmos os parâmetros passados pelo terminal, no make podemos pegar o nome da regra e suas dependências que estão em variáveis, as chamadas variáveis automáticas. Exemplo, o nome da regra é hello e o nome da saída do gcc também é hello, podemos usar então a variável $@ que nesse caso tem o valor de hello guardada dentro dela.

O arquivo Makefile ficará assim:


CC := gcc
hello: hello.c
	$(CC) hello.c -o $@
        ./hello

E a variável $^ indica uma lista das dependências daquela regra, no nosso caso o valor de $^ é hello.c, logo podemos mudar um pouco o nosso arquivo.


CC := gcc
hello: hello.c
	$(CC) $^ -o $@
        ./$@

Se você executar mais de um vez o arquivo make e não fez nenhuma alteração no arquivo hello.c, vai aparecer uma mensagem dizendo que esta tudo em ordem e nada foi modificado no arquivo e por isso não precisa compilar. Acaso você queira compilar mesmo assim é só apagar o arquivo executável ./hello, usando o comando rm no terminal:

$ rm ./hello

Ou criando uma regra com esse comando no Makefile:


CC := gcc
hello: hello.c
	$(CC) $^ -o $@
        ./$@
clean: hello
        rm $^

Dependências

Bom por fim a ultima coisa que você tem que saber é a ordem de dependências. Por exemplo eu quero que antes da regra de compilar eu quero que apareça no terminal uma mensagem, e depois da regra de compilação eu também quero que outra mensagem apareça, então o arquivo Makefile devera ser o seguinte.


CC := gcc

inicio: msg1 hello msg2

msg1: 
        @echo "Iniciando Compilação"

msg2:
        @echo "Finalizando Compilação"

hello: hello.c
	$(CC) $^ -o $@
        ./$@
clean: hello
        rm $^

Agora se você digitar make no terminal a regra inicial será inicio pois agora ela é a primeira. Nos pré-requisitos temos 3 parâmetros (que são os nomes das regras), que deveram ser executados na ordem, primeiro msg1, depois hello, e por fim msg2. Note que nas msg1 e msg2 eu utilizei @ antes do comando, fiz isso para que evite que esses comandos apareçam no terminal, e só oque vai aparecer é a saída de tal comando, o @ poderia ser empregado tanto na regra do hello: como no clean:

Referencias:

[ 1 ] – https://blog.pantuza.com/tutoriais/como-funciona-o-makefile

[ 2 ] – https://blog.pantuza.com/tutoriais/como-funciona-o-makefile

[ 3 ] – https://www.gnu.org/software/make/manual/make.html

[ 4 ] – http://orion.lcg.ufrj.br/compgraf1/downloads/MakefileTut.pdf

[ 5 ] – https://www.mat.uc.pt/~pedro/lectivos/ProgramacaoOrientadaObjectos/tutorialMakefilesPT.pdf

“Hello World” em C e Assembly

Resultado de imagem para assembly

Tenho interesse em Assembly desde que fiz uma matéria chamada Sistemas Microcontrolados, onde o professor nos deu um overview de como funcionava os registradores, a pilha (stack), e a como trabalhar com eles.

Na universidade sempre ouvimos alguém falar que o assembly é a fronteira final entre o que um humano pode entender e as instruções de maquina, a linguagem em que os drivers eram escritos, e se acaso você quiser algo rápido, deverá recorrer a ela. Lembro de ter me divertido muito, pois parecia que eu estava adentrando a um mundo novo que poucos conheciam, para mim era algo fascinante.

Para testar a veracidade dessas informações recriei dois códigos, um em linguagem C e outro em Assembly com a sintaxe AT&T.

hello.c

#include <stdio.h>
int main(){
 printf("Hello World\n");
 return 0;
}

Para compilar esse programa em C, use o seguinte comando:

gcc hello.c -o hello_c

Com isso terá gerado um executável com o nome de hello_c.

hello.s

.global _start

.text
_start:
        mov     $1, %rax       # SysCall(sys_write)
        mov     $1, %rdi       #FileDescriptor(stdout)

        mov     $message, %rsi  # Endereco da Mensagem
        mov     $13, %rdx       # Tamanho da Mensagem

        syscall                 # Chamando a Syscall


        mov     $60, %rax       # Syscall (exit)
        xor     %rdi, %rdi      # Retornando 0
        syscall                 # Chamando a Syscall
message:
        .ascii  "Hello World\n"

Ja para compilar este código em Assembly você terá que digitar:

gcc -c hello.s 

Que irá gerar um arquivo de saída hello.o e agora para linkar e virar um executável de vez:

ld hello.o -o hello_s

Os arquivos gerados são esses:

$ ls
hello.c  hello_c  hello.o  hello.s  hello_s

Sendo hello_c e hello_s executáveis.

$ ./hello_s
Hello World

$ ./hello_c
Hello World

E se compararmos os seus tamanhos:

$ ls -l
total 28
-rwxrwxr-x 1 michel michel 16696 fev 19 22:45 hello_c
-rwxrwxr-x 1 michel michel  4744 fev 19 23:00 hello_s

LinguagemTamanho
hello.c16696 bits
hello.s4744 bits
Tabela 1 – Comparação de tamanho entre os arquivo.

Ou seja o arquivo em Assembly é quase 4 vezes menor do que o arquivo compilado em C.

Referências:

[1] – https://pt.wikipedia.org/wiki/Linguagem_de_montagem_x86

[2] – https://www.cs.virginia.edu/~evans/cs216/guides/x86.html

[3] – http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html

[4] – https://montcs.bloomu.edu/Information/LowLevel/Assembly/asm-C.html#trivial

[5] – https://web.archive.org/web/20101010150001/http://code.google.com/p/bugsec/wiki/AssemblyArqComp

[6] – http://programminggroundup.blogspot.com/2007/01/chapter-3-your-first-programs.html

[7] – https://coolerlab.wordpress.com/2012/04/07/um-pouco-de-assembly-com-linguagem-c/