Algoritmo MDC (máximo divisor comum) em C

Seguindo os algoritmos, vou postar agora o algoritmo de MDC (Máximo Divisor Comum) utilizando função recursiva, um método rápido e fácil para encontrar o

MDC

.
O mesmo é encontrado em vários lugares e existem vários modos de serem feitos, porém o método que eu escolhi para calcular foi com função recursiva.
Uma breve explicação da função é que, o retorno dela, é ela mesma utilizando os parâmetros atualizados, sendo assim, enquanto calcula, vai retornando os novos valores para a função até achar o valor calculado.
Como eu disse, existem vários métodos a serem feitos, caso alguém queira dar alguma dica só comentar. :D

//
//  MDC.c
//  Máximo Divisor Comum
//
//  Created by Ayrton Jose Lopes on 03/06/13.
//  Copyright (c) 2013 Ayrton Jose Lopes. All rights reserved.
//

#include <stdio.h>

int tor= 0, i= 0;

/* Função recursiva que retorna o valor do MDC */
int mdc(int n, int d){
    if (d== 0) {
        return n;
    }
    else {
        return mdc(d, n%d);
    }
}

int main(){
    int n= 0, d= 0;
    scanf("%d", &tor);
    for (i= 0; i< tor; i++) {
        scanf("%d %d", &n, &d);
        printf("%d\n", mdc(n, d));
    }
    return 0;
}

O algoritmo imprime somente o valor calculado.

OBS:

Os algoritmos são testados no linux e todos estão funcionando.

Algoritmo conversão de base em C(binário, octal e hexadecimal)

Olá galera, tudo certo? Como estudante de computação, todos chegamos em um momento para fazer o tal “algoritmo de conversão de base”. Fiz ele com funções e procedimentos. Creio eu que ficou bem comentado, caso alguém tenha dúvida só comentar que eu respondo.

//
//  conversao_de_bases.c
//  conversão de Base
//
//  Created by Ayrton Jose Lopes on 23/06/13.
//  Copyright (c) 2013 Ayrton Jose Lopes. All rights reserved.
//


#include <stdio.h>
#include <string.h>
#include <math.h>
#define valorMaximo 100

/* Declaração de Variáveis Globais */

char valorBase[valorMaximo]; // Vetor que armazena o valor convertido
int valorDecimal;

/* Fim da declaração*/

/* Procedimento que inverte as posições do vetor*/
void inverteVetor(char *Vet, int count){
    int j= 0, k= 0; // contadores do laço
    char aux[valorMaximo]; // variavel auxiliar de troca
    j= 0;
    k= count-1;
    while (j < k) {
        aux[j]= Vet[j];
        Vet[j]= Vet[k];
        Vet[k]= aux[j];
        j++;
        k--;
    }
}
/* Fim do Procedimento */

/* Função que converte um número decimal para as bases de 2, 8 e 16 */
char* decToAll(int decValue, int Base){
    int i= 0, value= 0;
    while (decValue) {
        value= decValue%Base;
        /* Caso a base seja menor do que 10 ou o resto menor que 10 (no caso de outras bases maiores do que 10 terem restos maiores que 11)
         irá fazer o cálculo normal de resto, acrescentando no vetor o valor convertido 
         OBS: soma-se +48 (valor na tabela asci cujo valor é 0) pois está sendo acrescentado em um vetor de char, e não de inteiro ou flutuante */
        if (Base<= 10 || value< 10) {
            valorBase[i]= value+48;
        }
        /* Se o restor for maior do que 11, ele irá fazer o call na função que converte os restos em letras, e irá acrescentar no vetor */
        else {
            valorBase[i]= value+55;
        }
        decValue/= Base;
        i++;
    }
    valorBase[i]= '\0';
    inverteVetor(valorBase, i);
    return valorBase;
}
/* Fim da função */

/* Função que converte de qualquer base para decimal */
int allToDec(char *Num, int Base){
    int tamanho= 0;
    tamanho= (int)strlen(Num);
    inverteVetor(Num, (int)strlen(Num));
    for (int i= 0; i< tamanho; i++) {
        /* Se o valor está entre os números na tabela ascii, diminui-se 48 para calcular o valor */
        if (Num[i]>= 48 && Num[i]<= 59) {
            valorDecimal+= pow(Base, i)*(Num[i]-48);
        }
        /* Caso o valor não seja os números (tabela ascii), subtrai-se 65 valor A e soma-se 10 para calcular o valor */
        else {
            valorDecimal+= pow(Base, i)*(Num[i]-65+10);
        }
    }
    return valorDecimal;
}
/* Fim da função*/

/* Função que escolhe a opção de conversão de base*/
void convertion(int valueOption){
    int value= 0, base= 0;
    switch (valueOption) {
        case 1:
            printf("Digite um número de decimal para converter: ");
            scanf("%d", &value);
            printf("Digite a base para qual deseja converter (2, 8 e 16): ");
            scanf("%d", &base);
            printf("O valor convertido é: %s", decToAll(value, base));
            break;
            
        case 2:
            printf("Digite um número em binário para converter para qualquer base: ");
            scanf("%s", valorBase);
            printf("Digite a base para qual deseja converter (8, 10 e 16): ");
            scanf("%d", &base);
            printf("O valor convertido é: %s", decToAll(allToDec(valorBase, 2), base));
            break;
            
        case 3:
            printf("Digite um número em octal converter para qualquer base: ");
            scanf("%s", valorBase);
            printf("Digite a base para qual deseja converter (2, 10 e 16): ");
            scanf("%d", &base);
            printf("O valor convertido é: %s", decToAll(allToDec(valorBase, 8), base));
            break;
            
        case 4:
            printf("Digite um número em octal converter para qualquer base: ");
            scanf("%s", valorBase);
            printf("Digite a base para qual deseja converter (2, 8 e 10): ");
            scanf("%d", &base);
            printf("O valor convertido é: %s", decToAll(allToDec(valorBase, 16), base));
            break;
            
        default:
            break;
    }
}
/* Fim do procedimento */

int main(){
    int choose= 0, option= 0;
    
    printf("1-Conversão de bases.\n");
    printf("Escolha uma opção: ");
    scanf("%d", &choose);
    printf("\n");
    //Switch que escolhe a opção desejada pelo usuário
    switch (choose) {
        case 1:
            printf("Digite um valor de 1 até 6\n\n");
            printf("1-Decimal para qualquer base.\n");
            printf("2-Binário para qualquer base.\n");
            printf("3-Octal para qualquer base.\n");
            printf("4-Hexadecimal para qualquer base.\n");
            printf("Opção: ");
            scanf("%d", &option);
            convertion(option);
            break;
            
        default:
            break;
    }
    
    return 0;
}

OBS:

O código está foi compilado no GCC e está 100% funcional, não testei no windows, por isso não sei dizer se está funcionando ou não.

OBS 2:

Apesar de eu ter comentado somente as bases de 2, 8, 10 e 16, funciona para conversão de qualquer base abaixo de 16.
Obrigado e até a próxima :D

Bloqueando sites no mikrotik

Alguns dias atrás, me deparei com a seguinte situação: bloquear sites no mikrotik sem precisar criar um servidor squid ou cache, andei pesquisando por vários lugares, até que encontrei a solução. O mikrotik, tem uma função que permite bloquear as URLs dos sites, não permitindo o acesso das mesmas; assim como também é possível bloquear as “keywords” desejadas. A regra é bem simples, então lá vai:

[admin@mikrotik] > ip firewall filter add chain=forward content=”www.facebook.com” action=drop

Nesse exemplo, eu bloquei o site do facebook, sendo possível alterar o content somente por “facebook” (lembrando que não é aconselhável, pois qualquer site ou programa que contenha “facebook”, o mikrotik bloqueará o acesso). Para bloquear em um determinado range, é só adicionar:

[admin@mikrotik] > ip firewall filter add chain=forward content=”www.facebook.com” action=drop src-address=192.168.3.0/24

Sendo que no caso, o range a ser bloqueado foi o “192.168.3.0/24″, caso deixado em branco, será bloqueado toda a rede.
É isso, até mais e até o próximo post!

DHCP Server Mikrotik

Hoje ensinarei como criar um servidor DHCP no mikrotik, é um procedimento bem simples e bem útil, dando para usar em várias coisas. Eu já havia mostrado como criar um servidor PPPoe, até daria para usar o mesmo post, mas decidi criar algo específico mara não confundir as coisas, até por que irei em aprofundar mais no assunto.
Antes de começarmos, irei dar uma breve explicada sobre o mesmo. O Significado de DHCP: “Dynamic Host Configuration Protocol” traduzido: “Protocolo de configuração de host dinâmico” é um protocolo de serviço TCP/IP que oferece configuração dinâmica de terminais, com concessão de endereços IP de host e outros parâmetros de configuração para clientes de rede (fonte Wikipédia).
Primeiramente, devemos escolher um range de ip para o DHCP. Nesse exemplo usaremos a faixa 192.168.3.1/24.
Abra o terminal do mikrotik, e para começar iremos criar um pool para nosso servidor.

[admin@mikrotik] > ip address add address 192.168.3.1/24 interface=ether2
[admin@mikrotik] > ip pool add ranges=192.168.3.2-192.168.3.254 name=dhcp1

Feito isso, agora criaremos o servidor dhcp.

[admin@mikrotik] > ip dhcp-server add name=dhcp interface=ether2 address-pool=dhcp disabled=no
[admin@mikrotik] > ip dhcp-server network add address=192.168.3.0/24 gateway=192.168.3.1 dns-server=8.8.8.8,8.8.4.4

Agora, nosso servidor já está configurado e pronto para distribuir DHCP. Lembrando que, altere para a interface em que você queira que o DHCP funcione.
Ensinarei algumas opções a mais que podem ser utilizadas, como, após ter esgotados os ips do range criado, tem como configurar para o servidor ir para outro range automático, para isso, é só criar um novo pool, um novo ip e editar nosso pool e nosso servidor:

Crie um novo pool, e em seguida modifique o criado anteriormente:

[admin@mikrotik] > ip pool add ranges=192.168.4.2-192.168.4.254 name=dhcp2
[admin@mikrotik] > ip pool edit dhcp1 next-pool

Após dar enter no ultimo comando acima, irá aparecer uma tela em branco escrito “none”, modifique e coloque o novo pool, que no caso é o “dhcp2″ (feito isso, de um ctrl+o).
Depois de modificado, modificaremos nosso servidor pppoe

[admin@mikrotik] > ip dhcp-server network edit number=0 next-server

O último comando é o mesmo sistema de modificar o pool, de enter e modifique por “192.168.4.0″, que é a rede do novo pool criado, siga com um “ctrl+o” para salvar.
Bem, por enquanto é somente isso, posteriormente mostrarei como “amarar” o MAC ao ip. Até mais galera :)

Instalando Zend Server no Debian

Como todo programador, sempre tentando inovar seus conhecimentos, hoje aprendi a instalar o Zend Server. E como sempre, é bom compartilhar, mostrarei como instalar o mesmo, a principio, ainda não descobri todas as funcionalidades, mas parece ser bem útil. Na verdade, o Sr. Robson William Silva, não querie que eu instalasse, porém como eu não tinha o que fazer, decidir instalar o zend server por conta.
Vamos começar, inicialmente, se você não tem instalado, vá no terminal e digite:

apt-get install apache2 php5-cli php5-common php5-suhosin

Após isso, digite:

nano /etc/apt/sources.list

Feito isso, adicione a seguinte linha:

deb http://repos.zend.com/zend-server/deb server non-free

Dê um ctrl+o e um ctrl+x, e em seguida, baixaremos o Zend Server, no caso será para a versão do PHP 5.3

apt-get install zend-server-ce-php-5.3

Após ter feito o download, acessaremos via web, ex: http://localhost:10081 (no caso do debian com área de trabalho gráfica) ou http://ipdoserver:10081
Aberto a página, terá uma tela de configuração do Zend Server, siga os passos, configure a senha e boa, seu server já ta configurado.
Como a versão que instalamos do Zend Server é pago, vá na aba “Admnistration”, em licence, e terá um link para ter uma licença trial de 30 dias, porém, existe disponível para download, o Zend Server Community, que é a versão gratuita do mesmo.

Uma grande vantagem de utilizar ele, são as várias extenções que da para ativar ou desativar facilmente, ou também verificar os arquivos .php com erros, ele diz o arquivo, e aonde está o erro na sintaxe, ajudando muito no desenvolvimento do mesmo, ai vai mais uma vantagem do Zend Server.

Pronto! Agora seu Zend Server já está configurado e pronto para funcionar, agora só falta configurar ele no Zend Studio ;D

Criando um servidor PPPoe no mikrotik

Começando a série de tutoriais, utilizarei uma máquina virtual do RouterOS para os mesmos, informo que, para um melhor aprendizado de como aprender a fazer um servidor pppoe no mikrotik, recomendo ler Entendendo o básico sobre redes.

Começando, criaremos uma faixa de IP para o servidor PPPoe:

[admin@mikrotik] > ip address add address=192.168.199.1/24 interface=SaidaLink

Lembrando que, esse IP estará que estar na interface de saída, caso coloque na interface de entrada, o servidor PPPoe não funcionará.
Agora crie um Pool (nesse caso, será o range em que o servidor distribuirá os ips)

[admin@mikrotik] > ip pool add name=PPPoe ranges=192.168.199.100-192.168.199.200

Agora, o servidor irá distribuir DHCP nessa faixa de ip (do ip 100 ao 200).
Depois que os ips estão configurados, criaremos um Profile para o PPPoe Server:

[admin@mikrotik] > ppp profile add name=PPPoe local-address=192.168.199.1 remote-address=PPPoe use-mpls=no use-compression=no use-vj-compression=no use-encryption=yes

Nesse profile, definimos que: o “local-address”, é o gateway que o client PPPoe recebera, no nosso caso será o IP que foi levantado na RB (192.168.199.1). Já o “remote-address”, é o Pool que configuramos para distribuir os IPs para os clientes.
Após criado o Profile, será configurado a interface PPPoe Server:

[admin@mikrotik] > interface pppoe-server server add service-name=PPPoe interface=SaidaLink default-profile=PPPoe disabled=no

Lembrando que, esse “default-profile” citado acima, não é o profile que o PPPoe server usará, e sim o profile default, ou seja, caso você não defina nenhum profile no usuário “secret”, ele ira configurar altomaticamente para o profile definido.
Depois de ter criado o servidor PPPoe, só falta criar o usuário para o servidor PPPoe autenticar:

[admin@mikrotik> ppp secret add name=admin password=123456 profile=PPPoe service=pppoe

Agora o principal: criando a regra Masquerade para a faixa de IP do servidor PPPoe:

[admin@mikrotik> ip firewall nat add action=masquerade chain=srcnat src-address=192.168.199.0/24

Pronto, nosso servidor pppoe está configurado e pronto para rodar. Agora vai uma dica: você pode criar vários profiles, cada um como uma limitação. No exemplo abaixo, editarei o profile “PPPoe” que nós criamos, para limitar a velocidade para 500k/500k:

[admin@mikrotik> ppp profile edit PPPoe rate-limit

Após ter digitado o comando acima, dê enter, irá aparecer um editor de texto, coloque a velocidade desejada, no caso ficará como “500k/500k” aperte crtl+o e pronto, o profile PPPoe estará limitado a banda. Pode ser criado vários profiels, cada um com sua configuração. OBS.: caso crie mais de um profile, lembre de alterar no usuario “secret”.

Pois bem, esse nosso servidor PPPoe, é feita pela autenticação direta do mikrotik, logo ensinarei a autenticar com um servidor Radius.

Katipsoi Zunontee – @asfelix

Então galera, mudando um pouco o conteúdo do site, vou criar um post especialmente para ajudar meu amigo e irmão Alexsando Felix. O mesmo está concorrendo ao #DesafioMestreSEO.
Como no meu tempo Dipelnet, ele foi um dos que melhor me acolheu como amigo e parceiro de trabalho, o mínimo que eu posso fazer é divulgar e ajudar ele.
Para isso, estarei colocando o link dele aqui, darei RT em todos os posts, curtirei no facebook, e farei o possível para ajudar ele (:
O site é:
Katipsoi Zunontee
Então, bora ajudar ele o/

Criando um swap_file Ubuntu/Debian

Fala povo! Tudo na boa? Nesse artigo mostrarei como criar um swap_file a partir de um arquivo vazio. Geralmente, ao instalar seu sistema Linux, ele pede para criar uma partição swap, mas eu particularmente prefiro criar a partir de um arquivo, pois é mais fácil de configurar, alterar, essas coisas simples mas que fazem a diferença.
A memória SWAP é útil em vários fatores, hà quem diga que não ajude em nada, mas acredite, em servidores web, banco de dados, faz sim a diferença, pois nem todos os processos, vão para a memória real da máquina, ou seja, o próprio linux diz que: processo X vai para a memória swap e processo Y vai para a memória real. Claro que, nem tudo vai para a swap_file, mas que é uma mão na roda é!
Começando, crie uma pasta onde queira colocar o swap_file, não existe um diretório padrão, vai do usuário querer organizar seu servidor. Nesse tutorial, usaremos o diretório base do linux.
Primeiramente, entre como root no sistema, logo após no terminal digite:

dd if=/dev/zero of=/swap_file bs=1024 count=524288

Essa nossa nova memória virtual, terá 512 mb, para mudar, no caso deu 1024*512=524288. Caso queira criar de 1 gb, ou menos, basta alterar o 512 pela quantidade de memória, exemplo: para uma memória swap de 1gb, basta fazer 1024*1024=1048576.

Agora, diga para o linux que esse arquivo é uma memória swap:

mkswap /swap_file

Pronto, agora só falta ativar ela:

swapon /swap_file

Para saber se funcionou, de um “free -m” e irá ter a nova memória lá.
Agora, iremos fazer o linux ativar ela toda vez que for iniciado.

nano /etc/fstab

Após isso, só adicione a linha abaixo que toda vez que o linux iniciar, irá ativar altomaticamente a nossa swap_file.

/swapfile1 swap swap defaults 0 0

Feito! Agora nossa memória swap (ou virtual), já está funcionando. Reinicie o linux e teste, em caso de erros, é só pedir!

Bloqueando o flood ping e criando algumas restrições no Mikrotik

Fala galera, continuando com a série de tutoriais, nesse ensinarei a bloquear o famoso “flood ping” com alguns comandos básicos do Mikrotik. Colocarei aqui também como fazer algumas restrições como limitar o ping.
Primeiramente, a regra básica para bloquear o ping é:

[admin@MikroTik] > ip firewall filter add chain=input protocol=icmp action=drop

Com isso, toda solicitação de ping ao mikrotik será “barrado”, método muito útil para quem tem medo de alguem fazer um flood ping no seu RouterOS.
Para bloquear somente um “range” de ips, também é simples, para isso tera que criar uma “Address List”. A Primeira regra a seguir, ira criar a “address list” a segunda será para bloquear para os ips da primeira regra. Ai vai:

[admin@MikroTik] > ip firewall address-list add list=”bloqueia ips” address=”192.168.88.0/24″
[admin@MikroTik] > ip firewall filter add chain=input protocol=icmp src-address-list=”bloqueia ips” action=drop

Explicando: na primeira regra, eu defini qual ip que eu irei bloquear, no caso eu escolhi bloquear toda a faixa 192.168.88.0/24, para usar a mesma address list com vários ips, é só ir criar a regra deixando o nome igual e mudando sómente o ip.
Na segunda regra, eu defini que, só não irá pingar na RB somente a address list “bloqueia ips”.

Esses dois modelos que eu dei, são dois básicos que acabam se tornando úteis, existem várias regras, algumas considero inúteis, outras de extrema importáncia. Recomendo que, para melhor aprendizado, tente criar novos modelos, existem vários tipos para serem criadas, como eu disse, citei somente dois modelos, porém vai que numa dessas você acaba aprendendo o que faltava para sua regra ficar perfeita?

Resetando RB (RouterOS, todos os modelos e versões)

Olá galera, ao criar um post, me deparei com o seguinte problema: perdi acesso na RB, lógicamente tive que resetar a mesma, pois não consegui acessar ela nem a pau. Que bomba. Eu que já sabia, foi fácil, mas o procedimento não é que nem de roteadores, que você vai no botão Reset, fica apertado e ja reseta, esse botão serve para voltar o backup da RouterBoot.

E agora? Como resetar se o unico botão de reset não funciona? Aí vai a solução: para resetar sua RB, terá que “fechar curto” em um jumper da mesma: na foto abaixo, estará aonde destacado o jumper, ai é só pegar uma chave de fenda, ou algum metal que consiga encostar nos dois lados.

Resetando RB

Qualquer modelo de RouterBoard terá esse jumper, porém em lugares diferentes.
Outro método de resetar a RB ou é por cabo serial ou via terminal:

[admin@MikroTik] > system reset-configuration

Se você tem o RouterOS instalado em alguma máquina, sem ser uma RB, para resetar você terá que dar o comando citado acima. Caso você acesse remotamente, terá que ir na máquina real (ou VM mesmo), pois pelo winbox não acessará.

Decidi postar isso (resetando routeros), pois pra quem não sabe resetar, é uma droga mesmo, perde muito tempo, e até conseguir uma resposta pode demorar um pouco. E acredite, se você for começar a fuçar em mikrotik uma hora ou outra irá acontecer de perder acesso ou algo do gênero.