среда, 11 марта 2009 г.

Workspace

Дошли руки до настройки рабочего окружения. Вообще я постарался всё настроить так, чтобы у меня было идентичные данные на Windows и на Linux. Почти со всем удалось:
Аська: QIP Infium. Под линукс ничего лучше не нашёл. БД\настройки общие.
Менеджер паролей: пока Password Agent. Из-за совместимости. БД\настройки общие.
E-mail агент для работы: Microsoft Outlook. БД\настройки общие. В качестве антиспама поверх поставлен Spam Terrier.
Редактор: Komodo Edit + plugins. Несмотря на то, что EditPlus отлично работает под wine, пользоваться им не так удобно - всё таки под вайном программы подтормаживают, да и никто не гарантирует стабильности.
Контроль версий: пока RapidSVN. Если не смогу привыкнуть - буду искать дальше.
Файл менеджер: Tux Commander. Был Total Commander - переучиться легко.
Офис: OO. Правда, поставил я его одним из последних, и был весьма удивлён, когда при попытке открыть файл *.doc у меня открылся Microsoft Word. Потом еще пришлось удалять в CrossOver привязки к расширениям :)
Видео проигрыватель: SMPlayer. Наиболее похож на Media Playre Classic из всех, которые я посмотрел: влц, тотем, гном-мплеер. Остальные 3 не понравился ни по скорости, ни по удобству.

Все папки с проектами сделаны у меня как символические ссылки на папки на виндовых дисках.

вторник, 10 марта 2009 г.

Repositories

Да, вспомнилось тут: первое что необходимо сделать после установки федоры - в списке рабочих репозиториев выделит все free и nonfree репозитории, не выделяя тестировочные и девелоперские. Второе - добавить репозиторий RPM Fusion:

#rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm

#rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

понедельник, 9 марта 2009 г.

Bluetooth Fn-F5 switching

Есть ещё одна традиционная проблема: не работоспособность Fn-F5 для отключения Bluetooth. Решение просто как всё гениальное - необходимо записывать "enable" или "disable" в /proc/acpi/ibm/bluetooth Для получения статуса необходимо считать первую строчку. Правда, есть проблема - для изменения статуса необходимо быть root. sudo или setuid не помогают. Но тут мне на помощь пришёл удобный демон acpid. Мне понадобилось только добавить в /etc/acpi/events файл bluetooth.conf

event=ibm/hotkey HKEY 00000080 00001005
action=/etc/acpi/actions/bluetooth.sh
Говоря этим, что для нажатия кнопки Fn-F5 мне нужно выполнять скрипт /etc/acpi/actions/bluetooth.sh
#!/bin/bash
BLUETOOTH=/proc/acpi/ibm/bluetooth

if [ -r $BLUETOOTH ]; then
grep -q disabled $BLUETOOTH
state=$?
fi

if [ -w $BLUETOOTH ]; then
if [ $state == 0 ]; then
echo enable > $BLUETOOTH;
else
echo disable > $BLUETOOTH
fi
fi

ТК acpid выполняется из-под root -всё работает как надо.

Linux newbie

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

Вот одна из возникших проблем - отвратительные шрифты в несвободной реализации WinAPI (построенной, тем не менее, на свободном Wine) CrossOver. Решений как таковых я не нашёл - только сумел сделать читаемыми шрифты, правда, пожертвовав русским языком. Фактически, необходимо сделать файл /opt/cxoffice/share/locale/ru/LC_MESSAGES/crossover.mo пустым. В этом случае не теряется автодобавление установленных программ в меню,в отличие от полного удаления каталога /opt/cxoffice/share/locale/ как советуют некоторые.

пятница, 20 июня 2008 г.

Motivation loss

Что может плохого случиться с разработчиком в процессе работы над протяжённым во времени масштабным проектом? Он перестаёт видеть перспективу. Проект идёт уже не один год. Да, что-то делается, что-то получается. Что-то откладывается, что-то из тени выходит на первый план. Планы постоянно корректируются. Движуха со всех сторон. Развите полным ходом.
Хех, а я наблюдаю за всем несколько абстрагировавшись от этого паноптикума, и устаю. Мы уже давно не занимались созданием нового - только подкручиванием деталей и копированием функционала между проектами. Сложного программирования - 0. И не предвидится.
Кроме этого - постоянно растёт нагрузка. Эта рутина требует много времени и сил. Постоянно требуются новые фичи. Оценка, комментарии, ЛС, сортировки... Рутина. Скука.
Осложняется положение еще и тем, что я перманентно срывал сроки. Да, тут я кажется еще не писал, у меня есть проблема: я плохо планирую сроки. Не учитываю возможные проблемы от сторонних производителей, не закладываюсь на решение других срочных задач в этот период. Для своих подчинённых, как правило, сроки ставлю как для себя, хотя должен понимать что задачи я буду решать априори быстрее.
Так вот, осложнение в том, что я за дело, которым занимаюсь - болею душой. И, чтобы не подводить людей которые мне доверяют, остаюсь на ночь, работаю в выходные. И фоном всего этого проходит внутреннее чувство вины за срывы. От такого ощущения устаёшь. Особенно когда руководство ничего не делает для улучшения ситуации. И всё опять ложится на тебя. А усталость выливается, в итоге, в безразличие.

суббота, 7 июня 2008 г.

Framework::xCache Data tree

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

Основным кирпичиком системы является сущность - объединение данных и методов их обработки\получения. По сути это чёрный ящик, который имеет несколько функция для общения с внешним миром. Никого не интересует как это работает, как хранятся и получаются данные, есть ли там кеширование и тд. Из этого вытекает необходимость деления кеша по сущностям.

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

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

Дерево данных в кеше очень похоже на структуру директорий:
/project/system/entity/dataname.
Первый уровень - имя проекта. Это позволяет нам хранить все данные принадлежащие к одному проекту в одной ветке дерева. Естественно существует ветка для общих данных - она называется default.
Второй уровень - имя системы, из которой используется кеш. Это позволяет нам одновременно работать с одинаковыми сущностями из моей системы и из модулей обработки данных от наших партнёров.
Третий уровень - сущность. Не просто имя сущности, а соединение нескольких параметров инициализации кеша. Это сделано по двум причинам:
- желание использовать несколько веток кешей для одной сущности (зачем - разберу позже)
- возможность задавать множество способов первоначальной инициализации данных (при желании)
Четвертый уровень - просто имя переменной. Никаких изысков.

Каждый уровень - это вершина дерева. То есть в записи каждого уровня без завершающего слеша (/project, /project/system, /project/system/entity) хранится массив из всех вложенных уровней. Например в случае одного проекта (project1) и двух систем (system1 и system2) содержимое записи /project1 будет такое: array("system1","system2").

Имея такую структуру данных мы решаем практически все необходимые (перечислены выше) задачи. Очистка кеша проекта сводится к рекурсивному спуску по дереву и последовательному удалению. Так же решается и задача сброса ветки при обновлении - просто стартовой точкой становится не проект, а отдельная его часть.
На самом деле эта модель позволяет и блокировать ветки (или проект), но об этом ниже.

среда, 4 июня 2008 г.

Framework::xCache Introduction

Последние несколько лет я разрабатываю на PHP. Последний год - высоконагруженные проекты входящие в первую десятку согласно статистике Яндекса и LiveInternet'а. Много кода было написано за это время. Большинство успешно отправилось в /dev/null, но кое-что используется на боевом и хорошо себя зарекомендовало. И теперь я хочу немного рассказать об том, что в итоге попало в мой Framework. Это может быть полезным тем, кто забредёт на этот блог в поисках откровений, но, и это гораздо важнее, позволит мне систематизировать накопленный опыт. Начнём с кеширования.

В многих проектах на PHP используют кеширование как опкода, так и данных. Вариантов много, я остановился на xCache по двум причинам:
- опкод хранится в shared memory, а не на диске
- на моих тестах он показал скорость выше чем остальные
Простым подключением модуля можно получить ускорение 30%-50%. Используя всю мощь кеширования данных можно ускоряться практически бесконечно.

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

Вообще, всё его API делится на четыре группы:
- административные функции
- общие функции управления данными
- функции управления опкодом
- статистические функции

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

Есть несколько задач, которые не решаются тривиальными методами:
- очистка кеша всего проекта при выкатывании нового кода
- пересчёт кеш некоторой части кеша при изменении настроек
- блокировка всего (или некоторой части) кеша для заполнения долго-получаемыми данными

Для их решения была придумана модель данных, которую я опишу ниже.

вторник, 13 мая 2008 г.

Win2k8EEx64

Поставил себе в качестве операционной системы Windows Server 2008 Enterprise Edition x64. За прошедшее время (около 2 суток) всё хорошо. Система лучше Висты по всем параметрам: быстрее, стабильнее. Да и весь ее функционал есть. В сравнее с ХП тоже выигрывает - удобнее, красивее. Хоть и несколько более замедленная. Не намного.
Но без 2 Гб оперативной памяти в х64 для нормальной работы (если хочется Windows Aero) лучше не соваться.
Основная информация по всем этапам установки и настройки здесь.

Upd 0. Кстати, я заметил что я первый раз за несколько лет начал пользоваться стандартным explorer. Он действительно удобный.

Upd 1. Несмотря на отличную совместимость с практически всеми x86\x64 программами, в том числе пришедшими еще с XP, и, кстати, не работавшими под Вистой, озвучу несколько замеченных багов:
- TortoiseSVN не везде в контекстом меню показывается. В Total Commander'e есть, в Эксплорере нету.
- WinMerge ведёт себя наоборот. В Тотале нету, в Эксплорере есть.
- Для Bluetooth'a нет нормальных драйверов. В результате не могу обмениваться файлами с телефоном. Хотя он находится и коннект происходит.
- Изменение графических характеристик через встроенную IBM приблуду вызывает 100% прозрачность меню пуск. Остаётся только кнопка. Лечится простым изменением любой настройки внешнего вида.

Upd 2. Как я выяснил про графические характеристики - только отключение второго монитора и возврат к схеме с одним вызывает этот баг. Спасает ситуацию исключительно изменение текущей схемы отображения.
И есть еще один баг, уже со сторонним приложением: Outpost Security Suite 2008 работает с memleak'ами. Переписка с саппортом выявила, что это не тривиальная проблема. Теперь переписываемся с ними и пытаемся решить эту проблему.

Upd 3. Ошибка с возвратом к одному монитору решилась просто - в какой-то момент пересохранил схему, и всё заработало правильно.
Проблема с пунктами меню TortoiseSVN и WinMerge кроется в том, что Total Commander - х32 приложение, а вышеуказанные программы записывают себя в х64 ветки. На данный момент решений этой проблемы не нашёл.
Проблема с драйверами Bluetooth - общая. Связана она с основным предназначением Win2k8 - серверная система заточенная под безопасность. А, как известно, протокол Bluetooth к этому не располагает. Решения этого есть (стеки сторонних производителей), но с этим надо эксперементировать, а у меня не хватает пока времени.

четверг, 8 мая 2008 г.

Disillusionment

Ну вот и пришёл таёжный зверь. Многочисленные prohibitory sign's на пути меня не остановили, и, в итоге, я стою перед тупиком. Узким, сходящимся в одну точку, тупиком в глубинах гор. Похожим на лезвие ножа. А вокруг отвесные стены.
Это очень серьёзный урок мне, как системному архитектору. Крайне оптимизированные, но сложные для понимания системы никому не нужны. Да, они работают. Да, они держат в два раза больше хитов чем МойКруг, например. Да. Но - не нужны.
Сегодня можно считать концом EDMR. И моего личного фреймворка. Мы начинаем потихоньку переходить на другую систему. Более простую и понятную. Под которую легче писать. Под которой не надо помнить н-дцать извращённых методов решения просто задачи. Для поддержания которой не требуется хорошее понимание происходящего в ее глубинах. К которой будет документация. Медленную.
Как специально - сегодня и новый сервер пришёл. Мощный, большой, многопроцессорный. Вдобавок к средненькому однопроцессорному текущему. И будет на этом новом сервере крутиться новая система.

R.I.P.

четверг, 17 апреля 2008 г.

Wage level

Посмотрел кто и что сейчас предлагает на рынке.
Я могу получать в 1.5 раза больше без авралов и в 2 раза, если я согласен работать с переработками и авральными выходами в выходные и ночью.
И как теперь мне поступить?

среда, 19 марта 2008 г.

I can eat own dog food

Некое время назад написал класс для более удобного разбора данных (парсер). И отдал его своему отделу. Они им пользовались, что-то просили исправить, что-то добавить.
А сегодня я разбирал наш старый сайт online игр с его помощью. И остался крайне доволен - работать с ним одно удовольствие! Приятный API, функциональность, неплохая скорость, сохранение cookies. Появляются, правда, конструкции типа $p->part(...)->bpart(...)->fpart(...), но читаемости это не снижает.
Приятно.

четверг, 13 марта 2008 г.

Major bug

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

Upd: Еще одно интересное наблюдение - основное действие программиста на EDMR - сбросить кеш. Это помогает в 95% случаев.

вторник, 11 марта 2008 г.

MySQL easter egg

Есть два запроса:
SELECT * FROM `entities_categories` WHERE category IN('16325') AND entity IN ('used') ORDER BY category;
и
SELECT * FROM `entities_categories` WHERE category IN (SELECT id FROM entity_core_category WHERE id IN('16325') ORDER BY path) AND `entity` IN ('used');

Первый выполняется за 1.47 секунды, второй за .... 0,81 секунды! Неожиданно, верно? Начинаем разбираться:
mysql> desc SELECT * FROM `entities_categories` WHERE category IN('16325') AND entity IN ('used') ORDER BY category;


id 1
select_type SIMPLE
table entities_categories
type ref
possible_keys PRIMARY,category
key category
key_len 70
rows 63300
Extra Using where; Using filesort


mysql> desc SELECT * FROM `entities_categories` WHERE category IN (SELECT id FROM entity_core_category WHERE id IN('16325') ORDER BY path) AND `entity` IN ('used');

id 1 2
select_type PRIMARY DEPENDENT SUBQUERY
table entities_categories entity_core_category
type ref const
possible_keys PRIMARY PRIMARY
key PRIMARY PRIMARY
key_len 66 4
ref const const
rows 287754 1
Extra Using where Using index


Я не хочу понять это. Я хочу знать: как с ЭТИМ работать?

среда, 13 февраля 2008 г.

Abortive architecture

Так уж сложилось. Мы работаем в режиме вялотекущего deadline. Непрекращающегося. И времени на посидеть\подумать практически не остаётся. Отчасти в этом виновата нехватка людей. Отчасти - креативность начальства, расчитывающего на профессионализм высокооплачиваемых людей. Это не так важно.
Получается, что многие вещи придумываются и реализуются на коленке. В расчёте на свободное время которое появится, когда мы закончим. Но задачи всё появляются, и заканчиваться они не планируют. И это правильно - люди тут зарабатывают деньги, а не спасают мир идеальными решениями.
Недавно я выдал некий framework нужный для упрощения и централизации различных действий. В перспективе я планировал вытащить туда весь основополагающий функционал нашей системы. По задумке он должен был быть легко расширяем и очень гибок. Необходимый кусок подгружался только по требованию, все модули имели общий стиль использования (similar API). Но...
Сейчас у меня образовалось временное окно, в котором я сумел подумать в том числе и о своём детище. Я хотел добавить ветвление в функционал, это позволяло не слишком задумываться об общем модуле, которому необходимо вести себя немножко по разному в разных проектах. Реализация этого ветвления на настройках создавала монстра, тяжёлого как по памяти, так и по процессорному времени. Логичным кажется сделать дублирование этой разницы и использовать тот кусок, который нужен в данный момент. Но прозрачного деления не получается - слишком много сделано на текущей логике.
И вот тут у меня опускаются руки. Времени переписать весь framework у меня нет. Желания добавить очередную заплатку - тоже. Я нахожусь в классической патовой ситуации. В первую очередь виноват в этом я: не имея огромного опыта создания монстров - начал писать глобальный проект. Причём, как это ни обидно, как это ни приятно - это не последний milestone в смене взглядов на структуру и идеологию. Но сейчас я с грустью осознаю, что облажался.
Рабочий процесс это не затронет - придумывать заплатки на лету я научился давно. Но использовать этот framework в своих личных проектах в будущем я не буду.

P.S. Во произошедшем есть огромный кусок приятного experience: я в очередной раз прекратил считать себя самым умным. Я снова не считаю, что, при наличии времени, смогу придумать какую угодно сложную архитектуру. И это заслуга, в том числе, моего Технического Директора. Всё таки опыт - вещь которую можно получить только со временем. Никакой светлый ум не поможет перепрыгнуть через ступень не задерживаясь.
P.P.S. Надо уметь учиться у умных и опытных людей. Не зря в детстве говорят: "Слушай старших". Дети понимают это не так, как надо, а жаль. Я считаю, что надо объяснять еще в детском саду что "слушать" не значит "беспрекословно подчиняться". Это значит "слушать и задавать вопросы чтобы перенять опыт". Я рад, что у меня есть у кого учиться.

вторник, 12 февраля 2008 г.

Moominvalley in November

Серая, пока еще без снега, Мумидолл. Начало зимы.
На холме, у выхода из долины, стоит Снусмумрик и курит трубку. Тишина. Болотце, в котором Муми-Тролль запускал кораблик, покрылось тонким льдом. Покачивается одинокая камышинка около самого берега.
Сегодня утром семья Муми-Троллей встала гораздо позже обычного и в очень смурном настроении. Снифф тихонько нудил весь завтрак, а Ондатр, хоть и нашёл свою книгу в запеканке, так никому ничего не сказал.
После еды Муми-Папа убирал лодки и катамараны с причала, а Муми-Мама собирала разбросанные по всем комнатам вещи в шкафы. Никто не разговаривал, не шутил, не смеялся. Муми-Тролль и фрекен Снорк залезли в домик на дереве и долго там сидели глядя на тусклое, закрытое дымкой солнце.
Снусмумрик каждый год ждал начала спячки в Мумидолле, но всегда оказывался не готов. Еще вчера они спустили в ручей маленький плот и готовились к походу в грот, а сегодня на обед вся Муми-семья ела еловые иголки и готовилась к зимней спячке. Убирали всё, что создавало неповторимую атмосферу предвкушения Приключения, накрывали все диванчики и стулья, закрашивали коричневой краской первый этаж. Дом стал неуютным и гулким. Затем Муми-Папа собрал все веревочные лестницы, закрыл окна и они молча разбрелись каждый по своей комнате.
Снусмумрик тихо вздохнул, выбил трубку, и натянул шляпу на самые уши. Тоскливое зрелище совсем его расстроило. В этом году было особенно грустно - обычно спячка наступала раньше, и он уходил еще из живой долины. А сегодня он был единственным кто смотрел на посеревшие скамейки, забытую удочку на мостике, пустой флагшток, сумрачное солнце. Не хотелось даже писать прощальное письмо. Хотя, и он это знал, всё равно придётся. Но написать можно и позже, когда в долину приходят зимние жители и она снова оживает.
Пора уходить.
Он раскурил еще одну трубку, одел рюкзак и не оборачиваясь пошёл в лес. Впереди была зима.

вторник, 22 января 2008 г.

Deadlock

Меня восхищают эти люди. С BIOS'овой просьбой нажать 'F1' если не отключены ошибки и нет клавиатуры я смирился когда был маленький и верил в некую высшую гениальность.
Но вопрос MS Shell'а "Продолжить?" когда ему убиваешь pipe на STDIN.... Естественно, возникает deadlock.

вторник, 11 декабря 2007 г.

Abnormal case

Произошедшее окончательно убило веру в соображалку людей.
Дано: Локальная сеть. 100 Мбит\с между сервером на котором лежит файл и десктопом. На сервере есть файл весом в много Гб.
Необходимо: Переписать файл с сервера на десктоп удалённо (из дома). после этого произвести манипуляции с файлом всё на том же десктопе.
Решение: Подключаемся к локалке по VPN. Открываем на домашнем(!) компьютере файл-браузер. Копируем файл с сервера на десктоп. Получаем неожиданный результат: ориентировочное время копирования - 20 часов. Удивляемся и .... идём спать. Благо отмазка для меня почему задача не сделана - есть. Файл продолжает копироваться.

А давайте вдумаемся - как копируется файл? Почему так долго?
Канал из офиса наружу около мегабита. Канал дома - около мегабита. Получается, что файл сначала копируется на домашний компьютер гения, затем по VPN копируется на десктоп. Скорость - мегабит. Забит весь канал всего офиса. За одну ночь потрачен трафик на месяц вперед.

А днём (гений любит долго спать) это чудо невинно хлопает на меня глазами и не понимает почему я недоволен что задача не выполнена - ведь у него есть отмазка!

/me applause стоя

вторник, 27 ноября 2007 г.

x64 timestamp

Интересный ... даже не баг... Из-за длинны интов на x64 проверка timestamp ли 20071014171400 (14 октября 2007 17:14) выдаёт правду. Причём, формально он прав!

понедельник, 19 ноября 2007 г.

PHP Bugs

Сегодня день сброса накопленных неприятных багов:


1) срыв стека переменных (Одна переменная может быть заполнена другой. А может - и опкодом функции.)
2) срыв внутреннего механизма линкования - переменная перемешивается с другой. То есть, при изменении части массива одной переменной изменения происходят в другой.
3)Закрывающий тег ?> трейлит \n после себя.



И скажите мне теперь, пожалуйста: как в таких условиях программировать?? На эти баги было убито много времени, тк априори считалось - ошибка у нас.

P.S. еще пару багов не смог вспомнить.

пятница, 9 ноября 2007 г.

CRUDE into CRUDSEX

Из-за особенности реализации и для удобства использования расширил классическую маску прав CRUDE. Уже после финального коммита заметил, что теперь маска выглядит как CRUDSEX. Забавно :)