BEM VINDO AO BLOG DO MARCOS CARRARO CRIADOR DO "CARRARO DASHBOARD". MUITO MAIS QUE UM SIMPLES BLOG.
Mostrando postagens com marcador programação. Mostrar todas as postagens
Mostrando postagens com marcador programação. Mostrar todas as postagens

quinta-feira, 12 de maio de 2016

Engenharia reversa Shell Script compilado com SHC

Bom Dia,

Ando afastado do blog por alguns motivos particulares, e de estudos, desculpem-me, logo voltarei a postar mais material bacana.

Vamos lá, hoje tinha um script compilado, coisa antiga, sem o source, e precisava saber o que realmente ele fazia, foi então que precisei fazer um 'dump' para pegar o que ele executava.

Algumas pesquisas, algumas leituras, alguns testes, até chegar a este processo.

- Vamos na verdade iniciar o script porém logo em seguida vamos matar o mesmo, para pegar o que ficou na memória, e fazer esse 'DUMP'

- Vamos aumentar o tamanho do 'core' do linux para 1Mb
# ulimit -c 1000000

- Agora vem o pulo do gato, vamos executar o script, com um sleep de alguns microssegundos, e logo em seguida vamos matar ele mesmo $! , repare que nosso script tem o '.sh.x', isso não é regra, o script pode estar somente com '.sh', como sem nenhum ponto.

# ./script.sh.x & ( sleep 0.02 && kill -SIGSEGV $! )

Ao rodar o 'script' o sistema vai retornar um errro "[1]+  Segmentation fault      (core dumped) ./script.sh.x", vai ser criado um arquivo chamado "core.alguma_coisa" , dentro dele vai ter o conteúdo do script, porém vai estar bem poluído, para tal, vamos limpar o mesmo.

# cat core.alguma_coisa| strings

Agora você vai ter a saida em texto puro do script.

Lembrando, somente, utilize esse procedimento quando você é autor do binário, caso contrário estará violando as leis.

Forte Abraço Marcos Carraro.



Read More

quarta-feira, 8 de julho de 2015

Procurando conteúdo dentro de arquivo + mostrar nome do arquivo

Buenas,

Imagine a seguinte situação, você tem um projeto em /var/www/htmll/projeto1/ onde você precisa encontrar a palavra "conteudo_especial" porém você precisa saber em qual arquivo esta este conteudo.

Para isso o nosso querido linux é muito bom.

Vamos lá.

grep -H -r -i "conteudo_especial" .

Simples assim o -i é para olhar letras maisculas e minusculas, o -r é recursivo entra em cada pasta e procura, o -H vai mostrar o nome do arquivo que encontrou a palavra.

Forte abraço,
Marcos Carraro.
Read More

quarta-feira, 25 de fevereiro de 2015

Resolver problema Download .zip com PHP Corrompendo + Limitando Velocidade de Download de Arquivo com PHP

Bom Dia,


Hoje finalizei um sistema e por incrível que parece por algum motivo estranho ele corrompia os downloads em zip, fazendo algumas buscas comentaram do mod deflat do apache, onde ele faz a compressão dos arquivos para melhorar a performance do site e ocupar menos banda (Para testes:  http://www.whatsmyip.org/http-compression-test/  ) .

Ok, então no meu .htaccess inseri a seguinte linha.

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript application/ecmascript application/rss+xml
</IfModule>

Onde segundo ele deveria apenas compactar estes "mimes types", porém ele acabou compactando o .zip achei estranho, porém acabou resolvendo o problema, ainda fiquei "encucado" com o porque que ele compactou sendo que não declarei ele.

Download do zip resolvido é hora de ir para o php, onde vamos limitar a velocidade do download do usuário.

            // header para forçar download
            header('Content-Description', 'File Transfer');
            header('Pragma: public');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Cache-Control: private', false);
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="arquivo.zip"'); // Nome do arquivo
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . filesize('./upload/arquivo.zip'));
            header('Connection: close');
            // Metodo com limitacao de banda para 150k
            flush();
            $arqAberto = fopen("./upload/arquivo.zip", 'rb');
            while (!feof($arqAberto)) {
                echo fread($arqAberto, round(150 * 1024));
                flush();
                sleep(1);
            }
            fclose($arqAberto);


Forte abraço
Marcos Carraro.


Read More

terça-feira, 22 de julho de 2014

Mysql - Tabela para armazenar imagens e grandes textos

Bueno, se você esta montando algum sistema de notícias, que o mesmo vai ter imagens, e muito texto, e não deseja hospedar as imagens, então suba todo no banco. 

Para o editor estou utilizando o http://hackerwins.github.io/summernote/ junto do http://getbootstrap.com/

Então lembre-se que a coluna que vai armazenar o conteúdo, deve ter estes tipos, avalie o tamanho que podera ter e utilize a de acordo.

TINYBLOB, TINYTEXT                                 (255 Bytes) 
    BLOB, TEXT                                                    (64 Kilobytes) 
       MEDIUMBLOB, MEDIUMTEXT                 (16 Megabytes) 
  LONGBLOB, LONGTEXT                              (4 Gigabytes)

Forte quebra costelas,
Marcos Carraro.
Read More

segunda-feira, 28 de abril de 2014

C/C++ Função validar IP faz parte da Rede/Mascara

Buenas,

Segue uma pequena função em C/C++ que valida se o IP x esta na rede Y com a mascara Z.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//---------------------------------------------------------------------
long ip2long(const char *ip,int mascara, const char *rede){
    int ip_host_long,ip_rede_long,maximo,retorno;

    // Converte o IP do HOST no modo long - clong
    ip_host_long = htonl(inet_addr(ip));
    // Converte o IP da REDE no modo long - min
    ip_rede_long = htonl(inet_addr(rede));

    // Definindo o maximo
    maximo = (ip_rede_long | ((1 << (32 - mascara)) -1));

// Validando
    if(ip_host_long > ip_rede_long && ip_host_long < maximo){
        // Faz parte da rede e da mascara
        retorno = 1;
    } else {
        // Nao faz parte da rede e da mascara
        retorno = 0;
    }

    return retorno;
}


//---------------------------------------------------------------------

int main()
{
    const char *ip;
    int mascara;
    const char *rede;

    mascara = 24;
    rede = "192.168.1.0";
    ip = "192.168.2.3";

    long ip_longo = ip2long(ip,mascara,rede);


    printf("%u\n", ip_longo);


    return 0;
}


Forte abraço
Marcos Carraro
Read More

quarta-feira, 16 de abril de 2014

Centos 6 x64 + php 5.3 + bcompiler Com exemplo de arquivo php

Buenas,

Vamos botar para quebrar com o Centos minimal 6 atualizado com o php 5.3 (http://www.php.net/manual/pt_BR/book.bcompiler.php) e também vamos compilar o módulo bcompiler (http://pecl.php.net/package/bcompiler) para criar arquivos binários do php.

Instalação

Entrar no diretório
# cd /usr/src/

Baixar o pacote mais atual
# wget http://pecl.php.net/get/bcompiler

Descompactar o arquivo
# tar -xvsf bcompiler

# cd bcompiler-1.0.2/

PHPIZE Prepara o ambiente para a compilação (http://php.net/manual/pt_BR/install.pecl.phpize.php)
# phpize

Procedimentos comuns para a compilação
# ./configure
# make

A propria extensão manda fazer um teste antes de compilar verdadeiramente
# make test
# make install

Feito isso e não teve nenhum erro show de bola terminamos a compilação e a instalação.

Ao terminar a compilação ele retorna a mensagem de concluído, e também o diretório onde foi gravado o arquivo no meu caso "/usr/lib64/php/modules/"

Vamos agora para a ativação da extensão no php.

# cd /etc/php.d/

# vim bcompiler.ini

Cole o seguinte conteudo

; Ativando a extensao do bcompiler
extension=bcompiler.so


Reiniciando o serviço httpd.

# service httpd restart


Exemplos

No meu caso vou estar utilizando os arquivos compilados pelo php para a linha de comando (http://php.net/manual/pt_BR/features.commandline.php), para obter mais desempenho.



<?php

// $fh é o arquivo de destino, onde vai ser gravado a compialação
// repare na extensao do arquivo não é mais php e sim phb
$fh = fopen("arq_src.phb", "w");
bcompiler_write_header($fh);
// $fh é o arquivo de origem onde tem o codigo php cru
bcompiler_write_file($fh, "arq_src.php");
bcompiler_write_footer($fh);
fclose($fh);

?>




Read More

sexta-feira, 11 de abril de 2014

Criando Fluxo em ASCII

Buenas,

Ta aqui uma baita ferramente que fazia falta, criar fluxo em modo texto para usar nos script.

http://asciiflow.com/

A ferramente é baseada na web e é muito fácil de usar, com isso monta-se os fluxos e depois cola no script indicando o que ele deve fazer.

Forte Abraços
Marcos Carraro
Read More

quinta-feira, 3 de abril de 2014

Mysql Usando CASE com WHERE com Coluna Virtual - ATUALIZADO

Buenas,

Muitas vezes precisamos montar uma coluna virtual no mysql somente para aquela consulta, onde devemos aplicar um filtro, sem ter que ir para a programação apenas no banco para termos um desempenho melhor.

A situação.

Tabela Dias

Colunas
ID DIA HORA

Precisamos comparar alguns valores se estiverem OK retornar 1 caso contrário retornar 0

select
    ID,
   @DiaValido := (CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
where @DiaValido = 1

Desta maneira conseguimos obter melhor desempenho, pois não vamos precisar programar, apenas fazendo a consulta no banco, ganhando assim mais performance.

Atualizando 03/04/2014 - 1058 .
A consulta anterior estava levando 2.15ms para retornar banco pequeno, máquina pequena.

Ao invés de criar uma Coluna Virtual (nome verdadeiro Variável), utilizei o parâmetro HAVING, com isso ganhei 0,20 ms de tempo, pensando em um banco maior, com mais registros....

select
    ID,
(CASE WHEN (DAYOFWEEK(NOW()) = '7' && a.dia = '7')&&(DAYOFWEEK(NOW()) = '7' && b.dia = '1' ) THEN '1'
WHEN (DAYOFWEEK(NOW()) >= a.dia) && (DAYOFWEEK(NOW()) <= b.dia) then '1'
ELSE '0' END) as DiaValido
from
    Dias a,
   Dias b,
HAVING DiaValido = 1

Forte quebra costelas
Marcos Carraro
Read More

terça-feira, 18 de fevereiro de 2014

Criando uma "rule" regra no form_validation no codeigniter - Codeigniter parte 4?

Buenas,

Se falando de CodeiGniter ele já tem uma base e tanto de regras de validação, mas muitas vezes precisamos imcorporar alguma validação a mais no mesmo, porém não existe, e você deseja seguir a mesma lógica, então lá vamos nos...

no arquivo
system/librarires/form_validadion.php


Lá pelas ultimas linhas adicione as suas regras, no meu caso criei uma regra para impedir o uso de espaço apenas texto e numero.

    // --------------------------------------------------------------------

    /**
     * Não permite digiar espaços
     *
     * @access public
     * @param string
     * @return string
     */
    public function no_space($str) {
        return (!preg_match("/^[A-Za-z0-9]+$/", $str)) ? FALSE : TRUE;
    }


Até ali tudo beleza, porém ao aplicar no form, o erro dela vai estar como desconhecido, pois não existe uma tradução do erro para a regra no_space. Para isso...


application/languages/pt-BR/form_validation_lang.php

Adicione a tradução do erro.

$lang['no_space'] = 'O campo %s não pode ter espaços.';


Para utilizar a regra use da maneira normal em que é chamado as demais...

        $this->form_validation->set_rules('campo_name', 'Descricao do Input', 'required|no_space');


Forte Abraço
Marcos Carraro

Read More

quarta-feira, 12 de fevereiro de 2014

Shell Script para Calcular Eficiencia do Squid

Buenas,
Script saindo do forno para efetuar o calculo altere apenas o local dos logs e ta feito.

É feito apenas um calculo matemático consultando os logs do squid.


#!/bin/bash
TOTAL=`grep TCP /var/log/squid/proxy2_log.log | wc -l`;
HIT_GERAL=`grep HIT /var/log/squid/proxy2_log.log | wc -l`;
HIT_HTTPS=`grep -i https /var/log/squid/proxy2_log.log | grep HIT | wc -l`;

EFICIENCIA_GERAL=`echo " ($HIT_GERAL * 100)/ $TOTAL" | bc`;
EFICIENCIA_HTTPS=`echo " ($HIT_HTTPS * 100)/ $TOTAL" | bc`;

echo "Eficiencia no GERAL: " $EFICIENCIA_GERAL"%"
echo "Eficiencia com HTTPS: " $EFICIENCIA_HTTPS"%"

Abraços
Marcos Carraro

Read More

sexta-feira, 7 de fevereiro de 2014

Integrando CodeiGniter com jDataTables - CodeiGniter parte 3

Buenas Turma...

É muito bom utilizar o datatables em projetos, ainda mais hoje nessa web 6.0 v12 biturbo HAHAH,

Então para inegrar é barabada.

Projeto:
https://github.com/IgnitedDatatables/Ignited-Datatables

Ali tem todas as partes para fazer a integração, lembre-se que após isto você deve ativar a biblioteca no application/config/autoload.php

em librarires, assim não precisa carregar na mão.

Para emitir o json compativel com o datatalbes...

    function getservicosremotos() {
        $this->datatables
        ->select('a.id,a.descricao_sr,
                b.range_ip,b.host,
                b.descricao_ips,
                c.porta,
                c.descricao_porta')
        ->from('tb_servico_remoto a,tb_ips b,tb_portas c')
        ->where('a.host = b.id_ip and a.porta = c.id_porta') ;    
        echo $this->datatables->generate();
    }

Desta maneira ele vai retornar o json correto.

{"sEcho":0,"iTotalRecords":4,"iTotalDisplayRecords":4,"aaData":[["5","Conexao intranet","10.0.0.1","fw","Firewall principal","80","HTTP"],["6","TESTE","10.0.0.1","fw","Firewall principal","80","HTTP"],["7","ASD 2","172.16.1.1","TS","TS w2k8 SERVER2","8080","HTTP-ALTERNATIVE"],["8","teste dns google","8.8.8.8","google-dns","google-dns","53","DNS-TCP"]],"sColumns":"a.id,a.descricao_sr,b.range_ip,b.host,b.descricao_ips,c.porta,c.descricao_porta"}

// OBS:
wiki https://github.com/IgnitedDatatables/Ignited-Datatables/wiki

para adicionar uma coluna no json com algum link, alguma imagem, alguma informação html, utilize esta m

    function getservicosremotos() {
        $this->datatables
                ->select('
                b.descricao_ips,
                b.range_ip,
                c.descricao_porta,
                c.porta,
                a.descricao_sr,
                ')
                ->add_edit('a.id', '<a href="url/opcao/editar/$1">Editar</a>', 'a.id')
                ->from('tb_servico_remoto a,tb_ips b,tb_portas c')
                ->where('a.host = b.id_ip and a.porta = c.id_porta');
        echo $this->datatables->generate();
    }

->add_edit('COLUNA_ORIGINAL', '<a href="url/opcao/editar/$1">Editar</a>', 'COLUNA_ORIGINAL')

Então, vai ser alterada a coluna_original para o seguinte conteudo <a href="url/opcao/editar/$1">Editar</a> onde $1 é o valor original da mesma.

Abraços

Read More

domingo, 26 de janeiro de 2014

Compactando Saida HTML CodeiGniter - Parte 2

Dica rápida mas boa.

O que vai acontecer é que a saida do codigo HTML gerado pelas views do CodeiGniter vão ser mais compactas, removendo espaços desnecessários, com isso vai se ganhar mais performance, e também dá uma dificultada na visualização do código html.



application/config/config.php

$config['enable_hooks'] = TRUE;

Cole o seguinte conteudo no arquivo
application/config/hooks.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
| http://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['display_override'][] = array(
'class' => '',
'function' => 'compress',
'filename' => 'compress.php',
'filepath' => 'hooks'
);


/* End of file hooks.php */
/* Location: ./application/config/hooks.php */

Então agora crie o arquivo compress em 
application/hooks/compress.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
function compress()
{
$CI =& get_instance();
$buffer = $CI->output->get_output();
 
$search = array(
'/\n/', // replace end of line by a space
'/\>[^\S ]+/s', // strip whitespaces after tags, except space
'/[^\S ]+\</s', // strip whitespaces before tags, except space
'/(\s)+/s' // shorten multiple whitespace sequences
 );
 
$replace = array(
' ',
'>',
'<',
'\\1'
 );
 
$buffer = preg_replace($search, $replace, $buffer);
 
$CI->output->set_output($buffer);
$CI->output->_display();
}
 
/* End of file compress.php */
/* Location: ./system/application/hools/compress.php */
Read More

sexta-feira, 24 de janeiro de 2014

Começando com Framework CodeiGniter - Parte 1

// Configurando CodeiGniter.
- Remover Index.php
application/config/config.php
Deixe em branco a variavel $config['index_page'] = '';
Fonte: http://websitetutorials.grafix.gr/php/the-codeigniter-framework/initial-configuration/

- Configurando Modulos HMVC
//Baixar a extensão
https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/overview
//Coloque a subpasta “MX” (dentro de “third_part”) no diretório “application/third_party”
//Coloque os arquivos da pasta “core” (não a própria pasta!) dentro de “application/core”
//Crie a pasta “modules” dentro da pasta “application”

//para utilizar os módulos vai ficar assim a estrutura.
application/modules/livros/
application/modules/livros/controllers/
application/modules/livros/models/
application/modules/livros/views/

Fonte: http://codeigniterbrasil.com/tutoriais/hmvc-no-codeigniter-com-modular-extensions/

- Configurando Modulo Padrão
// Vai chamar a pagina/modulo padrão
application/config/router.php
$route['default_controller'] = "login";

- Habilitando Helpers no AutoLoad
application/config/autoload.php
$autoload['helper'] = array('html','text','url','form');

Fonte: http://websitetutorials.grafix.gr/php/the-codeigniter-framework/codeigniter-helpers/

- Habilitando Bibliotecas no AutoLoad
application/config/autoload.php
$autoload['libraries'] = array('database', 'session','email','form_validation');

Obs:. Se habilitar database, devesse automaticamente configurar o Banco, pois vai apresentar erro ao abrir a aplicação.
application/config/database.php

Obs2:. Se habilitar session devesse rapidamente criar uma chave criptografada
application/config/config.php
$config['encryption_key'] = 'oHnhkSq5zZRhozKoNzKMG6e64dnHv6Rt';
Para usar uma chave aleatória pode utilizar este link: http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/


Read More

quarta-feira, 27 de novembro de 2013

PHP Escrever em Imagem com Fonte diferente + Tamanho Fonte.

Buenas,

Hoje tivemos que montar um esquema para assinaturas dos e-mails, então nada melhor do que criar algo mais automatizado.

<?php

//Carregar imagem tamanho da imagen = 515x76
$rImg = ImageCreateFromJPEG("logo3.jpg");

//Definir cor
$cor = imagecolorallocate($rImg, 0, 0, 0);

// carregar fonte...
$font_file = './Museo300-Regular.otf';

//Escrever nome
$texto0  = "--";
$texto1  = "NOMEEEE";
$texto2 = "EMAILLLL";
$texto3 = "Fone: -------------";
$texto4 = "SITEEEEEEEEEEEEE";


// IMAGEM, TAMANHO_FONTE, 0, POSICAO X, posicao Y, TEXTO_COR, ARQ_FONTE, TEXTO
imagettftext($rImg, 10, 0, 10, 5, $cor, $font_file, $texto0);
imagettftext($rImg, 14, 0, 25, 17, $cor, $font_file, $texto1);
imagettftext($rImg, 12, 0, 25, 35, $cor, $font_file, $texto2);
imagettftext($rImg, 12, 0, 25, 52, $cor, $font_file, $texto3);
imagettftext($rImg, 12, 0, 25, 70, $cor, $font_file, $texto4);



//Header e output
header('Content-type: image/jpeg');
imagejpeg($rImg,"logos/LOGO_".$texto2.".jpg",500);
imagedestroy($rImg);
header('Location: logos/LOGO_'.$texto2.'.jpg');

?>
Read More

segunda-feira, 25 de novembro de 2013

Oracle 11g Express + SQL Developer no Windows X64.

Buenas,

Para download do Oracle Express : http://www.oracle.com/technetwork/products/express-edition/downloads/index.html

para Download do SQL Developer : http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

Ao instalar o Oracle Express, ele vai retornar um erro que não foi possível acessar, pois ele não existe. Para resolver este  problema é batata!

O erro apresentando é este ali de cima.

para isto, entre no regedit.

Vá neste destino.


Altera a chave de numero 1. Nela insira o caminho da tela acima do erro, porém repare que no meu caso ficou c:\users\Marcos onde marcos é o nome da conta de usuário do meu notebook.


Feito isto, a instalação vai proceder normalmente.

Ao tentar abrir o atalho conceitos básicos do oracle, vai ter problemas.. como este.


Calma, mais um que vai ser batata de resolver.

Apenas altera o caminho...
Acesse: C:\oraclexe\app\oracle\product\11.2.0\server

Onde vai ter um atalho chamado "Get_Started" um atalho para um site, botão direito, e altera a url para:

http://127.0.0.1:8080/apex/f?p=4950

Aqui já esta tudo rodando perfeito...



Bora Instalar o SQL Developer.


Este é barabada, baixa a versão com JDK incluso, caso baixar não incluso, primeiro instala o JDK x32, e por ultimo inicie o sql-developer.

Forte quebra costelas,
marcos carraro.
Read More

quarta-feira, 13 de novembro de 2013

Consultas Avançadas SQL - group_concat if/else

Buenas,

Hoje vai algumas dicas de consultas em SQL, muitas dicas legais...

Primeiro de tudo vamos verificar o group_concat();

- A consulta normal retorna...

MariaDB [db_painel]> select * from tb_ips;
+-------+---------------+------------+-------------------+-----------------------+------+
| id_ip | range_ip      | mascara_ip | host              | descricao_ips         | tipo |
+-------+---------------+------------+-------------------+-----------------------+------+
|     2 | 192.168.1.0   |          7 | NULL              | Rede Interna          | r    |
|     6 | 10.0.0.1      |         14 | fw                | Firewall principal    | h    |
|    10 | 192.168.1.101 |         14 | oracle            | Servidor Oracle Focco | h    |
|    11 | 10.0.0.0      |         10 | NULL              | DMZ                   | r    |
|    12 | 172.16.1.0    |          8 | NULL              | EXTERNA               | r    |
|    13 | 192.168.1.120 |          8 | bkp               | Servidor de bkp       | h    |
|    14 | 0.0.0.0       |          1 | NULL              | QUALQUER REDE         | r    |
|    15 | 201.2.55.99   |         15 | NULL              | LINK 2                | r    |
|    16 | 172.16.1.1    |          8 | TS                | TS w2k8 SERVER2       | h    |
|    17 | 8.8.8.8       |          1 | google-dns        | google-dns            | h    |
|    18 | 8.8.4.4       |         15 | google-dns2-teste | google-dns2-teste     | h    |
+-------+---------------+------------+-------------------+-----------------------+------+
11 rows in set (0.00 sec)


Repare que os ips tem um tipo R para REDE e H para HOST, então vamos agrupar tudo que for HOST e tudo que for REDE.

MariaDB [db_painel]> select tipo,group_concat(descricao_ips,'=',range_ip,'  ') as grupos from tb_ips group by tipo;
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tipo | grupos                                                                                                                                                                            |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| h    | google-dns2-teste=8.8.4.4  ,google-dns=8.8.8.8  ,TS w2k8 SERVER2=172.16.1.1  ,Servidor de bkp=192.168.1.120  ,Servidor Oracle Focco=192.168.1.101  ,Firewall principal=10.0.0.1   |
| r    | EXTERNA=172.16.1.0  ,DMZ=10.0.0.0  ,QUALQUER REDE=0.0.0.0  ,LINK 2=201.2.55.99  ,Rede Interna=192.168.1.0                                                                         |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Então, repare que a query ficou assim.
> select tipo,group_concat(descricao_ips,'=',range_ip,'  ') as grupos from tb_ips group by tipo;

Aqui vamos montar os grupos pelo seu tipo, então tudo que for do tipo 'H' vai concatenar pela descricao+IP, e dando um espaço.

Se for usar em alguma pagina php, ou html pode fazer a quebra 
> select tipo,group_concat(descricao_ips,'=',range_ip,'<br>') as grupos from tb_ips group by tipo;


-- if/else no sql
Na verdade aqui vamos utilizar o 'case' do mysql, ele fica mais fácil de entender em uma grande consulta.

Vamos fazer da seguinte maneira, se for do tipo H vai mostrar HOST, se for do tipo R vai mostrar REDE.

MariaDB [db_painel]> select (CASE WHEN tipo='r' then 'REDE' ELSE 'HOST' END) AS TIPO_DECODE,tipo from tb_ips;
+-------------+------+
| TIPO_DECODE | tipo |
+-------------+------+
| REDE        | r    |
| HOST        | h    |
| HOST        | h    |
| REDE        | r    |
| REDE        | r    |
| HOST        | h    |
| REDE        | r    |
| REDE        | r    |
| HOST        | h    |
| HOST        | h    |
| HOST        | h    |
+-------------+------+
11 rows in set (0.00 sec)

Então a clausula CASE funciona da seguinte maneira.
(CASE WHEN tipo='r' THEN 'REDE'   // Se tipo for igual a R então imprime REDE

ELSE 'HOST'  // Se não for do tipo R no caso vai ser do tipo H, então por sua vez imprime HOST

END) // Finaliza o bloco.

Você pode estar se pensando e se quero validar mais informações.... poderia implementar um case dentro do outro...


(CASE WHEN tipo='r' THEN 'REDE' 
ELSE (  (CASE WHEN tipo='h' THEN 'HOST' 
       ELSE 'TIPO DESCONHECIDO'  
       END)  )  
END) 

Repare que aqui já temos os dois CASE dentro um do outro, e assim pode fazer uma pilha....

SQL ainda tem muito mais funções, é espetacular...

Vale lembrar que quanto menos linhas de código o sistema tiver mais performático ele vai ser, pois são menos tratamentos na programação para validar os dados.

abraços
marcos carraro.

Read More

segunda-feira, 4 de novembro de 2013

Botando para Funcionar zend-framework 2 + apache + mariadb + Criação de Modulos + NetBeans no Fedora 19

Buenas,

Decide começar a estudar o zf2, então nada melhor do que colocá-lo para funcionar.

Então bora lá.

# yum install httpd mariadb mariadb-server php php-common php-pecl-apc php-cli php-pear php-pdo php-mysqlndphp-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml phpMyAdmin git

Feito isso já temos o webserver rodando, com Apache,PHP,MariaDB,phpMyAdmin.

Agora vamos instalar o tão falado zend framework 2.

Já tenha instalado o NetBeans 7.4

Verifique se já não esta instalado o ZF2.
Caso ele não esteja já instalado, seleciona a aba Plug-ins Disponíveis e lá procure por 'zend' e instale os pacotes php-zend framework e zend framework2.

Feito esta configuração, precisamos do "esqueleto" do FZ2, para isso no NetBeans selecione "Ferramentas -> Opções"

Repare que já tem o link para download, faz o download e selecione o mesmo.
Para os apreçados https://github.com/zendframework/ZendSkeletonApplication/archive/master.zip

Porém ainda fala configurar o composer, o composer no netbeans serve para indicar as bibliotecas que o zend vai precisar, para isso.

cd /usr/sbin ; php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

Ao finalizar a instalação, no netbeans devemos fazer a busca do composer. Em: "Ferramentas -> Opções -> Aba Composer (Pesquisar)"


Então agora chegou a hora de criar o nosso novo projeto.

Vá em novo-projeto selecione PHP, informe os dados necessários, porém ao chegar no fim vai ter o php-frameworks, selecione zend2-framework.

Aguarde alguns instantes e seu projeto já estará pronto.

Após ~5min ta pronto, você é obrigado a visualizar esta tela, se estiver visualizando parabéns o zend esta ok.

Acesse a máquina...
por...

http://ip_da_maquina/zend-dev/public

Obs:. zend-dev é o nome do projeto que eu dei para meus estudos.

Como o zend utiliza MVC, ele mantem já uma estrutura para isso.


Vamos criar então alguns módulos.

para criar esta módulos nos precisamos utilizar o zftool.

Para isso.

# cd /usr/sbin

# composer.phar require zendframework/zftool:dev-master

# cd /var/www/html/Dropbox/zend-dev
Esta é a pasta principal do meu projeto.

Vamos criar o modulo chamado cadastro_uf
# php ./vendor/bin/zf.php create module cadastro_uf /var/www/html/Dropbox/zend-dev/

Para confirmar verifique em...
# ls -la

# ls module/
Application
Cadastro_uf

Bueno, agora o que me restas é estudar mais para começar a programar e criar as classes, as view, templates... e bora lá.

abraços

Referencias:


Read More

Posts que a turma mais esta lendo...

Posts que a turma mais esta lendo...

Marcos Carraro