Mar19th

Finalmente os mockups do site !

Felipe 'chronos' Prenholato My Blog Read on

Eis que finalmente mostro-lhe minha ‘obra prima’, all by inkscape!
Seguem abaixo os desenhos iniciais a partir de onde farei meu o layout inteiro do meu blog :]


Canto topo-esquerdo do site, menu principal, caixa de login e busca.
estrutura base da home page


Canto topo-direito do site, atalhos rápidos e uteís, ai mostrando a interface de pesquisa nos arquivos.
interface para os arquivos do blog


Canto topo-direito do site, desta vez mostrando o logotipo e o calendário padrão.
logotipo


O desenvolvimento do layout poderá ser visto no blogbeta.

Comentários são muito bem vindos :)

Nov7th

Compilando esound 2.38-r1 se você está tendo problemas em compilar ele.

Felipe 'chronos' Prenholato Planet GentooBR, Gentoo Read on

Depois que fiz um emerge -NDu world quando voltei das férias ganhei de presente o seguinte erro do esound:



Esound Configure Settings:

Debugging support: no
libwrap support:   yes

LIBS=-lasound  -laudiofile -lm

make  all-recursive
make[1]: Entering directory `/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38'
Making all in docs
make[2]: Entering directory `/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs'
jw -f docbook -b html -o html ./esound.sgml
Using catalogs: /etc/sgml/sgml-docbook-3.1.cat
Using stylesheet: /usr/share/sgml/docbook/utils-0.6.14/docbook-utils.dsl#html
Working on: /tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:53:65:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Arrow Relations//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:54:8:E: reference to entity "ISOamsa" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:52:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:60:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Binary Operators//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:61:8:E: reference to entity "ISOamsb" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:59:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:67:60:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Delimiters//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:68:8:E: reference to entity "ISOamsc" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:66:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:74:67:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Negated Relations//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:75:8:E: reference to entity "ISOamsn" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:73:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:81:58:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Ordinary//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:82:8:E: reference to entity "ISOamso" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:80:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:88:59:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Math Symbols: Relations//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:89:8:E: reference to entity "ISOamsr" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:87:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:95:50:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Box and Line Drawing//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:96:7:E: reference to entity "ISObox" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:94:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:102:46:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Russian Cyrillic//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:103:8:E: reference to entity "ISOcyr1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:101:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:109:50:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Non-Russian Cyrillic//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:110:8:E: reference to entity "ISOcyr2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:108:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:116:47:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Diacritical Marks//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:117:7:E: reference to entity "ISOdia" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:115:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:123:43:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Greek Letters//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:124:8:E: reference to entity "ISOgrk1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:122:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:130:46:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Monotoniko Greek//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:131:8:E: reference to entity "ISOgrk2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:129:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:137:43:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Greek Symbols//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:138:8:E: reference to entity "ISOgrk3" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:136:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:144:55:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Alternative Greek Symbols//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:145:8:E: reference to entity "ISOgrk4" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:143:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:151:43:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 1//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:152:8:E: reference to entity "ISOlat1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:150:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:158:43:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 2//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:159:8:E: reference to entity "ISOlat2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:157:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:165:57:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:166:7:E: reference to entity "ISOnum" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:164:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:172:40:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Publishing//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:173:7:E: reference to entity "ISOpub" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:171:0: entity was defined here
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:179:47:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES General Technical//EN"
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:180:8:E: reference to entity "ISOtech" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/sgml-dtd-3.1/dbcent.mod:178:0: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:7:W: cannot generate system identifier for general entity "quot"
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:7:E: general entity "quot" not defined and no default entity
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:11:E: reference to entity "quot" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:6: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:19:E: reference to entity "quot" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:49:6: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:14:W: cannot generate system identifier for general entity "gt"
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:14:E: general entity "gt" not defined and no default entity
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:16:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:142:16:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:150:16:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:174:18:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:251:12:W: cannot generate system identifier for general entity "tilde"
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:251:12:E: general entity "tilde" not defined and no default entity
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:251:17:E: reference to entity "tilde" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:251:11: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:335:22:E: reference to entity "tilde" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:251:11: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:479:19:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:527:51:E: reference to entity "gt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:134:13: entity was defined here
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:529:46:W: cannot generate system identifier for general entity "percnt"
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:529:46:E: general entity "percnt" not defined and no default entity
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:529:52:E: reference to entity "percnt" for which no system identifier could be generated
jade:/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs/./esound.sgml:529:45: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1bg.dsl:2:69:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Russian Cyrillic//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1bg.dsl:3:5:E: reference to entity "cyr1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1bg.dsl:2:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1no.dsl:2:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 1//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1no.dsl:3:5:E: reference to entity "lat1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1no.dsl:2:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:2:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 1//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:3:5:E: reference to entity "lat1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:2:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:4:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 2//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:5:5:E: reference to entity "lat2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ro.dsl:4:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ru.dsl:2:69:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Russian Cyrillic//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ru.dsl:3:5:E: reference to entity "cyr1" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1ru.dsl:2:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sl.dsl:2:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 2//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sl.dsl:3:5:E: reference to entity "lat2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sl.dsl:2:0: entity was defined here
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sr.dsl:2:66:W: cannot generate system identifier for public text "ISO 8879:1986//ENTITIES Added Latin 2//EN"
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sr.dsl:3:5:E: reference to entity "lat2" for which no system identifier could be generated
jade:/usr/share/sgml/docbook/dsssl-stylesheets-1.79/html/../common/../common/dbl1sr.dsl:2:0: entity was defined here
make[2]: *** [html/index.html] Error 8
make[2]: Leaving directory `/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/docs'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38'
make: *** [all] Error 2
 *
 * ERROR: media-sound/esound-0.2.38-r1 failed.
 * Call stack:
 *                 ebuild.sh, line 1695:  Called dyn_compile
 *                 ebuild.sh, line 1033:  Called qa_call 'src_compile'
 *                 ebuild.sh, line   44:  Called src_compile
 *   esound-0.2.38-r1.ebuild, line   55:  Called die
 * The specific snippet of code:
 *      emake || die "Make failed"
 *  The die message:
 *   Make failed
 *
 * If you need support, post the topmost build error, and the call stack if relevant.
 * A complete build log is located at '/var/log/portage/media-sound:esound-0.2.38-r1:20071107-125915.log'.
 *

No fórum francês do gentoo alguém falava sobre usar a flag -doc quando compilar ele, mas isto não resolveu a situação, então fui ao modo hackerzin, já que isto me causava problemas ao iniciar o gvim por exemplo, o qual uso o tempo todo.

Para fixar eu descompactei a ebuild:


ebuild /usr/portage/media-sound/esound/esound-0.2.38-r1.ebuild unpack

Removi as linhas

SUBDIRS = docs

dos arquivos:

Makefile.am

Makefile.in

com o seguinte comando:



sed -i -e 's/SUBDIRS = docs//' /tmp/portage/media-sound/esound-0.2.38-r1/work/esound-0.2.38/Makefile*

E depois compilei com os seguintes comandos:



ebuild /usr/portage/media-sound/esound/esound-0.2.38-r1.ebuild config &&
ebuild /usr/portage/media-sound/esound/esound-0.2.38-r1.ebuild install &&
ebuild /usr/portage/media-sound/esound/esound-0.2.38-r1.ebuild merge

Isto compilou e instalou o esound, terminando com meus problemas qto ao gvim e alguns outros aplicativos.

Out16th

Otimizações para MySQL - parte 2

Handrus Nogueira MySQL Read on

Otimizando consultas

Esse é o mais batido de todos… por isso mesmo estou tentando inovar, não vou dizer pra você indexar suas tabelas… se você ainda não faz isso leia este post sobre indices e esse sobre operações simples (se você não trata indices provavelmente vai precisar do segundo também… rsrs)

Conexões persistentes

Primeiro fato: Muitas regras de acesso, muitos usuários no mysql e muitos bancos (ou bancos com muitas tabelas), principalmente se houver usuários com permissões diferentes em tabelas de um mesmo DB vão afetar a performance!
Segundo o próprio manual disponibilizado no site da MySQLAB aconexão persistente realmente poupa tempo!

Estimando o tempo de execusão

Primeiro, para ter um parametro correto você deve estimar o tempo “padrão” do seu server:


mysql>; SELECT BENCHMARK(1000000,1+1);

+------------------------+

| BENCHMARK(1000000,1+1) |

+------------------------+

|                      0 |

+------------------------+

1 row in set (0.06 sec)

a função benchmark é extremamente útil, ela executa uma query n vezes.
Outro exemplo:


SELECT benchmark( 1000000, (SELECT count( artigo ) FROM dbfreemag ));

Dessa forma é possível estimar o tempo que sua aplicação gasta com o BD, e saber se não é aí que deve ser atacado o problema de lentidão.

VÁRIOS INSERTS e REPLACES

Prefira usar uma unica instrução com multiplos valores, traduzindo utilize


 INSERT in
table values(...),(...),(...)

ao invés de três inserts diferentes.Sempre prefira fazer várias operações importando-as de arquivos através do comando LOAD DATA INFILE, ele é cerca de 20 vezes mais rápido do que usar vários inserts.Você também pode ganhar MUITO tempo se durante o insert parar o uso dos indices dessa tabela (isso significa no mínimo uma pesquisa a menos para cada registro inserido, visto que o registro não será levado em conta) isso pode ser feito com


ALTER TABLE nome_tbl DISABLE KEYS

e log em seguida


ALTER TABLE nome_tbl ENABLE KEYS

.
O LOAD DATA INFILE é extremamente interessante, aprenda mais sobre ele.

Em tabelas transacionais (TST) você pode (e deve) usar begin … instruções …commit.Isso fará com que o mysql descarregue tudo de uma única vez.Caso você tenha de fazer inserts muito grandes prefira faze-los em horários de menor requisição para que o tempo de espera das outras requisições não seja muito alto.
Em tabelas não transacionais (NSTS) você pode usar o lock tables … unlock tables, isso terá o mesmo efeito do begin … commit
O lock trava a tabela, o que significa que outras requisições terão de esperar, o que aumenta o tempo de espera de outras requisições, mesmo assim, o ganho de tempo numa tabela travada gira em torno dos 40%!Claro que você deve usar isso com cuidado, afinal, dificilmente é aceitável parar milhares de requisições, por maior que seja a atualização de registros…

Exemplos:



LOCK TABLES a WRITE;

INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);

UNLOCK TABLES;

No caso do lock … unlock você pode fazer uso dele a cada mil registros para não aumentar muito o tempo de espera das outras transações.Em geral o uso das travas (lock) pode ser utilizado com ganho de performance para 5 instruções ou mais.

Caso você tenha clientes que não podem esperar que as inserções se concluam para realizar buscas, faça uso do INSERT DELAYED, isso irá alocar o insert em buffer e as inserções serão gerenciadas para irem descarregando conforme o uso da tabela for diminuindo.Não confunda o INSERT DELAYED com o INSERT LOW_PRIORITY no low_priority a execução será atrasada até que NINGUÉM esteja lendo a tabela… o que num sistema muito utilizado pode significar esperar para sempe, isso não acontece no INSERT DELAYED.
Note que INSERT DELAYED é mais lento que um INSERT normal se a tabela não estiver em uso. Também há uma sobrecarga adicional para o servidor tratar uma thread separada para cada tabela na qual você utiliza INSERT DELAYED. Isto significa que você só deve usar INSERT DELAYED quando você estiver certo de que necessita dele!
Outra coisa, INSERT DELAYED só funciona em tabelas ISAM e MyISAM, como tabelas MyISAM suportam SELECT e INSERT concorrentes, se não houver blocos livres no meio do arquivo de dados, você raramente precisará utilizar INSERT DELAYED com MyISAM.

DELETES / UPDATES

Ao deletar todos os dados de uma tabela use TRUNCATE TABLE (TRUNCATE TABLE nome_tabela).
No uso de UPDATES você também deve fazer uso das instruções dentro de blocos begin … commit.
Uma coisa importante a se considerar sobre os deletes é que eles vão “zoar” seus indices.Isso porque é necessário um tempo razoavelmente grande para atualizar todos os indices de uma tabela.Isso vai consumir tempo principalmente em tabelas do tipo MyISAM, onde a função de ler e gravar na tabela ao mesmo tempo pode ficar comprometida (isso é uma das vantagens do MyISAM, que vou abordar num próximo POST).Para evitar que isso aconteça é importante que depois de uma deleção muito grande ou de tempos em tempos para tabelas que são muito atualizadas se execute o OPTIMIZE TABLE.

É importante resaltar que OPTIMIZE TABLE só funcionam para MyISAM e InnoDB.Basicamente ao rodar o OPTIMIZE você vai estar alocando o espaço de forma que não fiquem espaços inutilizados entre os blocos de dados, reordenando os indices e reparando a tabela (no caso do MyISAM) caso hajam registros deletados (Isso não quer dizer recuperação dos dados, e sim da estrutura da tabela).

Outras Dicas

Você pode alterar a ordenação da tabela para a ordem que você mais utiliza. Ex.: ALTER TABLE … ORDER BY expr1,expr2… se você na maioria das vezes recupera registros na ordem expr1,expr2…

Se você usa vários campos em uma ou mais tabelas para calcular alguma variável do seu sistema é interessante adicionar uma tabela (ou um campo) para fazer isso.Um simples


UPDATE table set count=count+1

é extremamente mais rápido do que um


SELECT count(*) from Artigos where Artigos.category = X 

Isso porque você vai evitar muitos processos de gerenciamento de tabela ;)

O uso de valores padrão acelera o uso.Sempre que possível defina o padrão na criação da tabela e só altere o valor daquele campo na inserção quando for extritamente necessário,isso vai te fazer ganhar algum tempo.

Normalmente a normalização das tabelas até sua 3ª forma normal é o ideal, mas só geralmente.Não tenha medo de duplicar dados para ganhar tempo!

Para consultas importantes use SELECT HIGH_PRIORITY … Isso fará com que a consulta “fure” a fila.
Do mesmo modo, sempre que possível utilize INSERT DELAYED … Isso fará com que várias inserções fiquem em cache e sejam adescarregadas ao mesmo tempo.Economizando MUITO tempo.(Só faça isso quando não precisar verificar imediatamente se o dado foi inserido ou não).

Na maioria dos servidores é mais rápido trabalhar com arquivos de imagem e apenas fazer referencia deles no banco de dados do que jogar as imagens para dentro do BD

Use nomes de colunas com até 18 caracteres, além de poupar tempo de processamento vai garantir que você possa portar facilmente seu banco de dados para qualquer servidor/qualquer BD.Se você tem colunas identicas em tabelas diferentes, declare-as com mesmo nome e mesmo tipo.

Saiba que um a clausula IN (valores) é extremamente otimizada no mysql.Se você já tem os valores para a clausula IN, não perca tempo fazendo subselects ou Joins!

Join É mais rápido que subselect, aprenda a usar JOIN!!

Se for necessário use tabelas HEAP, elas usam indices HASH e ficam apenas na memória, o que as torna MUITO rápidas, no entanto só permite uso de colunas de tamanho fixo!(Aprenda mais sobre HEAP)

Obs.Não use HEAP para dados vitais!!

Por fim, gere tabelas compactadas das tabelas que você não utiliza mais… Ou transfira aquelas tabelas que acumulam muitos dados e não requisitarão dados antigos para uma tabela compactada.Você pode compactar tabelas através do MYISAMPACK

Por enquanto isso é tudo pessoal.
Nas próximas tentarei falar de otimizações específicas para cada tipo de tabela e de otimizações que podem ser feitas diretamente no server, com opções de inicialização, configuração e compilação do MySQL!
Até lá!

Set23rd

Otimizações para MySQL - parte 1

Handrus Nogueira MySQL Read on

Normalmente esse assunto já está batido em listas de discussão especializadas, mas eu encontrei certa dificuldade em encontrar tudo que eu vou colocar aqui em um único lugar e de forma simples.

Nessa parte 1 vou tratar de tipos de tabela.

Tipos de tabela - Segurança x Velocidade:

No MySQL Versão 3.23.6, você pode escolher entre 3 formatos de tabelas básicos (ISAM, HEAP e MyISAM). Versões mais novas do MySQL suportam tipos de tabelas adicionais (InnoDB ou BDB), dependendo de como o BD foi compilado. Básicamente você pode dividir esses tipos em duas categorias: Tabelas de transção segura(TST) e Tabelas de transação “não segura”(NTST).

Vantagens de tabelas de transção segura(TST):

  • Mais segura. Mesmo se o MySQL falhar ou se você tiver problemas com hardware, você é capaz de recupera-los através de recuperação automática ou de um backup + o log de transação.
  • Você pode combinar muitas instruções e aceitar todas de uma vez com o comando COMMIT.
  • Você pode executar um ROLLBACK para ignorar suas mudanças (se você não estiver rodando em modo auto-commit).
  • Se uma atualização falhar, todas as suas mudanças serão restauradas. (Com tabelas NTST todas as mudanças que tiverem sido feitas são permanentes).
  • Pode fornecer melhor concorrência se a tabela tiver muitas atualizações concorrentes com leituras.

Vantagens de tabelas de transação “não segura”(NTST):

  • Muito mais rápida e não há nenhuma sobrecarga de transação.
  • Usará menos spaço em disco já que não há nenhuma sobrecarga de transação.
  • Usará menos memória para as atualizações.

Vale lembrar que num mesmo banco você pode utilizar tabelas de transação segura e de transação não segura para obter melhor performance e que caso você tente criar uma tabela com tipo não válido a tabela será criada automaticamente como o tipo myISAM.

Dadas essas explicações vagas e rotineiras, vamos por a mão na massa e entender melhor a diferença entre esses tipos de tabelas:

PRIMARY KEY / UNIQUE

Normalmente quando você tenta executar uma transação que viola uma chave primária você obtém um erro certo? ERRADO! Isso depende. Se a transação ocorrer em uma (ou mais) tabela(s) de transação não segura (ISAM, HEAP e MyISAM) isso está correto. Caso contrário o mysql fará o rollback da sua transação (sim, de TODA a transação!), no caso das transações não seguras o mysql irá para o registro errado e deixará os demais rodando, o que pode vir a causar várias inconsistências no seu sistema.

No caso de tabelas de transação segura você terá que utilizar o show warnings | errors, ou mysql_info() para versões mais antigas, para conseguir debugar suas querys.
No caso de transações não seguras você pode usar a diretiva IGNORE para não receber mensagens de erro (INSERT IGNORE …), isso fará com que o mysql ignore a transação que causa o erro e pule para as próximas. Por isso é uma diretiva que inspira cuidado para ser utilizada!

NOT NULL

Em tabelas NTST todos os campos no MySQL têm valores padrão. Se você tentar armazenar NULL em uma coluna que não aceita valores NULL, o MySQL Server armazenará 0 ou ” (strig vazia) nela(comportamento que pode ser alterado com a opção de compilação -DDONT_USE_DEFAULT_FIELDS). Isso faria com que as instruções INSERT gerassem um erro a menos que você colocasse valores específicos para TODAS as colunas que exigem um valor diferente de NULL.

Se você inserir um valor ‘errado’ em uma coluna como um NULL em uma coluna NOT NULL ou um valor numérico muito grande em um campo INT, o MySQL irá atribuir a coluna o ‘melhor valor possível’ em vez de dar uma mensagem de erro. Para strings este valor é uma string vazia ou a maior string possível que possa estar na coluna. Isso porque “não podemos verificar estas condições antes da consulta começar a executar. Se encontrarmos um problema depois de atualizar algumas linahs, não podemos fazer um rollback já que o tipo de tabela não suporta isto. A opção de parar não é tão boa como no caso em que a atualização esteja feita pela metade que é provavelmente o pior cenário possível. Neste caso é melhor ‘fazer o possível’ e então continuar como se nada tivesse acontecido.” (retirado do MYSQL MANUAL).
Isso tudo só mostra que devemos fazer TODAS as validações no software ANTES de executar a query :D.

ENUM e SET

Se você inserir um valor errado em um campo ENUM, ele será configurado com uma string vazia em um contexto string.
(ENTENDA ENUM)
Se você inserir uma opção errada em um campo SET, o valor errado será ignorado.
(ENTENDA SET)

Por enquanto é tudo pessoal, pretendo em um post futuro tratar a fundo as peculiaridades de cada um dos tipos de tabela. Por enquanto vale essa separeção simplista de transação não segura e transação segura. Caso você esteja preparando um banco de dados para uma aplicação e queira informações mais detalhadas, vale lembrar que o ALTER TABLE consegue alterar o tipo da tabela sem nenhum grande problema, só gerará complicações caso você deseje mudar a tabela de um tipo TST para um NTST, afinal essa segurança extra também vai exigir um bocado de mudança nas validções do seu software!

Abraço e até a próxima!

Set13th

CHRONOSBOX.ORG finalmente na ativa + BLOG :]

Felipe 'chronos' Prenholato In Blog Read on

E ai pessoal, finalmente, depois de vários problemas de falta de leitura de contrato rs*, consegui acertar meu domínio para ficar certinho. Antes usava o http://chronosbox.hmbr.org, e agora estou com o meu próprio, http://chronosbox.org.

Este post fica só para avisar vocês :), meus próximos passos com o blog são:

  • 1. Dar uma cara mais personalizada ao Blog, contarei inicialmente com a ajuda de amigos e minha criatividade (3 de 0 a 10) e paciência (8 de 0 a 10) para trabalhar com imagens e desenhar o site :].
    Qualquer dica/ajuda é hyper bem vinda e o nome dos contribuintes para a cara final aparecerá na página ‘About’, que ainda será construída :).
    Durante este tempo tentarei registrar os feitos e criar uma página sobre a construção do Blog em si além de ir postando coisas interessantes sobre Wordpress e web em geral que aprender/descobrir.
  • 2. Não menos importante, continuarei a produzir artigos inicialmente semanalmente e com o tempo pretendo aumentar a periodicidade, também conto com a ajuda de um outro Blogger, Handrus, grande amigo a quem dou espaço e postará conforme ter assuntos e tempo :).
  • 3. Com algum bom conteúdo e já uma cara própria para o Blog, irei atráz de acertar o layout para o lado de acessibilidade e standarts, e também todos os posts do Blog. Em seguida vem o acerto quanto a inclusão dos feeds em mecanismos como o feed burner e outras estátisticas :].
  • 4. Após isso esperem artigos de qualidade, por isso com um intervalo até grande, mas com qualidade :], também pretendo convidar novos posters, que me parecerem dignos de postarem (isso inclui ser mui amigo hehe).

Inté senhores e senhoras!

Set8th

Indentando seus arquivos automaticamente e em massa com o VIM.

Felipe 'chronos' Prenholato Planet GentooBR, Editores, vim/gvim, Dicas, Linux Read on

Heya pessoal.

Depois de longo tempo sem postar, mas sempre coletando idéias (vem por ai um how-to de como usar controle de playstation adaptado a porta serial para jogar no linux).

A dica de hoje abrange uma área delicada, indentação de código. Por todo o mundo existem códigos mal indentados (exceto em python :]), e no meu trabalho, este é um caso extremamente comum com as ferramentas que dou manutenção, e literalmente é um pé no saco. No dia 06 de Setembro deste mês, de tão saco cheio que estava dos códigos mal indentados e sempre usando uma mapping (1) do VIM para indentar uma página, com o problema sério que quando ia dar um svn diff ou coisa do genêro quase toda a página vinha no diff, senão toda ela, resolvi verificar se o VIM não tinha um “BATCH mode”, assim com o top, para usar em um loop para passar nos arquivos.

Pois bem, depois de uma meia hora batendo papo no #vim da irc.freenode.net, o pessoal me fala de uma opção ‘-c’ do VIM, que eu jurava não ter visto no manual do VIM. É dai que surge a dica de hoje :).

Para indentar os arquivos, podes usar os seguintes comandos (segue abaixo a explicação dos comandos para ninguém ficar boiando):



1. cd diretorio/com/arquivos/a/serem/indentados
2. find -type f | egrep ".html$|.php$|.inc$|.tpl$" > lista_arquivos
3. for arquivo in $( < lista_arquivos );
4. do
5.     echo "$(date +'%d/%m/%Y %H:%M:%S') - iniciando indentação  de '$arquivo'" >> log_indentacao
6.     vim -c ":normal gg=G" -c :w! -c :q! -- $arquivo &&
7.         echo "$(date +'%d/%m/%Y %H:%M:%S') - finalizando indentação  de '$arquivo'" >> log_indentacao ||
8.         echo "$(date +'%d/%m/%Y %H:%M:%S') - falhou indentação  de '$arquivo'" >> log_indentacao
9. done

Explicando as linhas:

  • Linha 2: Procurando por arquivos a serem indentados, este comando
    pega todos os arquivos .html, .php, .inc e .tpl do diretório e
    subdiretórios. Se houver problemas com espaços, você pode usar da
    seguinte forma:

    
    find -type f -name '*.php' -or -name '*.html' -or -name '*.inc' -or -name '*.tpl' -exec vim -c ':normal gg=G' -c :w! -c :q! -- "{}" ;
    

    Com isto, ele irá fazer a mesma coisa que o for faz.

  • Linhas 3 e 4: Inicia o for. $(<lista_arquivos) faz o bash fazer um ‘eval’ do arquivo lista_arquivos, mandando seu conteúdo como paramêtros para o for.
  • Linhas 5, 7 e 8: Logando para melhor acompanhamento.
  • Linha 6: O comando propriamente dito, a opção -c envia comandos ao VIM. Uma explicação melhor sobre o comando de indentação pode ser achada digitando ‘:help =’ no próprio VIM, existem dezenas de configurações que podem ser setadas e existem também dezenas de arquivos de identação prontos, da uma olhadinha em /usr/share/vim/vim71/indent :].
  • Linha 9: Finaliza o for.

Com esta dica, se salve dos arquivos não indentados! Os comandos passados ao vim também pode ser para tirar quebras de linha DOS, outra dor de cabeça absurda que costumo ter, e qualquer outra coisa do VIM.

(1) Sobre o mapping do vim, para indentar seus arquivos abertos, podes usar os seguintes comandos no seu .vimrc:

" map <F8> to reindent file
noremap <F8> mzd19m04gg=G`z
inoremap <F8> <ESC>mzgg=G`z<Insert>

Apertar a tecla = com um bloco de texto selecionado também faz o mesmo trabalho :)

Realmente espero que aproveitem!

Abraços!

Jun29th

Matando sessões de outros usuários em servidores *nix, mas só como root.

Felipe 'chronos' Prenholato Linux Read on

Bem, certo dia da minha vida, tive que kickar um sysadmin do servidor dele, onde eu
estava instalando um portal pq ele realmente estava me atrapalhando, ficava reiniciando postgresql toda hora, o servidor também … enfim, ridículo :D.

Me bateu uma luz (por causa do mesmo sysadmin) hoje e fiz uma coisa legal, segue
abaixo um script para kickar todos os usuários que não seja o que vc passar ou
kickar o que vc passar, pegando principalmente por IP/Maquina deles.

Naturalmente você só poderá rodar o script como root, mas acredite, não é difícil conseguir.
A maioria dos servidores acaba dando uma permissão com sudo a algum arquivo usando vim, tipo, sudo vim /etc/apache/vhosts/seuvhost.conf, dentro do vim, execute :!su - e você terá um shell como root.



#!/bin/bash

# a ideia eh matar todos os bashs menos o seu, impossibilitando alguem
# de atrapalhar o servico.
#
# o script eh dedicado a um homem chamado Jomar.
#
# Este script eh licenciado sobre a GPLv2 e toda alteracao devera ser
# publicada e enviada se possivel ao criador.

# Autor:
# Felipe Prenholato
# chronos@gentoobr.org

QUEM=$1
EXPULSAR=$2

if [ "$EXPULSAR" == "S" ]
then
    GREP="grep"
elif [ "$EXPULSAR" == "N" ]
then
    GREP="grep -v"
else
    echo "Use: mata [IP|NOME_MAQUINA] [S|N]"
    echo "O segundo argumento define se o cara vai ser expulso ou se
 fica no micro."
    exit 1
fi

w | grep "^[a-z]" | ${GREP} "$QUEM" | tr -s 't' ' ' | cut -d' ' -f2
tmp/tmpmata

for e in $(cat /tmp/tmpmata);
do

    PROCESSOS=$(ps aux | grep bash | grep $e | tr -s 't' ' ' | cut
 	-d' ' -f 2)

    kill -9 $PROCESSOS

done


Use com cuidado e por sua conta. Isto pode causar demissão por justa
causa
ou te arranjar um grande problema.

Ele em um while true rodando impede que qq ser vivo que não seja do seu
IP/Maquina entre via ou terminal.

EU NÃO ME RESPONSABILIZO!

Jun25th

pingping - Verificando conexão com servidores.

Felipe 'chronos' Prenholato Planet GentooBR, Dicas, Servidores, Linux Read on

Ai em baixo meu script pingping. Ele vai alertar os emails quando algum servidor parar. Leia ele :).



#!/bin/sh
# Este script pinga servidores na lista da variavel SERVIDORES e envia
# emails para os emails da lista da variavel LISTA_EMAILS alertando caso
# eles caiam. O script só alerta se na última vez que ele testou o
# servidor estiver em pé ou se o servidor não foi testado ainda.
#
# Autor: Felipe Rafael Prenholato - chronos@gentoobr.org
# IRC: nick chronos in #gentoo-br or #sancalivre at irc.freenode.net
# Data: 21 de Junho de 2006.
#
# Este script está coberto sobre a licença GPLv2 e disponível via
# pedido por e-mail. Qualquer alteração por favor envie para o criador
# do script.

# Variavel SERVIDORES: lista de servidores separados por espaço.
# Se colocar nomes em vez de IPs certifique-se de que o servidor em que o script
# rodar resolva o ip.
SERVIDORES="elise prime odissey"

# Variavel LISTA_EMAILS: lista de emails separados por espaço
LISTA_EMAILS="chronos@gentoobr.org philipe_rp@yahoo.com.br"

# Formato da data a ser enviada no e-mail.
data=$(date +"%T de %d/%m/%Y")

# função que pinga o servidor e envia email.
ping_server() {

# variaveis locais usadas
local pingreturn
local serversts
local TMPFILE
local server

server=$1
TMPFILE="/tmp/ping_$server.tmp"

# Debug
#echo "Servidor: $server"
#echo "Arquivo temporario: $TMPFILE"

# pinga servidor e pega retorno.
ping -c3 $server &>/dev/null;
pingreturn=$?;

# Debug
#echo "Ping retornou $pingreturn para $server"

# Se pingreturn for 0 o servidor foi pingado.
if [ "$pingreturn" == "0" ]
then
echo "1" > $TMPFILE
fi

# Se pingreturn for 1 o servidor não foi pingado.
if [ "$pingreturn" == "1" ]
then

# Se $TMPFILE não existir cria ele.
if ! [ -e $TMPFILE ]
then
# Debug
#echo "$TMPFILE não existe, criando com valor 1."
echo "1" > $TMPFILE
fi

# pega status do servidor, 1 é pingado, 0 é não pingado.
serversts=$(cat $TMPFILE)

# Debug
#echo "Valor de $TMPFILE: $serversts"

# se ele estava de pé (valor 1) caiu agora, grava valor 0 em
# $TMPFILE e manda email.
if [ "$serversts" == "1" ]
then

echo "0" > $TMPFILE
msg="Servidor $server fora do ar em $data. Contatar responsavéis."
ass="Servidor $server fora do ar."
LC_ALL="en_US.ISO-8859-1" echo "$msg" | mail -s "$ass" $LISTA_EMAILS
fi

fi

}

# roda ping_server para cada servidor.
for e in $(echo $SERVIDORES);
do
ping_server $e;
done

Ele precisa ser instalado em um servidor que possa pingar os demais e enviar emails. Versões antigas do postfix não vão funcionar, tem q suportar a opção -a no comando mail, seu uso é:



./script

Coloque ele para rodar no cron e fique numa boa :)

Mai29th

Centro …

Felipe 'chronos' Prenholato Textos Read on

Começo meu blog com um texto de uma pessoa muito especial para mim, homenageando ela, que ainda vive, a cidade de São Carlos que me acolheu, a história em que todos participam, os fotográfos que registram esta história e as pessoas que veêm tudo, com o sentimento e carinho que a Juliana, autora do texto, passa.

“Centro

Para o projeto, levei apenas uma camêra e a vontade de aprender a fotografar.
E foi por trás da camêra, fechando um olho, que a cidade mudou.
Mas nada se passou. Diferente foi apenas meu jeito de olhar
Mesmo que ninguém diga nada a cidade conta a história, porque você não olha?

Olha a antiga estação …
Trem de passageiros, não tem mais.
Não tem mais multidão eufória indo e vindo na plataforma,
embarcando, desembarcando ou apenas para ver o trem …

Em seus relógios parados, o tempo não passa mais.
Para dizer a verdade, ele até anda para traz.
Porque ele virou museu, e agora só conta o que aconteceu.
Mas, lá fora, o tempo anda ligeiro;
O trem ainda passa e apita, mas, não tráz nem leva ninguém.

A cidade conta mais.
Diz ela, que no centro as fachadas de suas casas eram lindas.
Ela poderia mostrá-las se não estivessem cobertas por letreiros,
mas ela mostra orgulhosa algumas fachadas conservadas, prédios que só podem ser vistos por inteiro olhando para o céu.
As casas em ruínas logo darão lugar à uma nova construção, mas aqueles entulhos, serão mais que uma bela arquitetura demolida,
serão histórias deixadas para tráz,
vidas que por ali passaram,
fotografias que alguém tirou, alguma coisa que ficou.

Lembranças de quando se jogava futebol descalço na rua do Cine Avenida, do Bar do Jóia …
E agora, onde eram??
Que saída …
Agora só em fotografia.

Do alto de um prédio, vi a cidade com seus prédios, suas torres, suas casas novas, suas ruas que vão longe …
Vi quintais com varais cheios de roupas coloridas, diversos modos de viver, diversas vidas.
Casinhas humildes, casarões …
Detalhes que passam desapercebidos … entalhes e anjos esculpidos.
Parece até que tudo fica escondido!
E a gente só encontra quando precisa, e se não precisa, nem liga.

Quem precisa concertar um guarda-chuvas?
Procura então o seu luiz,
que com suas mãos enrugadas e seus olhos miudos,
surpreende na habilidade com o alicate,
em uma casa humilde cuja placa se vê da rua onde diz “Concerta-se guarda-chuva”.

E a cidade diz, que todos são uma história,
as pessoas se vão, os prédios caem …

Andando pela cidade, ouvindo histórias, alegro-me por ter estado lá.
E fico esperando que haja sempre alguém para perguntar,
que haja sempre alguém para lembrar,
que haja sempre alguém para contar,
que haja sempre alguém para escutar …
E que haja ao menos uma foto para se mostrar.”

O texto é de autoria de Juliana Dino dos Anjos para o projeto História dos Bairros. Todos os direitos reservados.

Agora, reflitam sobre a sua cidade, os belos locais, as simples pessoas …

Calendar

  • Agosto 2008
    D S T Q Q S S
    « Mar    
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31  

Recently

Recent Comments

Categories

Monthly Archives


Related Entries

This block requires the Related Entries Plugin.

Monthly Archives

About

Recently

Recent Comments

Categories

Pages