Android Oreo GPS sucks

Android 8 limits how frequently background apps can retrieve the user’s current location. (see more)

Maybe some applications use GPS without any visible need, but some apps use it as its core. And now they can’t.

Android Oreo GPS sucks

With Android Oreo, I have to keep a track app in foreground, with an active screen. Google says it intends to save battery, but with Oreo, I waste more battery than ever because my tracking apps need to run in foreground with an active display, with the display always on. Burn battery and burn display. And every 10 minutes I have to touch the screen…

It is the time to move to iOS?

NVIDIA, black screen

Já há uns meses que, de vez em quando, os ecrãs do meu computador ficavam momentaneamente pretos e, depois, voltavam ao normal e recebia uma notificação do Windows a dizer que o driver da placa NVIDIA tinha estoirado e o sistema tinha recuperado.

Tenho o Windows 7, num PC com duas placas de védeo – uma NVIDIA Quadro K620 e uma ATI Radeon X1300 – que sustentam 4 ecrãs.

Na última semana, deixei de conseguir trabalhar porque o driver estoirava e deixava os dois ecrãs da esquerda permanentemente a preto. Por vezes até congelava o PC, e nalguns casos também fez reboot.

Depois de 3 dias a reinstalar drivers, e à procura de solução na net@, encontrei uma que funcionou: desinstalar o driver da NVIDIA, remover manualmente todos os ficheiros relacionados com essa placa, e instalar um driver que eu sabia que funcionava.

Eu já tinha tido problemas, no passado, com este driver. Já tinha instalado e desinstalado diversas versões até encontrar uma que funcionasse. Quando comprei a NVIDIA Quadro, instalei o driver mais recente, na altura o 361.75, e não funcionou. Pesquisei na net@ e descobri que o 341.98 era estável. Tive-o instalado durante vários anos. Mas o Windows instalou uma atualização por cima e devem ter ficado ficheiros iguais, de fabricantes diferentes, em pastas distintas. Ou seja, provavelmente, o driver instalado estava a usar algumas DLLs de outro fabricante. E isso fazia o sistema estoirar. Por isso é que foi necessária esta limpeza exaustiva. Retirei as instruções daqui, da resposta do eckdd, de 17 de agosto de 2016. E é a única que funciona.

  • Desinstalar o driver da NVIDIA no Device Manager. Os 2 ecrãs que estavam pendurados nesta placa, deixaram de estar ativos. O eckdd tem mais uns pormenores que eventualmente poderão evitar isto, mas como eu tenho outra placa de vídeo com mais 2 ecrãs, o sistema passou todo para esses ecrãs e continuei a trabalhar.
  • Confirmar que o Windows não instala novamente o driver. Normalmente instala, logo a seguir, um VGA standard para um ecrã apenas.
  • Remover todos os ficheiros ".inf", que estão na pasta Windows, e que tenham o conteúdo "nvidia". Com o Windows 10, isso pode ser feito com um comando na PowerShell. Como tenho o Windows 7, tive que configurar o Windows para fazer pesquisas em ficheiros não indexados (não sei se o INF é indexado ou não) e depois pesquisei na pasta \Windows\inf.
  • Desistalar todos os produtos NVIDIA no COntrol Panel, em Add/Remove Programs.
  • Remover todas as diretorias NVIDIA em Program Files e Program Files (x86).
  • Fazer reboot.
  • Nas diretorias System32 e SysWOW64 (e subdiretorias), remover todos os ficheiros começados por "nvidia". Isso pode ser complicado, pois foram instalados pelo user SYSTEM. No meu caso, foi necessário fazer "Take Ownership" para cada um individualmente, para depois os poder apagar.
  • Instalar o driver que funciona e fazer reboot.
  • Nunca mais deixar a Microsoft instalar drivers por cima desse.

Lixo às toneladas

Cada português produz 40 quilos de lixo por mês

Cada português produz em média 40 quilos de resíduos por mês e, por ano, o país tem mais quase cinco milhões de toneladas de resíduos, o peso de três pontes Vasco da Gama, segundo dados de instituições do setor.
Os números fazem parte de um vídeo da responsabilidade de três entidades ligadas aos resíduos e que agora começa a ser divulgado, chamando a atenção para o facto de apenas se reciclarem 10% dos resíduos.
in DN


Eu produzo apenas 800 g de lixo por mês. Os outros cá de casa também.

Um total de 4,8 kg por mês, a família toda.

O esforço é quase nenhum, mas os resultados são enormes.

INEM, esses heróis

A Maria ligou para o 112 às 4h07m. Eu ainda não estava seguro de que isso era necessário. Passou-me o telefone às 4h09m, pois não sabia transmitir onde estávamos.
“Morada”, perguntaram-me.
“Boa Hora”, respondi.
“Rua e número?”
“Não tem.”
“Tem que me dizer mais qualquer coisa, pois tenho que transmitir dados precisos à equipa que se vai dirigir ao local.”
“A equipa vem de Loulé?”
“É provável. Ou de Loulé, ou de … (não me lembro do local que disseram), mas deve ser Loulé.”
“Se vêm de Loulé isso é suficiente. Eles sabem onde é.”
“OK, então eu vou passar…”
Passaram. Voltaram a perguntar-me mais ou menos o mesmo. E depois de umas hesitações minhas, porque ainda não estava seguro de que fosse necessária uma ambulância – tive que perguntar à Maria se era mesmo preciso – lá confirmei com o meu interlocutor.
“Quem vai na estrada do Parragil para Alte, são cerca de 600 metros a partir do Parragil.”
“E é junto da estrada?”
“Não, mas eu fico na estrada à espera.”
Desliguei o telefone às 4h13m.
Às 4h20m tinha a ambulância lá ao fundo, na estrada. Demoraram 7 minutos a comunicar internamente, a entrar na ambulância e a percorrer 8 km, por estradas com rotundas e, em parte, na serra e cheias de curvas. Eu não faria melhor.

A origem do escabeche

“2kg, 5 euros”, respondeu-me o peixeiro. “Ok, eu levo”. Mas logo depois: “espere”, atalhei.

Na banca do lado, o vendedor apregoava “sardinha a 1 euro”. Virei-me e constatei que ele não tinha sardinha, só Tuna Fixe: um gozão, ou um adepto do marketing feroz.

Queria assá-las todas, mas as minhas irmãs e os meus pais fugiram para Espanha, para comer cerdo grelhado.
Fritei-as no dia seguinte, mas eles fugiram para Monchique para comer javali.
Agora tenho 30 sardinhas fritas para fazer de escabeche e ir comendo a meio da manhã, intercaladas com mergulhos, enquanto os outros comem bolas com creme.

Histórias do Algarve III

A comer alcaparras, enquanto recordo Benagil de ’78, que era a imagem viva do Stromboli, do Roberto Rossellini. Já não há nada disso em Benagil.

Benagil é um não-lugar, no sentido que lhe deu Marc Augé. Um sítio não-sítio, igual a tantos outros: vivendas para turistas, com parqueamento privado à porta; escada bonita e empedrada até à praia, uma fila de veraneantes a inscreverem-se para um passeio de barco pelas grutas marinhas…

Nada de velhas vestidas de preto, com lenço, também preto, na cabeça, a gritar, do alto da falésia, “o almoço está pronto”, enquanto os filhos da terra recebiam os amigos lisboetas, lá em baixo, na praia selvagem – mesmo selvagem, vocês nem imaginam – e livre.

E o único elo que liga todas estas realidades são as alcaparras mediterrânicas,… e a minha memória.

Sardinhas de escabeche, a última receita

Fritar sardinhas, enrolandas em farinha, no dia anterior.

Saltear uma cebola, em lume bem forte, cortada em meias luas, em azeite e uma pitada de sal – o chamado sal mágico, que chupa a água da cebola durante a cozedura.

Juntar uma folha de louro, pimenta moída no momento, e também grãos inteiros de pimenta preta.

Mexer sempre, para não queimar. A cebola tem que perder água duas vezes e tem que ficar mesmo mole. Juntar vinagre e continuar a mexer.

Retirar do lume e verter por cima das sardinhas.

Et voilà.

Histórias do Algarve II

Na extremidade oeste da Ria Formosa, um casal chega à praia. Ele, com um ar distinto, de doutor em Direito, e ela calma e assertiva, talvez investigadora científica, ou mesmo chefe de algum centro de investigação. Com alguma dificuldade, ele espeta o chapéu de sol na areia, percebe-se que as habilidades manuais não são o seu forte – nem forte, nem fraco, nem nada – e o chapéu pode cair a qualquer momento.

Pouco depois, chega o filho, atarracado, como o pai, também com cabelo curto, preto e encaracolado, com uma cadeira desmontável, de metal e pano, debaixo de um braço, e um livro, com muitas folhas, na outra mão. Não terá mais de 12 anos – ou talvez uns 14 mal crescidos. Monta a cadeira e senta-se, de calções e polo, à sombra do chapéu instável montado pelo pai, a ler a Guerra e Paz, do Leão Tolstoi, volume I. Na praia, todas as outras crianças chapinham, de calções de banho, à beira da água.

Numa outra ilha da ria, 30 km a leste, dois caminhantes chegam à extremidade nascente e sentam-se à espera da maré vazia para passarem a nado para a ilha seguinte. O sol está a pôr-se e a luminosidade do dia cai a cada instante.

Uma mulher de cabelos pretos desgrenhados, com algumas cãs, e cara com traços vincados, envergando um vestido roxo, de algodão, comprido, surge junto à costa e contorna a extremidade da ilha à frente dos caminhantes. Atrás dela, um miúdo com aspeto enfezado, aparentando ter 12 anos, mas provavelmente com 14 anos mal nutridos, vestido com uma camisola e calças compridas, arrasta uma caixa de madeira vazia – daquelas onde se vende fruta – puxada por uma corda, com os dois braços atrás das costas. E a mulher anuncia, sem parar, mas deslocando-se pesadamente: “O Miguel está disponível para amar”.

Histórias do Algarve

O algarvio, de caganeira, arreou as calças e borrou-se todo. Uma boca aproximou-se e ele disse: “Vens de garfinhe? Vens de garfinhe? Se nã vieres de colher nã te safas.”


No fim da guerra de 18, durante a pneumónica, contam os velhos do barrocal algarvio, que iam à vila – Loulé – com um ramo de arruda atrás da orelha, para se protegerem da gripe espanhola.

A minha avó, correspondente no jornal de Portimão, nunca soube do assunto, pois com ela as notícias circulavam de cima para baixo, de Almada para Portimão.

Monchique, outra vez

Fui ontem a Monchique almoçar para ajudar a economia local a recuperar da tragédia do incêndio. Vai ser uma tragédia para o turismo e, por isso, precisam de toda a ajuda que pudermos dar.

Ao andar por aquelas montanhas percebi o trabalho exemplar da Proteção Civil. Os aglomerados populacionais – às vezes apenas 3 ou 4 casas – foram salvaguardados. Ardeu tudo em volta, mas os sítios – nome pelo qual os pequenos aglomerados são conhecidos na serra e barrocal algarvios – saíram ilesos. Há algumas casas isoladas que foram queimadas, mas aí também a Proteção Civil agiu de forma omnisciente: deixou arder edificações pontuais, que iriam exigir demasiados recursos necessários noutros locais, necessários para a estratégia global.

Estamos bem preparados para a guerra.

O lado obscuro da minha passagem pela serra foi o constatar que, da zona não ardida, metade das árvores são eucaliptos, e a percentagem de pinheiros é grande também. Espera-se, então, mais um novo fogo calamitoso para muito breve.

Espanha, um país de porcos

Espanha – um país de porcos

“Há cerca de 50 milhões de porcos em Espanha, mais 3,5 milhões do que a população daquele país, de acordo com dados divulgados pelo Ministério da Agricultura e Pesca, Alimentação e Ambiente espanhol, que também revelam que houve um aumento de cerca de nove milhões de suínos desde 2013.” in DN


Curiosamente, ainda ontem fotografei uma autocaravana espanhola a despejar o esgoto no parque de estacionamento de uma praia, aqui em Portugal.

Mostrei a foto um um dos novos caralhos que se dispôs logo a defender os espanhóis, mesmo sem os conhecer. “Isso é o ar condicionado”, dizia ele. Mas então mostrei-lhe melhor o tubo do esgoto, por onde esta nojeira saía e ele calou-se.

A ciência ao serviço das trevas

Antes de ontem, no rescaldo do fogo de Monchique, vi um programa de informação na TV, onde estavam dois comentadores. Um deles era cientista, o outro não sei.

O cientista falava bem, de forma segura e convincente, mas era um aldrabão, um aldrabão científico. Um aldrabão que pôs a Ciência ao serviço das trevas.

Começou por dizer que a percentagem de eucaliptos na zona era de 45%, e não da ordem dos 70% como se tinha falado. Mas não disse a que zona se estava a referir, Se à zona ardida, se aos concelhos afetados, à totalidade dos concelhos incluindo o barrocal e o litoral, ou apenas à zona de serra, ou a todo o Algarve.

Depois disse que as várias espécies arderam na mesma proporção que existem no terreno, ou seja, das espécias ardidas, os eucaliptos eram exatamente 45%. E disse-o, enfatizando o facto de que as outras espécies também ardem. Nomeadamente, e isto digo eu, azinheiras, medronheiros, etc. Não falou dos pinheiros, que são resinosas e ardem tão depressa como os eucaliptos. Se tivesse apresentado a soma das percentagens das duas espécies, a coisa teria sido diferente.

Nas imagens que vi na TV durante toda a semana do incêndio, quando mostravam fogo, só vi eucaliptos e pinheiros. São os precursores do fogo: sem eles não há fogo, ou, pelo menos, não há fogo que resista aos bombeiros.

Mas voltando ao “cientista”. Também não falou da rapidez com que umas e outras árvores ardem. Estava nitidamente a defender os eucaliptos. Um fogo com eucaliptos e pinheiros move-se mais depressa, propaga-se à distância.

As folhas dos eucaliptos voam a arder para pegar fogo mais longe. O meu tio, que mora junto da albufeira de Castelo de Bode, viu folhas de eucalipto a voarem em chamas e a passarem a albufeira de um lado ao outro, cerca de 500 metros, levando o fogo à outra margem.

Ainda hoje foi publicada uma notícia no DN que diz que os bombeiros em Marvão usaram folhas de castanheiro, como tapete, para taparem o fogo e passarem por cima dele. “Custam mais a arder”, referiu Paulo Fernandes, docente da Universidade de Trás-os-Montes e Alto Douro.

Havemos de ultrapassar esta tragédia dos fogos intermináveis. Mas precisamos de “exportar” os cientistas vergohosos para um deserto qualquer, para se liofilizarem.

IIS e SQL Server

Como disse na crónica anterior, a Microsoft está sempre a mudar a forma de trabalhar, os processos de comunicação, as configurações dos programas e dos sistemas, tudo.

Depois de instalar o Windows 2012 Server, com IIS e SQL Server Express, criei uma aplicação em C# para Web, no Visual Studio e tentei fazer o deployment para o servidor.

O SQL Server estava a funcionar, e conseguia aceder a ele localmente e remotamente, através do SQL Server Management Studio. Algumas pistas da forma de configurar este ambiente, estão na tal crónica anterior.

Criei uma base de dados simples, para teste, e conseguia aceder a ela, modificá-la, local e remotamente. Para isso tive que abri o porto 1433 em TCP, nas firewalls de Linux que ficam entre as máquinas Windows. No entanto, a aplicação Web C# não conseguia aceder à BD.

Quando escrevi a 1ª edição do meu livro Linguagens WEB, a Microsoft tinha acabado de lançar a primeira versão do dotNet. Usei as strings de ligação (connection strings) e as configurações dos sistemas de então. Mais tarde, na 4ª edição, tive que mudar tudo, pois a Microsoft decidiu alterar uma série de coisas, inclusive o nome da máquina local, que por vezes é localhost, outras vezes é (local), é como lhes apetece. Mas as strings de ligação à BD e as configurações também mudaram nessa altura. Além disso, passou a existir um servidor IIS Express no Visual Studio, para que os deployments não fossem feitos logo no servidor de produção, e assim, poder-se fazer debug.

Agora, mudou tudo outra vez: strings de ligação, formas de autenticação, utilizadores do sistema, configurações, e por aí fora. Ficam aqui registadas as configurações necessárias para fazer o deployment local (no IIS Express) e remoto (no IIS de produção). Na minha configuração, decidi ter apenas uma base de dados no servidor de produção, portanto, tanto o IIS de produção, como o virtual acedem à mesma BD.

A configuração é a seguinte: no Windows Server 2012, está o servidor Web (IIS) de produção e a BD (SQL Server Express); na máquina de desenvolvimento, está o Visual Studio, com um IIS Express.

No ficheiro Web.Debug.config, coloquei a seguinte string de ligação:

<connectionStrings>
<add name="BD"
connectionString="Data Source=192.168.4.201\SQLEXPRESS;Initial Catalog=escola;User Id=sa;Password=Pass-xxxx"
providerName="System.Data.SqlClient" />
</connectionStrings>

No ficheiro Web.Release.config, coloquei a seguinte string de ligação:

<connectionStrings>
<add name="BD"
connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=escola;Integrated Security=SSPI"
providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</connectionStrings>

A ligação no Web.Release.config pode ser feita através de autenticação integrada, pois os dois servidores (IIS e SQL Server) estão na mesma máquina. O mesmo já não acontece no Web.Debug.config, pois o IIS Express está a correr na máquina de desenvolvimento e tem que aceder à BD remotamente, por isso precisa de usar credenciais de autenticação: nome de utilizador e password.

Mas as coisas não são assim tão simples. É necessário que o SQL Server aceite estas dusa formas de autenticação, para permitir o acesso aos dados.

Na versão anterior destas confusões, desculpe, configurações da Microsoft, havia um utilizador IUSR_<máquina> que era responsável pelo IIS, e bastava autorizá-lo junto do SQL Server. Agora tudo mudou. E provavelmente vai mudar de novo daqui a 2 ou 3 anos. Mas continuemos.

Configurar o SQL Server para aceitar pedidos locais do IIS

Para conseguir chegar a esta configuração, os dois sites seguintes foram fundamentais:
Configuring IIS, ASP.NET, and SQL Server
Add IIS 7 AppPool Identities as SQL Server Logons
O primeiro diz como configurar corretamente um utilizador para aceder ao SQLEXPRESS, mas falha no Login name. O segundo diz qual é o login name, que no meu caso foi: IIS APPPOOL\DefaultAppPool

Eis a lista de instruções. De notar que o utilizador está errado: não é NT AUTHORITY\NETWORK SERVICE, mas sim IIS APPPOOL\DefaultAppPool, como indica o 2º site.

Adicionar o utilizador à lista de utilizadores com permissões

Open SQL Server Management Studio (shortcut: Start -> Run -> ssms)
Connect when prompted.
Expand Security and then expand Logins.
If you don’t have the network service listed (should be NT AUTHORITY\NETWORK SERVICE):
Right-click on the Logins folder and select New Login.
At the top, in the ‘Login Name’ field, enter NETWORK SERVICE. If it refuses to accept that, try entering NT AUTHORITY\NETWORK SERVICE.
Now select the Server Roles tab on the left.
You can tick any role you like, but for me I will give it ‘public’ access.
Now select the User Mapping tab on the left.
Tick all the databases you want to allow this service account to access.
In the Schema column for each selected database, set the value to dbo (or whatever schema you are using in your database).
Then, select one database row at a time and set the following permissions for it:
db_datareader
db_datawriter
public
Now click OK.
If you do have the network service account listed, edit that login entry and then follow steps (5 – 9) above.

Autorizar o acesso a uma BD

Expand Databases on the left.
Expand the Security folder and then expand Users.
The service account should be listed there. Right-click and Properties on the service account (for us, NT AUTHORITY\NETWORK SERVICE).
Select the Securables tab on the left.
Click on the Search button.
Select ‘Specific Objects’ and click OK.
Now click the Object Types button.
Scroll down and tick Schemas. Click OK.
In the textbox below, enter the schema you are giving access for (the same as Step 7 above). In our case, it will be dbo. Click OK.
At the bottom, select all the permissions you want to give for that database. In my case, I need quite extensive access to my database so I will be selecting these permissions:
Alter
Control
Create Sequence
Delete
Execute
Insert
References
Select
Update
Now click OK.

E aqui vai a correção à primeira caixa (nome correto do utilizador do IIS)

In SQL Server Management Studio, look for the Security folder (the security folder at the same level as the Databases, Server Objects, etc. folders…not the security folder within each individual database)
Right click logins and select “New Login”
In the Login name field, type IIS APPPOOL\YourAppPoolName – do not click search
Fill whatever other values you like (i.e., authentication type, default database, etc.)
Click OK

Para o acesso remoto, através do IIS virtual, a página seguinte foi fundamental, principalmente a 2ª resposta:
SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified

“Every time a client makes a connection to SQL Server named instance, we will send a SSRP UDP packet to the server machine UDP port 1434.”
Make sure the SQL Browser service is running on the server.
If the firewall is enabled on the server, you need to put sqlbrowser.exe and/or UDP port 1434 into exception.

Foi necessário pôr a correr, em modo automático, o serviço SQL Server Browser, abrir o porto 1434 em UDP, na firewall do Windows Server e dos sistemas Linux intermédios.

Já agora, fica aqui o resto do código da aplicação

Default.aspx

<%@ Page Language="c#" AutoEventWireup="false" Codebehind="Ola.aspx.cs" Inherits="ola.Ola"%>
<% ola.Ola t = new ola.Ola(); %>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h1>Teste</h1>
<p>Mensagem: <% Response.Write(t.Message); %></p>
<p>IPv6: <% Response.Write(t.IPv6); %></p>
<p>IP: <% Response.Write(t.IP); %></p>
<p>Data: <% Response.Write(t.date); %></p>
<p>Connection String : <% Response.Write(t.conString); %></p>
<p>Dados: <% Response.Write(t.dados); %></p>
</body>
</html>

Ola.aspx.cs

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace ola
{
    public class Ola : System.Web.UI.Page
    {
        public string Message;
        public string IPv6;
        public string IP;
        public string date;
        public string dados;
        public string conString;
        private SqlConnection ligacao;

        public Ola ()
        {
            Message = "Aplicação de teste";
            IPv6 = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();
            IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;
            date = DateTime.UtcNow.ToString("dd/MM/yyyy HH:mm zzz");
            
            System.Configuration.Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/wwwroot");
            System.Configuration.ConnectionStringSettings connString;
            connString = rootWebConfig.ConnectionStrings.ConnectionStrings["BD"];
            conString = connString.ConnectionString;
            dados = "";
            ligacao = new SqlConnection(conString);
            try
            {
                ligacao.Open();
                String sql = "SELECT * FROM aluno";
                SqlCommand comando = new SqlCommand(sql, ligacao);
                using (SqlDataReader dbDados = comando.ExecuteReader())
                {
                    while (dbDados.Read())
                    {
                        dados += dbDados.GetString(1) + ", " + dbDados.GetString(2) + ";";
                    }
                }
                ligacao.Close();
            }
            catch (Exception e)
            {
                dados = "ERRO: " + e.Message;
            }
        }


    }
}

E o resultado

Teste
Mensagem: Aplicação de teste
IPv6: fe80::7c07:5225:9e81:8b40%12
IP: 192.168.0.54
Data: 12/08/2018 20:27 +01:00
Connection String : Data Source=localhost\SQLEXPRESS;Initial Catalog=escola;Integrated Security=SSPI
Dados: Maria, Lisboa;João, Porto;