Программирование

Статистика для блоггеров

Сначала картинка. А вы так можете (не по цифрам, а по группировке данных)? Более подробные картинки будут ниже.
blogstats1.png
Я не знаю, есть ли нормальные средства статистики для блоггеров. Наверное, для простых случаев — есть. В ЖЖ можно поставить один из множества ЖЖ-счетчиков (уж не знаю, хороши ли они), на standalone-блог можно поставить обычный счетчик. Но это — для простого случая.

Умножение матриц, серия 5: вычисления на GPU (2)

Почему переделываем тесты?

Предыдущая моя статья на эту тему была написана в феврале 2007 года, сразу после выхода первой публичной бета-версии CUDA Toolkit/CUDA SDK. Представители NVidia предупреждали, что в бета-версии производительность не является оптимальной, к релизу она будет улучшена.

За прошедшие полгода, пока я занимался совсем другими вещами, были выпущены релизы:

  • NVidia CUDA: SDK и библиотеки CUBLAS/CUFFT v1.0;
  • NVidia CUDA Display Driver 162.xx (драйвер, собственно, транслирует псевдокод в реальные программы GPU);
  • RapidMind Platform версий 2.0.0, а затем и 2.0.1.

Интересно посмотреть, стала ли производительность лучше.

Опять про MovableType и dirify

Сегодня меня порадовали, дескать подписка на комментарии в твоем блоге не работает.

Действительно, на ряде записей ссылка "подписаться на комментарии к этой записи по RSS" была битая, вела на несуществующий фид.

Разбирательство показало, что:

  • Это касается только записей, где последняя буква (буквы) в title - непечатная (мягкий-твердый знак или знаки препинания). Эти символы дирифицируются в подчеркивание.
  • Сами такие записи имели URL вида date/bla_bla_.html (фиды: bla_bla_.xml).
  • Ссылки из списков записей (по месяцам, по рубрикам) были правильными.
  • А вот ссылки, сформированные через <$MTEntryBaseName$> вели на bla_bla.html.
Засучив рукава, я полез читать исходники MovableType и мне открылось страшное.

Мизантропическое-2

А знаете ли вы, что плагин Crossposter (к MT4) не работает с ЖЖ по двум прозаическим причинам
  • Во-первых, автор XML::Atom::Client при постинге новой записи делает POST (как и положено), а при обновлении имеющейся - PUT (вот ударило ему в голову). Мораль: не тестировали, даже не пытались.
  • Во-вторых, тот же модуль не забывает перекодировать текст из utf-8 в &#xNNNN (нафига, спрашивается?), ничего не делает с title и не передает кодировку принимающей стороне.

Всех бы убил, но боюсь один остаться. Попатчил в очередной MTLJPost (видели бы вы, как он конфигурируется под MT4, просто смех один), расслабился.

Да, теперь коментарии разрешены везде.

Movable Type 4: nofollow и noindex

К MT3 был отдельный плагин nofollow, который приписывал атрибут rel=nofollow ко всем ссылкам в комментариях.

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

Естественно, о российских реалиях и теге <noindex> в SixApart не знают. Прилагаемый

патч
решает эту проблему. На глаз - работает.

P.S. Если вы не знаете что такое "патч", то он вам не нужен

Как один мужик Calendar Widget починял

Те, кто программировал календарь для показа на вебе (и вообще в программах) знает, какая это мучительная задача. Тут и високосные годы и заполненные/не заполненные недели и много всего разного.

В то же время, иметь календарик в блоге — приятно, особенно если он не сильно пустой. По счастью, авторы Movable Type дают готовый Calendar Widget, который даже работает. И я даже им долгое время пользовался, но полного счастья не было:

  • Календарик - одинаковый на всех страницах. Включая, например, архив за ноябрь прошлого года. Хотя разумнее в архиве за прошлые месяцы показывать календарь за эти месяцы.
  • А если быть точным, то календарик на странице отвечает моменту ее генерации. Для архива за прошлый месяц - это будет дата последней записи за тот месяц, другими словами там будет правильный календарь пока вы не перегенерируете страницу.
Одним словом, бардак. Впрочем, есть средства его починить, но сначала нужно поставить задачу.

Мизантропическое

Голосом зануды:
MovableType 4.x. Казалось бы, давно имеем систему Widget Set, можно собрать сайдбар из этих самых виджетов мышкой и разместить в блоге. Прекрасная штука, была еще в 3-й версии.
Однако в 4-й версии про них явно забыли и включаемые элементы настраиваются переменными (по сути, дефайнами) в шапке страницы. Как-то так:
<MTSetVar name="sidebar" value="1">
<MTSetVar name="module_recent_entries" value="1">
<MTSetVar name="module_category_archives" value="1">
Ну скажите пожалуйста, если widget set - это плохо, то нафига для них отдельный пункт меню завели ? При этом, естественно, набор переменных новых темплейтов в документации не описан, несмотря на то, что одно из ключевых Release Notes у четверки озвучено как Kick-ass documentation. Впрочем, если kick-ass переводить буквально, то ощущение от документации сходится. Попробуйте там найти что-нибудь действительно нетривиальное....

MT-Colorer. Кажется прекрасной заменой для кривого, косого и т.п MTCodeBeautifier-а (который, извините уже непонятно как скачать, хорошо что в заначке был).
Но он тянет за собой ports/devel/colorer, который в свою очередь хочет принести все известные ему библиотеки и компиляторы java, после чего все ломается. Видите-ли JDK 1.4 не собирается GCC 4.2, а у меня это, пардон, системный компилятор (FreeBSD-current) и другого тут не носят.

Эх, хорошо что я незлобивый. Другой бы давно всех убил, один бы остался. (С) Успенский, близко к тексту.

Экспорт темплейтов Movable Type

Как и обещал ранее, родил скрипт для упрощения работы по переносу темплейтов MT:
cкачать tmpl_export_lite.zip

Это не замена 97-баксового Template Exporter, а именно скрипт для легкой автоматизации работы (переносить через dump/restore не всегда удобно):

  • Предназначен для работы с Template Installer, в частности кормится его конфигурационным файлом.
  • Работает с командной строки, если у вас хостинг, то нужен shell-доступ, ftp недостаточно.
  • Назначение: сохранить результаты работы через интерфейс MT в виде, пригодном для установки TemplateInstaller (например, в другой блог). Сохраняются только темплейты, уже определенные в Template Set
  • Все настройки перевода (<__trans=..) естественно пропадают, ибо в базе данных оно сидит уже переведенное.

Апгрейд Movable Type (3.x -> 4.x), часть первая

После десятка экспериментов на кошках, была отработана (и проделана на данном блоге) процедура апгрейда на Movable Type 4.x с третьей версии. В общих чертах она совпадает с рекомендованой авторами MT4, хотя имеются, конечно, и всякие локальные отклонения.

В пошаговом виде процедура выглядит так: После десятка экспериментов на кошках, была отработана (и проделана на данном блоге) процедура апгрейда на Movable Type 4.x с третьей версии. В общих чертах она совпадает с рекомендованой авторами MT4, хотя имеются, конечно, и всякие локальные отклонения.

В пошаговом виде процедура выглядит так:

Голова нужна не только, чтобы в нее есть....

"Чисто случайно" выяснил, что Export в Movable Type 3.3 не экспортирует теги. Кучу всякой хрени экспортирует, а теги - нет.

Другими словами, процедура апгрейда в 4-ку будет примерно такой:

  • апгрейдим по стандартной процедуре (как-то даже будет работать) до 4.0
  • делаем экспорт
  • ставим рядом блог с нуля (меня, напоминаю, волнуют новые темлейты)
  • делаем импорт.
  • дальше перенастраиваем и все такое.

Мда, я конечно уже 20 лет в разработке софта и все такое прочее, но о людях был лучшего мнения.

MT: перенос темплейтов (боремся с чужой жадностью)

Разработчики MovableType, судя по всему, предполагают, что вся работа с темплейтами должна происходить внутри интерфейса системы. В ряде сортов колбасы потребности, очевидно, нет. В частности, нет способов сделать:
  • backup/restore только темплейтов;
  • использование темплейтов одного блога для другого;
  • редактирование внешним редактором, а не встроенным уебибожеством.

Понятно, что разработчики плагинов в стороне не остались и Mark Carey предлагает готовое решение в виде плагинов Template Exporter и Template Installer. Есть правда одна закавыка, Installer бесплатен для некоммерческого использования, а вот за Exporter автор хочет $97.

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

<b>pg_dump -E UTF8 -F c -t mt_template movabletype | ssh server pg_restore -d movabletype -c </b>

Это, естественно, для инсталляции MT на PostgreSQL. C MySQL я практически не знаком, но уверен что средства побэкапить-поресторить табличку есть и там. Для переноса Archive Mapping нужно таскать табличку mt_templatemap. Конечно, мы неявно предполагаем что:
  • blog_id на двух инсталляциях совпадает
  • нужно перенести все темплейты всех блогов.

Естественно, для чуть более сложной задачи: экспортировать не все, а только для одного блога, экспортировать в файлы (и импортировать из них) придется попрограммировать. На первый взгляд, экспорт в формате, пригодном для импорта через Template Installer должен уложиться строчек в 20.

Movable Type 4: апгрейду быть

Несколько дней поковырял в фоновом режиме на тестовом сервере 4-й Movable Type и таки решил апгрейдиться.

Причин тому несколько (из cписка новых фич перечислены только важные для меня):

  • Главная причина апгрейда.
    Новая система темплейтов хоть и не идеально соответствует моим желаниям, но все же гораздо ближе к ним, чем старая.
    Старые темплейты я последний раз проклинал пару дней назад, переводя RSS-фид на Feedburner: пришлось исправить всего то мест пять (в идеале должно быть одно).
  • Более человеческие средства кросспоста в ЖЖ, используемый сейчас MTLJPost чудовищен.
  • Возможность сделать ветвящиеся комментарии, этот плагин был и для версии 3.3, но заставить его работать я так и не смог.
  • Встроенная поддержка OpenID, отчего использование этой авторизации стало менее замысловатым.
  • Активные авторы плагинов будут делать их (и исправлять ошибки) под 4-ю версию, а на старые — очевидно забъют.

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

Помимо этого, не подходят и старые стилевые файлы. Т.е. любимый Cutline придется рихтовать самому.

Таким образом, задача явно не на пару часов, а скорее на пару дней. Будем, значит, мучаться, описывая мучения в блоге.

Movable Type 4.0. Апгрейдиться или нет...

Вердикт после попытки пару часов поработать: глюкало. Пусть сначала 4.2 выпустят, потом поговорим

Посмотрел на 4-й Movable Type с точки зрения "апгрейдиться или нет".
Впечатления двойственные:

  • Очень красивая новая панель управления, кнопочки, все мигает и переливается.
  • Появился бэкап (как я понимаю, полный), а не только экспорт.
  • Переделана система темплейтов, явно учли мои замечания :).
  • Есть готовый плагин для кросспоста в ЖЖ, не такой уродский, как используемый мной MTLJpost. Немножко недоделаный, имя аккаунта не видно где должно, но пользоваться можно.
  • Preview - настоящие. Наконец то!
  • апгрейд на тестовой площадке прошел на ура.
Попробовал проапгрейдить тестовую площадку....

Синхронизация MTЖЖ(beta.ya.ru) ? А как ?

А мне вот тут дали добрый совет. Дескать разрешить комментировать во всех зеркалах моего блога, и в ЖЖ-шном и в бетаярушном и чтобы везде были одинаковые ветки и все такое (и все транслировалось бы туда-сюда)

И мне даже в порядке эксперимента оно было бы интересно. BUT HOW ?

Есть ли готовое или частично-готовое решение ? Ну хрен с ним с я.ру пока, но даже двусторонняя синхронизация MT<->ЖЖ похоже малореальна. Как, например, вылить дерево комментариев из ЖЖ ?

Update. В силу излишнего AI у скрипта синхронизации с ЖЖ, пришлось комментирование тут запретить (синхронизации то нету :). Комментируйте ЖЖ-шную копию пожалуйста

Программирование NVidia 8800: вести с веба

В University of Illinois at Urbana, куда я чуть было не уехал заниматься геологией 15 лет назад, в настоящее время читается курс ECE 498 AL : Programming Massively Parallel Microprocessors.

Опуская обычные охи "ну почему этому не учат на ВМК" - все в наших руках и я думаю, что через пару лет такие курсы будут и у нас, тема вкусная - хочу обратить внимание на слайды и транскрипты лекций, доступные вот тут. Читают приглашенные лекторы из NVidia, поэтому основное внимание уделено, сюрприз, NVidia 8800. Курс включает в себя лабы, которые сделаны очень интересно: есть готовая рыба, делающая подготовительную работу (I/O, печать результаты) и студент должен только написать несколько десятков-сотен строк изучаемой функциональности. Что, конечно, экономит кучу непроизводительного времени (смотреть тут)

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

Нравится, как практику, подробный разбор аппаратуры. Вылезает множество подробностей, которые нигде не опубликованы.

Вот о подробностях - ниже.

NVidia 8800GTX: скорость чтения текстур

В предыдущей части мы рассматривали чтение из глобальной памяти Geforce 8800 напрямую ("как из массива C"). При этом отсутствует кэширование, но при оптимальной схеме доступа получается (согласно указаниям NVidia) наибольшая производительность.

В то же время, скорость доступа при неоптимальном паттерне очень маленькая. Для решения этой проблемы (помимо оптимизации паттерна) NVidia CUDA предлагает доступ к памяти как к текстуре. При этом работает двумерное кэширование (оптимизированное под локальный доступ), пиковые скорости должны получаться меньше, а наихудшие варианты - наоборот лучше.

Все это, как обычно, нуждается в изучении.

NVidia 8800GTX: пропускная способность памяти (при использовании CUDA)

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

Из общих соображений, понятно что самая медленная часть суперкомпьютера - память. С одной стороны, теоретическая пропускная способность (bandwidth) составляет 900MHz * 384 бита * 2 (DDR) = 86.4 GB/sec. С другой стороны, раздел 6.1.1.3 руководства говорит о 200-300 циклах memory latency (при, по всей видимости,случайном доступе).

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

Читая веб и блоги: CUDA и прочее программирование на NVidia 8800

На удивление мало жизни происходит по запросу 'NVidia CUDA' в поиске по блогам и новостям. Что у Яндекса, что у Google. Мне это сильно удивительно - штука многообещающая, первая версия SDK датирована ноябрем (появилась примерно 1-го декабря), публичный SDK появился практически месяц назад, а большинство упоминаний в духе "вот вышло", в крайнем случае "читал доку". Таких текстов - навалом, маркетинг NVidia работает. Но скучно.

Помимо форумов NVidia, где заводится по 5-6 новых топиков в день, интересных публикаций немного.

Для начала: Beyond3D опубликовал большой текст про CUDA. Более подробный, чем все что я видел до сих пор (ну, кроме собственно документации).

NVidia CUDA: синхронизация и shared memory

Экспериментально выяснилось, что содержимое shared memory не сохраняется между запусками кода на G80. Всякий раз оно инициализировано, причем значения разные, то 10 (float), то 125.

Плакала идея синхронизации между мультипроцессорами путем завершения kernel. Нет, синхронизироваться можно, конечно, но если хочется сохранить результат, то надо писать в глобальную память.

Читая форумы: NVidia 8800GTX гигафлопсы, консистентность памяти и прочие тараканы

Третий день читаю форумы про NVidia CUDA и радуюсь сырости технологии.

  • Для начала, объявленные 520 GFLOP/s оказались обычным маркетингом The 520 GFLOPS number quoted in the technical brief includes some graphics-specific operations that are not directly accessible from CUDA. С точки зрения вычислений, гигафлопсов там 345 (считая Multiply-Add за две операции). Тоже неплохо. В реальности будет разика в два поменьше, но тоже ничего.
    Для сравнения, гипотетический (пока) 3Ghz 4-ядерный Core2Duo умеет 8 операций на такт * 4 ядра * 3Ghz = 96 GFLOP/s, а получить удастся процентов 70 от этого.
  • Отсутствие атомарных операций сильно усложняет жизнь. Предлагается в цикле писать значение в global memory, до тех пор пока не убедишься в успехе.
  • На текущий момент все вызовы - блокирующие. Т.е. нет возможности
    • Запустить счет и одновременно заливать/выливать данные для следующего/предыдущего счета.
    • Использовать две (и более) карт
    Обещают починить.
  • The performance gain you'll get by using CUDA over the graphics API largely depends on how much your application can take advantage of the shared memory. В-общем, идея понятная, но полностью противоречит всей прошлой истории GPGPU. Может оно и хорошо

Pages

Subscribe to Программирование