2008-05-24
2008-05-20
Microsoft about Vista
2008-05-19
В Spokane всё спокойно
2008-05-07
Выбор домашнего сервера
2008-05-05
Google calculator
pi*(3mm^2) in inch^2: pi * (3 (mm^2)) = 0.0146084351 inch^2
Мой сын на нём считает задачки по физике. Калькулятор знает многие физические константы, может перевести результат в нужные единицы, а то, что единицы совпали, является дополнительной проверкой.
Я когда увидел, попробовал и мне очень понравилось. Я когда-то тоже делал похожую штуку. А потому знаю где лежат одни грабли. И заглянув в заветное место увидел грабли в целости и сохранности. Вот они. Но Гугл зделал их ещё занятнее.
(0 Celsius - 0 Celsius) in Celsius: (0 degree Celsius) - (0 degree Celsius) = -273.15 degrees Celsius
0 Celsius + 0 Celsius: (0 degree Celsius) + (0 degree Celsius) = 273.15 degrees Celsius
0 Celsius *3: (0 degrees Celsius) * 3 = 546.3 degrees Celsius
Собственно, объяснение простое, но сначала ещё один пример:
0 Celsius - 0 Celsius: (0 degrees Celsius) - (0 degrees Celsius) = 0 kelvin
Гугл не умеет работать с размерностями со смещённым нулём. Для абсолютных единиц типа температуры бывают шкалы, гне нуль смещён. Например, температура Кельвина - абсолютная, а Цельсия и Фаренгейта - относительные. Вычитая относительные величины, скажем градусы Цельсия, мы получаем новую размерность - интервал температуры в градусах Кельвина или Цельсия. Очевидно, что переводя интервал в градусы Цельсия не надо прибавлять смещение в 273 градуса. Этим интервал отличается от значения температуры.
Сумма относительных температур должна оставаться в тех же единицах. Т.е. не надо два раза прибавлять смещение. Надо сначала сложить, а затем уже преобразовать размерности. Либо рассматривать одно из слагаемых как интервал, добавляемый к абсолютной величине, что математически то же самое.
В принципе, не очень часто приходится иметь дело со смещёнными размерностями. Температуры да шкалы времени, и, кажется, всё. Так что калькулятор вовсе не плох. Однако с температурами они прокололись. Слишком много сил ушло на попугаев.
Никто не знает, как Гуглу баг зафайлить?
2008-05-02
Куда их совать-то?
О высоком
2008-05-01
Жгун
2008-04-30
Утиная типизация
2008-04-29
2008-04-28
Corteo
2008-04-17
Софт подчиняется закону Паркинсона.
2008-04-15
TGMLC = The Great Moore's Law Compensator
Взято отсюда. Картинка говорит сама за себя. Раньше софт работал быстрее - это не иллюзия, это так и есть на самом деле.
2008-04-10
Прошлогодний кампинг на Sunrise Point.
Пишут же люди операционные системы...
2008-04-08
Весна на Snoqualmie
2008-04-05
Дикие черепахи
2008-04-04
Перевернул зеркало.
2008-04-02
Блог в зеркале
Что мне не очень нравится в LJ, это то, что это не совсем блог, это социальная сеть. Потому там всё заточено на общение, а не на тексты. Опять же, чтобы оставить комент, нужно регистрироваться, логиниться и т.д. Да и дизайн весь какой-то социальный. И всякие рейтинги, "друзья", обсуждения, и пр. Я никогда не принадлежал к никакой тусовке и не переношу никаких рейтингов. Желание уйти из злачного места появляется сразу после просмотра блогов рейтинговых "лидеров" на первой странице. Я туда раньше не заглядывал и правильно делал.
2008-03-31
Опять хакнули баш.
2008-03-30
2008-03-29
2008-03-28
Переползание в blogger.
Unicode
2008-03-26
BIOS Hypervisor
2008-03-25
Смена лампочки в Микрософте
Слегка сокращённо. Я не знаю, как перевести некоторые термины, оставив их на английском.
Этот классический пост Эрика Липперта описывает, со всей мучительной детальностью, какая в точности нужна работа, чтобы добавить одну функцию ChangeLightBulbWindowHandleEx в Микрософтовский код:
# Один девелопер потратил пять минут на написание ChangeLightBulbWindowHandleEx.
# Один программ-менеджер написал спецификацию.
# Один эксперт по локализации проверил спецификацию на возможные проблемы локализации.
# Один эксперт по usability проверил спецификацию на возможные проблемы с usability и accessibility.
# Как минимум один девелопер, один тестер и один ПМ провели "мозговой штурм" по поводу возможных проблем с безопасностью.
# Один ПМ добавил модель безопасности к спецификации.
# Один тестер написал план тестирования.
# Один тест-лид включил его в график-тестирования.
# Один тестер написал тесты и добавил их в ночной автоматический тестовый прогон.
# Три или четыре тестера поучаствовали в "ad hoc bug bash" (поковырялись на предмет багов).
# Один технический писатель написал документацию.
# Один технический корректор вычитал документацию.
# Один технический редактор проверил документацию.
# Один менеджер документации добавил новую документацию в существующую систему, обновив таблицу содержания и поисковые индексы.
# Двадцать пять переводчиков перевели документацию на все поддерживаемые языки. Менеджеры переводчиков живут в Ирландии (для европейских языков) и в Японии (для азиатских языков), сдвинутые по времени относительно Редмонда, потому это не простая логистическая проблема.
# Команда старших менеджеров координирует все эти усилия, оплачивает работу и обосновывает расходы перед вице-президентом.
...
Кто же всё это делает для Open Source? Ответ, согласно комментарию Raymond Chen, это "никто", что говорит о вопиющей непрофессиональности и некачественности ОС софта.
Моё (codinghorror) откровенное мнение: "А вам всё это нужно, чтобы быть успешным?".
А моё мнение, как девелопера, что процесс сильно идеализирован и сокращён. Всё сложнее и дольше даже на первых стадиях. Потому до написания документации дело может дойти только по решению европейского суда.
Зачем всё это нужно мне? Ради одного последнего пункта, "оплачивает работу и обосновывает расходы". Это то главное, чего мне очень не хватает в Open Source.
2008-03-23
Стерео
2008-03-21
Из блога в блог перелетая
2008-03-19
Кто-нибудь хочет в Microsoft?
Вперед, в XXI век
2008-03-18
Vista vs XP
2008-03-17
Суп из рекламы
2008-03-14
Power Pain Point
2008-03-11
Yahоо
2008-03-08
2008-03-06
Неинтересные интересы
2008-03-04
2008-03-03
Выборные игры
Инн-овации
2008-02-24
2008-02-12
Незаметный Подкрад
2008-02-11
Московский цирк
... приехал в нашу деревню. Они выступают три дня в Kirkland Performance Center. Очень понравилось! Молодцы, ребята! Всё чётко, профессионально, весело и красиво. И музыкальное сопровождение замечательное, живое, играло трио с балалайкой, баяном и чем-то типа гуслей и всякими флейтами, но при этом как-то необычно, не заезжено и даже современно.
2008-01-29
Бред
Что противнее всего в этой теперешней простуде - это зацикленный, как "for(;;)" сон, состоящий из одной какой-то неопределённой и бессмысленной, но очень интенсивной мысли, которая во сне казалась очень важной, что-то надо было сделать, и зациклена она была, чтобы, вероятно, я не забыл это сделать, как это иногда бывает с мыслью "не проспать", но выматывает это примерно так же, как зацикленная мелодия из нескольких простых нот. Даже кратковременной пробуждение не помогает. Всё возвращается обратно.
Уже не первый раз думаю, что неплохо бы научиться методике выходить из таких неприятных циклических снов, какое нибудь ментальное расслабление, переключение внимания.
2008-01-13
2008-01-07
Народ обиделся
2008-01-05
Про выборы
2008-01-01
Та самая Татьяна?
2007-12-29
Экслер и фильмы
2007-12-27
Демократы в России
Я благодарен соратникам по партии, которые выдвинули меня кандидатом в президенты. Сделаю все, от меня зависящее, чтобы остался один кандидат от демократических сил.
Звучит угрожающе! Хотя позже он уже пообещал сделать себе хакамаду. А я уж было надеялся на необычные дебаты.
2007-12-25
Год спустя
2007-12-17
Free as in "free cheese".
Тюрьма Азкабан
Alcatraz Island. Магическая тюрьма из "Гарри Поттера". Совпадает по описанию и название похожее. Знаете где это?
2007-12-12
Anyone can hack.
Как пользователь начинает работать с программой? Читает мануал? Нет. Он её запускает и смотрит. Дальше происходит примерно такой мысленный монолог:
... Так, тут обычное меню File с пунктами Open и New. Нажмем New.
... Ага, текстовый курсор, можно печатать. И тулбар с Bold/Italic, значит текст с атрибутами.
... Печатаю, строчка сама переносится, значит редактор не строчный, а по параграфам.
... Ага, выделеный текст можно сделать Bold, а ещё раз нажать и снова обычный.
... Снова нажал New, он спросил сохранять или нет. Значит New не открывает нового окна или закладки, а просто заменяет в том же окне.
И т.д.
Это обычный reverse engineering. Метод "научного тыка". Пользователь играется с приложением и строит у себя в сознании модель того, как эта программа работает. Причем это делает не какой нибудь крутой спец, а каждый рядовой пользователь! Часто это делается интуитивно и неосознанно. Человек даже не помнит как оно работает, но при изменении ощущает, что программа "стала работать как-то не так".
Всё это очевидно? Казалось бы очевидно, но не всем. Почему-то фразу "пользовательская логическая модель" часто воспринимается в штыки. Такая модель должна быть продумана заранее, включая терминологию, в которой и надо делать интерфейс и документацию. Эта модель должна быть проста, логична, полна и, по возможности, состоять из ортогонального набора функций. И она обязательно должна быть discoverable. Иначе будет не программа, а набор хитро запрятаных "пасхальных яиц". Никто ваш длинный readme и FAQ читать не будет, даже если его набрать с capslock.
Для того, чтобы понять нечто в первый раз нужна аналогия. Где-то было так сделано, можно предположить, что и здесь это может работать. Либо поможет "крутой спец", который поделится кусочком своей модели. Либо, конечно, книжка. Кстати, Вы читали инструкцию к вашему телевизору? А к часам на руке?
P.S. Название поймёт тот, кто смотрел Ratatouille.
2007-12-08
2007-12-01
Есть такая партия, в шахматы
Есть "партия власти", которая по определению одна и которая олицетворяет путь на "сохранение завоеваний последних лет" в очередной холодной войне. Суверенитет как высшая ценность. Вероятно, она и соберёт большинство реально. Просто потому, что все остальные - партии нишевые.
Взять, к примеру, коммунистов, ЛДПР и, вероятно, Яблоко. Это партии, которые имеют шанс получить голоса определённой ниши избирателей, пройти на них в парламент (Яблоко - сомнительно), и договориться с партией власти, выторговывая себе определённые уступки. Это как компании-сайты продаются Гуглу или Микрософту за большие деньги, ибо имеют большую "пользовательскую базу", и реально за эти деньги продаются "души пользователей". Так и здесь: "голоса избирателей". Это нормально, в принципе, в политике, люди будут работать в парламенте, влиять на принимаемые законы, и т.д. и т.п.
Я бы поставил отдельно СПС сейчас, которая заявляет о том, что не будет договариваться. Вероятно именно поэтому такие нападки властей именно на неё. Фактически только СПС сейчас заявляет о реальном альтернативном пути развития. Это типичная партия западничества. Т.е. "открытая экономика", интеграция в Европу, Нато и т.д. Ну, да, и конечно, "распродажа земли и ресурсов", приватизация госкорпораций, и т.д. За ней должны бы стоять интересы международного капитала, но похоже не стоят или стоят не очень, вероятно, не надеясь на успех и предпочитая работать с существующей властью. СПС выглядит слишком радикально со своей непримиримостью.
Странно, мне казалось, что СПС - естественный выбор для эмигрантов, заинтересованных в "открытости" и "интеграции" больше, чем в "суверенитете". Хотя она воспринимается как партия "переворота" и потому, вероятно, неприемлема для многих, не желающих потрясений. Но они тоже будут работать в парламенте, если пройдут, никуда не денутся.
"Другая Россия", претендующая на то же самое место, как уже неоднократно сказано, партия только в смысле шахмат, и не выбираема.
Есть ещё всякие "Истинные Патриоты Матери-Отчизны" с какими-то совсем непонятными нишами.
2007-11-23
The Collapse of the Middle Class
2007-11-21
MPlayer
2007-11-14
Шок капитализма
2007-11-12
Ratatouille
2007-11-05
OOPs - продолжение.
Приведу один пример на "ядро" "объектной модели". Иногда подобную конструкцию называют "провайдером". Пример, конечно, дурацкий, но простой и для иллюстрации пойдёт.
Замечательно, сказали мы, и, не мудрствуя лукаво, написали как сказано. Всё просто и тривиально. После чего пришёл PM и сказал, что заказчик просит ещё коллекцию колонок, и каждая колонка - тоже коллекция клеток. Ну ладно, сказали мы и добавили. Хотя
это в нашей модели уже не так тривиально. После чего, заказчик захотел извлекать клетку прямо из таблицы используя две координаты. Тоже можно сделать. Сделали.
После чего заказчик сказал, что всё медленно и требует много пямяти. Таблица расходует слишком много пямяти на одну клетку, даже если там просто число. Поскольку число мы храним как величину типа "object" в объекте типа "cell", и указатель на него лежит в массивах внутри объекта "строка" и объекта "столбец". Ещё у нас в каждой клетке могут быть массивы указателей на зависимые клетки.
Почему это медленно? Поскольку плохая locality. Процессор быстро работает с пямятью расположенной рядом, поскольку она находится в процессорном кеше. Случайные обращения - значительно, на порядок, дольше.
Во вторых множество указателей между объектами заставляют сборщик мусора Java или .NET делать сложную работу по маркировке этих указателей, при этом он ходит по всей этой памяти, проверяет все ссылки, короче вы поняли.
Только мы всё это зашипили, как новая беда. Новый PM, пришедший в вашу группу, взамен старого ушедшего с повышением, сказал, что мы должны перейти на интерфейсы вместо классов и потому мы сделаем новую версию "объектной модели", причём мы будем поддерживать обе сразу, смешано и одновременно: "Вот вам challenge проявить вашу technical excellence."
И как весь этот огород сделать? Очень просто. Надо сделать "провайдер". Или "ядро". Это внутренний объект. Про который не знает ни заказчик, ни PM. Который хранит состояние вашего реального объекта. А реальный объект у вас один - таблица. Всё остальное, все эти строки, столбцы и клетки - её составные части. Как клетки вашего организма - ваши составные части. То, что заказчик просит то извлечь клетку так, то сяк - показатель, что клетка - часть таблицы.
Ключевое слово здесь - "зависимость", "dependency". Клетки зависимы, а таблицы нет. Границы между данными надо проводить по направлениям с наименьшим зависимостями.
Итак, есть объект, хранящий все данные нашей таблицы, и внутренними методами, скажем, извлечь значение элемента, поместить значение, и т.д. Все объекты нашей пользовательской "объектной модели" будут очень простые и одинаковые, они хранят указатель на этот объект и параметры, которые необходимы для вызова его методов. Например, пользовательский объект клетка будет хранить её координаты.
Псевдокод:
internal class TableDataProvider {
...
public object get_value(int x,int y);
public void put_value(int x,int y,object value);
};
public class Table {
private TableDataProvider data;
public Row get_row(int y){ return new Row(data,y); }
public Column get_column(int x){ return new Column(data,x); }
public Cell get_cell(int x,int y){ return new Cell(data,x,y); }
};
public class Row {
private TableDataProvider data;
private int row;
internal Row(TableDataProvider d,int y){ data=d; row=y; }
public object get_cell(int x){ return new Cell(data,x,row); }
};
public class Column {
private TableDataProvider data;
private int column;
internal Column(TableDataProvider d,int x){ data=d; column=x; }
public object get_cell(int y){ return new Cell(data,column,y); }
};
public class Cell {
private TableDataProvider data;
private int row;
private int column;
internal Cell(TableDataProvider d,int x,int y){ data=d; column=x; row=y; }
public object get_value(){ return data.get_value(column,row); }
public void put_value(object value){ data.put_value(column,row,value); }
};
Тривиально, не правда ли? Что в этом хорошего?
- Мы отделили пользовательский интерфейс от внутреннего. Теперь первый можно менять или сделать их несколько с разными версиями, работающие одновременно с теми же данными. И внутреннее представление можно менять и не трогать пользовательские интерфейсы.
- Все многочисленные объекты объектной модели создаются и существуют только пока они нужны пользовательскому коду и после этого уничтожаются. Они все будут эффективно собраны сборщиком мусора 0-го поколения.
- Явно видна и понятна стоимость решения. Хотите легкой в обучении и browseable объектной модели - вот её стоимость - несколько операторов new. Хотите эффективности? Давайте добавим get_value/put_value в объект table и немножко сэкономим.
- Все внутренние вычисления делаются внутри провайдера, пользовательские объекты тут вообще ни при чем.
- Возможны любые shortcut-ы, как вниз так и вверх. Например, можно добавить метод/свойство получающий объект "таблица" из любого объекта.
2007-11-04
2007-10-27
2007-10-26
FAR - open source
Иди в баню!
Праздник какой! Надо распечатать и на двери офиса повесить. Вообще, интересный блог: A Soviet Poster A Day. Рекомендую. На английском. Умно, интересно, без мозгопромывания, как это обычно бывает в таких случаях.
2007-10-24
Куда пропала Ximeta?
2007-10-23
Выборы и политика
2007-10-20
2007-10-19
Халява.
Убунта
2007-10-17
Nokia N810
Это следующая версия моей N800. Из нового там встроенный GPS, более быстрый процессор, клавиатура, вся немножко меньше. С новой версии операционки, которая, впрочем будет доступна и для N800. Обещана поддержка передачи звука через bluetooth.
Менять, вероятно, не буду. Не люблю выдвижные клавиатуры. Да и вообще, дизайн мне у N800 нравится больше.
2007-10-16
Высокий штиль
Eёё Моё.
2007-10-15
Билл Гейтс и Нигерия
2007-10-10
OOPs - продолжение.
Немного повторюсь про инкапсуляцию, поскольку это важно.
Значит, инкапсуляция. Чёрный ящик с защищённой внутренней структурой и внешними интерфейсами. Но обычно ещё к ней же относят и локальность. Т.е. практически во всех языках объект - это некий указатель на компактную структуру данных, хранящюю состояние объекта. В принципе, в языках, где объект - это нечто неспецифицированное, это может быть не указатель, а более абстрактный handle, который может быть, например индексом во многих разных массивах. Но я такого не встречал. Чаще всего это указатель. Зачем это говорю? Cейчас подойдём.
Значит написали мы черный ящик. Мощный, удобный, защищенный. Один объект - всё замечательно работает. Два объекта, десять объектов. Сто тысяч одинаковых объектов. Начинаются проблемы. Во первых уже давно надо нам объект искать. Если десять можно было показать пользователю, для ста, тоже сойдет, колесико у мышки спасает ситуацию, то тысячу уже сложно. Надо искать по параметрам, которые у нас, наверное, выведены как свойства. Есть в программе массив объектов (или, скажем, дерево), давайте мне возможность запросов. Linq скажут гордые своей осведомленностью, молодые программисты. Sqlite, скажут пожав плечами бородатые одмины. Вам нужен SQL сервер, скажут системные интеграторы и такие же аналитики.
Можно добавить в объект интерфейс для запросов. Для тысячи будет работать. А когда подойдем к миллиону, то ещё один для построения индексов. И тут мы обнаружим, что всё работает медленно. Долго загружается, долго индексируется, долго ищется и занимает кучу памяти. Даже закрывается долго! Ещё мы обнаружим, что если всё распечатать в текстовый файл, открыть в Фаре и поискать, то всё и откроется мгновенно, и найдется быстрее. Как же так, мы использовали самые лучшие объектные технологии, а без них быстрее? Может, таки прав аналитик, и надо всё засунуть в базу?
И проблемм здесь несколько. Первая основная: неудобно управлять большим количеством черных ящиков. Если объектов много и они одинаковые, то их набор начинает обладать своими собственными свойствами. Перегородки между объектами становятая слишком дороги. Мы как бы переходим от одной молекулы к веществу, и то, что в молекуле казалось внутренним, начинает задавать макро-свойства.
С точки зрения объектной, объектом становится весь контейнер объектов, и индивидуальные объектики становятся не нужны. Начинаются всякие вырезки и наборы, методы, работающие с вырезками и т.д. Произошла векторизация API.
Вторая проблема - локальность. Часто бывает так, что разные свойства объектов не нужны одновременно, и лучше бы расположить рядом в памяти не поля одного объекта, а одно поле для разных объектов.
Третья проблема - locks. Замки. Это вообще отдельная долгая история, которой касаться сейчас не буду. Просто разные поля часто требуют разных локов, но, при этом, защищены должны быть несколько объектов, или даже весь контейнер.
Короче мораль: много объектов - тоже объект. Неправильно! Не "тоже"! Только! Или никто не объект. А данные.
Объект - это его состояние. Его надо хорошо продумать и нормализовать. Удалить лишние состояния, особенно всякие "недоделанные". Атомарно создать, сразу "готовый". Сделать методы модифицирующие состояние, по возможности атомарно с нужным количеством параметров. И не надо всяких лишних объектных моделей и "свойств". Сделайте ядро с данными и потом, по просьбе трудящихся, можно навесить столько объектных моделей, сколько надо (а надо будет несколько, с разными версиями API...). Навесить снаружи. Не надо размазывать данные по объектной модели. Вы потом их не найдете и не соберёте. Тогда контейнерный объект сделается изменением этого ядра. Его можно будет перевести на SQL. И т.д.
Да... Скомкано и непонятно. Долгая история. Хотел коротко объяснить, но нет, не получается. Тут каждый довод можно объяснять, целая книжка получится.
2007-10-03
Одичал
Разное
1. Да, спутник! Всегда завидую людям, которые делали что-то первыми, причем делали такое! Всё нижеперечисленное тоже работа, но как-то мелко. По совести надо было бы мне этим первым пунктом и ограничиться.2. Все радуются открытию .NET-овских библиотек. Как говорится, с чем вас всех и поздравляем. Полезно, нет слов. Но в Гугле это никогда не нарисуют. Нет, это совсем не спутник.
3. Joost - мелочь, но интересно.
4. Новый Windows Blinds - работает поверх Висты. Упоминаю потому, что Вистовый Гуй не переношу. А с железями можно всё настроить. Кстати, если есть любители Висты, то наоборот тоже работает. Можно сделать всё размыто и полупрозрачно. Утверждается, что на хорошей карточке XP+WB быстрее, чем Виста.





