Skip to content
9 de junho de 2016 / rafaelti

Hello World com Oracle PL/SQL

Objetivo

Criar o primeiro script PL/SQL

Plataforma

Oracle SQL Developer

Conhecimento

Oracle SQL Developer e SQL

Introdução

Script para BD é uma poderosa ferramenta para automatizar rotinas e trabalhar de forma rápida em reparos. O PL/SQL é uma robusta linguagem de script que pode salvar algumas horas de trabalho.

Solução

Faremos o Hello World no PL/SQL. No Sql Developer é necessário ativar a Saída Dbms/Output Dbms, ambos, script e saída dbms, devem estar na mesma conexão.

DECLARE
   messageoutput VARCHAR2(20);     
BEGIN
  messageoutput := 'Hello World';
  dbms_output.put_line(messageoutput);
END;
7 de junho de 2016 / rafaelti

Laço com PL/SQL

Objetivo

Criar laço no script PL/SQL

Plataforma

Oracle SQL Developer

Conhecimento

Oracle SQL Developer e SQL

Introdução

Uma das funções importantes das linguagens de programação é a criação de laço. A dinâmica do funcionamento dos laços no PL/SQL é um pouco peculiar.

Solução

Faremos o laço no PL/SQL. No Sql Developer é necessário ativar a Saída Dbms/Output Dbms, ambos, script e saída dbms, devem estar na mesma conexão.

DECLARE
    type tarray is table of varchar(20) index by pls_integer;
    datasetitem tarray;
    i integer;
    dsindex integer;
BEGIN

  FOR i IN 1..20
  LOOP
     datasetitem(i) := 'Item na posição:'||i;
  END LOOP;
  
  dsindex := datasetitem.first;
  LOOP
    EXIT WHEN dsindex is null;
    dbms_output.put_line(datasetitem(dsindex));
    dsindex := datasetitem.next(dsindex);
  END LOOP;  
END;
20 de outubro de 2015 / rafaelti

Gerar Sitemap com PHP e SimpleXMLElement

Objetivo

Criar sitemap dinâmico com SimpleXMLElement

Plataforma

Linux, php

Conhecimento

php

Introdução

SimpleXMLElement não permite incluir NameSpace de uma forma trivial. Como o exemplo abaixo.

//xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" 
$url->addChild('mobile:mobile');

O NameSpace mobile não renderiza desta forma.

Solução

Para apresentar o NameSpace mobile é necessário usar um hack

$url->addChild('hack:mobile:mobile');

Exemplo completo fica como código abaixo

	$urlset = new \SimpleXMLElement('<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />');
        /***
		
		Some code
		***/

        foreach ($rows as $row) {

            $url = $urlset->addChild('url');

            $url->addChild('loc', $this->url()->fromRoute('product/id', array('title' => StringUtil::toAscii($row['description']), 'id' => $row['id']), array('force_canonical' => true)));
            $url->addChild('hack:mobile:mobile');
            $image = $url->addChild('hack:image:image'); //, 'http://www.google.com/schemas/sitemap-image/1.1');
            $image->addChild('hack:image:loc', $row['url_image']); //, 'http://www.google.com/schemas/sitemap-image/1.1');
            $image->addChild('hack:image:title', htmlspecialchars($row['description'], ENT_QUOTES, "UTF-8")); //, 'http://www.google.com/schemas/sitemap-image/1.1');
            $image->addChild('hack:image:caption', htmlspecialchars($row['description'], ENT_QUOTES, "UTF-8")); //, 'http://www.google.com/schemas/sitemap-image/1.1');


            $url->addChild('lastmod', date_format(date_create($row['updated']), 'Y-m-d\TH:i:s\+00:00'));
            $url->addChild('changefreq', 'monthly');  //weekly etc.
                
        }
		
		$response = $this->getResponse();
        $response->getHeaders()->addHeaderLine('Content-Type', 'text/xml; charset=utf-8');       
        $response->setContent($urlset->asXML());

        return $response;
7 de agosto de 2015 / rafaelti

Primeiro job com Beanstalk e ZF2

Objetivo

Criar jobs através do ZF2

Plataforma

Linux, php, zf2, beanstalk

Conhecimento

Linux, php, zf2

Introdução

Após instalar o Beanstalk agora é hora de integrar o ZF2 e automatizar a criação de jobs.

Solução

Utilização do SlmQueue especificamente SlmQueueBeanstalkd, com o composer para instalação é o jeito mais fácil. Ao instalar SlmQueueBeanstalkd via composer automaticamente instala suas dependências.

Inserir os módulos no application.config.php

'SlmQueue' ,
'SlmQueueBeanstalkd',

Após a instalação copiar os arquivos slm_queue.global.php e slm_queue_beanstalkd.local.php para o Autoload.
Minha configuração ficou

//slm_queue.global.php
return array(
 'slm_queue' => array(
  ///
  //Configurações
  //
 'job_manager' => array(
 'invokables' => array(
 'Application\Job\PrintHelloWorldJob' => 'Application\Job\PrintHelloWorldJob',
 ),
 ),
 'queue_manager' => array(
 'factories' => array(
 'default' => 'SlmQueueBeanstalkd\Factory\BeanstalkdQueueFactory'
 )
 ),

 ),
);

E

//slm_queue_beanstalkd.local.php
return array(
'slm_queue' => array(
 /**
 * Configuration for Beanstalkd
 */
 'beanstalkd' => array(
 'connection' => array(
 /**
 * Connection host
 */
 'host' => '0.0.0.0',

 /**
 * Connection post
 */
 'port' => 11300,

 /**
 * How long, in seconds, the socket will wait for the server to respond to its
 * initial connection attempt
 */
 'timeout' => 2
 ),
 ),
 ),
);

Job Hello World

namespace Application\Job;

use SlmQueue\Job\AbstractJob;
use SlmQueue\Queue\QueueInterface;

class PrintHelloWorldJob extends AbstractJob
{
 public function execute()
 {
 echo "Hello World \n";
 }
}

Colocando um job na fila.

 public function queueAction() {
 $response = $this->getResponse();
 $job = $this->getServiceLocator()->get('SlmQueue\Job\JobPluginManager')->get('Application\Job\PrintHelloWorldJob');

 $queue = $this->getServiceLocator()->get('SlmQueue\Queue\QueuePluginManager')->get('default');
 $queue->push($job);
 return '';
 }

Ao acessar http://localhost/proj/queue
Resultado

rafael@ubuntu:/var/www/html/proj$ php public/index.php queue beanstalkd default
Hello World 

Hello World
23 de abril de 2015 / rafaelti

Queue com Beanstalk

Objetivo

Trabalhar com mensageria com o Beanstalk e definir as primeiras queue.

Plataforma

Linux, python

Conhecimento

Linux, python

Introdução

Para escalar serviço uma ótima solução é a utilização de Queue, o Beanstalk é uma ferramenta muito versátil.

Solução

A instalação é através(muitas vezes) do gerenciador de pacotes.

Para iniciar o serviço definindo o endereço e porta

# Utilização: beanstalkd -l [ip address] -p [port #]
beanstalkd -l 127.0.0.1 -p 11301 &

Alguns comandos disponíveis

# To start the service:
service beanstalkd start

# To stop the service:
service beanstalkd stop

# To restart the service:
service beanstalkd restart

# To check the status:
service beanstalkd status

Testando o Beanstalk com python

pip install pyyaml
pip install beanstalkc

Interpretador python

rafael@ubuntu:~$ python
Python 2.7.6
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import beanstalkc
>>> beanstalk = beanstalkc.Connection(host='localhost', port=11301)
>>> beanstalk.put('job_one')
1
>>> job = beanstalk.reserve()
>>> job
<beanstalkc.Job object at 0x7f60d28fb790>
>>> beanstalk.use('tube_a')
'tube_a'
>>> beanstalk.tubes()
['default', 'tube_a']
>>> print job.body
job_one
>>> beanstalk.tubes()
['default', 'tube_a']
>>> print job.body
job_one
>>> job.delete()
>>> print job.body
job_one
>>> print job.body

1 de abril de 2015 / rafaelti

LLVM – Primeiro pass

Objetivo

Criar o primeiro pass no LLVM

Plataforma

C/C++, LLVM e linux

Conhecimento

C/C++, LLVM e linux

Introdução

O pass do LLVM é parte fundamental para o compilador. Com os passes podemos otimizar e transformar os códigos.

Solução

No primeiro exemplo não utilizarei o hello world proposto na página do LLVM, utilizarei um exemplo do Prof. Fernando(sem autorização dele é claro, mas é para um bem maior). Este pass conta a quantidade de opcodes no programa.

Primeiro devemos criar o nosso pass, criei no diretório /llvm/lib/Transforms/CountOP

//CountOp.cpp
define DEBUG_TYPE "opCounter"
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include <map>
using namespace llvm;
namespace {
 struct CountOp : public FunctionPass {
	std::map<std::string, int> opCounter;
	static char ID;
	CountOp() : FunctionPass(ID) {}
	virtual bool runOnFunction(Function &F) {
		errs() << "Function " << F.getName() << '\n';
		for (Function::iterator bb = F.begin(), e = F.end(); bb != e; ++bb) {
			for (BasicBlock::iterator i = bb->begin(), e = bb->end(); i != e; ++i) {
				if(opCounter.find(i->getOpcodeName()) == opCounter.end()) {
					opCounter[i->getOpcodeName()] = 1;
				} else {
					opCounter[i->getOpcodeName()] += 1;
				}
			}
		}
		std::map <std::string, int>::iterator i = opCounter.begin();
		std::map <std::string, int>::iterator e = opCounter.end();
		while (i != e) {
			errs() << i->first << ": " << i->second << "\n";
			i++;
		}
		errs() << "\n";
		opCounter.clear();
		return false;
	}
 };
}
char CountOp::ID = 0;
static RegisterPass<CountOp> X("opCounter", "Counts opcodes per functions");

Agora precisamos do nosso makefile

##===- lib/Transforms/Hello/Makefile -----------------------*- Makefile -*-===##
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##

LEVEL = ../../..
LIBRARYNAME = CountOp
LOADABLE_MODULE = 1

include $(LEVEL)/Makefile.common

Ao executar o make será retornado

rafael@ubuntu: /opt/llvm/lib/Transforms/CountOp$ make
llvm[0]: Compiling CountOp.cpp for Release+Asserts build (PIC)
llvm[0]: Linking Release+Asserts Loadable Module CountOp.so

Nosso Pass está pronto.

Segundo passo é o código alvo, ou seja, o código que o pass utilizará para produzir os resultados desejados. Este pode ficar em qualquer lugar.

//teste.c
#include <stdio.h>
int main() {
  int c1 = 17;
  int c2 = 25;
  int c3 = c1 + c2;
  printf("Value = %d\n", c3);
}

Precisamos transformar nosso código em bytecodes com o comando abaixo

clang -c -emit-llvm teste.c -o teste.bc

Agora rodamos o pass obre o bytecode

opt -load CountOp.so -opCounter -disable-output teste.bc

O resultado

Function main
add: 1
alloca: 3
call: 1
load: 3
ret: 1
store: 3
4 de março de 2015 / rafaelti

Hypertable – Chave aproximada com Scanner

Objetivo

Utilizar na busca do Scanner uma chave aproximada para retornar as células do Hypertable

Plataforma

PHP, Hypertable e linux

Conhecimento

PHP e Hypertable

Introdução

Muitas situação não é conveniente utilizar HQL e a busca com chave aproximada com scanner pode ser um pouco traiçoeira.

Solução

Para utilizar a chave aproximada não se deve usar o RowInterval(ou pelo menos não consegui). Devemos usar regex na chave.

function scan(&$client, $key, $columns) {
    try {
        //$client = $this->client();
        $ns = $client->namespace_open('ns');

        $args = array('row_regexp' => "^$key", 'columns' => $columns);

        $ss = new \Hypertable_ThriftGen\ScanSpec($args);

        $scanner = $client->scanner_open($ns, 'yourtable', $ss);

        do {
            $cells = $client->scanner_get_cells($scanner);
            foreach ($cells as &$cell) {
                var_dump($cell);
            }
        } while (!empty($cells));

        $client->scanner_close($scanner);
        $client->namespace_close($ns);
    } catch (\Hypertable_ThriftGen\ClientException $e) {
        echo "error: $e->message\n";
        exit(1);
    }
}
10 de fevereiro de 2015 / rafaelti

ZF2 – retornar xml e download

Objetivo

Disponibilizar de forma correta XML no Zend Framework 2 e seu download

Plataforma

PHP e ZF2 Conhecimento PHP e ZF2

Introdução

Várias técnicas podem ser mais rápidas, mas utilizar o call stack do ZF2 traz mais seguração

Solução

No import do Controller pode se utilizar de DOMDocument ou SimpleXMLElement, como montará o documento não é importante.

public function xmlAction() {
 $response = $this->getResponse();

$xml = ....;
.
.
.
        $response->getHeaders()->addHeaderLine('Content-Type', 'text/xml; charset=utf-8');
        $response->getHeaders()->addHeaderLine('Content-Disposition', 'attachment; filename="test.xml"');

        $response->setContent($xml->asXML());

        return $response;
    }       
23 de outubro de 2014 / rafaelti

Incluindo um usuário ao sudoers no fedora 20

Objetivo

Incluir um usuário ao sudoers no fedora

Plataforma

Linux

Conhecimento

Linux e vi

Introdução

Ao incluir um usuário provavelmente o usuário no grupo de usuários sudoers. O sudo é um comando melhor do que su -c.

Solução

1. No terminal digite

su --login -c 'visudo'

2. Digite a senha do root

3. O arquivo sudo abrirá como abaixo

root ALL=(ALL) ALL
nobody ALL = NOPASSWD: /usr/local/bin/sendmsg.sh

4. Sob a linha root ALL=(ALL) ALL adicione o seu usuário

SeuUsario ALL=(ALL) ALL

1 de setembro de 2014 / rafaelti

Instalar o LLVM

Objetivo

Instalar e LLVM

Plataforma

Linux e C++

Conhecimento

Linux e C/C++

Introdução

É uma infraestrutura de compilador escrita em C++, desenvolvida para otimizar em tempos de compilação, ligação e execução programas escritos em linguagens de programação variadas. Implementada originalmente para C e C++, sua arquitetura permitiu a expansão para outras linguagens posteriormente, incluindo Objective-C, Fortran, Ada, Haskell, bytecode Java, Python, Ruby, ActionScript,GLSL, Julia, entre outras.

Solução

Leia a documentação para entender o funcionamento deste projeto.

  1. Checkout LLVM:
  2. Checkout Clang:
  3. Checkout Compiler-RT:
  4. Test Suite Source Code [Opcional]
  5. Configure e build LLVM and Clang:
    • cd ~/llvm
    • ./configure --disable-optimized
    • make [-j] — O -jX se tiver mais núcleos o processador.
    • make check-all
  6. Testar se estar ok. opt –version

Atente que estamos pegando os fontes do Trunk, ou seja, desenvolvimento. No caso de uma versão estável pegue de uma tag.