Автовыставка на МВЦ

Сходили на автовыстовку на МВЦ, посмотрели на новое изделие от «Лады» (смотрится неплохо) и их новый концепт «Лада 4x4» (смотрится ужасно), посидели в Mini Cooper, пересмотрели кучу других машин, видели нового робота «Хонды», последнюю модель, я видео снял.

Только вот выложить его никуда не могу: с youtube, например, его удалили. Кто что ещё посоветует?

Из минусов: простудился до состояния «лучше убейте» и дома нет интернета.

10 комментариев

Робот «Асимо»

На видео — робот «Асимо» фирмы «Хонда», последняя модель. Снято на автовыставке, которая проходила на МВЦ в этом году. Видео я не монтировал, кое-где придётся проматывать.

Добавлено позднее: в связи со смертью сервиса «Яндекс.Видео» ролик более не доступен.

12 комментариев

Гаджеты: новый телефон

Свою Nokia N73 я собираюсь в этом году отправить на свалку истории. В итоге, я очень недоволен этим телефоном. Из-за мелочей в интерфейсе и из-за медленной, после установки необходимых приложений, работы.

Думаю пока что выбрать. Из претендетов — iPhone 3G, который скоро появится у трёх операторов в Москве, HTC Touch Pro и Samsung SGH-i900 WiTuю

В первом останавливает необходимость разлочки (хотя вопрос — так ли это необходимо?), второй не нравится интерфейсно, кажется неэстетичным меню, третий отпугивает небольшим (по разрешению) и нестандартным экраном. Кто ещё может что-то посоветовать?

25 комментариев

iPhone 3G: официальные заявления

«Билайн», похоже, первым официально заявил о подписании контракта с Apple на поставку iPhone 3G. В их PDF-отчёте от 28-го августа написано:

VimpelCom announced today it has signed an agreement with Apple to bring iPhone 3G to Russia expected later this year.

Вчера то же самое сказал нам «Мегафон»:

ОАО «МегаФон», первый общероссийский оператор мобильной связи, сегодня официально объявил о подписании соглашения с американской Apple Inc. о продажах телефонов iPhone 3G в России.

Продажи iPhone в России начнутся уже в этом году Что же МТС молчит? По неофициальной информации продавать второй iPhone с контрактом будут три оператора GSM, включая «МТС», но я уже волнуюсь. Переподключаться я не буду.

12 комментариев

iPhone: ура! и МТС!

Оказывается уже в пятницу (у меня дома нет интернета, пишу из «Кофе Хауза») МТС объявила о подписании соглашения с Apple по поводу продажи iPhone:

Москва, РФ — ОАО «Мобильные ТелеСистемы» (NYSE: MBT), крупнейший оператор сотовой связи в России и странах СНГ, сегодня сообщил о подписании соглашения с американской Apple Inc. о продажах iPhone в России.

Продажи iPhone в России начнутся уже в этом году.

Я уже начал беспокоиться, что придётся куда-то подключаться, если я выберу в качестве следующего телефона iPhone.

3 комментария

Python

В последние три дня прочитал кучу документации по Python (язык программирования). Уже без труда пишу и читаю что-то подобное (Ваня, зацени):

[r'% r',][~0] % {(): '''^''' uR'|' in 2**2*__name__[::-8//(lambda _:~_)(3 or 2)]*2}<2>3j,(`3`) is ([])

Кто-нибудь скажет, не запуская,чему это будет равно?

14 комментариев

PHP: compliler_halt_offset

Малоизвестная возможность PHP, появившаяся с версии 5.1 — аналог секции DOC из Perl. Позволяет создать специальную текстовую секцию в конце файла скрипта, откуда можно будет читать данные, например, туда можно поместить страницу помощи к программе или какие-то метаданные.

Секция начинается вызовом специальной конструкции __halt_compiler(), всё, что дальше этой строки интерпретатор не считывает и не выполняет. Смещение, по которому начинаются данные за конструкцией, доступно через константу __COMPILER_HALT_OFFSET__. Почему нельзя было сделать константу, указывающую на файловый ресурс (по аналогии с STDERR) для меня загадка.

Использовать можно, например, так:

echo file_get_contents(__FILE__, null, null, __COMPILER_HALT_OFFSET__);

// the end of the script execution
__halt_compiler();Hello, world!

На печать программа выведет строку «Hello, world!».

4 комментария

Microsoft взялась серьёзно за браузер: IE8

Microsoft серьёзно взялась за стандартизацию своего браузера. В блоге IE появилась статья, где рассказывается о дальнейших шагах по преобразованию браузера. Например, все расширения CSS будут теперь начинаться с префикса («-ms-»), как того требуют стандарты. Причём речь идёт не о нововведениях (IE7 уже поддерживает свойство «-ms-interpolation-mode» с префиксом), а о существующих свойствах. К примеру, «zoom» будет теперь называтся «-ms-zoom».

Хорошая новость: фильтры будут! только теперь они будут называться «-ms-filter» и выглядеть как обычное свойство, взятое в кавычки. Т. е. для указания прозрачности (загибайте пальцы) мы будем использовать: opacity (CSS3), -moz-opacity (старые FF), -khtml-opacity (старые Konqueror), filter (IE ниже 8) и -ms-filter (IE8 и выше).

Для сайтов, которые переделать невозможно (из-за объёма или запущенности), остаётся возможность использовать Compatibility View (режим обратной совместимости).

4 комментария

Комиксы: заяц ПЦ и его воображаемые друзья

ПЦ! (24.06КиБ)

Продолжаю делиться комиксами, которые я люблю. У Линор Горалик есть отличнейший комикс «Заяц Пц и его воображаемые друзья: Щ, Ф, грелка и свиная отбивная с горошком». Рекомендую.

6 комментариев

Как избавляться от прилипал-торговцев на улице

Фразу из небольшого рассказа с форума Алекса Экслера надо заучить:

В меня как-то такой орел вцепился на улице, «мы дарим вам замечательный шведский светодиодный фонарь»… Я изрядно развлекся. Фонарь взял, сказал спасибо, я принимаю подарок, сунул его в сумку и пошел.

Он несется рядом, «но подождите, подарок в том, что он продается в три раза дешевле, чем в магазинах, я не успел рассказать вам все условия, предлагаемые нашей фирмой…» А я спокойно и радостно ему объясняю: «Договор дарения — реальная сделка, заключенная в момент ее исполнения. Вне зависимости от суммы, этот договор может быть заключен в устной форме, поскольку исполняется в момент заключения. Ваша фирма в Вашем лице сделал мне оферту, я ее акцептовал и принял подарок. Право собственности на передаваемую по договору вещь, если о ином не договаривались, или иное не предусмотрено законом, переходит в момент фактической передачи вещи. Т. е. фонарик — уже моя собственность, мне больше ничего не надо от его фирмы и от него лично. Я очень благодарен. Ни о каких условиях договора не могло и речи идти, посколькудоговор дарения не может быть заключен под условием, о чем прямо указано в гражданском кодексе. Если он считает, что я незаконно отнял у него вещь, мы можем зайти по дороге в милицию, и он составит там заявление с указанием всех подробностей происшествия. Если милиция ничем ему не поможет, то его фирма сможет обратиться в суд с иском ко мне об истребовании фонарика…» и т.д

После 15 минут такого общения, когда мы дошли до моего офиса, я увидел, что парень ужу чуть не плачет. Стоимость-то с него точно бы удержали… Пожалел, отдал фонарь, порадовался счастью на его лице.

14 комментариев

Chrome: война клоническая началась

Хорошо, я выскажусь о «Хроме», тем более многие ждут. К «Хрому» я абсолютно равнодушен, вплоть до того, что даже его не поставил и не удосужился у кого-то посмотреть. Я лишь пролистал скриншоты на «Хабре» и просмотрел многочисленные статьи о сравнениях его с другими браузерами. Этот браузер меня интересует не больше, чем «Amaya» или «Arachne».

34 комментария

Ошибка в валидации поля: виноват PHP

function validateDigit(e) {
    var re = /[0-9x0Dx08]/i;
    var code;
    if (!e || !e.which) {
        if (window.event) {
            code = event.keyCode;
        }
    }
    else code = e.which;
    if(!code) return;

    if (!re.test(String.fromCharCode(code))) return false;
}

Что бывает от невнимательности (скрипт с сайта управления ГИБДД МВД от РТ): пропали слеши и в поле ввода вводятся буквы «d» и «x». А всё от stripslashes.

3 комментария

IE8beta2: ACID3

Как-то все забыли про ACID3. Проверил им Internet Explorer 8 beta 2 и Chrome (специально для этого скачал!). Итак, по сравнению с ближайшими конкурентами:

Opera 9.60beta1 — 85% FireFox 3.1 beta1 — 85% Chrome 0.2 beta — 79% WebKit r36309 — падает на 26% Internet Explorer 8 beta 2 — 21%

14 комментариев

Chrome: не к добру

Интересно, через какое время сообщество обнаружит about:network в «Хроме», научится включать «I/O Tracking», увидит там, что каждый день «Хром» качает что-то некислое с «Гугла» и поднимет панику?

И сколько умных людей сходит в поисковик и выяснит, что это подгрузка чёрных и белых списков фишинговых и вредоносных сайтов (Safe Browsing API)?

Речь идёт об URL вида «http://static.cache.l.google.com/safebrowsing/» и других со словом «safe», браузер сначала получает данные о том, что ему нужно получить, а потом потихоньку скачивает необходимые данные. Кстати, Google Safe Browsing используется и в FireFox3.

9 комментариев

Поиск «утечек» в Python

У home_virtualis нашёл интересную статью о поиске «утечек» в Python на практике: «Exception #08: Поиск „утечек“ памяти в python-программе». Будет интересно всем тем, у кого в программе на Python неоправданно накапливаются ресурсы с каждой итерацией.

Кстати, с конечным выводом статьи я бы поспорил:

Память не «утекает» в python просто так. Если в программе есть рост используемых ресурсов, то практически всегда это обозначает плохую архитектуру с необоснованно долгим сроком жизни каких либо объектов.

Что называть «Пайтоном»? Если «голый» интерпретатор, то «текущих» популярных интерпретаторов сейчас, наверное, нет. Но язык без модулей мало кому нужен. Как только подключаются внешние (скомпилированные) модули, вот тут начинаются утечки и падения. Например, у меня «Пайтон» упал уже несколько раз при попытке использования µTidylib. Один раз — при попытке открыть несуществующий файл.

Мне кажется, что стабильность интерпретатора определяется ещё и стабильностью его популярных расширений. Хоть разработчики к ним отношения могут и не иметь, но без них язык не решает популярные задачи, ради которых его и изучают.

14 комментариев

Python 3.0

Не знаю когда выйдет «Пайтон» версии 3 (roadmap я не смотрел), но что в нём нового мне хочется знать уже сейчас. Из всех изменений для меня наиболее непонятное замена конструкции print на функцию с тем же названием. Видимо для того, чтобы можно было её перекрыть?

Это изменение для меня лично неудобно. В дальнейшем придётся держать в голове на какой версии я пишу — 2.5 или 3.0 (в 2.6 эту функцию можно импортировать из модуля __future__). В Python 2.5 конструкция print () выведет пустой тупл (tuple), а в Python 3.0 — пустую строку. Соотвественно, print (’a’, ’b’) в 2.5 означает печать тупла со значениями ’a’ и ’b’, а в 3.0 — вывод двух строковых параметров.

Все остальные изменения одобряю со страшной силой (хотя зачем нужно было рушить синтаксис исключений мне тоже неведомо, чтобы не пересекались указания нескольких обрабатываемых исключений и переменные, куда они помещаются?).

13 комментариев

Бесполезное: переводим строку в десятичные коды

Недавно решил попристальнее посмотреть что нового появилось в CMD (язык пакетных файлов Windows) со времён Windows NT. Написал небольшую программу, которая переводит строку в десятичные коды. Мне показалось, что CMD стал ещё более нелогичным чем был. Например, я так и не догадался как решить все проблемы с кавычками. Какое бы решение я не придумывал для того, чтобы проверить входной параметр, я тут же придумывал решение для того, чтобы разрушить код.

В итоге, исключить в программе влияние кавычек я не смог. Если у кого-то получится, расскажите как это делается в CMD. Вот программа:

@ECHO OFF
REM BOLK

REM Вспомогательная процедура для прохождения по массиву
IF NOT "%2"=="" GOTO :LINE

SETLOCAL
REM Входной параметр
SET LINE="%~1"
ECHO In: %LINE%

REM Сюда попадёт результат из ONE
SET OUT=""
REM Переменная останова вспомогательной процедуры
SET LINEBREAK=0
REM Сюда мы поместим результат и выведем его
SET RESULT=
CALL :ONE

REM ECHO Out: %OUT%
REM GOTO :EOF

REM Цикл прохода для DEBUG, который даст нам кучу переменных с шестнадцатеричными
REM значениями в каждой
(ECHO E100 %OUT% 0 && ECHO D100 && ECHO Q) | ^
FOR /F "usebackq tokens=2-15 skip=2 delims=- " %%a IN (`DEBUG`) DO ^
@CALL %0 %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n

GOTO :EOF

: Процедура осторожного разбора входной строки, разбираем так,
: чтобы спецсимволы не попали в код
:ONE
SET L="%LINE:~-2,1%"

REM Это для DEBUG — нужно чтобы заэкранировалась кавычка
IF ^%L:~1,-1%==^" (
  SET OUT="""%OUT:~1,-1%
) ELSE (
  SET OUT="%L:~1,-1%%OUT:~1,-1%"
)

SET LINE="%LINE:~1,-2%"

IF NOT %LINE%=="" GOTO ONE
GOTO :EOF

: Процедура для прохода по массиву. Так как вызывается через pipe,
: тормозить придётся самостоятельно — родительский процесс ничего отсюда
: не получает
:LINE
IF %LINEBREAK%==1 GOTO :EOF
IF "%1"=="00" (SET LINEBREAK=1 && ECHO %RESULT% && GOTO :EOF)
CALL :CHAR %1
SHIFT
GOTO LINE

: Победа разума над CMD — преобразование hex->dec
:CHAR
SET /A RES=0x%1
IF DEFINED RESULT (SET RESULT=%RESULT% %RES%) ELSE SET RESULT=%RES%

8 комментариев

Если бы программистов звали элохим

Когда я слышу «если бы программисты строили дома, то первый же дятел разрушил бы цивилизацию», мне хочется сказать:

Посмотри на себя! Одна нога короче другой, один глаз меньше, позвоночник плохо приспособлен к вертикальным нагрузкам, не говоря об ударных, одна трубка для пищи и воздуха, нижние рёбра имеют незакреплённые концы! Зачем тебе соски? Почему ногти защищают ту сторону пальцев, которая меньше всего контактирует с окружающей действительностью? Плохо с балансом: стоит чем-то не попользоваться с месяц и оно атрофируется, не говоря уже о мелких багах, как персональных (чихание на яркий свет), так и общих (слепое пятно в глазу). Кстати, запакован человек неплохо, вот только распаковывается мучительно долго.

19 комментариев

Проводит ночи 31-я весна

Ну вот мне и 31 год. Формально это случится в 6:30 утра, но, думаю, уже можно поздравлять.

За прошедший год я успел:

  • расставить все точки над «ё» в прошлом
  • жениться
  • сменить три работы
  • переехать жить в Москву
  • прочитать 70 книг
  • накопить денег на хорошую машину
  • наконец-то встретиться с Романом Ивановым, Димой Смирновым и Ильёй Бирманом
  • полюбить Питер
  • побывать в 19 музеях и выставках

35 комментариев

ЖЖ от 2008-09-13 00:11:00

Мне 31 год. Поздравить меня можно у меня на сайте. Не пугайтесь, там всё просто, в поле коментария, там где написано «Ваш OpenID» выберите «Логин в LiveJournal», в следующем поле напишите свой ник в ЖЖ, а большом поле — свой комментарий.

Оставить комментарий

The reports of my deatch are greatly exaggerated.

Пока я праздновал свой день рождения ЖЖисты из сообщества «kazan», модератором коего я являюсь, похоронили президента республики Татарстан Минтимера Шаймиева. Якобы президент умер в Кемере, где отдыхал с семьёй.

Главную «виновницу» переполоха, которая первой поделилась новостью, уже вызывали в «куда следует». Центральные издания информацию опровергают, а в качестве источника сведений о кончине президента цитируют, в основном, ЖЖ Ирека Муртазина, который поделился новостью позднее, но зато является заметной фигурой в официальных кругах. Хотя кое-кто уже цитирует официальный некролог одной из казанских газет.

Теорий у народа на этот счёт две: президент умер или кто-то намеренно распускает «дезу», чтобы сыграть на падении акций предприятий Татарстана.

9 комментариев

То, что мешало плохому танцору, теперь у музыканта

тестигитара (46.46КиБ)

Не знаю что это, но выглядит забавно. Нашлось поиском в «Яндексе» по какому-то из запросов, исходный сайт не отвечал.

5 комментариев

Расширение RSS: «Яндекс», поиск по блогам

«Яндекс» выпустил специальный RSS-плагин к популярным PHP-форумам для сервиса «Поиск по блогам». Автор — известный PHP-программист Дима Смирнов. На медленно стухающей «Хабре» немедленно появились те, кто «не читал, но обсуждают».

В чём же заключается смысл плагина? Поскольку я в курсе, давайте расскажу.

Сервис поиска по блогам «Яндекса», как вытекает из названия, индексирует блоги и многим кажется, что на этом его отличие от основного поиска заканчивается. Как бы не так! Поисковик «Яндекса» индексирует HTML-страницы, поисковик поиска по блогам индексирует RSS, а в RSS сайты отдают какое-то небольшое количество последних постов.

Проблема, как несложно догадаться, в том, что существую сайты, которые старше сервиса, а так же такие, до которых поисковик добрался недавно. Львиную часть их содержимого индексатор поиска по блогам не видит — из RSS они давным-давно пропали.

Дима с командой поиска по блогам придумали очень простую и эффективную штуку. RSS — формат расширяемый, для него уже масса расширений, это нормальная практика. Если заглянуть в RSS любого диминого сайта, то можно увидеть, что в нём упоминается новое расширение: «ya:more», т. е. новый тег «more» в пространстве имён «ya».

Для того, чтобы его использовать, в тег «rss» нужно дописать строку

xmlns:ya="http://blogs.yandex.ru/"

и вставить тег «ya:more», содержащий URL, указывающий на RSS, содержащий предыдущие N постов:

<rss xmlns:ya="http://blogs.yandex.ru/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">
<ya:more>http://coprophagous.ru/rss/posts/740</ya:more>

Получается много связанных этим тегом документов, в последнем из которых тег «ya:more» отсутствует. Таким образом индексатор поиска по блогам может пройтись по всем постам блога и проиндексировать их. СЕОшники должны оценить.

Заслуга Димы заключается не только в том, что он придумал простое решение проблемы и мотивировал команду поиска реализовать её, но ещё и в том, что он написал готовые плагины, которые добавляют эту функциональность для трёх популярных форумов на языке PHP: PHPBB, vBulletin и IP.Board.

Кроме этого, формат позволяет индексировать и комментарии к записям, в том числе и древовидные. Подробнее об этом можно прочитать в файле readme.html, который находится внутри архива с плагинами.

16 комментариев

Питон — это такая змея

Меня удивляет, что некоторые программисты со рвением называют язык программирования «Пайтон» «Питоном». Безотносительно истории происхождения названия, должен заметить, что названия не переводятся. Ruby никто не называет «Рубином», язык «Си» языком «Вэ», а SmallTalk «Непринуждённой Беседой».

Python — это «Пайтон».

60 комментариев

Сон разума: снится Python

Вот что родил мой мозг в текущем проекте:

def trim(letter):
    SKIPLEAD = object()
    SKIPINNE = object()

    todelete, stage, skipped = [], SKIPLEAD, 0

    for idx, blank in enumerate([x == '' for x in letter]):
        if stage == SKIPLEAD:
            if blank:
                todelete.append(idx)
            else:
                stage = SKIPINNE
        else:
            if blank:
                skipped += 1
                todelete.append(idx)
            else:
                if 0 < skipped < 3:
                     todelete = todelete[0:-skipped]
    return [letter[idx] for idx in set(range(0, len(letter))) - set(todelete)]

20 комментариев

Разум проснулся: Python itertools

С подсказки Вани в комментариях к предыдущему посту посмотрел itertools. И вот что я вам скажу товарищи. Если за что-то и любить «Пайтон», то за итераторы и генераторы (а ещё за суперпозицию функций, но это отдельная тема), а переписанный код из предыдущего поста выглядит теперь вот так:

from itertools import groupby, chain,  starmap

def ntrim(letter, n=3, replby=1):
    return list(chain(
            *starmap(
                lambda item, grp: [grp, [''] * replby][item and len(grp)>=n],
                ((item, list(grp)) for item, grp in
                    groupby(chain(['']*n, letter, ['']*n), lambda x:x)
                )
            )
        ))[replby:-replby]

Я модифицировал исходную задачу: последовательности из трёх и более пустых строк заменяются на одну, пустые элементы в начале и конце списка удаляются. И ещё я прибил ленивый триплет из Python 2.5, потому что на домашнем ноуте у меня 2.5, а на рабочем сервере будет 2.4. Надо, кстати, будет посмотреть не цепляется ли он как-то через __future__. Завтра посмотрю, сейчас — спать.

13 комментариев

PHP: мануалы читать необходимо

Я изучаю новый язык следующим образом: сначала всегда полностью читаю руководство (вот с «Пайтоном» мне не повезло — в руководстве, которое я выбрал, об itertools было упомянуто вскользь), потом уже пробую что-то писать, изредка показывая куски кода для критики.

Конечно, руководство полностью наизусть я не помню, но зато всегда помню, что «что-то где-то было», это частно избавляет от изобретения велосипедов.

В свежей статье на «Хабре» — один из подобных велосипедов:

function uptime() {
    $fp=@popen('uptime','r');
    $s=@fgets($fp);
    @fclose($fp);

    @preg_match('#load average: ([0-9\.]+)#', $s, $m);
    return $m[1];
};

Во-первых, в PHP есть функция sys_getloadavg, во-вторых, (если версия PHP ниже 5.1.3) эту информацию можно добыть значительно проще: «(float) substr(strstr(`uptime`, „load average:“), 13)», в третих, можно (на Линуксах) читать /proc/loadavg.

В этой статье вообще масса забавного: в разделе «временные припарки», где index.php заменили для снятия нагрузки, для чего-то использовался print, вместо того, чтобы выдать сообщение голым html, memcached используется как база данных и так далее.

8 комментариев

За что я люблю свою жену

Диалог по SMS:

— не обижайтесь на своего мужа, он хороший. Аноним — аноним, я на мужа не обижаюсь. но пусть к тому времени, когда надумает ребёнка, сделает куклу в свой рост, чтобы быть иногда с малышом. :)

За что ещё (кроме всего прочего) люблю жену — за то, что она может привести сильные и разумные аргументы, при этом без всякого давления.

P.S. Ссылка от Кости Коломейца: картонный папа.

1 комментарий

Спираль истории: @font-face

Когда на земле было всего два браузера — IE и Netscape Navigator, они оба поддерживали разные виды внедряемых шрифтов. IE поддерживал своё, но бесплатное решение, Netscape использовал платное решение от BitStream. В те времена вебмастера интересовались возможностями браузеров ещё меньше, чем сейчас и этой возможностью мало кто пользовался.

Хотя в Татарстане, где я жил, технологию внедряемых шрифтов использовали очень часто для поддержки татарского алфавита на сайтах.

Суть технологии очень проста: шрифт подключается как любой внешний ресурс (другие примеры — графика, CSS, JS) и им можно писать что-то на странице. Netscape помер, а решение Microsoft всё-таки вошло в CSS, хотя и в изменённом виде.

На данный момент, оказывается, во всех браузерах, включая альтернативный, на какой-то стадии есть поддержка внедрения шрифтов (@font-face):

  • у Internet Explorer есть наиболее удачная из всего зоопарка разработка — поддержка шрифтов в формате EOT
  • у Opera эта поддержка есть в лабораторном билде, значит появится и в самом браузере (поддерживается TTF)
  • Safari (WebKit) поддерживает эту технологию ещё с октября прошлого года
  • у FireFox, вероятно, поддержка появится в версии 3.1, по крайней мере сейчас существуют сборки, в которых она уже есть
    Хочу сразу сказать почему я считаю, что у IE наиболее удачное решение: разработчик может указать какие именно знаки оставить в шрифте, что даёт огромную экономию по размеру. Другие же браузеры поддерживают шрифты в форматах TrueTypeFont и OpenType. Легко представить к чему это приведёт: подключать будут гигантские Unicode-шрифты, содержащие всё что только возможно, вплоть до вымерших алфавитов.

17 комментариев

Python iterstrip: itertools для чайников

Я общел рассказать как работает конструкция, которую мы, в итоге, в Ваней породили для тех, кто не знаком с itertools в Python. Для начала формулировка задачи: есть список (list) последовательности строк. В нём все поледовательности пустых строк, длиной более двух надо заменить на одну пустую строку, а пустые строке в начале и конце списка удалить.

Из [’’, 1, 2, 3, ’’, ’’, ’’, ’’, 4, ’’, ’’] мы должны получить аккуратное [1, 2, 3, ’’, 4].

Код, который получился в итоге, с некоторыми упращениями, выглядит вот так:

return list(
            chain(
                *(
                    [[''], grp][item or len(grp)<3]
                        for item, grp in (item, list(grp))
                            for item, grp in groupby(chain(['']*3, letter, ['']*3), lambda x:x))
                )
                )
        )[1:-1]

Заголовок функции я приводить не буду, чтобы не плодить отступы, в функцию входит параметр letter, который содержит обрабатываемый список, возвращается, соответственно, обработанный список. Я постараюсь обойтись без определения генераторов и итераторов, просто представьте, что данные «текут» по функциям, что позволяет их обрабатывать очень экономично, даже если они бесконечные.

Центральное место этой программы, функция groupby группирует входящий список, пользуясь результатом функции, записанной во втором параметре, как признаком группировки. Список не пересортируются, в группы объединяются данные, идущие подряд. На выходе появляется список туплов (tuples), состоящих из результата работы функции, применительно к группе и списка (точнее объекта _grouper) объединённых результатов:

[(x, list(k)) for x, k in groupby([1,2,3,-4,-1,2], lambda x: x>=0)]

Я тут прошёлся по списку [1, 2, 3, -4, -1, 2], объединяя его значения при помощи функции x>=0. Т. е. все подряд идущие числа с одинаковым знаком будут сгруппированы. Получится вот что:

[(True, [1, 2, 3]), (False, [-4, -1]), (True, [2])]

сверху на groupby я навесил генератор — по сути, цикл, который проходит по всем элементам groupby, раскладывая тупл (tuple) в два элемента — x и k. Этот цикл для каждой итерации возвращает результат, форма которого записана перед циклом. Это тупл, состоящий из двух элементов: k (где записан результат группировочной функции) я оставил неизменным, а объект _grouper я преобразовал в список.

Функция chain объединяет итератор, для простоты можно пока представить, что она склеивает списки. Конструкция «[’’]*3» эквивалентна [’’, ’’, ’’] — трём пустым строкам. Таким образом, строка «for item, grp in groupby(chain([’’]*3, letter, [’’]*3), lambda x:x))» делает следующее: по итератору, состоящему из трёх пустых строк, нашего списка letter и ещё трёх пустых строк, проходит функция groupby, которая группирует элементы по самому простому признаку: «lambda x: x», т. е. группируются одинаковые элементы, далее по получившемуся списку туплов проходит цикл, каждый тупл раскладывается на два элемента: item и grp, где из grp делается список (при помощи вызова «list»).

Выше находится конструкция «[ [’’, grp] ][item or len(grp)<n]», выглядит она страшно и кажется «птичим языком», но на деле широко применяется в самых разнообразных языках, включая PHP, сейчас я её объясню. Результатом «item or len(grp)<n» будет True или False. Условие, на мой взгляд, очевидное: если строка не пустая или последовательность меньше 3, то True. True и False используются как индекс списка и выбирают, соответственно, первый или нулевой элемент массива, т. е. список, содержащий пустую строку или группу символов.

Цепочка такая:

Иcходная последовательность: [’’, ’1’, ’1’, ’’, ’’, ’’, ’3’, ’’, ’5’] Добавили с двух сторон пробельные строки: [’’, ’’, ’’, ’’, ’1’, ’1’, ’’, ’’, ’3’, ’’, ’5’, ’’, ’’, ’’] Прошли groupby и генератор: [ (’’, [’’, ’’, ’’, ’’]), (’1’, [’1’, ’1’]), (’’, [’’, ’’]), (’3’, [’3’]), (’’, [’’]), (’5’, [’5’]), (’’, [’’, ’’, ’’]) ] Прошли через условие на птичьем языке: [ [’’], [’1’, ’1’], [’’, ’’], [’3’], [’’], [’5’], [’’] ]

Далее у нас стоит chain, который принимает аргументом всё, что получилось, но с префиксом звёздочка. Chain, как я писал выше, объединяет итераторы, для простоты мы считаем, что это, с натяжкой, эквивалентно объединению списков. У нас есть список, содержащий списки. Хорошо бы эти списки склеить.

В PHP есть функция call_user_func_array, которая принимает на вход два параметра: фукнцию, которую надо вызывать и массив её параметров. В PHP я бы склеил эти списки вот так: call_user_func_array(’array_merge’, $letter). В Python делается всё то же самое, только синтаксис этого вызова другой: func(*args). Это означает, что когда будет вызвана функция func, список args станет списком её аргументов, chain принимает на вход любое количество элементов.

Таким образом мы получим вызов chain(*[ [’’], [’1’, ’1’], [’’, ’’], [’3’], [’’], [’5’], [’’] ]), что эквивалентно chain([’’], [’1’, ’1’], [’’, ’’], [’3’], [’’], [’5’], [’’]). На выходе мы получим следующий итератор, который как список выглядит вот так: [’’, ’1’, ’1’, ’’, ’’, ’3’, ’’, ’5’, ’’].

Легко заметить, что какое бы количество пробельных строк не было по краям, в конце всегда остаётся по одной. От них нам нужно избавиться. Делается это просто, в Python есть срезы, которыми я и пользуюсь: список[1: -1] означает «вернуть список с первого элемента, убрав ещё один с конца». В PHP это будет array_slice($list, 1, -1).

В итоге [’’, ’1’, ’1’, ’’, ’’, ’3’, ’’, ’5’, ’’][1:-1] даст нам искомое: [’1’, ’1’, ’’, ’’, ’3’, ’’, ’5’].

Мда. Что-то как-то не очень всё просто получилось :)

13 комментариев

Когда начинается старость?

Мы в офисе немного поспорили на тему каким возрастам соотвествуют какие названия. Вот в каком возрасте начинается зрелость? Мы поискали в «Яндексе». Я недавно читал на эту тему небольшую главку в одной книжке, а для моих сослуживцев эти данные оказались сюрпризом:

до 15 лет — детство
16—30 лет — юность
31—45 — молодость
46—60 — зрелость
61—75 — пожилой возраст
76—90 — старческий возраст
91 и старше — долгожители

Я недавно завязал с юностью и шагнул в молодость.

9 комментариев

Киев

Съедили в Киев на выходные. Красивый, (относительно) чистый, добрый, старинный город. Оооочень много красивых старых зданий, всё (по сравнению с Москвой) очёнь дёшево. Украинская речь понимается на слух без каких-либо проблем, но большая часть людей в Киеве разговаривает по-русски.

Украинский очень милый язык («подарункы», «кава» и «смачно» ласкают слух), первый день понравился больше всего, на второй день был ливневый дождь, попытка посушиться в жлобском отеле и холодный и поломанный поезд №4, который почему-то называют «фирменным».

Из приятных мелочей — множество растений (каштаны, о!), в переходах — куча цветов, которые не продаются у нас, и интересная фишка — на телефоне, где высвечивается информация о базовой станции, в метро показывается название станции метро (проезд в метро стоит 50 копеек, т. е. около 2.5 российских рублей!).

В итоге, поездка (включая номер в отеле, который мы сняли, потому что нам нужно было посушиться), с дорогой, едой и посещениями музеев, обошлась около 6500 рублей на человека.

Юра, спасибо что позвал!

10 комментариев

noindex в поисковике Sphinx

В замечательном поисковике Sphinx (кстати, очень рекомендую, есть биндинги в Ruby, Python, PHP, Perl), как известно, нет поддержки тега NOINDEX. Я два дня был на конференции РИТ: высокие нагрузки, ради доклада по Sphinx (доклад читал автор) встал в восемь часов, зато узнал, общаясь с автором в кулуарах, несколько полезных трюков.

Один из них — как сделать NOINDEX, простой и очевидный, но я не успел до него догадаться. У Sphinx есть опция html_remove_elements, которая позволяет указывать содержимое каких HTML-тегов следует игнорировать. Обычно там указаны SСRIPT и STYLE, добавляем туда NOINDEX и результат достигнут.

P.S. Dizzy57, привет!

8 комментариев

Анекдот про Python

Приходит первый элемент итератора к доктору.

— Доктор, меня все игнорируют. — next

Смешно?

6 комментариев

HTC X7500

Чёрный смартфон HTC с выдвижной клавиатурой и экраном на Windows Mobile, показывающим дату 10 января 2007, имя владельца John Smith, время 7:46 и напоминание о встрече с HTC.

Купил себе HTC X7500 на день рождения.

VGA (640×480), дисплей 5 дюймов, 262144 цветов, 128МБ RAM, 256МБ ROM, встроенный microdisk в 8ГБ (если не хватит, если возможность вставить flash-карту miniSDHC до 32ГБ), есть съёмная QWERTY-клавиатура, GPS, WiFi, Bluetooth, TV/VGA-выход, две камеры (3 мегапикселя), одна из них — со вспышкой, встроенный телефон (3G, EDGE, HSDPA, GSM, UCDMA).

Поставил Windows Mobile 6.1, пока всё нравится. Есть масса недостатков, но я рад, что выбрал систему на Windows, под неё есть всё, что душе угодно.

Основные паттерны использования: MP3-плеер, читалка книг, выход в интернет (браузер, почта), GPS-навигатор, телефон, камера для заметок.

25 комментариев

HTC X7500: Hands free

Свежекупленный HTC X7500 действительно такой кирпич, каким кажется на картинках. Большой, тяжёлый, металлический. Прикладывать его к уху нелепо и он с самого начала рассчитан на разговор через hands free (идёт в комплекте). Это не является для меня серьёзным недостатком, но длина провода не позволяет таскать устройство в сумке.

Беспроводные наушники Jabra с черными амбушюрами и серебристыми чашками, на белом фоне.
Jabra BT620s

Я с самого начала рассчитывал купить беспроводную гарнитуру, желательно — стерео. Купил Jabra BT620s. Она давно выпускается, отлично выглядит, лёгкая и все отзывы положительные.

Засада заключается в том, что по умолчанию Windows Mobile не поддерживает стерео. Поправить, впрочем, это достаточно просто, есть масса решений, я выбрал то, что описано на форуме сайта 4PDA, заодно поднял качество звука до максимума (говорят с этим масса проблем, от «заиканий» до меньшего времени работы), но я пока не столкнулся с проблемами, буду решать их по мере появления.

После всех манипуляций, качество отличное, меня всё устраивает.

Оставить комментарий

YoTa: интернет WiMAX

Я стал бета-тестером нового WiMAX-провайдера «Йота», потестирую — опишу впечатления. WiMAX — это беспроводной «дальнобойный» интернет. «Йота» — первый провайдер мобильного WiMAX-интернета в России, все провайдеры до этого предоставляли услуги только фиксированного (стационарного) интернета.

10 комментариев

Я, клипарт

Как я и предполагал, фотографии нашей свадьбы потихоньку растаскивают на статьи. Один из примеров — иллюстрация к статье «В чём секрет семейного счастья» на сайте «Православие и мир».

Нам, кстати, не жалко.

23 комментария

Blogcamp

Три минуты назад принял решение отказаться от приглашения на «Блогкемп», так Смирнов уже написал об этом. По «Яндексу» новости распространяются моментально.

5 комментариев

← сюда туда →