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;
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.

24 de fevereiro de 2014 / rafaelti

Linguagem R

Objetivo

Instalar e utilizar a Linguagem R

Plataforma

Linux e Linguagem R

Conhecimento

Linux e Linguagem R

Introdução

A linguagem R é largamente usada entre estatísticos e data miners para desenvolver software de estatística e análise de dados.

Solução

Há um guia para instalar facilmente R no Ubuntu. Para verificar o poder do R vamos utilizar o pacote igraph. Para instalar os pacotes no R é fácil também ele utiliza o CRAN (Comprehensive R Archive Network) onde se encontra a maioria dos pacotes. Utilizar o R pode ser feita via comando ou arquivo. Vamos utilizar comando.

Iniciar R execute.

$ R

Instalar o pacote igraph via CRAN

> install.packages("igraph")

Importar ao ambiente o pacote

> library("igraph")

Gerar um grafo

> str(g2)

Imprimir graficamente o grafo

> plot.igraph(g2)

Isto é uma das várias funcionalidades que o R proporciona