Задача - смотреть googlemaps родного города с приличной скоростью, но при этом интернет-радио не должно заикаться от нехватки канала.
Очевидное решение - локальный кэш.
Ключевые слова:
nginx,
PAC, bash, perl.
0. понять нумерацию картинок в гугле.
kh${srv}.google.com/kh?n=404&v=${version}&t=${img_name}
srv - номер сервера на момент поста изменялся от 0 до 3
version - глобальная версия карт, т.е. номер версии увеличивается даже если меняется только часть карты. Например, для Омска карты версий 20 и 21 совпадают.
Что такое n=404 - вне моего разумения, а разбираться особо не пришлось.
img_name - имя занумерованного кусочка плоской земли
Нумерация оказалась довольно простой, вся земля - это не шар и не геоид, земля плоская - Квадрат t. Далее этот квадрат делится на 4 части в духе
tqtr
ttts
Потом на 16 частей.
tqqtqrtrqtrr
tqttqstrttrs
ttqttrtsqtsr
tttttststtss
И так далее до длины имени квадрата в 20 симоволов (макимальный уровень детализации).
1. скачать гугль.
Я набросал
тривиальную качалку всея гугля и запустил её на далеком серваке.
ITER_MAX - кол-во попыток, которые скрипт будет предпренимать, чтоб скачать картинку.
TAIL_MAX задает глубину рекурсии относительно некоторого базового квадрата, который передается функции getmap
В конце файла видно, что я выбрал 12 квадратов 12го увеличения и хочу скачать их на глубину 7 (т.е. до 19го увеличения включительно).
Если боитесь, что вас забанят в гугле за черезмерную активность по скачиванию планеты себе на жесткий диск - также реализуйте ф-ции _proxify и _change_proxy.
Также можно потом поправить
скрипт отрисовывающий качество покрытия для визуализации детальности кэша.
Например, у меня получилось так:
И это занимало около двух гигабайт и покрыло
вот такую территорию.
2. настроить локальный кэш
Ставим nginx версии не ниже 0.5.31 (которая включает замечательную возможность - proxy_store) и конфигуряем его примерно так, как
сконфигурял его я. :)
Замечания по конфигу приветствуются (кроме вопроса, когда же в proxy_pass будет возможно использование хотя бы адекватного набора констант).
3. заставить браузер ходить в кэш
Скормить браузеру примерно такой файл авто-конифгурации proxy:
function FindProxyForURL(url, host) {
if (host.match('kh[0-9]+\.google\.com'))
return 'PROXY 127.0.0.1:1234';
return 'DIRECT';
}
Во всяком случае данный пример работает с firefox.