SATtva Персональная страница
темы архив все rss xml 2.0
 
 
блог
досье
связь
english
 

MITM от Yota

22.05.2015
крипто

По-видимому, при попытке открыть запрещённый ресурс по HTTPS, Yota приветствует своих пользователей попыткой подмены сертификата:

image

Nice try Yota, but no.

Циклическая сортировка в Python

05.04.2015
софт

Предположим, у вас есть длинный список ссылок, ведущих на небольшое число хостов. Что-нибудь вроде:

links = ['http://foo.com/page1',
         'http://foo.com/page2',
         'http://foo.com/page3',
         'http://foo.com/',
         'http://blah.org/file0',
         'http://blah.org/file1',
         'http://foobar.net/some_page',
         'http://foobar.net/another_page',
         'http://foobar.net/yet_another',
         'http://blah.org/file2',
         'http://blah.org/file3',
         'http://blah.org/file4']

Надо скачать страницы/файлы по этим ссылкам, но не создавая избыточную нагрузку на каждый из хостов, чтобы, так сказать, пройти ниже радара.* Можно ввести паузы между закачками, но это сильно затянет исполнение.

Самое простое решение -- отсортировать список так, чтобы хосты чередовались между собой, и последовательные запросы гарантировано приходились на разные хосты. Но как выполнить такую сортировку, не прибегая к громоздким циклам? На помощь приходит модуль itertools.

Для начала определим критерий сортировки: нас интересует имя хоста:

from urllib.parse import urlparse

sort_by_host = lambda url: urlparse(url).netloc

Ну, а теперь самое весёлое. Этот код можно легко переписать в однострочник, но, памятуя, что свобода лучше, чем несвобода явное лучше неявного, сделаем его более наглядным:

from itertools import groupby, zip_longest

# Сортируем по именам хостов.
sorted_urls = sorted(links, key=sort_by_host)
# Группируем хосты.
grouped = [list(group) for _, group
           in groupby(sorted_urls, key=sort_by_host)]
# Сортируем хосты циклически.
interleaved = list(zip_longest(*grouped))
# Преобразуем в однородный список без None-элементов.
output = [item for group in interleaved
          for item in group if item is not None]

# Полученный результат.
for link in output:
    print(link)

# http://blah.org/file0
# http://foo.com/page1
# http://foobar.net/some_page
# http://blah.org/file1
# http://foo.com/page2
# http://foobar.net/another_page
# http://blah.org/file2
# http://foo.com/page3
# http://foobar.net/yet_another
# http://blah.org/file3
# http://foo.com/
# http://blah.org/file4

Для ценителей лаконичности та же функция в одну строку. Ну, или уж как получится. :)

output = [i for e in list(zip_longest(*[list(g)
          for _, g in groupby(sorted(links, key=sort_by_host),
          key=sort_by_host)])) for i in e if i is not None]


* Реальная задача, из которой родился пост, была связана с API некоторого сайта, лимитирующим плотность вызовов, но детали той задачи не столь иллюстративны в рамках краткой заметки.

GPG Remote

18.02.2015
софт

За полтора месяца в свободное время написал по просьбам трудящихся небольшую клиент-серверную систему для использования GnuPG в относительно недоверенной среде. Система позволяет обезопасить закрытые ключи пользователя от утечки через локальное скомпрометированное приложение.

Документация на английском и репозиторий
Документация на русском
Скачать

Показали по тиви

10.02.2015
blender

Ну, почти. На самом деле, в Голливуде на Academy Awards (в простонародии, Оскар) acceptance talk, где чествовали Эрвина Коуманса, главного разработчика Bullet Physics.

Пару лет назад Phymec (a.k.a. Chiaroscuro) обратился с просьбой позаимствовать какой-нибудь из этих панорамных рендеров для одной из его потрясных физических анимаций (сделанных с использованием той самой библиотеки Bullet), на что я, конечно же, с удовольствием согласился.

И тут ВНЕЗАПНО... Не перестаю удивляться, насколько мир маленькая деревня.

Нямка

02.01.2015
blender

image

image

image

Деревянный Томск

02.01.2015
мнение

В продолжение предыдущего поста, чтобы придать ему более ясный контекст, вот отличная фотосерия, посвящённая деревянной архитектуре Томска. У некоторых снимков, на мой вкус, слишком тяжёлая HDR-обработка, но в целом очень здорово передают атмосферу.

Центр творческой конвергенции

02.12.2014
blender

Концептуальный конкурсный проект развития исторической территории в рамках Преображенской зоны (г. Томск).

image

image

image

image
image
image
image

image

image

image

image

image

image

image
image
image
image

Пришёл чудесный спам

21.10.2014
право

Избранное:

Детективное агентство ********** предлагает Вам информационно-поисковые услуги
<...>
Тексты СМС – 160.000 за месяц, 250.000 за полгода (МТС, Билайн, Мегафон)
<...>
Определение местоположения по телефону – 50.000 рублей (по всему миру, точность до дома), если телефон в Москве – 40.000 рублей
<...>
Пробив IP-адреса – 35.000 рублей (Московский регион)
<...>
Движения средств по счету фирмы – 100.000 рублей за год (любой регион)
Остаток средств на счету фирмы и сумма оборота за квартал – 50.000 рублей
<...>
Взлом почты (mail.ru, yandex.ru, rambler.ru) – 15000 рублей (результат зависит от посещаемости ящика)
<...>
А также ряд специфических услуг (помощь в возврате долгов, физическая поддержка, получение прав без экзаменов, разрешение на оружие и т.д. и т.п.)

Сбился со счёта, на сколько статей УК они тут нарекламировали.

По ссылке -- убогий сайт-визитка с половиной пустых разделов. Телефоны с московскими номерами, офис -- в Махачкале.

Интервью, вот, дал

14.08.2014
blender

По блендероводству.

Кто хотел на pgpru матановую капчу?

10.10.2013
софт

Из нового движка:

image