Sunday, January 27, 2013
Instrução
Em homenagem a Eduardo Ribas D'Avila e seu afã de ensinar.
(Varuzza, Patrão e Sato)
Foi pra Itapevi como se fosse ótimo
Ensinou daquela vez como se fosse máquina
Gritou com seus alunos como se fosse um bárbaro
Ouviu do diretor o comentário esdrúxulo
Tomou a refeição como se fosse o Érico
Peidou e arrotou como se fosse um príncipe
Ensinou o taleban como se ouvisse música
Matéria por matéria na sequência errática
Soltou na condução um trocadilho péssimo
E adentrou a casa com seu peido pútrido
Tombou como um tijolo em seu muquifo sórdido
Adormeceu ouvindo um quarteto clássico
Sonhou que recebia um pagamento máximo
Foi pra Itapevi como se fosse máquina
Ensinou daquela vez como se fosse esdrúxulo
Gritou com seus alunos como se fosse um príncipe
Ouviu do diretor o comentário Érico
Tomou a refeição como se fosse o máximo
Peidou e arrotou como se fosse música
Ensinou o taleban como se fosse bárbaro
Matéria por matéria na sequência clássica
Soltou na condução um trocadilho errático
E adentrou a casa com seu peido ótimo
Tombou como um tijolo em seu muquifo pútrido
Adormeceu ouvindo um quarteto lúgubre
Sonhou que recebia um pagamento sórdido
Foi pra Itapevi como se fosse Érico
Ensinou daquela vez como se fosse Érico
Gritou com seus alunos como se fosse um Érico
Ouviu do diretor o comentário Érico
Tomou a refeição como se fosse o Érico
Peidou e arrotou como se fosse o Érico
Ensinou o taleban como se fosse o Érico
Matéria por matéria na sequência Érico
Soltou na condução um trocadilho Érico
E adentrou a casa com seu peido Érico
Tombou como um tijolo em seu muquifo Érico
Adormeceu ouvindo um quarteto Érico
Sonhou que recebia um pagamento Érico
(Varuzza, Patrão e Sato)
Foi pra Itapevi como se fosse ótimo
Ensinou daquela vez como se fosse máquina
Gritou com seus alunos como se fosse um bárbaro
Ouviu do diretor o comentário esdrúxulo
Tomou a refeição como se fosse o Érico
Peidou e arrotou como se fosse um príncipe
Ensinou o taleban como se ouvisse música
Matéria por matéria na sequência errática
Soltou na condução um trocadilho péssimo
E adentrou a casa com seu peido pútrido
Tombou como um tijolo em seu muquifo sórdido
Adormeceu ouvindo um quarteto clássico
Sonhou que recebia um pagamento máximo
Foi pra Itapevi como se fosse máquina
Ensinou daquela vez como se fosse esdrúxulo
Gritou com seus alunos como se fosse um príncipe
Ouviu do diretor o comentário Érico
Tomou a refeição como se fosse o máximo
Peidou e arrotou como se fosse música
Ensinou o taleban como se fosse bárbaro
Matéria por matéria na sequência clássica
Soltou na condução um trocadilho errático
E adentrou a casa com seu peido ótimo
Tombou como um tijolo em seu muquifo pútrido
Adormeceu ouvindo um quarteto lúgubre
Sonhou que recebia um pagamento sórdido
Foi pra Itapevi como se fosse Érico
Ensinou daquela vez como se fosse Érico
Gritou com seus alunos como se fosse um Érico
Ouviu do diretor o comentário Érico
Tomou a refeição como se fosse o Érico
Peidou e arrotou como se fosse o Érico
Ensinou o taleban como se fosse o Érico
Matéria por matéria na sequência Érico
Soltou na condução um trocadilho Érico
E adentrou a casa com seu peido Érico
Tombou como um tijolo em seu muquifo Érico
Adormeceu ouvindo um quarteto Érico
Sonhou que recebia um pagamento Érico
Tuesday, October 16, 2012
Best of forró - tomando cuba
Algum tempo após eu começar a série "best of forró" (nem tudo publicado ainda), hoje no banho lembrei dessa bonita canção:
Vá tomando cuba, tome cuba com limão
Vá tomando cuba, que faz bem ao coração
Você bem sabe
Cachaça faz mal a gente
No fim um fica valente
Tira do certo a razão
Quem tomar muito aguardente
Termina morrendo inchado
Deixe a cachaça de lado,
Tome cuba com Limão
Vá tomando cuba, tome cuba com limão
Vá tomando cuba, que faz bem ao coração
__________
__________
__________
Num copo pediu limão
Eu disse "tá tomando cuba?"
Ela falou "tu tem razão"
Eu não lembro dos três primeiros versos acima, mas lembro que eram seis no total com padrão de rima ABBABA. Eu nunca tinha entendido, nas aulas de português, o padrão de rima ABBA, nessa música ela cai muito bem (se bem que, a rigor, seja ABBC, pois no fundo não importa se A rima com C).
Nada dessas coisas eu consigo encontrar no google.
Vá tomando cuba, tome cuba com limão
Vá tomando cuba, que faz bem ao coração
Você bem sabe
Cachaça faz mal a gente
No fim um fica valente
Tira do certo a razão
Quem tomar muito aguardente
Termina morrendo inchado
Deixe a cachaça de lado,
Tome cuba com Limão
Vá tomando cuba, tome cuba com limão
Vá tomando cuba, que faz bem ao coração
__________
__________
__________
Num copo pediu limão
Eu disse "tá tomando cuba?"
Ela falou "tu tem razão"
Eu não lembro dos três primeiros versos acima, mas lembro que eram seis no total com padrão de rima ABBABA. Eu nunca tinha entendido, nas aulas de português, o padrão de rima ABBA, nessa música ela cai muito bem (se bem que, a rigor, seja ABBC, pois no fundo não importa se A rima com C).
Nada dessas coisas eu consigo encontrar no google.
Wednesday, August 01, 2012
mysql: getting a column in a row that maximizes another column
I can't explain the problem in a better way, but I'll provide an example of what I'm trying to solve here. Say you have a table t:
product | id | price |
---|---|---|
keyboard | 1 | 23 |
keyboard | 2 | 55 |
keyboard | 3 | 99 |
keyboard | 4 | 18 |
chair | 1 | 29 |
chair | 2 | 15 |
chair | 3 | 9 |
chair | 4 | 42 |
If you want the greatest value of column price, you'll just
SELECT max(price) FROM t
However, if you want to know the greatest price for each product, you'll need group:
SELECT product,max(price) FROM t GROUP BY product
All good. However, what if you need to get the id column for the row that has the maximum price for each group? That is, you want to get the value 3 for keyboard, and 4 for chair.
The ideal solution would be to have an proper aggregation function to do that, for instance VALUE( id HAVING price = max(price) ) or something like that. But MySQL (and AFAIK, Oracle 10g) don't provide such thing.
There's a lot of possible solutions, and I'll summarize the ones I know.
This one is a trick that works when the column you want to maximize (or minimize) has a maximum size.
SELECT product, max(price), substr( max( concat( lpad( price, 10, 0 ), id ) ), 11 ) as id FROM t GROUP BY product
That one uses string functions also, but I think it's neater (mainly because it's the only one I came up by myself) (however, it won't work if the SEPARATOR character occurs in that column):
SELECT product, max(price), substring_index( group_concat( id order by price desc separator '|' ), '|', 1 ) FROM t GROUP BY product
Here's one that uses subqueries:
SELECT product, max(price),
( SELECT id FROM t t2 WHERE t2.product = t.product ORDER BY price DESC LIMIT 1 )
FROM t
GROUP BY product
However, you can't do this with temporary tables. Also, you can't refer to GROUP columns defined outside the subquery inside the subquery (or else you could just add AND t2.price = max(t.price), and it should be nice).
This one relies on an undocumented feature of grouping in MySQL:
SELECT product, max(price), id
FROM(
SELECT product, price, id
FROM t
ORDER BY product, price DESC
) x
GROUP BY product
If we don't specify the column id neither as a GROUPed column or in an aggregation function (as MAX), standard SQL databases just won't run; however, MySQL has a
SELECT max(price) FROM t
However, if you want to know the greatest price for each product, you'll need group:
SELECT product,max(price) FROM t GROUP BY product
All good. However, what if you need to get the id column for the row that has the maximum price for each group? That is, you want to get the value 3 for keyboard, and 4 for chair.
The ideal solution would be to have an proper aggregation function to do that, for instance VALUE( id HAVING price = max(price) ) or something like that. But MySQL (and AFAIK, Oracle 10g) don't provide such thing.
There's a lot of possible solutions, and I'll summarize the ones I know.
This one is a trick that works when the column you want to maximize (or minimize) has a maximum size.
SELECT product, max(price), substr( max( concat( lpad( price, 10, 0 ), id ) ), 11 ) as id FROM t GROUP BY product
That one uses string functions also, but I think it's neater (mainly because it's the only one I came up by myself) (however, it won't work if the SEPARATOR character occurs in that column):
SELECT product, max(price), substring_index( group_concat( id order by price desc separator '|' ), '|', 1 ) FROM t GROUP BY product
Here's one that uses subqueries:
SELECT product, max(price),
( SELECT id FROM t t2 WHERE t2.product = t.product ORDER BY price DESC LIMIT 1 )
FROM t
GROUP BY product
However, you can't do this with temporary tables. Also, you can't refer to GROUP columns defined outside the subquery inside the subquery (or else you could just add AND t2.price = max(t.price), and it should be nice).
This one relies on an undocumented feature of grouping in MySQL:
SELECT product, max(price), id
FROM(
SELECT product, price, id
FROM t
ORDER BY product, price DESC
) x
GROUP BY product
If we don't specify the column id neither as a GROUPed column or in an aggregation function (as MAX), standard SQL databases just won't run; however, MySQL has a
ONLY_FULL_GROUP_BY
flag (that I think is off by default) that allow you to do this - but it is not specified which value of id will be returned. It could be from any row belonging to that GROUP, but experience shows that it will always return the value from the last row. So, you perform an ORDER BY, then GROUP BY. It is not guarranteed that it will work, but it does (currently).Friday, January 20, 2012
Encoding and mysql
Knowing how encoding works is crucial when dealing with non-ASCII characters in your source code or database. If your data is numeric, or ASCII based, you could never know that there is such thing, but most of the time this is a issue. If you're dealing with multilingual data, it is definitely a important thing.
MySQL has four encoding settings: the server encoding, the table encoding, the column encoding, and the client encoding. Server encoding is the default encoding tables and columns will follow if not specified. Table encoding supersedes the Server if the column's is not definied. Finally, client encoding defines to which one should retrieved data be displayed.
I once had a problem with some mysql database texts being corrupted, only the non-ASCII characters on portuguese text. The problem, basically, was that data was generated on an old version of Excel, which by default saved CSV files with Latin-1 encoding, and the same data was loaded on some table which were defined to be encoded on UTF8.
The command
SELECT * FROM t1
in a Latin1 client retrieved garbage (unreadable in both Latin1 or UTF8 terminals), but the same command in a UTF8 client retrieved data in the original Latin1 encoding!
Below are some tips to diagnose and solve those problems.
To sort out if your data is stored on a different encoding from what you defined on the table or column the problem is, on *NIX, I open a terminal emulator, ensure that its encoding is UTF-8, connect to mysql using the --character-set utf8 option and then select data known to have non-standard characters. If everything is right,
I always use the *NIX terminal to perform these checks. First, ensure which encoding your terminal emulator is using; then, connect to the database using the same encoding as the terminal. Then check which encoding is the table and the column.
If when you SELECT data, it appears garbled, you can be sure that data isn't encoded as the table tells it is. Then you can connect to mysql using the same encoding as the table is defined (even if it is not the same as the terminal); if the same SELECT retrieves data correctly displayed, then your data is in the same encoding as your terminal and you should ALTER TABLE accordingly.
If your data is still garbled, try switching the terminal's encoding and doing the SELECT over and over, until it is displayed correctly. If so, change the table/column encoding to match the terminal's and everything must be fine.
If things still aren't worked out, your data has been corrupted, probably because it has a certain encoding X and was converted from another encoding Y to Z (or even back to X). Making the other way round may work to get thing back, but sometimes data is lost permanently.
The problem using GUIs to sort things out is that sometimes you don't really know which encoding the GUI itself is using. I don't imagine how to deal with it on Windows. *NIX Terminal Emulators I know usually have this setting in a place easy to be found, and mysql terminal client is also very easy to define this.
Also, I found out that the encoding defined on tables and columns doesn't affect how data is stored, but only how it is retrieved. When the table/column encoding matches the client's, data is retrieved as it was stored initially. When they don't match, results will be converted FROM table/column encoding TO client encoding.
So if your data is latin1 encoded, your table is defined as utf8, and you set the client to latin1, results will be converted to latin1, AS IF IT WERE utf8! It will completely mess your data!
You could set whatever encoding you want, as long as the client encoding matches the data the data will be retrieved unchanged.
It is also good practice to check (using the command "file") the encoding of any file before loading it in the database. "iconv" is helpful when translating files between encodings.
Finally, the "encoding collation" property interferes on how LIKE and other operators perform on those kind of character. For instance, if you set "utf8-general-ci", "ç" LIKE "c" = 1, but for "utf8-bin" it yields 0.
MySQL has four encoding settings: the server encoding, the table encoding, the column encoding, and the client encoding. Server encoding is the default encoding tables and columns will follow if not specified. Table encoding supersedes the Server if the column's is not definied. Finally, client encoding defines to which one should retrieved data be displayed.
I once had a problem with some mysql database texts being corrupted, only the non-ASCII characters on portuguese text. The problem, basically, was that data was generated on an old version of Excel, which by default saved CSV files with Latin-1 encoding, and the same data was loaded on some table which were defined to be encoded on UTF8.
The command
SELECT * FROM t1
in a Latin1 client retrieved garbage (unreadable in both Latin1 or UTF8 terminals), but the same command in a UTF8 client retrieved data in the original Latin1 encoding!
Below are some tips to diagnose and solve those problems.
To sort out if your data is stored on a different encoding from what you defined on the table or column the problem is, on *NIX, I open a terminal emulator, ensure that its encoding is UTF-8, connect to mysql using the --character-set utf8 option and then select data known to have non-standard characters. If everything is right,
I always use the *NIX terminal to perform these checks. First, ensure which encoding your terminal emulator is using; then, connect to the database using the same encoding as the terminal. Then check which encoding is the table and the column.
If when you SELECT data, it appears garbled, you can be sure that data isn't encoded as the table tells it is. Then you can connect to mysql using the same encoding as the table is defined (even if it is not the same as the terminal); if the same SELECT retrieves data correctly displayed, then your data is in the same encoding as your terminal and you should ALTER TABLE accordingly.
If your data is still garbled, try switching the terminal's encoding and doing the SELECT over and over, until it is displayed correctly. If so, change the table/column encoding to match the terminal's and everything must be fine.
If things still aren't worked out, your data has been corrupted, probably because it has a certain encoding X and was converted from another encoding Y to Z (or even back to X). Making the other way round may work to get thing back, but sometimes data is lost permanently.
The problem using GUIs to sort things out is that sometimes you don't really know which encoding the GUI itself is using. I don't imagine how to deal with it on Windows. *NIX Terminal Emulators I know usually have this setting in a place easy to be found, and mysql terminal client is also very easy to define this.
Also, I found out that the encoding defined on tables and columns doesn't affect how data is stored, but only how it is retrieved. When the table/column encoding matches the client's, data is retrieved as it was stored initially. When they don't match, results will be converted FROM table/column encoding TO client encoding.
So if your data is latin1 encoded, your table is defined as utf8, and you set the client to latin1, results will be converted to latin1, AS IF IT WERE utf8! It will completely mess your data!
You could set whatever encoding you want, as long as the client encoding matches the data the data will be retrieved unchanged.
It is also good practice to check (using the command "file") the encoding of any file before loading it in the database. "iconv" is helpful when translating files between encodings.
Finally, the "encoding collation" property interferes on how LIKE and other operators perform on those kind of character. For instance, if you set "utf8-general-ci", "ç" LIKE "c" = 1, but for "utf8-bin" it yields 0.
Thursday, August 11, 2011
Problemas com o Submarino.com
No dia 8/8/2011, a entrega de um produto foi incorretamente recusada em minha casa. No mesmo dia, contactei o chat (protocolo 11727048) para resolver o assunto, quando descobri que demoraria mais dois dias para receber uma resposta, pedi o cancelamento. O atendente disse que não seria possível cancelar a compra, me deixando extremamente irritado.
Além disso, no site do Submarino, o produto consta como entregue, o que me deixou muito preocupado com a idoneidade da empresa de entregas.
No dia seguinte, fui instruido a esperar até 11/08 pela resposta do departamento (protocolo 117328674). novamente o cancelamento foi dado como impossível.
No dia 11/08, entrei em contato novamente com o chat (117392737) e fui informado de que no dia 10/08 o produto estava em processo de devolução. fui instruido a esperar mais dois dias pela resposta do departamento, ou pelo e-mail do submarino reportando que o produto foi devolvido. Somente então a atendente Maria Aparecida acenou com a possibilidade de cancelamento, quando esse e-mail chegar.
Quero deixar registrada minha intenção de cancelar o pedido, antes que se passem os 7 dias após o pagamento (no sábado), minha preocupação com o status incorreto de "entregue", sendo que o produto foi recusado, e minha insatisfação com a "impossibilidade" de cancelar a compra, em desacordo com o código do consumidor.
Além disso, no site do Submarino, o produto consta como entregue, o que me deixou muito preocupado com a idoneidade da empresa de entregas.
No dia seguinte, fui instruido a esperar até 11/08 pela resposta do departamento (protocolo 117328674). novamente o cancelamento foi dado como impossível.
No dia 11/08, entrei em contato novamente com o chat (117392737) e fui informado de que no dia 10/08 o produto estava em processo de devolução. fui instruido a esperar mais dois dias pela resposta do departamento, ou pelo e-mail do submarino reportando que o produto foi devolvido. Somente então a atendente Maria Aparecida acenou com a possibilidade de cancelamento, quando esse e-mail chegar.
Quero deixar registrada minha intenção de cancelar o pedido, antes que se passem os 7 dias após o pagamento (no sábado), minha preocupação com o status incorreto de "entregue", sendo que o produto foi recusado, e minha insatisfação com a "impossibilidade" de cancelar a compra, em desacordo com o código do consumidor.
Thursday, May 26, 2011
Aliens e tupperware
Já escreveram sobre como as canetas bics vem e vão, sabe-se lá de onde e sabe-se lá pra onde. Quando elas estão perto de acabar, vão para um cemitério de canetas, pois ninguém nunca viu uma caneta bic no final. Um dia alguém encontrará esse cemitério* e ficará rico; ou louco, tentando transferir a tinta das canetas de umas para outras.
O mesmo vale para os tupperwares, na minha opinião eles vem das casas das mães, lotados de comida, e depois viram pratos de gato, até que um dia as colocamos sobre um fogão quente ou coisa parecida, e elas são postas para dormir.
Este foi um sonho engraçado. Eu estava dormindo numa casa (parecia da Nicéia) e de repente uma ponteira laser vermelha apareceu, me enchendo o saco. Depois verde. Olhei pela janela para tentar localizar quem estava fazendo isso, e nada. depois de um tempo começou novamente. Olhei para a janela e não achei. Aliás a cidade era bem bidimensional, parecia um desenho de perfil, com cores bem azuis e "estouradas". De repente, luzes laser verdes apareceram, pensei que eram aqueles spots que ligam quando tem algum evento. Desconfiei que tinha alguma coisa muito estranha quando um laser arredondado começou a sair das nuvens. Parecia o ícone do bluetooth.
Bom, discos voadores iguais ao do Ed Wood começaram a aparecer, e claro que decidi me esconder. Sem me prender à arquitetura da casa em que eu estava, e ao fato de que existiam dois carros no quintal que precisei manobrar para entrar, na hora que voltei a cidade, que tinha casas, prédios, virou uma pilha de tupperwares!
Pensei: então os aliens voltaram para buscar seus tupperwares.
* o cemitério de judeus é um semitério?
O mesmo vale para os tupperwares, na minha opinião eles vem das casas das mães, lotados de comida, e depois viram pratos de gato, até que um dia as colocamos sobre um fogão quente ou coisa parecida, e elas são postas para dormir.
Este foi um sonho engraçado. Eu estava dormindo numa casa (parecia da Nicéia) e de repente uma ponteira laser vermelha apareceu, me enchendo o saco. Depois verde. Olhei pela janela para tentar localizar quem estava fazendo isso, e nada. depois de um tempo começou novamente. Olhei para a janela e não achei. Aliás a cidade era bem bidimensional, parecia um desenho de perfil, com cores bem azuis e "estouradas". De repente, luzes laser verdes apareceram, pensei que eram aqueles spots que ligam quando tem algum evento. Desconfiei que tinha alguma coisa muito estranha quando um laser arredondado começou a sair das nuvens. Parecia o ícone do bluetooth.
Bom, discos voadores iguais ao do Ed Wood começaram a aparecer, e claro que decidi me esconder. Sem me prender à arquitetura da casa em que eu estava, e ao fato de que existiam dois carros no quintal que precisei manobrar para entrar, na hora que voltei a cidade, que tinha casas, prédios, virou uma pilha de tupperwares!
Pensei: então os aliens voltaram para buscar seus tupperwares.
* o cemitério de judeus é um semitério?
Tuesday, May 24, 2011
Excel e localização
As funções em excel são diferentes na versão em português e em inglês, isso todo mundo já sabia.
Nunca tinha parado pra pensar... que decisão de design complicada da parte da Microsoft! Isso talvez facilite a vida do usuário que não conhece inglês (coisa cada vez mais rara), e mostra uma disposição louvável da Microsoft em disponibilizar ferramentas cada vez mais localizadas.
Entretanto, quem sabe programar em uma língua, ao se deparar com o Excel em outra localização se perde. Quem diria que o bom e velho "TRIM" fosse "ARRUMAR"?
A coisa é pior do que eu pensava: Excel em português brasileiro é diferente do em português de portugal. "TRIM" lá é "COMPACTAR".
Trabalhar com as mensagens do sistema com múltiplas localizações já é difícil o bastante; com linguagens diferentes dependendo da localização é demais!
Não achei referências sobre funções em japonês ou outra lingua oriental...
http://eduardofarias.wordpress.com/2009/09/23/excel-ingls-portugus/
http://wwwhome.ewi.utwente.nl/~trieschn/excel/excel.html
Neste contexto, faz sentido a piada:
- Em que linguagem você programou?
- Em português.
Nunca tinha parado pra pensar... que decisão de design complicada da parte da Microsoft! Isso talvez facilite a vida do usuário que não conhece inglês (coisa cada vez mais rara), e mostra uma disposição louvável da Microsoft em disponibilizar ferramentas cada vez mais localizadas.
Entretanto, quem sabe programar em uma língua, ao se deparar com o Excel em outra localização se perde. Quem diria que o bom e velho "TRIM" fosse "ARRUMAR"?
A coisa é pior do que eu pensava: Excel em português brasileiro é diferente do em português de portugal. "TRIM" lá é "COMPACTAR".
Trabalhar com as mensagens do sistema com múltiplas localizações já é difícil o bastante; com linguagens diferentes dependendo da localização é demais!
Não achei referências sobre funções em japonês ou outra lingua oriental...
http://eduardofarias.wordpress.com/2009/09/23/excel-ingls-portugus/
http://wwwhome.ewi.utwente.nl/~trieschn/excel/excel.html
Neste contexto, faz sentido a piada:
- Em que linguagem você programou?
- Em português.