воскресенье, 14 ноября 2010 г.

Брестская крепость

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

Об Александре Коршунове отдельно: он вне тусовки и в новоделе не помоился. Роль Гаврилова тянет на второго «Заслуженного Артиста России», а Коршунов уже. Ну, про репрессии в отношении Гаврилова, которые озвучены в конце фильма, наверное всем уже известно. Когда в интерпретации Угольникова репрессиями названа задача охранять ЗК, в википедии это превращается в «сослан в сталинские лагеря». К реальному факту: восстановлен в звании, служил начальником лагеря для японских военнопленных и получал благодарности — понятие репрессии имеет очень опосредованное отношение.

Ну а в целом Угольникову большое спасибо. Всё есть, всё: игра актёров, операторская работа, спецэффекты. Когда игра актёров — это режиссёр, а когда всё — это уже продюсер. Что бы Угольников после этого ни наплёл, памятник нерукотворный себе он уже воздвиг. Он и сам это понимает.

ссылки по теме:
Исаев анализирует «Крепость»
Угольников оправдывается
обратно обзор историка
клип

Итого: всем смотреть. Читаю книжку.

четверг, 29 июля 2010 г.

ну погоди, Джим Рейнор

Кто-нибудь уже зарубился в Старкрафт2? Стесняться не буду, признаюсь: зарубился. Прикольные заставки между миссиями: Джим Рейнор бухает в кабаке. Это такой мессадж подсознанию: «Привет, игрозависимый!». Жидкость в стакане для виски то зелёненькая, то прозрачная, чтобы детям смотреть было можно.

Близзарды создали интерактивное анимэ: кровавые брызги на фоне платонической любви Рейнора к Аэлите-Кэрриган. Платоническую любовь игроку воспроизводить неинтересно, а побрызгаться можно вволю, не напрягая мозг.

Какой мессадж несёт аппликация на скафандре морпеха-уголовника? Мой вариант: «Граница на замке». Ваше мнение?

четверг, 15 июля 2010 г.

Питер и Нск на картах мира

Оказывается, Яндекс карты, Бинг мэпс и Гугол карты находят "Питер"! Гугол даже "Нск" находит, в том числе и через API. Проверить можно на map.pr, поле Go To в правом верхнем углу карты, если что. Может "Нск" Гугол понимает, когда спрашиваешь из Новосибирска? Вообще кажется, что скоро мысли читать начнёт.

А Йеху мэпс не говорит по-русски.

воскресенье, 13 июня 2010 г.

Миядзаки в Н-ске

В Н-ске, в кинотеатре «Седьмое небо» на площади Калинина прокатывают Миядзаковские мультфильмы. Вчера ходили с Леной на «Принцесса Мононоке». Качество не сильно лучше, чем на дисплее, экран не по-широкому большой. Прилеплены фанские субтитры, жаль, что не в переводе от ст. о/у. Несмотря на это (смотря, смотря), было здорово.
Крутить будут до 23 июня.

суббота, 15 мая 2010 г.

популярная эзотерика

В магазине Book Look в центральном зале есть отдел "популярная эзотерика". Популярной механики, физики, психологии в магазине нет. В глубине магазина есть ещё один отдел: эзотерика. Видимо, ещё один отдел создали специально для пытливых умов посетителей магазина.

воскресенье, 9 мая 2010 г.

Про баньян с джемом

С Днём Победы!

Закончился квалификационный раунд Google Code Jam. Это такая всемирная олимпиада с алгоритмическим уклоном. Решать весело — алгоритмы не часто встречаются в повседневной работе. Организовано хорошо. Рабочему человеку отойти от повседневной рутины трудно: надо выделить время, подготовить рабочее место и т.д. Для этого добавили квалификационный раунд. Длится он целых 24 часа: можно без спешки настроить инструменты и приступить к решению собственно задач.

В контексте Джема этом году меня порадовали два события: появилась народная Идея — свободная (и бесплатная) IDE с открытыми исходными кодами. Задачи Джема разрешено решать только с помощью свободных инструментов. Второе, разработчики Гугола открыли доступ к guava-libraries аж 4 релиза. Теперь (двадцать лет спустя) в Яве можно легко и просто читать строки входного файла:
Files.readLines(in, Charsets.UTF_8, new LineProcessor() {

    public boolean processLine(String line) throws IOException {
        // обрабатываем стоку
        return true;
    }

    public Integer getResult() {
        return null;
    }
});

или в одну строчку отсортировать список, оставив в нём уникальные элементы:
    times = Ordering.natural().sortedCopy(Sets.newHashSet(times));

Уже похоже на языки высокого уровня, такие как Перл или Питон, правда? В строке нет и следа того, что список times на самом деле генерализирован для BigInteger. Когда пишешь код, в Идее работает автодополнение и проверка типовой безопасности. В какой IDE для Перла или Питона настолько же удобно, быстро и безопасно писать код?

В общем, в этом году пересел с Перла на Яву. Квалификацию прошёл, посмотрим, что будет в первом раунде.

С Днём Победы!

суббота, 1 мая 2010 г.

про Катынь

Маленькая ветка в ЖЖ Вассермана. Профессионального историка, между прочим.
Решение о публикации фальшивок подтверждает характеристику, когда-то данную Анатолием Чубайсом: отмороженный. Давно данную, ещё до президентства.

Здесь статья Мухина. Осмысление истории у Юрия Игнатьевича малоправдоподобное, но писать он безусловно умеет. На факты всегда смотрит под оригинальный углом зрения. Данная статья очень сильная. Попал в верхний отдел позвоночника.

четверг, 22 апреля 2010 г.

о фундаментах

Отсюда:
They say a house is only as good as its foundation, and we believe the same holds true for web applications like Google Docs. With our old foundation, we could continue delivering most features you wanted quickly, but over time it became clear that some just weren’t possible. So we decided to rebuild the underlying infrastructure of Docs to give us greater flexibility, improved performance and a better platform for developing new features quickly.
Aга, я даже знаю что это за новый фундамент такой. Покойтесь в мире, Closure Tools.

воскресенье, 4 апреля 2010 г.

вы ненавидите HTML?

А помните, была такая IDE — Delphi? Вот что мне напомнил веб-фрэймворк Ваадин: никакого языка разметки или таблиц стилей — процедурный язык программирования, интерфейс пользователя верстается наглядно, с помощью мастера. Вроде и сам занимаюсь клиентскими веб-приложениями, вроде давно известны мощные продукты (привет Гуголу) в этой области, но факт существования такой IDE заставляет по-новому взглянуть на положение дел в отрасли. Новая платформа уже не стучится в дверь, она уже пришла. Хотите в Quake в браузере сыграть?

среда, 31 марта 2010 г.

Великая Война / Барбаросса

Новый и первый вменяемый сериал по ВОВ на ОРТ. Для тех, кто, как и я, проживает без телевизора, показывают по серии в неделю. Режиссёр Валерий Бабич. Авторы сценария — широко известные в узких кругах Исаев и Драбкин. Смотрел с удовольствием. Качать с пока легальных файлообменников и уже нелегальных торрентов.

суббота, 13 марта 2010 г.

про Федору

Вывел компы в эфир. Оказывается, вместо точки доступа за $200 (карточка + недо-комп с линуксом) можно воткнуть в мега-комп карточку за $20 (линукс там уже есть) и настроить с ней точку доступа.

Карточка D-Link DWA-510 — это сети g, а не n, но WPA2-PSK у неё есть. Как было замечено, первый результат в Google по запросу «WPA2-PSK»: «Взламываем WPA2 PSK ...». Пусть где-нибудь на Гриде пароль и можно поломать, но проще начать с соседей: в комнате ловятся 4 чужие сети (Академгородок, понимаешь!). Две из них сидят на одном и том же канале и глушат друг друга. Одна защищена WPA-PSK, остальные WEP. Можно у себя поднять FreeRadius над WPA2-EAP, такое и за десять лет не сломают, но неохота ковыряться.

DWA-510, которая мне досталась, построена на чипсете RaLink, а бывают другие варианты. Позвонил в Квесту и Техносити, но только в ВИП-компьютерс согласились просветить чипсет карточки перед покупкой. Вставляем LiveCD в привод и

#lspci | egrep -i network
05:02.0 Network controller: RaLink RT2561/RT61 rev B 802.11g

Это то, что надо.

Для настройки точки доступа нужен пакет hostapd. Во времена былинные приходилось дополнительно пересобирать ядро, а сейчас пакет включен в репозиторий... Федоры 12, а не 11. Проапгрейдить дистрибутив легко. То есть было бы легко, если бы сначала прочитал ресурс обновляем Федору используя yum. Вместо этого я выкачал DVD-дистрибутив (не помешает) и проапгрейдился с него. Дистрибутив вышел в конце прошлого года, с тех пор Федора 11 на локальной машине обновлялась, здесь скопилось много новых пакетов, которые оболочка модернизатора менять на свои, старых версий, не решается. Встала лишь малая часть пакетов Федоры 12, остальное пришлось заменять вручную.

Разобрался как убрать графический загрузчик: сообщения в текстовой консоли вселяют больше уверенности, чем безликий progress bar. Графический загрузчик включается параметром ядра rhgb (Redhat Graphic Boot). Нет параметра — нет загрузчика. Заодно добавил параметр vga=792 — консоль может и должна выглядеть красиво. Как оказалось, сделал это зря.

Через неделю начал шуметь копеечный вентилятор на старенькой NVidia GT7300, и я заменил её на валявшуюся без дела Radeon X1950 Pro. Новая карточка в три-четыре раза мощнее, чем старая, но геморроя с ней в линуксе больше на порядок. Потому что это — ATI. Для неё есть (сюрприз!) аж три драйвера: от самой ATI, от Новелла, и свободный. Первый даёт лучшую поддержку для 3D, но сделан для старых иксов. Для Федоры 12 — не вариант, к тому же в линуксе я не играю. Второй, говорят, глючит. Третий — самый стабильный для 2D, но у меня с ходу не завёлся. Нагуглив проклятия линуксоводов всех стран компании Nvidia, я уже собирался сбыть карту с рук на барахолке, как вдруг наткнулся на совет выкинуть опцию vga=792 из параметров ядра. Опция грузит модуль фрэймбуфера, тот конфликтует с radeonfb (о чём пишет) и вроде бы выгружается, да, оказывается, не совсем.

Ну а без vga=792 тишь (карточка тихая) и благодать. И тебе фильмы смотри без тормозов, и тебе в консоли разрешение 128 столбцов на 43 строки. Очень нравится в линуксе то, что если проблема решена, то она решена на годы. Способ настройки сетевой карточки на стороне винды подробно изложен на форуме убунту. Ниже конфиги Федоры — может кому понадобятся?


### WiFi D-Link DWA-510: с помощью визарда system-control-network
статически задать адрес IP:
адрес 192.168.130.1
маска подсети 255.255.255.0
остальное не трогаем



### WiFi D-Link DWA-510: /etc/hostapd/hostapd.conf

ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0

wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

wpa_passphrase=ваш очень длинный и не угадываемый по словарям пароль

# Most modern wireless drivers in the kernel need driver=nl80211
driver=nl80211

# Customize these for your local configuration...
interface=wlan0
hw_mode=g
# канал надо выставить подальше от соседских
channel=1
ssid=яркое и запоминающееся название вашей сети



### WiFi D-Link DWA-510: избранное из iptables линуксового сервера
# линуксовый сервер == файервол == точка доступа == статический ip 192.169.130.1
# виндовый клиент == статический ip 192.169.130.2
# чтобы пакеты сервера снаружи не отличались от клиента, в mangle:
-A PREROUTING -i wlan0 -j TTL --ttl-set 64
# маскарадим в nat:
-A POSTROUTING -s 192.168.130.0/24 ! -d 192.168.130.0/24 -j MASQUERADE
# в filter:
-A INPUT -s 192.168.130.0/24 -i wlan0 -j ACCEPT
-A INPUT -s 192.168.130.1/32 -i lo -j ACCEPT
-A FORWARD -s 192.168.130.0/24 -i wlan0 -j ACCEPT
-A FORWARD -o wlan0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i wlan0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -s 192.168.130.1/32 -j ACCEPT


### /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.130.255;
option routers 192.168.130.1;
option domain-name-servers 85.118.224.121,89.31.118.1;
authoritative;

subnet 192.168.130.0 netmask 255.255.255.0 {
   interface wlan0;
   range 192.168.130.3 192.168.130.100;
}


### /etc/sysconfig/dhcpd
DHCPDARGS=wlan0


Для Федоры 14:

### добавить в /etc/rc.d/rc.local строчку
echo 1 > /proc/sys/net/ipv4/ip_forward
при установке выключить сервис NetworkManager и включить сервис network


### Radeon X1950: избранное из /etc/X11/xorg.conf
Section "Device"
Identifier  "Radeon"
Driver      "radeon"
VendorName  "ATI Technologies Inc"
BoardName   "RV530 [Radeon X1650]"
BusID       "PCI:1:0:0"
EndSection

воскресенье, 14 февраля 2010 г.

История с GWT

Если кто не знает, GWT — это не только компилятор Явы в Яваскрипт, но и библиотека виджетов, сериализация-десериализация RPC клиентом и на сервере, плагин для IDE Eclipse, собственные (native) методы на Яваскрипте. Компоненты более-менее независимые, главное там — компилятор. Хочешь — используй стороннюю библиотеку виджетов, хочешь — иную IDE (Идея рулез). По сравнению с GWT проект Google App Engine выглядит брендовой песочницей. С помощью GWT сам Гугол построил интерфейс Adwords и «Волну». Есть аналогичный набор инструментов для компилирования сырого Яваскрипта в оптимизированный Яваскрипт, о котором хорошо написал Илья Кантор. Между прочим, после оформления Closure Tools в отдельный проект и создания «Волны», я было решил, что Гугол не считает коммерчески обоснованным далее скрывать код инструментов разработки на сыром Яваскрипте. Однако судя по косвенным признакам, Google Bazz написан скорее с помощью Closure Tools, а не GWT, и хоронить Closure Tools рано.

Пример работы GWT со спрайтами. Кратко, суть спрайтов в том, что много мелких картинок собирают в одну, чтобы уменьшить число HTTP запросов для отрисовки страницы (пример). Когда рисуют страницу, средствами CSS кусочек картинки-агрегата подставляют фоном к нужному элементу, и выглядит это точь-в-точь как оригинальное единичное изображение. На практике: собираете мелкие картинки в графическом редакторе, копаетесь в получившемся винегрете, высчитывая координаты составляющих кадров, переносите данные в CSS, проверяете в браузере. Для команды специально обученных верстальщиков это просто. А если потом нужно добавить ещё одну картинку, повторям снова. Ну, вы поняли. В GWT это выглядит следующим образом:

1. утилитой генерируем интерфейс для стилей (назовём его Style)

2. вручную набиваем другой интерфейс: ресурс, где связываем интерфейс стилей со стилями, а произвольный геттер с исходной картинкой.
public interface Resources extends ClientBundle {

Resources RESOURCES = GWT.create(Resources.class);

@Source("layout.css")
Style style();

@Source("images/appLogoSmall.png")
ImageResource appLogoSmall();
}
3. Возвращаемся в стили и прописываем там спрайт:
@sprite .logo {

gwt-image: "appLogoSmall";
position: relative;
top: 18px;
}
4. Используем генерированный класс во время выполнения программы, ссылаясь на метод


Resources.RESOURCES.style.logo()

или в шаблоне GWT UIBinder (отдельная тема)


<ui:with field='res' type='za.co.jigsaw.saas.gwt.resources.client.Resources'/>
<!-- Здесь навесим логотип: -->
<div class='${res.style.logo}>


компилятор сам сгенерирует нужные параметры классу .logo, чтобы он отображал картинку, а картинки соберёт в одну. У выходных файлов (картинка, CSS) имя составлено как хэш-функция от содержимого, что позволяет кэшировать их в браузере навечно.

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


url(data:image/png;base64,iVBORw0KGgoA...

увидел, что компилятор встроил картинку в файл CSS! Трюк, возможный в Лиске, но не в ie6/7, для которых генерируются свои CSS. Если специально обученные верстальщики могут полениться сравнить: встроенная картинка в случае FF или картинка-агрегат, то компилятор выбирает оптимальный вариант. Внимание разработчиков GWT к деталям производит впечатление.

Это была преамбула, а теперь — амбула. Проект — SaaS с адвордовским пользовательским интерфейсом. Как в теме поста, надо научить дружить историю браузера с GWT. История — это «вперёд», «назад» и перезагрузка страницы (либо её загрузка по урлу). GWT работает с историей на низком уровне, а надо привязать её к архитектуре MVP. Известно два варианта: один изложен в предыдущей ссылке а другой — GWT Presenter (сторонняя библиотека под GWT). Второй сейчас используется в проекте. На низком уровне, история оперирует токенами. Токен — это кусок урла, который идёт после знака ’#’. Изменения токенов отслеживается.

Подробнее про GWT Presenter. Веб-приложение разбито на страницы. Хотя GWT приложение и помещается на одной странице, GWT Presenter разбивает его на места (Places), по которым можно перемещаться с помощью навигации, меняя токены. Грубо говоря, каждому месту соответствует своё представление (view), которое управляется презентатором (presenter). Похоже на странички.
Токены используются для того, чтобы:
1) попасть в нужное место
2) хранить состояние презентатора, чтобы по внешней ссылке или при обновлении странички попасть в нужное состояние приложения.

Пример 1:
Переход из списка элементов к редактору элемента. Презентатор списка выставляет презентатору редактора идентификатор (здесь 2010:3) и вызывает его revealDisplay(), что приводит к обмену событиями по системной шине:
...: «Презентатор, покажись!»
Презентатор: «Я показался!»
Место: «Это мой презентатор? Ага, я показалось!»
Местный управляющий: «Какое-то место показалось... давай токен.»
Место: «Презентатор, давай своё состояние.»
Презентатор: «Идентификатор сейчас ’2010:3’»
Место: «Ясно, значит токен будет ’#settings/lifecycles/edit/;lid=2010:3′. Возвращаю токен.»
Местный управляющий: «А что, в истории по-другому? Ладно, заношу токен в историю.»

Пример 2:
Переход в редактор по ссылке из браузера. Ссылка ведёт на страничку с токеном
#settings/lifecycles/edit/;lid=2010:*

Происходит обмен событиями по системной шине:
Местный управляющий: «Чёрт, история поменялась. Запросили место для ’settings/lifecycles/edit/’!»
Место: «Это что, про меня, что-ли? Щас обработаю. Презентатор, твой идентификатор теперь ’2010:*’, понятно?»
Презентатор: «Угу, законфигурировал.»
Место: «Презентатор, покажись!»
... далее см. пример 1...
Место: «Я показалось»
... опять см. пример 1...

Пример 3:
Перенос изменения состояния презентатора в токен (и историю браузера), чтобы при обновлении странички состояние осталось прежним. Пользователь меняет значение фильтра с 2009 на 2010 год, и начинается обмен сообщениями по системной шине:
Презентатор: «Я поменялся!»
Место: «Это мой презентатор? Я поменялось!»
Местный управляющий: «А тебя сейчас видно? Ага, понятно. Давай токен.»
Место: «Презентатор, фильтр теперь какой?»
Презентатор: «Вот, 2010»
Место: «Ясно, значит токен будет ’#settings/lifecycles/;year=2010′. Возвращаю токен.»
Местный управляющий: «А что, в истории по-другому? Ладно, заношу токен в историю.»

Если сравнить работу GWT Presenter’а с каркасом веб приложения, выходит, что компоненты маршрутизации (routing) и декодирования запроса/кодирование ответа представлены в целом неплохо. Обратная маршрутизация неявно подразумевает, что место для презентатора, который покажут, уже создано. Недостатки: использование сообщений/обработчиков сверх меры. При переходе по ссылке (см. Пример 2) нужное место можно вообще находить синхронно. Обработка похожих сообщений («я появился», «я показался») почти совпадает друг с другом. Ещё про недостатки:

Пример 4:
На страничке (в одном месте) расположены два списка: список пользователей и список ролей. Оба списка можно фильтровать: пользователей по флагу активен/неактивен, а роли по статусу админ/просто пользователь. Логично сделать два отдельных презентатора, каждый из которых наследует функциональность базового презентатора списков. А архитектура GWT Presenter ставит презентатор и место в соответствие один-к-одному. В результате здесь требуется добавить избыточный презентатор, который будет делегировать передачу состояния от места к презентаторам пользователей и ролей и наоборот, а самое неуклюжее — передачу события «я поменялся» на системную шину, потому что место не желает следить за событиями чужих презентаторов.

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

В конце мая пройдёт традиционная конференция Google IO, на котором заявлены аж два доклада по архитектуре GWT приложений. Будем надеятся, докладчики просветят в области архитектуры, типичной для GWT приложений. Пока что буду переделывать GWT Presenter. Попробовать что-ли обратные вызовы?