Monday, January 29, 2024

Galope no Caleidoscópio

 Este post foi... uma mensagem no Whatsapp.

Gostei, e resolvi preservar aqui...  Então vamos: Galope no Caleidoscópio

-----------------------------------------------------------------------------------------------------------------------

Vindo aqui partilhar uma experiência nova - pra partilhar, mesmo, e também pra mim, pra não esquecer o momento:  hoje, pela primeira vez, na flor dos meus sessenta e oito anos, vivi a experiência de estar montado em um cavalo a galope!

"Estar montado" é a expressão, porque meu cavalo estava ligado ao do meu instrutor por uma corda - pra ele poder assumir o controle em caso de necessidade.  O que foi uma excelente ideia da parte dele.

Porque o MEU controle - não digo nem do cavalo, mas de mim mesmo - era praticamente nulo!

"Vamos lá", diz o instrutor, "Vamos", digo eu e...

E começou o galope e começou a minha experiência de estar imerso na quarta - ou quinta, ou sexta! - dimensão do mundo caleidoscópico!

Não dá pra explicar, só sentir.  Mas vou tentar: o mundo, visualmente, se tornou um turbilhão de fragmentos de cor em constante movimento.  Fragmentos desencontrados e um tanto distorcidos.  Um caleidoscópio.  Era como estar dentro de uma tela de Picasso. E esse turbilhão visual vinha acompanhado de uma tempestade de sons vindo dos cascos dos cavalos, da respiração deles, da minha respiração...  E junto com estas visões e sons, a avalanche de impressões físicas produzidas por estar montado em um animal a galope, tentando - não num nível de qualquer pensamento, porque nem seria possível, e sim de uma forma totalmente corporal - harmonizar meus movimentos com os dele...  Ainda não entendi bem como funciona essa coisa de "montar a cavalo" - aliás já tive a percepção de  que não se trata de "entender", mas de "aprender com o corpo" - mas acho que já estou dando os primeiros passos nesse aprendizado de comandar um animal muito mais forte... Um comando que não vem da força física mas de um misto de união harmônica com o animal e domínio pela força da vontade...

Bom, já estou falando demais.  O que eu queria contar era isso: minha excursão pelo mundo caleidoscópico da quarta dimensão! :-) 


Fiz a maior façanha do mundo, sou o melhor aluno de equitação que jamais existiu?  Com certeza não!

Estou sentindo a satisfação de ter vencido algumas limitações? Com certeza que estou!

Basicamente, satisfação de não ter cedido ao medo!

Tive medo? Pode apostar que sim!

Mas não galopamos uma vez, galopamos várias vezes!

E a cada vez que o instrutor dizia "Vamos?", eu consegui resistir à tentação de responder "Por hoje está bom, não quero mais", e em vez disso concordar que "Vamos"!  Que bom que eu consegui isso!

E- mais um triunfo sobre o pavor! - eu não me agarrei na sela!  O instrutor disse que eu poderia, se quisesse - mas em nenhum momento eu me agarrei na sela!


Tchau beijos obrigado por me escutar!

----------------------------------------------------------------------------------------------------------------


Friday, January 05, 2024

"O Despertar de Tudo" - ou, "Hay que agitar, hay que agitar"!

 "O Despertar de Tudo"  é o título do livro que estou lendo, um livro que contesta as visões tradicionais sobre a evolução da Humanidade.  E "Hay que agitar, hay que agitar", era uma das falas prediletas de Don Pepe, o anarquista espanhol retratado por Érico Veríssimo em "O Tempo e o Vento".

Este post começou sendo uma conversa no Whatsapp sobre as minhas leituras.  E acabou passando de "Sapiens", de Yuval Harari, e "O Despertar de Tudo", de David Graeber e David Wengrow, para Jessé de Souza e Darcy Ribeiro.

Um pouco por preguiça, um pouco por achar que mais não é necessário, vamos então à transcrição da conversa no Whatsapp:

-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x


Esse eu já terminei.  É uma síntese das teses dominantes na História - e Pré-História; inclui, claro, interpretações do autor sobre estas teses, e conclui com um quase exercício de futurologia.  Boa leitura; bem escrito, bem pensado; para quem conhece História, traz considerações bem interessantes, para quem não é versado em História, pode constituir até mesmo um divisor de águas!




Esse eu comecei a ler agora!  É a antítese do "Sapiens"!  Enquanto "Sapiens" resume as interpretações dominantes da História, este "Despertar de Tudo" as coloca abaixo, sem deixar pedra sobre pedra!  Com certeza eu tenho em mente que é preciso ler "com um grão de sal", mas o pouco que já li me deliciou!  É muito bom ler autores que declaram que tanto as teses de Rousseau quanto as de Hobbes sobre o "estado natural" do ser humano não tem o menor fundamento empírico - coisa que eu tentava dizer em aula aos colegas e professores, e ninguém dava bola!


JESSÉ DE SOUZA

Ao ler a contestação de Hobbes e Rousseau, sinto o mesmo prazer que senti em ler a  entrevista de Jessé de Souza em que ele diz o que transcrevo abaixo:

"Entrevistadora: Como o sr. avalia o legado de Sergio Buarque de Holanda, nesse aniversário de 80 anos de "Raízes do Brasil"?"

"Jessé de Souza: Sérgio Buarque construiu a interpretação do Brasil mais influente até hoje. Em grande medida, ela advém de Gilberto Freyre (1900-87), como a noção de identidade nacional baseada nos afetos e nos sentimentos supostamente trazida de Portugal. Cientificamente, a validade dessa interpretação é, no entanto, nula. E sua celebração até hoje mostra apenas a miséria de nosso debate acadêmico e, por consequência, de nosso debate público."

Entrevista completa em https://www.ihu.unisinos.br/78-noticias/558679-celebracao-de-obra-mostra-miseria-de-nosso-debate-diz-jesse-souza .


DARCY RIBEIRO

É o mesmo prazer que tive ao me ser mostrado um vídeo com um pequeno trecho de uma entrevista de Darcy Ribeiro.  Gostei tanto que não sosseguei até encontrar o ensaio onde ele registrou a declaração que me encantou:

"Minha reclamação que mais zanga provocou em você era de fato uma aspiração meio desastrada, de padrinho enxerido que quer ajudar à força seus afilhados a brilharem.

Disse que não quero vê-los feito “cavalos de santo” de candomblé, por cujas bocas não falam nossos exus e xangós, mas Lévi Strauss, Victor W. Turner, P. Berger, ou até meus amigos Peter Worsley e Eric Hobsbawm que têm, aliás, horror disso.

Você não concorda que um dos piores riscos que ocorrem às nossas ciências sociais esteja na propensão a desvincular jovens de talento da temática brasileira, para os atrelar aos interesses momentâneos de mestres estrangeiros? Tenho visto tanto destes basbaques, convertidos em papagaios que repetem pela vida inteira um saber que, na matriz, já se tornou obsoleto, que não me consolo de ver novos basbaques surgindo. 

Por esse caminho, cada nova geração voltando-se para fora se constitui como um porta-voz ou um vodu do que se diz e do que se faz nos centros estrangeiros, deslumbrada com o último gênio metropolitano. Prosseguindo nessa linha jamais se constituirá no Brasil um saber nosso, edificado geração após geração pela transmissão e herança de um patrimônio cultural próprio através de permanente revisão, cientificamente fundada, de suas interpretações da realidade brasileira. Em lugar disso teremos tão só este pobre cúmulo de tesezinhas que são meras exemplificações episódicas e bizarras, com base em casos locais, das teorias em moda lá fora."

-Trecho de carta aberta a Roberto da Matta, publicada sob o título "Por uma Antropologia Melhor e Mais Nossa".

-Este ensaio e vários outros podem ser encontrados no site da Fundação Darcy Ribeiro, em https://fundar.org.br/wp-content/uploads/2021/06/ensaios-insolitos.pdf .

-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x


Não é uma delícia ouvir essas coisas ditas alto e bom som?!

"O quadro geral predominante da História, adotado pelos seguidores tanto de Hobbes quanto de Rousseau, não tem quase nenhuma relação com os fatos" ("O Despertar de Tudo", pag. 19; ver também pags. 26 e 27).
"Validade científica nula! Miséria do debate acadêmico!"  Dá-lhe, Jessé!
"Basbaques convertidos em papagaios! Cavalos de santo de Lévi-Strauss!"  Senta a pua, Darcy!

Hay que agitar!  Hay que agitar!


Friday, April 28, 2023

Comentários sobre a tese de doutorado em Sociologia “A construção de uma vida digna e a batalha por legitimidade moral” por Nínive Fonseca Machado (UFRGS, IFCH, 2022/2)

 Esse trabalho foi... uma viagem!  Nos foi dado um capítulo da tese para ler e comentar, na disciplina de Antropologia da Moral e da Ética.  Li o capítulo, despertou-me grande interesse, busquei e encontrei a tese completa na Internet, e já nas primeiras páginas me emocionei bastante - a tese trata dos beneficiários do Bolsa Família; só lendo as citações e os agradecimentos nas primeiras páginas eu já estava grandemente tocado... O que não deixa de fazer sentido, porque a Ivana, minha mulher, que é Assistente Social, trabalha com esse público, e trabalha de uma forma que eu acho muito linda.  E minha irmã, minha falecida irmã, "a exilada política", de certa forma também trabalhou com esse público, e foi "recompensada" com cadeia e exílio - o que também me afetou bastante, a mim que era um adolescente que amava e admirava muitíssimo a irmã...

Então, o que escrevi talvez não tenha uma conexão direta, evidente, com a tese.  Diz mais sobre mim, sobre o que o texto despertou em mim.  Mas dizer isto, dizer como algo nos afetou, não será contribuir com o que temos de mais essencial e valioso?

Coloco abaixo um trecho, quem quiser ler mais é só seguir o link para o PDF completo:
Ah, o link para a tese completa, para quem quiser ler, está incluído no texto!

Trecho:
O Artigo
Antes mesmo de dizer algo sobre o “Resumo” da tese, quero transcrever o primeiro
“Agradecimento”, que me tocou profundamente:
Às mulheres e ao único homem que generosamente gastaram seu tempo comigo e
me deixaram entrar em suas casas e aprender um pouco sobre suas vidas. Suas
histórias refletem a trágica tradição brasileira de invisibilizar a pobreza, mas
também a incomensurável força que vocês têm ao lutarem cotidianamente pelo
reconhecimento de suas vidas. Sem vocês, esse trabalho não existiria.
... ... ...
... ... ...
Citações iniciais
Pode parecer estranho iniciar os comentários sobre um texto com as citações que o autor
escolheu colocar ao início do trabalho. Mas, aqui estão elas:
“Então, acho que o que está faltando no ser humano é cada um saber o seu lugar.”
Margareth Carbinato, presidente do Sindicato dos Empregadores Domésticos do Estado
de São Paulo

“Mas se aparecer uma faxina eu faço. Um serviço que não fosse pra me explorar eu
queria”
Beneficiária do Bolsa Família E. S. 59 anos

“O Brasil é uma história de sucesso colonial”
Grada Killomba

Comentários sobre o artigo “Onde no mundo estão os valores? Exemplaridade, Moralidade e Processo Social” de Joel Robbins (UFRGS, IFCH, 2022/2)

 Este trabalho foi escrito para a disciplina de Antropologia da Moral e da Ética.  Foi escrito "por obrigação", mas como discordei (petulante, eu, não é?) de muitas dos postulados do autor, achei que isso tornava o texto interessante, principalmente onde falo de "Caos e propriedades emergentes" no contexto da Sociologia...

Coloco abaixo um trecho do texto, quem quiser ler tudo basta seguir o link:

Trecho:
O comportamento de sistemas – ou seja, em uma concepção ampla, conjuntos de elementos
que interagem – pode convergir para um equilíbrio (estado permanente), para uma oscilação
estável (comportamento periódico) ou para uma “mudança caótica”2. Entretanto, o caos não
está além do alcance do estudo científico. Mesmo sistemas caóticos apresentam padrões,
chamados “atratores”. Partilho abaixo a imagem – que acho belíssima! – do “Atrator de
Lorenz, tema icônico na Teoria do Caos, representando a dependência dos fatores iniciais
(“efeito borboleta”) na dinâmica dos fluidos:
...
Podemos ver que há um padrão, mas o mesmo nunca se repete exatamente.
O que estou querendo comunicar – de forma muito abreviada e sucinta, já que mais não é
possível no escopo deste trabalho - é que não precisamos pensar em cultura como algo
homogêneo ou estático ou mesmo cujas mudanças obedeçam a leis em um modelo
“newtoniano”, determinísticas. É possível, sem abrir mão do conceito e sem abrir mão da
ciência, analisar “os aspectos caóticos do mundo”!

Foucault, a pessoa - Trabalho de Antropologia da Moral e da Ética (UFRGS, IFCH, 2022/2)

Este trabalho foi escrito para a disciplina de Antropologia da Moral e da Ética.
Achei que, se não ficou a oitava maravilha do mundo, não deixou de ficar interessante, e por isso... aqui está!

Aqui vai um trecho, como "amostra"; se gostar e quiser ver o arquivo completo, siga o link para o .PDF:
Foucault, a pessoa

Trecho:
Ora, seria o fato de estas ideias terem sido escritas por um autor, ele próprio,
homossexual, irrelevante?! Seria por irrelevância que a enciclopédia Britannica cita a
homossexualidade de Foucault en passant, e a enciclopédia Stanford a omite por
completo?! Às vezes, o que não é dito informa tanto, ou mais, do que o que é dito...
Estas omissões dão uma noção das forças que Foucault certamente teve de enfrentar
para viver abertamente sua sexualidade; seu renome como intelectual, a repercussão e o
impacto das suas ideias, em sua época e nos dias de hoje, dão uma dimensão dos
poderes de seu intelecto e de sua personalidade.
Intelecto e personalidade, entretanto, indubitavelmente (segundo as próprias
ideias de Foucault), inextricavelmente ligados com as condições de seu nascimento -
sua nacionalidade, sua classe social – e sua sexualidade. Parafraseando a professore Vi
Grunvald, creio que, para estudar o pensamento e o trabalho de Foucault, é
importantíssimo levar em conta que “Foucault era francês, nascido em uma França
colonialista e que, durante a juventude de Foucault (falo de 1945 a 1955,
aproximadamente) enfrentou movimentos de libertação na Algéria, no Vietnam, nos
Camarões... Foucault era além disto um burguês, nascido em uma família privilegiada,
com elevado status tanto social quanto financeiro. E Foucault era abertamente
homossexual, em uma sociedade em que isto era reprovado como ‘imoralidade’ e
‘doença’”.


Sunday, February 27, 2022

Canoas e Motocicletas

 Este post não nasceu como um post, foi um e-mail para meu professor de "Leituras e Escritos Etnográficos".

Achei que bem podia vir parar aqui.

Hope you enjoy!

-x-x-x-x-x-x-x-x

Sôr,


Me vieram na cabeça umas viagens, e eu resolvi partilhar com o senhor.

Não sei o que vai achar, e nem tenho certeza se vai ter tempo pra ler.

Mas se não partilhar com o senhor, nunca vou saber, não é?


Então,

Sobre as canoas dos trobriandeses, e sobre a mágica envolvida em torná-las velozes e seguras...

e sobre a descrição que Malinowski faz da sensação de navegar nelas, com frases como

"ser levado mar adentro por uma espécie de jangada suspensa que desliza acima das ondas de maneira quase mágica"...

Lindo, não é mesmo?

Mas o que me chamou mais atenção foi a frase

"Na água, ela desliza ... ora ocultando-se entre as cristas, ora flutuando sobre elas".


O senhor já navegou em um barco pequeno, em mar aberto?

Eu já tive essa experiência...

No mar aberto, as ondas não são as ondas pequenas, que se quebram logo, que vemos na praia.

São como colinas.  O espaço entre o tôpo de uma onda e outra é dez metros, vinte metros...

E a altura das ondas pode ser três metros, quatro metros...

São colinas.  Coxilhas.  Navega-se num "pampa marítimo"...


E, quando nossa pequena embarcação está num "vale" entre duas ondas,

o tôpo das ondas é mais alto, muito mais alto, do que nossas cabeças,

e tudo que se vê é água...

Estamos rodeados de paredes de água.

O mundo se reduz a água

e céu!


É uma sensação de estar à mercê dos elementos,

de ser pequeno,

de estar suspenso entre a vida e a morte,

que se repete, 

e se repete, 

e se repete,

a cada "vale marítimo" em que entramos.


Com certeza essa sensação deve diminuir com o hábito, com a familiaridade.

Mas com certeza, sem uma crença na magia, em uma magia protetora, 

uma magia capaz de fazer face às forças da natureza,

seria muito difícil ter a coragem de repetir e repetir e repetir a experiência,

até que venha o hábito e a familiaridade...


"Quem teria a coragem de se aventurar em uma canoa que não tenha sido embebida de mágica?", perguntei-me...

"Eu, com certeza, não!", respondi-me...


-x-x-x-x-x-x-x-x


E de repente me veio à cabeça uma analogia com...  motocicletas!

Eu tenho uma motocicleta, eu já rodei, sei lá, uns trezentos mil quilômetros pilotando motocicletas.

Tenho cicatrizes de cortes, tenho cicatrizes de queimaduras, já tive uma luxação na cervical, podia ter morrido ou ficado paralítico...

E continuo andando de moto! :-) 

Não existe motociclista que nunca tenha caído, eu acho!


Na verdade, eu mesmo já disse várias vezes, 

"Cara, se pararmos pra pensar, o cara que inventou a motocicleta e a considerou um veículo 'usável'

era LOUCO,

e os que efetivamente USAM motocicletas

são IDIOTAS!"

:-)


E é difícil contestar essa minha afirmação, se considerarmos que pilotar uma moticicleta consiste em andar a mais de cem quilômetros por hora

praticamente sem proteção - que proteção efetiva oferecem um capacete e uma jaqueta de couro, ou mesmo uma jaqueta com "exoesqueleto", 

para o impacto que o corpo vai sofrer num acidente de moto?


E como as pessoas, mesmo assim, desprezam esse raciocínio, e ANDAM de motocicleta?

Será que a "imagem" a "tradição"... a "mágica", associadas às motocicletas

não são o que permite isto?


A imagem do motociclista tipo Hell Angel.

a imagem do motociclista tipo "esportivo",

há vários estereótipos, 

mas todos, sem importar a "nuance"

fortes

ousados

invulneráveis, praticamente,

e, sempre, LIVRES!


Não será isso uma variedade de "mágica da canoa"?

Não seria uma jaqueta de couro um "objeto cerimonial"?


-x-x-x-x-x-x-x-x-x-x-


Obrigado por me escutar, professor!

E, não, não fumei nada, não bebo nem uso nenhuma outra substância que altere meu humor nem meu comportamento.

Só viajei nisso, mesmo!


Saturday, March 28, 2020

BRASIL TEM DEZ MIL NOVOS CASOS DE CORONAVIRUS NA SEMANA DE 15 A 21 DE MARÇO - OS NÚMEROS DA CONTAMINAÇÃO DIVULGADOS PELO MINISTÉRIO DA SAÚDE NÃO SÃO VERDADEIROS



O cabeçalho é propositalmente sensacionalista, e embora siga o estilo dos nossos jornais, não saiu em nenhum deles.  Não com estas palavras.  Ao contrário, se pegarmos uma notícia do G1 de hoje, 28 de março, é informado que há "3.417 casos confirmados de coronavírus" (1).  Três mil e quatrocentos E DEZESSETE casos confirmados, desde o início da pandemia, em todo o Brasil, é o que diz a notícia.  Grifei o "dezessete" porque quero chamar a atenção para como são dados números precisos, sem arredondamento, sem a ressalva de "aproximadamente"... 3.417, é dito, é como se o número "quebrado" tivesse a intenção de nos dizer, implicitamente, que é feita uma contagem precisa, inquestionável... 

Mas, como eu já postei aqui, penso que é evidente que o número de doentes por coronavirus que é divulgado não significa NADA, porque se não estão sendo feitos testes, como diabos saberiam quantos casos existem?! 

Mas há outros meios de estimar o número de casos.  Por exemplo uma notícia do mesmo G1, na mesma data (2), falando do aumento de internações por insuficiência respiratória grave: a Fundação Oswaldo Cruz informa que "entre 15 e 21 de março, foram 2.250 internações; média semanal histórica é de 250 a 300 hospitalizações nos meses de fevereiro e março". O que teria feito as internações por "insuficiência respiratória grave", como é especificado na notícia, passarem de 250 para 2.250?  Não é razoável e até óbvio pensar que essas pessoas estão com COVID-19?  Então, a partir deste dado, podemos ter uma estimativa bem fundamentada sobre quantas pessoas foram contaminadas com coronavírus!
Trabalhando com esta hipótese mais do que razoável de que o aumento nos casos de internação por insuficiência respiratória grave se deve ao coronavírus, então na semana de 15 a 21 de março tivemos aproximadamente DOIS MIL NOVOS CASOS GRAVES de coronavirus (foram 2.250 internações, estamos subtraindo as 250 que ocorreriam em "tempos normais").
Está sendo geralmente aceito e bastante divulgado que apenas vinte por cento dos casos de COVID-19 necessitam internação (3).  Ora, 2.000 são vinte por cento de...  DEZ MIL!  Tivemos em torno de DEZ MIL NOVOS CASOS de coronavírus em uma semana!

Eu poderia começar a conjeturar que se tivemos dez mil novos casos em uma semana, e o vírus já se espalhou por todo o Brasil há pelo menos três semanas, então devemos ter pelo menos trinta mil casos neste momento.  Mas não vou fazer isso.  Não quero falar de conjeturas como se fossem fatos. 
Fato: tivemos em torno de dez mil novos casos de CoViD-19 na semana de 15 a 21 de março.
Fato: os números divulgados pelo Ministério da Saúde não correspondem à realidade.
Como foi dito no cabeçalho.  Sensacionalista, mas infelizmente verdadeiro.

Notas:
1 - "Brasil tem 92 mortes e 3.417 casos confirmados de novo coronavírus, diz Ministério da Saúde" - https://g1.globo.com/bemestar/coronavirus/noticia/2020/03/27/brasil-tem-92-mortes-e-3417-casos-confirmados-de-novo-coronavirus-diz-ministerio-da-saude.ghtml .
2 - "Em uma semana, Brasil registrou 9 vezes mais internações por problemas respiratórios que a média, aponta Fiocruz" - https://g1.globo.com/bemestar/coronavirus/noticia/2020/03/27/internacoes-por-problemas-respiratorios-estao-10-vezes-maiores-que-a-media-no-brasil-aponta-fiocruz.ghtml
3 - Há várias fontes dando esta estimativa, veja como exemplo este artigo do Nexo Jornal, "Quais números importam para entender o avanço do coronavírus" -   https://www.nexojornal.com.br/expresso/2020/03/15/Quais-n%C3%BAmeros-importam-para-entender-o-avan%C3%A7o-do-coronav%C3%ADrus

Wednesday, March 25, 2020

UM INSTANTÂNEO DO MOMENTO - CORONAVÍRUS


Este post surgiu de conversas no Whatsapp.  Era pra ser só pra algumas pessoas mais próximas.

Primeiro porque não são colocações positivas, longe disso.  E eu tinha (tenho) um certo escrúpulo em dizer coisas negativas.  Mas parece que as pessoas já estão percebendo, então essa não é uma razão pra não fazer o post.

O outro motivo é que os posts estão "crus", mal escritos, sem acabamento.
Bom, eu não dei acabamento.  Tenho outras coisas pra fazer.  Eu acho que do jeito que está dá bem pra entender a idéia.

Então, lá vai:

POST 1:
Aqui vão as previsões do Lorde do Caos:
Bom, os milhares, talvez centenas de milhares, talvez milhões de mortes causados pelo coronavirus, direta ou indiretamente (pelo colapso do sistema de saúde), já são uma certeza.  Teremos muitas mortes.
O medo da doença fará a grande maioria da população que pode ficar em casa, ficar em casa.  Classe média.  As mortes serão maiores entre as classes sociais que não podem ficar em casa pois não tem reservas e precisam comer e pagar as contas.  Trabalhadores.
Bolsonaro é um imbecil e o véio da Havan é um vampiro mas nunca coisa eles estão certos: a economia vai entrar em colapso.  Não vejo os negócios voltando ao normal em menos de trinta dias a contar de agora.  E em menos de trinta dias a contar de agora a grande maioria das pequenas empresas quebra, se não tiver um apoio.  E o governo Bolsonaro, tal como o governo Trump, não dará apoio a pequenas empresas.  Irá "salvar" as grandes empresas, os bancos, os oligopólios de telecomunicações...  Melhor dizendo irá "tentar" salvar, porque a grande maioria dos empregos vem das pequenas empresas e a maior parte do PIB vem do consumo das famílias.  Quebram as pequenas empresas, multidões ficam desempregadas, o consumo despenca, até os grandes começarão a ir à falência.  Há uma maneira de mitigar isso?  Não sou economista, mas acho que com a isenção de impostos às pequenas empresas e a distribuição de um valor mínimo a cada família durante três meses se pode diminuir a catástrofe.  Dinheiro há.  Fundo eleitoral, emendas parlamentares, verbas de luxo de altos funcionários públicos...  Mas isto não será feito, então dentro de uns dois meses estaremos no caos social.
Começarão os saques a lojas.  Provavelmente vai começar pelos supermercados, depois a multidão vai perder a noção e roubar roupas, eletrodomésticos, o que der.  Cenas de apocalipse.
A resposta será o exército nas ruas, muita gente morta e, muito provávelmente, uma nova ditadura militar.

POST 2 (complemento)
Ah, um detalhe que não é detalhe, porque é muito importante, é essencial:  de onde tirar dinheiro para evitar que as pequenas empresas quebrem e haja um colapso na economia, além dos meios que já falei?  Dos pagamentos da dívida, ora!  Se tu tens uma dívida com um banco, mas estás desempregado não sabes por quanto tempo ainda e precisas pagar aluguel e comer, tu vais usar o dinheiro que tens pra pagar o banco ou vais dizer "banco, foda-se, agora eu preciso sobreviver, depois que eu me aprumar a gente conversa"?!  Suspenda-se, ou diminua-se, os pagamentos da dívida do Brasil!  Eles não vão nos emprestar mais dinheiro, mesmo!  Então fodam-se, srs. banqueiros internacionais!  A Argentina já fez isso, todo mundo disse que iam virar párias na comunidade financeira internacional, e aí estão eles, bem belos!
Aliás, a contabilidade brasileira é extremamente perversa no tratamento da dívida.  É buscado um "superávit ANTES DO PAGAMENTO DA DÍVIDA".  Então se estivermos nos enterrando pagando juros que serão "inquitáveis", uma dívida eterna, mas SEM LEVAR ESTES PAGAMENTOS EM CONTA NÓS TIVERMOS DINHEIRO SOBRANDO, É CONSIDERADO QUE A ECONOMIA ESTÁ BEM!  Isso é absurdo!  É uma fantasia!  Não existe superávit "antes de pagar a dívida".  Na vida real, existe dinheiro suficiente, ou não existe dinheiro suficiente pro País andar!
Sabe o que que deveria ser contabilizado à parte? Não o dinheiro gasto pra pagar dívida, mas os investimentos!  Infraestrutura, bens de produção, pesquisa e desenvolvimento, isso sim deveria ser considerado à parte!  Porque isso vai resultar em futuro superávit.  Não a dívida!


Thursday, July 11, 2019

ANOTAÇÕES SOBRE O USO DE COLUNAS DO TIPO "COORDENADA GEOGRÁFICA" EM SQL SERVER E C SHARP



ANOTAÇÕES SOBRE O USO DE COLUNAS DO TIPO "COORDENADA GEOGRÁFICA"
EM SQL SERVER E C#

Aeh galera, Pedro de volta!
Voltando ao tema "Lidando com uma Coluna do Tipo Coordenada Geográfica no SQL Server".
Dêem uma olhada nas anotações abaixo:
Elas mostram:
·         como criar uma tabela com uma coluna do tipo "Coordenada Geográfica"
·         como inserir registros nesta tabela, usando as funções geography
·         STGeomFromText
·         Point
·         Como fazer SELECT da coluna "Coordenada Geográfica,
·         formatando como texto
·         obtendo latitude e longitude
·         como declarar variáveis "Coordenada Geográfica" em memória
·         como usar a função .STDistance para listar pontos dentro de uma determinada região

Tudo isto são exemplos "da vida real", que estou empregando no SGA.
As anotações terminam com alguns exemplos "demo", mostrando como criar linhas e polígonos.
Ao longo do texto, há links para os sites que usei como base.
Hope you enjoy!

USE [SGAPerto_Mobile]
GO
/****** Object:  Table [dbo].[Locais]    Script Date: 05/30/2019 16:48:16 ******/
CREATE TABLE [dbo].[Locais](
      [IdLocal] [int] IDENTITY(1,1) NOT NULL,
      [NomeLocal] [varchar](50) NOT NULL,
      [PontoLocal] [geography] NOT NULL,
 CONSTRAINT [PK_Locais] PRIMARY KEY CLUSTERED
(
      [IdLocal] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

/****** Object:  Index [IX_Locais]    Script Date: 05/30/2019 16:48:16 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Locais] ON [dbo].[Locais]
(
      [NomeLocal] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

-- Artigo: Convert Latitude/Longitude (Lat/Long) to Geography Point

-- Note que usando StGeomFromText para criar um Ponto, os parâmetros são LONGITUDE / LATITUDE
insert into Locais (NomeLocal, PontoLocal)
select 'Perto', geography::STGeomFromText('POINT(-51.005615 -29.952576)', 4326)
union all
select 'Casa do Pedro', geography::STGeomFromText('POINT(-51.224386 -30.039285)', 4326)
union all
select 'Campus do Vale UFRGS', geography::STGeomFromText('POINT(-51.119298 -30.072127)', 4326)

-- Note que usando Point (método estático) para criar um Ponto, os parâmetros são LATITUDE / LONGITUDE
insert into Locais (NomeLocal,PontoLocal)
select 'Zaffari Cidade Baixa', geography::Point(-30.038163, -51.221145, 4326)
union all
select 'Colégio Pão dos Pobres', geography::Point(-30.040824, -51.228015, 4326)
union all
select 'Bar Pinguim',  geography::Point(-30.037915, -51.222291, 4326)

-- Note que usando STAsText para converter um Ponto para String, a exibição é no formato POINT(LONGITUDE LATITUDE)
select *, PontoLocal.STAsText() as PontoLocal_Formatado, PontoLocal.Lat as Latitude, PontoLocal.Long as Longitude from Locais

declare @ondeEstou as geography
select @ondeEstou = PontoLocal from Locais where NomeLocal = 'Casa do Pedro'
select * from
( select *, PontoLocal.STDistance(@ondeEstou) as Distancia from Locais ) as meuSelect
where meuSelect.Distancia < 500
order by Distancia


-- Descrição do Método STDistance no Microsoft.docs

declare @pontoPerto as geography = geography::STGeomFromText('POINT(-29.952576 -51.005615 )', 4326)
declare @pontoCasa as geography = geography::STGeomFromText('POINT(-30.039285 -51.224386)', 4326)
declare @pontoCampusDoVale as geography = geography::STGeomFromText('POINT(-30.072127 -51.119298)', 4326)

select @pontoCasa.STDistance(@pontoPerto) as Casa_Perto
select @pontoCasa.STDistance(@pontoCampusDoVale) as Casa_Facul
select @pontoPerto.STDistance(@pontoCampusDoVale) as Perto_Facul


-- Artigo: Como converter um Android ArcGis para latitude e longitude

-- Agora fresqueando com Linhas e polígonos
-- No SGA vou usar apenas pontos e calcular a distãncia entre eles.

DECLARE @g geography; 
DECLARE @h geography; 
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326); 
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @g,@h


CREATE TABLE SpatialTable  
    ( id int IDENTITY (1,1), 
    GeogCol1 geography,  
    GeogCol2 AS GeogCol1.STAsText() ); 
GO 
 
INSERT INTO SpatialTable (GeogCol1) 
VALUES (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326)); 
 
INSERT INTO SpatialTable (GeogCol1) 
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326)); 
GO 




Note que Geography é um User Defined Type.  Antes do SQL 2008, ele não existia.
A partir do 2008 ele (penso eu) já vem instalado.
Veja este excelente artigo para mais informações sobre "CLR User-Defined Types":

Pode ver também
CLR User-Defined Types - SQL Server

Para ver se o seu banco tem ou não os tipos de dados "geoespaciais", vá na "árvore de objetos", abra "Programmability" -> Types e veja se tem lá Spatial Data Types.
(você também pode ver se o Microsoft.SqlServer.Types está instalado no seu SQL simplesmente fazendo
 SELECT * FROM SYS.ASSEMBLIES)



Em C#, para usar dados geoespaciais, é precisoa biblioteca Microsoft.SQLServer.Types também esteja instalado, tal como no SQL Server.
Esta DLL vai trazer a definição do tipo SQLGeography - equivalente no C# ao tipo Geography do SQL.
O método recomendado é ir no NuGet e pegar de lá o SQLServer.Types para o seu projeto.

Daí é só declarar as variáveis, normalmente:
        public Microsoft.SqlServer.Types.SqlGeography PosicaoGeografica { get; set; }
:-)

Mas, vejam o que aconteceu quando eu fui usar um objeto DEFINIDO EM UM WEB SERVICE
e que tem uma propriedade do tipo SQLGeography na minha Web Forms Appliction:
EU NÃO CONSEGUIA ACESSAR AS PROPRIEDADES .Lat e .Long da propriedade!
Bom, eu não consigo acessar MÉTODOS de um objeto de um tipo definido dentro de um Web Service.  Isso faz todo sentido: só posso acessar métodos do Web Service que tenham o decorator [WebMethod].  Mas, aparentemente, TAMPOUCO CONSIGO ACESSAR PROPRIEDADES READ-ONLY de objetos definidos no Web Service!
Bom, como eu lidei com isto?
Criei minhas propriedades "customizadas"! :-)

Tenho propriedades "Latitude" e "Longitude" que são nullables of double, e que NÃO SÃO PERSISTIDAS.
Só servem para SETAR A PROPRIEDADE DO TPO SQLGEOGRAPHY SEM TER QUE CHAMAR MÉTODOS DO NAMESPACE MICROSOFT.SQLSERVER.TYPES.SQLGEOGRAPHY DE FORA DO WEB SERVICE.
Seto Latitude, ele tenta setar a PosicaoGeografica, não consegue porque ainda não tem Longitude.
Seto Longitude, ele vê que já tem Latitude, e gera um Point com estas coordenadas.
Pronto, já tenho minha posição geográfica armazenada, prontinha pra ser salva.
Além disto, posso usar as propriedades GetLatitude e GetLongitude para recuperar estes valores.
Talvez esta encrenca toda possa ser melhorada, mas tudo funciona!
Veja o código abaixo:
    public class Unidade
    {

        [NomeColuna("UND_POSICAO_GEOGRAFICA")]
        public Microsoft.SqlServer.Types.SqlGeography PosicaoGeografica { get; set; }

        private void SetaPosicaoGeografica()
        {
            if ((! Latitude.HasValue) || (! Longitude.HasValue))
            {
                PosicaoGeografica = null;
            }
            else
            {
                //System.Globalization.CultureInfo culturaEnUs = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
                //String tempStrLatitudeLongitude = "POINT(" + Latitude.Value.ToString(culturaEnUs) + " " + Longitude.Value.ToString(culturaEnUs) + ")";
                //Char[] tempArrCharLatitudeLongitude = tempStrLatitudeLongitude.ToArray();
                //System.Data.SqlTypes.SqlChars tempSqlCharLatitudeLongitude = new System.Data.SqlTypes.SqlChars(tempArrCharLatitudeLongitude);
                //PosicaoGeografica = Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(tempSqlCharLatitudeLongitude, 4326);
                PosicaoGeografica = Microsoft.SqlServer.Types.SqlGeography.Point(Latitude.Value, Longitude.Value, 4326);
            }
        }

        private double? _Latitude;
        public double? Latitude
        {
            get
            { return _Latitude; }

            set
            {
                if (value < -90 || value > 90)
                {
                    throw new ApplicationException("A Latitude tem de estar entre -90 e 90 graus.");
                }
                _Latitude = value;
                SetaPosicaoGeografica();
            }
        }

        private double? _Longitude;
        public double? Longitude
        {
            get
            { return _Longitude; }

            set
            {
                if (value < -180 || value > 180)
                {
                    throw new ApplicationException("A Longitude tem de estar entre -180 e 180 graus.");
                }

                _Longitude = value;
                SetaPosicaoGeografica();
            }
        }

        // Estas propriedades GetLatitude
        // e GetLontitude
        // são necessárias porque, por alguma razão cabalística, a propriedade "Lat" da Posicao Geografica não é disponibilizada fora desta solucao
        // se eu não colocar o SET vazio, tampouco consigo usar estes GetLatitude e GetLongitude.
        // Deduzo que, assim como os métodos, as propriedades ReadOnly de uma classe disponibilizada através de um WebService não são acessíveis de fora do WebService.
        // (Obs: Faz sentido não enxergar os métodos da classe, só consigo usar em um WebService o que está decorado como [WebMethod]. 
        //       Que isso ocorra com as propriedades readonly de uma classe é, pra mim, no mínimo intrigante!
        //
        // Obs: Uso PosicaoGeografica.IsNull em lugar de PosicaoGeografica == null porque, estranhamente, mesmo que debugando e fazendo um Watch eu veja o objeto como {Null},
        //      fazer ?PosicaoGeografica == null na janela Immediate tem como resposta... false! :-o


        public double? GetLatitude
        {
            get
            {
                if ((PosicaoGeografica != null) && (! PosicaoGeografica.IsNull))
                    return (double?)PosicaoGeografica.Lat;
                else
                    return null;
            }
            set
            {
            }
        }

        public double? GetLongitude
        {
            get
            {
                if ((PosicaoGeografica != null) && (! PosicaoGeografica.IsNull))
                    return (double?)PosicaoGeografica.Long;
                else
                    return null;                   
            }
            set
            {
            }
        }

        [NomeColuna("UND_ID")]
        public Guid? idUnidade { get; set; }

etc, etc, etc. - vai definindo propriedades "as usual".


E tem mais um truquezinho.
Tenho que passar a minha variável SQLGeography como parâmetro para uma SP para poder salvar o valor, não é mesmo?
Então, eu populo os parâmetros fazendo um SQLCommandBuilder.DeriveParameters, e depois populo os valores a partir de uma "coleção de parãmetros" onde cada item tem um string que é o nome e um objeto que é o value. 
 SqlCommandBuilder.DeriveParameters(cmd);
foreach (ProcParam param in proc.ParamInType)
    cmd.Parameters["@" + param.Name].Value = param.Value;
Beleza.
Mas... "parece" que o SQL 2008 tem um probleminha, e não popula a propriedade UdtTypeName para os parâmetros do tipo UDT, e daí dá erro quando tento rodar a procedure!
Resolvi isso na base da "marreta":
foreach (SqlParameter item in cmd.Parameters)
                {
                    // A "marreta" aih no UdtTypeName eh porque o DeriveParameters nao popula esta propriedade.
                    // Parece que isto soh ocorre com SQl 2008.
                    // Ver https://github.com/jonwagner/Insight.Database/issues/43 .
                    if (item.SqlDbType == SqlDbType.Udt)
                        // if (item.Value is Microsoft.SqlServer.Types.SqlGeography)  TIVE QUE REMOVER ESTE "IF", porque se o parâmetro estiver NULL ele não vai ter tipo.  Portanto esta rotina só funciona se TODOS os UDTs forem Geography! :-(

                            item.UdtTypeName = "geography";
                }

Sobre isto, veja
Error Passing SqlGeometry Parameter To Stored Procedure · Issue #43 · jonwagner/Insight.Database
Ah, mais uma coisa:  quando eu uso o dado geoespacial como parâmetro em uma SP, eu coloco um default NULL nele.
Assim não dá erro se não for passado.
Ver se um objeto SQLGeography é nulo é chato bagaray, ele pode ser != null e ainda assim ter a propriedade .IsNull verdadeira.  "Creio" que isto é porque um objeto pode conter uma COLEÇÃO de objetos geoespaciais.  Ainda sou recruta na coisa e não tenho certeza.  Em todo caso, fazer o parâmetro ter um default NULL é jogar no seguro!
CREATE PROCEDURE SGA_SP_UNIDADE_SALVAR(@inACAO NUMERIC(1),                                                           @inUND_POSICAO_GEOGRAFICA GEOGRAPHY = NULL,
                @inUND_ATIVO bit,
                @outCod_Error NUMERIC(9) OUTPUT)
AS
etc etc etc

Bom, finalizando, aí vai um exemplo de SP que recebe uma coordenada geográfica, uma distãncia em metros, e retorna os registros de uma tabela (que, óbvio, tem uma coluna do tipo coordenada geográfica) que estejam dentro da "distância" em relação ao "ponto de referência".


/****** Object:  StoredProcedure [dbo].[SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE]    Script Date: 07/03/2019 14:38:15 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE]
GO

/****** Object:  StoredProcedure [dbo].[SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE]    Script Date: 07/03/2019 14:38:15 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE PROCEDURE [dbo].[SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE](
                                                                          @inPontoDeReferencia GEOGRAPHY,
                                                                          @inDistanciaEmMetros NUMERIC(9),
                                                                          @outCod_Error NUMERIC(9) OUTPUT)
AS

 /*********************************************************************************************************
 Objeto..........: SGA_SP_UNIDADE_CONSULTAR_NO_RAIO_DE
 Schema..........: dbo
 Projeto/Equipe..: PertoSGA/DSR
 Responsavel.....: Pedro Pereira
 Date............: 02.julho.2019
 Objetivo........: RETORNAR A LISTA DAS UNIDADES DENTRO DE UM DADO RAIO (@inDistanciaemMetros) DE UM PONTO DE REFERÊNCIA (@inPontoDeReferencia)
                   (Unidades que não tenham uma Posição Geográfica cadastrada nunca serão retornadas).
 Alteração.......:
   Data         Reponsavel             HashTag      Comment
 **********************************************************************************************************/

BEGIN
       DECLARE @UndAux INT;
       SET NOCOUNT ON;
       SET XACT_ABORT ON; SET NOCOUNT ON;
BEGIN TRY
       --Validação inicial se usuario existe
        SET @outCod_Error = 0
        SELECT SGA_UNIDADE.UND_ID,
                    SGA_UNIDADE.UND_NOME,
                    SGA_UNIDADE.GRP_ID,
                 SGA_UNIDADE.UND_CODIGO,
                    SGA_UNIDADE.CID_ID,
                    SGA_UNIDADE.UND_BAIRRO,
                    SGA_UNIDADE.UND_ENDERECO,
                    SGA_UNIDADE.UND_TELEFONE,
                    SGA_UNIDADE.UND_DESCRICAO,
                    SGA_UNIDADE.UND_POSICAO_GEOGRAFICA,
                    SGA_UNIDADE.UND_ATIVO,
                    SGA_UNIDADE.UND_POSICAO_GEOGRAFICA.STDistance(@inPontoDeReferencia) as UND_DISTANCIA
       FROM SGA_UNIDADE
       where SGA_UNIDADE.UND_POSICAO_GEOGRAFICA.STDistance(@inPontoDeReferencia) <= @inDistanciaEmMetros
       AND UND_ATIVO = 1
       order by UND_DISTANCIA
      
END TRY
BEGIN CATCH
       exec error_handler_sp; SET @outCod_Error = 1; --SGA0001
END CATCH

END

GO


Vou incluir aqui também um...  "anexo": uma chamada desta SP.  Não vai fazer muito sentido, porque esta chamada está inserida em um contexto de classes de persistência da minha aplicação que eu não vou incluir aqui.  Mas achei que não ficaria completo sem este exemplo, e vocês são rapazes espertos que podem perfeitamente preencher as lacunas das rotinas e classes que são referenciadas.
        [WebMethod]
        public void UnidadeNoRaioDePesquisar(PertoSGA_WebService.DA.DBAccess.ExecUnidadeRaioPesquisarParam param, ref List<TO.Unidade> unidades)
        {
            DA.ExecProcResult exProcResult = new DA.ExecProcResult();
            DA.DBAccess.ExecUnidadeNoRaioDePesquisar(ref exProcResult,
                new DBAccess.ExecUnidadeRaioPesquisarParam {
                    inPontoDeReferencia = param.inPontoDeReferencia,
                    inDistanciaEmMetros = param.inDistanciaEmMetros
                });
            if (exProcResult.DataTable != null)
            {
                unidades = Utils.DataTableToList<TO.Unidade>(exProcResult.DataTable);
            }       
        }