Posts de July, 2013

[Rafael Biriba] OpenCart: Com o aumento do dolar, veja como atualizar o preço de todos os seus produtos via SQL

Wednesday, July 31st, 2013

opencart-634x250

Com o aumento do dolar, resolvi postar aqui como fazer para aumentar o preço de todos os seus produtos baseado numa porcentagem.

No caso tive que aumentar 0.05% em cima de todos os produtos.

Para fazer isso, você precisa rodar uma linha SQL diretamente no servidor (pode ser feito facilmente pelo phpmysql admin do seu provedor de hospedagem)

UPDATE opencart_product SET price = round(price*1.05,2)

Onde “opencart_product” é o nome da minha tabela de produtos e “1.05″ é o valor que quero deixar no produto, no caso 100% + 0.05%.

Você também pode baixar o valor do produto proporcionalmente dessa mesma forma. Se você tirar 10% de todos os produtos a query ficaria assim:

UPDATE opencart_product SET price = round(price*0.9,2)

Espero que essa informação seja útil para você, assim como foi para mim :)

TwitterFacebookShare

[Andrews Medina] introdução ao pypy

Sunday, July 28th, 2013

pypy é bastante conhecido por ser uma implementação de python escrita em python. Mas é muito mais do que isso.

O pypy pode ser divido em duas partes. Uma delas é o rpython, um subset de python com a finalidade de ser uma ferramenta para construção de interpretadores. E o pypy, que é uma implementação de python usando o rpython.

O objetivo do pypy é ser um interpretador rápido e flexível para python. O pypy (graças ao rpython) tem suporte a jit, stackless e suporte a várias estratégias de garbage collector.

ambiente de desenvolvimento

É bem fácil montar um ambiente com pypy. Basta fazer o download e descompactar o pypy e criar um ambiente virtual usando o virtualenv.

Faça o download do pypy

Você pode baixar a última versão estável através do link: http://pypy.org/download. Após isso basta descompactar o arquivo:

E criar um ambiente virtual com o pypy, usando o `virtualenv`:

E só testar e rodar seus scripts e aplicações usando o pypy.

Você pode encontrar mais informações sobre o pypy no pypy.org e no http://doc.pypy.org.

[Tiago Motta] Plugin de Fonética Portuguesa para ElasticSearch

Thursday, July 25th, 2013

O ElasticSearch possui um plugin fonético que abrange diversas regras e padrões. No entanto nenhuma dessas regras é boa o bastante para as peculiaridades da lingua portuguesa.

Pensando nisso e de posse de uma gramática portuguesa, forkei o repositório e criei um encoder com as regras de nosso estimado idioma lusitano. Como alguns meses depois ainda não obtive resposta alguma da equipe do plugin original, promovi então este encoder a um novo plugin: Portuguese Phonetic Plugin.

Para utilizá-lo você precisa clonar o projeto no github e instalá-lo:

git clone https://github.com/timotta/elasticsearch-fonetica-portuguesa.gitcd elasticsearch-fonetica-portuguesa./script/install.sh ~/Programas/elasticsearch-0.20.5

Depois é preciso configurar um analyser em config/elasticsearch.yml:

index :    analysis :        analyzer :            fonetico :                type : custom                tokenizer : standard                filter : [ standard, lowercase, foneticaportuguesa_filter, asciifolding ]        filter :            foneticaportuguesa_filter:                type : foneticaportuguesa                replace : false

Com tudo configurado, você pode criar um novo indice usando este analyser, como é mostrado abaixo:

$ curl localhost:9200/comfonetica -XPUT -d '{  "mappings" :{     "document" : {        "analyzer" : "fonetico"     }   }    }'

Com o indice criado e configurado é possivel verificar as transformações de texto da seguinte forma:

$ curl -XGET 'localhost:9200/comfonetica/_analyze?analyzer=fonetico&pretty=true' -d chiclete{  "tokens" : [ {    "token" : "XICLETE",    "start_offset" : 0,    "end_offset" : 8,    "type" : "",    "position" : 1  }, {    "token" : "chiclete",    "start_offset" : 0,    "end_offset" : 8,    "type" : "",    "position" : 1  } ]

Repare que a palavra se transformou em duas. Isso acontece porque a configuração replace do filter está como false.

Atualmente só testei o plugin com a versão 0.20.5 do elasticsearch, se testarem em outras versões peço que reporte no github. Além disso, nem todas as regras fonéticas foram implementadas, então se você precisar de alguma que esteja faltando, colabore ou solicite lá também.

[Tiago Motta] Complexidade Ciclomática com Pygenie recursivo

Tuesday, July 16th, 2013

Pygenie é uma biblioteca python bem simples para calcular a complexidade ciclomática de seus método. É tão simples, mas tão simples que para projetos mais complexos é preciso scriptar um pouco para que todos os diretórios sejam analisados.

Para facilitar então a nossa vida aqui na empresa, fiz uma contribuição (com pouca esperança de ser aceita pois o projeto está parado a dois anos) para que seja possível obter os resultado de forma recursiva. Com esta contribuição é possivel informar o parâmetro -r que analisará recursivamente todos os arquivos .py dentro de um diretório.

$ pygenie complexity mylib -r

Se dentro de seu projeto houver algum arquivo ou diretório que você não deseja que seja analisado você pode utilizar um outro parâmetro adicionado, o -e, onde você informar um pattern para ser excluído. Por exemplo se houver um diretório de testes:

$ pygenie complexity mylib -r -e tests

Caso você deseje utilizar desde já pode instalar o pygenie através do meu fork e neste meio tempo tentar incentivar nosso amigo Matthew Von Rocketstein a aceitar o pull request.

[Tiago Motta] SlimIt, Head.js e django compressor

Tuesday, July 16th, 2013

Ao configurar o django compressor com o filtro do SlimIt, o arquivo do head.js comprimido pela templatetag compress era gerado com um caracter  ï ao ínicio. Utilizando o SlimIt na mão eu obtinha o seguinte erro:

$ slimit head.jsIllegal character '\xbb' at 1:1 after LexToken(ID,'\xef',1,0)Illegal character '\xbf' at 1:2 after LexToken(ID,'\xef',1,0)

Criei uma issue no repositório do SlimIt acreditando ser um problema desta lib. E determinado a corrigir tal problema acabei descobrindo que a raíz deste era o Head.js. No arquivo fonte desta biblioteca javascript havia realmente um caracter estranho, que nenhum editor exibia, nem mesmo o Vi. No entanto, se abríssemos o arquivo via python com um simples:

open("head.js").read()

Víamos claramente o caracter escondido. Espantosamente o único editor que testei e que exibiu o caracter estranho foi o editor online do github.

Forked, pull resqueted e merged: Felizes para sempre.

[Flavia Missi] The proc filesystem

Sunday, July 14th, 2013

Intro

If you use tools such as ps and top then you are already using the proc filesystem even though you never actually ran an ls or opened a file belonging to it. The reason for that is that these tools make use of this filesystem to collect information about processes, and this what this filesystem is for – to store informations about processes.

But what exactly is the proc filesystem?

The proc filesystem is actually a pseudo filesystem used as an interface to access kernel data structures. It’s mostly informative and read-only, but you can actually configure some stuff there.

What kind of informations does /proc stores?

Lets take a look at the filesystem structure to understand what exactly it stores. The following is the result of a ls inside /proc

>$ ls -l
dr-xr-xr-x  9 root    root    1
dr-xr-xr-x  9 root    root    10
# ... omitted output
dr-xr-xr-x  9 root    root    9910
dr-xr-xr-x  2 root    root    acpi
dr-xr-xr-x  4 root    root    asound
-r--r--r--  1 root    root    buddyinfo
dr-xr-xr-x  4 root    root    bus
-r--r--r--  1 root    root    cgroups
-r--r--r--  1 root    root    cmdline
-r--r--r--  1 root    root    consoles
-r--r--r--  1 root    root    cpuinfo
-r--r--r--  1 root    root    crypto
-r--r--r--  1 root    root    devices
-r--r--r--  1 root    root    diskstats
-r--r--r--  1 root    root    dma
dr-xr-xr-x  2 root    root    driver
-r--r--r--  1 root    root    execdomains
-r--r--r--  1 root    root    fb
-r--r--r--  1 root    root    filesystems
dr-xr-xr-x  8 root    root    fs
-r--r--r--  1 root    root    interrupts
-r--r--r--  1 root    root    iomem

Let’s make sense of it: the numbers are directories named by its processes IDs, these directories contains informations of the process it refers, such as the command the process is executing, the command line of the process, the process environment variables, memory mapping information such as libraries that are being used and much more.

It’s worth to note that some of these files’ contents may be null-separated, you can use cat with tr to replace them, e.g.

$ cat 1/environ | tr "\000" "\n"

Now lets run a ls on the /proc/1 directory, this pid always refers to the init process:

>$ ls -ltr
-r--r--r--  1 root    root   cmdline
-r--r--r--  1 root    root   status
-r--r--r--  1 root    root   stat
lrwxrwxrwx  1 root    root   exe -> /sbin/init
-r--r--r--  1 root    root   limits
lrwxrwxrwx  1 root    root   root -> /
-r--r--r--  1 root    root   wchan
dr-xr-xr-x  3 root    root   task
-r--r--r--  1 root    root   syscall
-r--r--r--  1 root    root   statm
-r--r--r--  1 root    root   stack
-r--r--r--  1 root    root   smaps
-r--r--r--  1 root    root   sessionid
-r--r--r--  1 root    root   schedstat
-rw-r--r--  1 root    root   sched
-r--r--r--  1 root    root   personality
-r--r--r--  1 root    root   pagemap
-rw-r--r--  1 root    root   oom_score_adj
-r--r--r--  1 root    root   oom_score
-rw-r--r--  1 root    root   oom_adj
-r--r--r--  1 root    root   numa_maps
dr-x--x--x  2 root    root   ns
dr-xr-xr-x  5 root    root   net
-r--------  1 root    root   mountstats
-r--r--r--  1 root    root   mounts
-r--r--r--  1 root    root   mountinfo
-rw-------  1 root    root   mem
-r--r--r--  1 root    root   maps
dr-x------  2 root    root   map_files
-rw-r--r--  1 root    root   loginuid
-r--r--r--  1 root    root   latency
-r--------  1 root    root   io
dr-x------  2 root    root   fdinfo
dr-x------  2 root    root   fd
-r--------  1 root    root   environ
lrwxrwxrwx  1 root    root   cwd -> /
-r--r--r--  1 root    root   cpuset
-rw-r--r--  1 root    root   coredump_filter
-rw-r--r--  1 root    root   comm
--w-------  1 root    root   clear_refs
-r--r--r--  1 root    root   cgroup
-r--------  1 root    root   auxv
-rw-r--r--  1 root    root   autogroup
dr-xr-xr-x  2 root    root   attr

I’ll cover only the most important files, some of their content you’ll find in process management commands output as I said before, such as ps, others you’ll only find if you come into this directory.

/proc[pid]/task/

This directory contains all threads in the process, one subdirectory per thread. They are named with the id of the thread (tid). Within this subdirectory there is basically the same structure as the one in /proc/[pid], for shared attributes the file contents are the same, for distinct attributes the corresponding files may have different values (e.g. /proc/[id]/[tid]/status)

/proc/[pid]/status

Provides same information as the /proc/[pid]/stat and /proc/[pid]/statm formated for humans.

This file gives informations about the process (/proc/[pid]/stat) and it’s used by the ps command and also provides information about memory usage  (/proc/[pid]/statm)

For information about the columns and fields see the proc manual page.

/proc/[pid]/root

This file is a symbolic link that points to the process’s root directory. Its existence makes container virtualization techniques possible, tools such as chroot make use of it. See the chroot(2) manual for more information.

/proc/[pid]/ns/

Subdirectory containing one entry for each namespace that supports being manipulated by setns, if you’re curious and enjoy some black magic, take a look at the manuals of clone and setns.

/proc/[pid]/coredump_filter

Through this file you can control which memory segments are written to the core dump file when one is performed for the corresponding process. For more information see core(5) manual page.

/proc/[pid]/cmdline

This file holds the complete command line for the process, unless its a zombie, in the case of walkers, this file will be empty.

/proc/[pid]/cwd

Symbolic link to the current working directory of the process. For instance, if you want to find the current working process for a process, run:

>$ cd /proc/20/cwd; /bin/pwd

/proc/[pid]/environ

This file contains the environment variables for the process, null-separated.

/proc/[pid]/exe

This file is a symbolic link containing the pathname of the executed command.

These are some of the files that I find important or just curious under /proc/[pid]/ and I might have forgotten some of them, if you think I did, don’t hesitate to tell me so!

Also, as you might have noticed I simply didn’t addressed the files right under /proc. That’s because I see the information they carry as more important than the former – this is because of my programming background and day-to-day issues. That’s why I am leaving the job to cover those with the manuals (which, BTW, covers the topic very well). Use $ man proc to get a complete explanation on what information each file can give you and $ man /proc/<filename> for more information about a specific file.

[Guilherme Garnier] Minha palestra no FISL 14 – Design Patterns em Ruby

Tuesday, July 9th, 2013

Na última semana aconteceu a última edição do FISL, o Fórum Internacional de Software Livre. No segundo dia do evento, fiz uma palestra sobre Design Patterns em Ruby, a qual foi baseada neste post. Todas as palestras do evento foram transmitidas ao vivo, e os vídeos já estão disponíveis.

Disponibilizei o vídeo da minha apresentação no Vimeo e os slides no Slideshare.

http://www.slideshare.net/GuilhermeGarnier/design-patterns-em-ruby-23952518

Posts relacionados: