Есть один сайт с новостями, который я сопровождаю на работе. На том сайте есть функция "Показать последние комментарии". Когда-то не очень давно и не очень близко мне было поручено добавить к каждому комментарию ссылочку "Перейти", при нажатии на которую пользователь должен переходить на страницу с новостью аккурат к нужному комментарию. Задача, в общем-то тривиальная - на странице с новостью каждому комментарию назначается якорь, а в ссылке "Перейти" указывается переход по этому якорю. На выполнение этой работы у меня ушло 2 минуты. И как всегда, русская народная пословица "Поспешишь - людей насмешишь" оказалась дюже актуальной.
Ничто не предвещало беды, пока в один недобрый день не появилась новость, к которой было оставлено комментариев на 5 страниц. Само по себе это было не фатально, но ссылочка "Перейти" работать перестала. Всё дело в том, что в этой ссылочке не указан номер страницы, на которой находится комментарий. Осложняется ситуация ещё и тем, что благодаря сортировке по дате комментария номер страницы, грубо говоря, не является константой и один и тот же комментарий с течением времени может переместиться с 1-й страницы на 10-ю.
Решение было найдено сравнительно быстро - комментариям был добавлен признак "порядковый номер комментария в новости". Реализация (в силу моей страсти к извращениям и сравнительно большого массива данных) затянулась на 4 часа. Сперва я написал хранимую процедуру для базы данных, которая для каждой отдельной новости пересчитывала порядковые номера комментариев. В тестовом окружении она работала сравнительно быстро (0.3-0.5 сек), а в продакшне тормозила (от 10 до 200 сек). Позже я попробовал ещё пару вариантов, но в итоге остановился на приемлимом - SQL-запросами пересчитываю порядковые номера (при добавлении MAX()+1, при удалении n-1 WHERE n>m). Теперь всё работает быстро.
Моралей у этой басни несколько:
1. Господа заказчики, начальники и прочие "вышестоящие", я не ругаюсь и не жалуюсь, но никогда не говорите "эта задача простая и много времени не займёт"
2. Господа разработчики, нефиг выёживаться, простота - залог успеха!
3. Прочие - учите пословицы, полезно и познавательно :)
PS: Не забыть бы ночью запустить скрипт, который пересчитает все порядковые номера...
четверг, 6 августа 2009 г.
четверг, 28 мая 2009 г.
Капля ненависти
Так случилось, что самому большому шефу нашей конторы захотелось сделать из двух сайтов один. Сам он человек технически безграмотный, особенно в сфере интернет-программирования (ещё бы!), поэтому идею перенести большой и посещаемый информационный портал на базу чуть меньшего и не столь посещаемого ему явно нашептали. Зачем из двух сайтов делать один осталось загадкой для всего офиса.
На более низком уровне идиотизм продолжился - де-юре начальник IT-отдела, а де-факто технический директор компании (вероятно, в угоду срокам, бизнесу и самому большому шефу, что вполне понятно) был против разработки сайта с нуля. И естественно, он решил воспользоваться разработками своего друга - одного из наших программистов (который, начиная работать над тем самым "чуть меньшим и не столь посещаемым порталом" по его личному признанию "не знал ни одной функции и не мог написать ни одной строчки на РНР") - нулёванным и "доработанным" этим "юным дарованием" DataLife Engine.
Задача осложнялась также тем, что сайт необходимо было интегрировать в общую систему публикации документов - для оффлайнового приложения и пары сайтов. Эта система публикации крутится в интранете компании. Редактор является простой надстройкой над MS Word'ом. Тут начальник отдела опять "посоветовался" со своим другом, который однозначно решил, что нужно перегонять новости ИЗ системы обновления НА сайт, а не С сайта В систему.
После всех этих советов и "додумок" проект упал на меня с аннотацией "надо, чтобы было надёжно, удобно, красиво и ещё вчера". Пока дизайнер рисовал макеты я переделывал привязку новостей к категориям, т.к. изначальная была абсолютно негодна к использованию на уважающем себя сайте. Вместо перечисления категорий в одном поле типа varchar я создал табличку для привязки новостей к категориям. Получилось простое отношение many-to-many. Хочется отметить, что уже на этом этапе мне стало грустно от кода ДЛЕ. Создалось чёткое ощущение, что писал его в лучшем случае студент-второкурсник, а то и вовсе старшеклассник. Ну надо же как-то оформлять код, не говоря уже об элементарных оптимизациях.
Наконец, от дизайнера пришли макеты, которые я красиво и вполне семантично сверстал. Когда я начал натягивать их на движок, я упёрся в ущербность встроенного шаблонизатора. Он ОЧЕНЬ многого не умеет. Ни циклов, ни условий. Да, к тому же, нагло вмешивается в DOM шаблонов, чего я ему до сих пор не могу простить. Кроме того, достаточно ощутимая часть дизайна прописана в контроллерах!!! Ну, в итоге, проматерившись пару дней, дизайн я на движок натянул.
Пришло время интегрировать сайт в систему публикации. Тут меня ждал очередной сюрприз. Я, разумеется, не стал слушать автора "доработок" (по совместительству друга шефа) и не стал убирать auto_increment с поля id таблицы новостей. Вместо этого я создал таблицу соответствия внутреннего id внешнему (внешний id - это id новости в общей системе публикации документов). Точно так же я поступил с категориями. За неделю я написал и отладил интерфейс, через который внешний софт мог публиковать новости на моём сайте, всё было красиво. До тех пор, пока программист, ответственный за систему публикации документов не отправил на сайт все новости с 2005 года по сей день.
Нет, сайт не упал. Он продолжил работать в штатном режиме (хвала небесам, даже не смотря на тестовый режим). Стала рубиться админка. Она просто засыпала на 30 секунд (дефолтное время исполнения РНР-скриптов), после чего вылетала с ошибкой. Причём, происходило это исключительно на странице со списком категорий. Тут я стал ковырять таблицу категорий, справедливо рассудив, что дело именно в ней. Очередной "приятный" сюрприз от разработчиков ДЛЕ - это отсутствие каких-либо индексов в таблице категорий, кроме первичного. Это при том, что дерево категорий формируется рекурсивным списком! Это при том, что выбираются они по полю alt_name, которое содержит название категории в транслите (для ЧПУ)! Это при том, что в таблице есть специальное поле, отвечающее за очерёдность категорий, по которому производится сортировка! И - один первичный ключ?! Поубивал бы... Нет, разработчики, вероятно, не рассчитывали, что их продукт будет использоваться на сайте с достаточно большим деревом категорий (около 60 тысяч категорий - это всё-таки серьёзно). Хотя на официальном сайте в характеристиках системы написано "неограниченное количество категорий".
Но это не самое страшное, в конце-концов, я добавил соответствующие индексы достаточно быстро. Самое интересное то, что после этой операции ничего не изменилось. НИ-ЧЕ-ГО! И я опять полез в код. Пять минут - и вот он кусочек кода, отвечающий за формирование массива категорий. Функция set_vars - кеширование переменной, get_vars - соответственно, чтение кеша. Ха! Ребята-разработчики, видимо, изрядно покумекали перед написанием файлового кеша! Пять строчек кода, а сколько поэзии, какая рифма! Сериализованная переменная кладётся в файл, файл чмодится, а с другой стороны - читается и десериализуется. А у меня массив из 60 тысяч элементов. Да ещё и многомерный. И вот - ОН - встречайте - кеш-файл с 2 мегабайтами сериализованных данных! Вот он, наш герой, заставивший 4-процессорный сервер с 16 гигабайтами оперативки пристыженно лечь и закрыть нос лапами, как проштрафившийся щенок!
Конец истории будет краток - я отключил кеширование категорий. Совсем. По крайней мере до той поры, пока шеф не сподобится поставить Memcached или что-нибудь подобное для сохранения информации в памяти между запусками скрипта. Хотя, я чувствую, ЭТО ещё не конец!
Вива ДЛЕ, привет разработчикам! Вы умеете писать лапшекод, который заставляет мощную железку притвориться калькулятором!
На более низком уровне идиотизм продолжился - де-юре начальник IT-отдела, а де-факто технический директор компании (вероятно, в угоду срокам, бизнесу и самому большому шефу, что вполне понятно) был против разработки сайта с нуля. И естественно, он решил воспользоваться разработками своего друга - одного из наших программистов (который, начиная работать над тем самым "чуть меньшим и не столь посещаемым порталом" по его личному признанию "не знал ни одной функции и не мог написать ни одной строчки на РНР") - нулёванным и "доработанным" этим "юным дарованием" DataLife Engine.
Задача осложнялась также тем, что сайт необходимо было интегрировать в общую систему публикации документов - для оффлайнового приложения и пары сайтов. Эта система публикации крутится в интранете компании. Редактор является простой надстройкой над MS Word'ом. Тут начальник отдела опять "посоветовался" со своим другом, который однозначно решил, что нужно перегонять новости ИЗ системы обновления НА сайт, а не С сайта В систему.
После всех этих советов и "додумок" проект упал на меня с аннотацией "надо, чтобы было надёжно, удобно, красиво и ещё вчера". Пока дизайнер рисовал макеты я переделывал привязку новостей к категориям, т.к. изначальная была абсолютно негодна к использованию на уважающем себя сайте. Вместо перечисления категорий в одном поле типа varchar я создал табличку для привязки новостей к категориям. Получилось простое отношение many-to-many. Хочется отметить, что уже на этом этапе мне стало грустно от кода ДЛЕ. Создалось чёткое ощущение, что писал его в лучшем случае студент-второкурсник, а то и вовсе старшеклассник. Ну надо же как-то оформлять код, не говоря уже об элементарных оптимизациях.
Наконец, от дизайнера пришли макеты, которые я красиво и вполне семантично сверстал. Когда я начал натягивать их на движок, я упёрся в ущербность встроенного шаблонизатора. Он ОЧЕНЬ многого не умеет. Ни циклов, ни условий. Да, к тому же, нагло вмешивается в DOM шаблонов, чего я ему до сих пор не могу простить. Кроме того, достаточно ощутимая часть дизайна прописана в контроллерах!!! Ну, в итоге, проматерившись пару дней, дизайн я на движок натянул.
Пришло время интегрировать сайт в систему публикации. Тут меня ждал очередной сюрприз. Я, разумеется, не стал слушать автора "доработок" (по совместительству друга шефа) и не стал убирать auto_increment с поля id таблицы новостей. Вместо этого я создал таблицу соответствия внутреннего id внешнему (внешний id - это id новости в общей системе публикации документов). Точно так же я поступил с категориями. За неделю я написал и отладил интерфейс, через который внешний софт мог публиковать новости на моём сайте, всё было красиво. До тех пор, пока программист, ответственный за систему публикации документов не отправил на сайт все новости с 2005 года по сей день.
Нет, сайт не упал. Он продолжил работать в штатном режиме (хвала небесам, даже не смотря на тестовый режим). Стала рубиться админка. Она просто засыпала на 30 секунд (дефолтное время исполнения РНР-скриптов), после чего вылетала с ошибкой. Причём, происходило это исключительно на странице со списком категорий. Тут я стал ковырять таблицу категорий, справедливо рассудив, что дело именно в ней. Очередной "приятный" сюрприз от разработчиков ДЛЕ - это отсутствие каких-либо индексов в таблице категорий, кроме первичного. Это при том, что дерево категорий формируется рекурсивным списком! Это при том, что выбираются они по полю alt_name, которое содержит название категории в транслите (для ЧПУ)! Это при том, что в таблице есть специальное поле, отвечающее за очерёдность категорий, по которому производится сортировка! И - один первичный ключ?! Поубивал бы... Нет, разработчики, вероятно, не рассчитывали, что их продукт будет использоваться на сайте с достаточно большим деревом категорий (около 60 тысяч категорий - это всё-таки серьёзно). Хотя на официальном сайте в характеристиках системы написано "неограниченное количество категорий".
Но это не самое страшное, в конце-концов, я добавил соответствующие индексы достаточно быстро. Самое интересное то, что после этой операции ничего не изменилось. НИ-ЧЕ-ГО! И я опять полез в код. Пять минут - и вот он кусочек кода, отвечающий за формирование массива категорий. Функция set_vars - кеширование переменной, get_vars - соответственно, чтение кеша. Ха! Ребята-разработчики, видимо, изрядно покумекали перед написанием файлового кеша! Пять строчек кода, а сколько поэзии, какая рифма! Сериализованная переменная кладётся в файл, файл чмодится, а с другой стороны - читается и десериализуется. А у меня массив из 60 тысяч элементов. Да ещё и многомерный. И вот - ОН - встречайте - кеш-файл с 2 мегабайтами сериализованных данных! Вот он, наш герой, заставивший 4-процессорный сервер с 16 гигабайтами оперативки пристыженно лечь и закрыть нос лапами, как проштрафившийся щенок!
Конец истории будет краток - я отключил кеширование категорий. Совсем. По крайней мере до той поры, пока шеф не сподобится поставить Memcached или что-нибудь подобное для сохранения информации в памяти между запусками скрипта. Хотя, я чувствую, ЭТО ещё не конец!
Вива ДЛЕ, привет разработчикам! Вы умеете писать лапшекод, который заставляет мощную железку притвориться калькулятором!
Ярлыки:
DataLife Engine,
DLE,
говно,
лапшекод,
лохи,
параша,
разработчики
вторник, 12 мая 2009 г.
Назад в прошлое
ноВчера (в рамках помощи обучающимся дистанционно в ТУСУРе) мне вновь, впервые за последние лет 10, довелось писать на паскале. Дюже забавно. Что больше всего меня удивило - не то, что я забыл синтаксис языка напрочь (благо, книжка по паскалю у меня была, а задания были уровня начала школьного курса информатики), а то, что я не испытал никаких проблем с типизацией. Я, привыкший писать на похапе, где типы преобразуются динамически и вполне себе прозрачно, не испытал трудностей при работе с языком с жёсткой типизацией! Да, возможно, сказался небольшой опыт работы с Java (однако там же можно объявлять переменные в теле программы, а не только в заголовке, как в паскале).
Я даже применил там MVC (насколько это понятие применимо к программе, вычисляющей суммы матриц и ищущей максимумы методом пузырька). Интересно, оценит ли преподаватель :)
ЗЫ: Возвращаться в прошлое интересно и даже, наверное, полезно :) Думаю помогать этим бездельникам и впредь :) Антикризисное управление, ага!
Я даже применил там MVC (насколько это понятие применимо к программе, вычисляющей суммы матриц и ищущей максимумы методом пузырька). Интересно, оценит ли преподаватель :)
ЗЫ: Возвращаться в прошлое интересно и даже, наверное, полезно :) Думаю помогать этим бездельникам и впредь :) Антикризисное управление, ага!
понедельник, 23 марта 2009 г.
Как пересадить родителей на Linux и избавиться от старого железа
Недавно я приехал домой и обнаружил на компьютере родителей горстку вирусов. Файрволл показывал постоянную сетевую активность, что явно означало наличие трояна, с которым мой старый-добрый McAffee Enterprise не справился. Да, оправдываться за кривую систему мне пришлось бы долго (это и устаревший McAffee 8.0, и устаревшая Windows XP SP1 практически без патчей, да много всего), но я не буду этого делать. Поскольку все задачи, требуемые от компьютера - это пасьянс “косынка”, тетрис и файрфокс (да и то исключительно для просмотра прогноза погоды с помощью яндекс-бара) я решил, что с ними благополучно справится линукс, а от винды я уже устал. Примечательно, что система крутилась на Athlon XP 1.8 с 3 гигабайтами оперативки и жёстким диском на 400 Гб. Последний я решил изъять и сделать внешним (переносным). Его место занял доисторический Seagate на 2 Гб. Иначе бы не было этого поста :)
Поставить линукс в наше время - задача вполне тривиальная (не то, что в конце 90-х), однако впихнуть его в столь малый объём памяти не так просто (не то, что в конце 90-х) . Ну да приступим.
Дистрибутив Debian netinstall скачан и записан на болванку. Загружаемся, устанавливаем. Я установил только базовую систему (которая всё равно была полна ненужных пакетов), она заняла около 500 Мб. Чистая консоль, ничего более.
Тут встал вопрос об окружении рабочего стола (потому что запустить графический пасьянс из консоли будет крайне проблематично). Поначалу я хотел установить KDE 4.2, но к сожалению (а как позже я понял - к счастью) она заняла бы 500 Мб в архиве и плюс 1200 Мб в установленном виде. В сумме эти 1700 Мб были больше, чем объём свободного дискового пространства (1500 Мб). В итоге, выбор мой пал на xfce, которая весила всего 200 Мб в архиве и около 700 в установленном виде. В общем, sudo apt-get install xfce-desktop и на этом я лёг спать.
Проснувшись утром я нашёл, что xfce уже установлена и настоена, осталось лишь набрать startx (ну или перезагрузить компьютер, дабы иксы стартовали автоматически). Прекрасно. Устанавливаем приложения.
Браузер. Файрфокса в пакетах не оказалось (или я не нашёл, впрочем, это и хорошо), поэтому sudo apt-get install iceweasel. Iceweasel - это перелицензированный аналог ФФ для Debian. На него встают те же расширения, что и на ФФ, так что с яндекс-баром никаких проблем не возникло.
Далее игры. sudo apt-get install gnome-games для установки gnometris. Сейчас уже точно не помню, кажется, пасьянс встал с этим же пакетом, а может быть я установил ещё и kde-games. Не важно.
Беда заключалась в том, что объём свободного места начал подходить к концу и надо было что-то предпринимать. Тут есть несколько хитростей:
1. Я удалил все man-pages. Да, плохо, но родителям и консоль-то не нужна, только игры и браузер, зачем же им маны? А меня в редкие мои визиты к ним и гугл удовлетворит.
2. sudo apt-get install localepurge. В открывшемся “окне” выбираем только используемую локаль (ru, а не ru_RU.UTF-8). Остальные удаляются и больше не ставятся.
3. cd /var/cache/apt/packages && sudo rm -r *.deb удалит все “дистрибутивы” (дебиан и убунту сохраняют здесь пакеты, которые скачиваются при apt-get install, чтобы в дальнейшем в случае необходимости не качать их снова из сети) .
Ух ты, теперь вся система с рабочим столом занимает около гигабайта. Идём дальше!
4. sudo apt-get remove openoffice.org-bundled — зачем нам офис? Почему его поставили без моего ведома? Непонятно.
5. sudo apt-get remove exim4 — сервер электронной почты нам тоже не нужен.
6. sudo apt-get remove gimp — зачем нам поставили графический редактор не понятно.
7. и наконец sudo apt-get autoclean && sudo apt-get autoremove чтобы подчистить неиспользуемые пакеты.
Далее оптимизируем саму систему. Для этого делаем следующее:
1. sudo apt-get install preload — уж точно и не помню, нашёл в гугле, судя по названию предзагружает в память часто используемые приложения.
2. sudo apt-get install prelink && prelink — линкует приложения с библиотеками в одно целое, чтобы при запуске не тратить время на это. В первый раз занимает очень много времени. А на будущее я просто прописал это в крон, чтобы prelink запускался раз в сутки.
Всё здорово, но остаётся одна маленькая проблемка - при запуске системы пользователю приходится набирать имя и пароль. Это неудобно, а для компа, на котором только играют и смотрять погоду на завтра это и вовсе недопустимо. Выходим из системы и в меню выбираем “Сконфигурировать xfce”. Указываем рутовый пароль. На вкладке “Безопасность” активируем автологин и выбираем непривелигированного пользователя.
Отлично, автологин работает, но дебиан не даёт непривелигированному пользователю выключать компьютер :) Ах, какая защищённая система! Идём в /etc/sudoers и указываем в конце user ALL=NOPASSWD:/sbin/shutdown, проверяем - выключается!
Осталось объяснить родителям, как играть в линуксовые версии игр (впрочем, пока я производил эти манипуляции они привыкали к играм на моём ноутбуке с установленной убунтой), рассказать что Iceweasel - это файрфокс и “чтобы выключить компьютер надо нажать на зелёного человечка” :)
PS: df -h показывает, что свободно 765 Мб из 2 Гб. Это я ещё установил openssh, k3b и mc :)
Поставить линукс в наше время - задача вполне тривиальная (не то, что в конце 90-х), однако впихнуть его в столь малый объём памяти не так просто (не то, что в конце 90-х) . Ну да приступим.
Дистрибутив Debian netinstall скачан и записан на болванку. Загружаемся, устанавливаем. Я установил только базовую систему (которая всё равно была полна ненужных пакетов), она заняла около 500 Мб. Чистая консоль, ничего более.
Тут встал вопрос об окружении рабочего стола (потому что запустить графический пасьянс из консоли будет крайне проблематично). Поначалу я хотел установить KDE 4.2, но к сожалению (а как позже я понял - к счастью) она заняла бы 500 Мб в архиве и плюс 1200 Мб в установленном виде. В сумме эти 1700 Мб были больше, чем объём свободного дискового пространства (1500 Мб). В итоге, выбор мой пал на xfce, которая весила всего 200 Мб в архиве и около 700 в установленном виде. В общем, sudo apt-get install xfce-desktop и на этом я лёг спать.
Проснувшись утром я нашёл, что xfce уже установлена и настоена, осталось лишь набрать startx (ну или перезагрузить компьютер, дабы иксы стартовали автоматически). Прекрасно. Устанавливаем приложения.
Браузер. Файрфокса в пакетах не оказалось (или я не нашёл, впрочем, это и хорошо), поэтому sudo apt-get install iceweasel. Iceweasel - это перелицензированный аналог ФФ для Debian. На него встают те же расширения, что и на ФФ, так что с яндекс-баром никаких проблем не возникло.
Далее игры. sudo apt-get install gnome-games для установки gnometris. Сейчас уже точно не помню, кажется, пасьянс встал с этим же пакетом, а может быть я установил ещё и kde-games. Не важно.
Беда заключалась в том, что объём свободного места начал подходить к концу и надо было что-то предпринимать. Тут есть несколько хитростей:
1. Я удалил все man-pages. Да, плохо, но родителям и консоль-то не нужна, только игры и браузер, зачем же им маны? А меня в редкие мои визиты к ним и гугл удовлетворит.
2. sudo apt-get install localepurge. В открывшемся “окне” выбираем только используемую локаль (ru, а не ru_RU.UTF-8). Остальные удаляются и больше не ставятся.
3. cd /var/cache/apt/packages && sudo rm -r *.deb удалит все “дистрибутивы” (дебиан и убунту сохраняют здесь пакеты, которые скачиваются при apt-get install, чтобы в дальнейшем в случае необходимости не качать их снова из сети) .
Ух ты, теперь вся система с рабочим столом занимает около гигабайта. Идём дальше!
4. sudo apt-get remove openoffice.org-bundled — зачем нам офис? Почему его поставили без моего ведома? Непонятно.
5. sudo apt-get remove exim4 — сервер электронной почты нам тоже не нужен.
6. sudo apt-get remove gimp — зачем нам поставили графический редактор не понятно.
7. и наконец sudo apt-get autoclean && sudo apt-get autoremove чтобы подчистить неиспользуемые пакеты.
Далее оптимизируем саму систему. Для этого делаем следующее:
1. sudo apt-get install preload — уж точно и не помню, нашёл в гугле, судя по названию предзагружает в память часто используемые приложения.
2. sudo apt-get install prelink && prelink — линкует приложения с библиотеками в одно целое, чтобы при запуске не тратить время на это. В первый раз занимает очень много времени. А на будущее я просто прописал это в крон, чтобы prelink запускался раз в сутки.
Всё здорово, но остаётся одна маленькая проблемка - при запуске системы пользователю приходится набирать имя и пароль. Это неудобно, а для компа, на котором только играют и смотрять погоду на завтра это и вовсе недопустимо. Выходим из системы и в меню выбираем “Сконфигурировать xfce”. Указываем рутовый пароль. На вкладке “Безопасность” активируем автологин и выбираем непривелигированного пользователя.
Отлично, автологин работает, но дебиан не даёт непривелигированному пользователю выключать компьютер :) Ах, какая защищённая система! Идём в /etc/sudoers и указываем в конце user ALL=NOPASSWD:/sbin/shutdown, проверяем - выключается!
Осталось объяснить родителям, как играть в линуксовые версии игр (впрочем, пока я производил эти манипуляции они привыкали к играм на моём ноутбуке с установленной убунтой), рассказать что Iceweasel - это файрфокс и “чтобы выключить компьютер надо нажать на зелёного человечка” :)
PS: df -h показывает, что свободно 765 Мб из 2 Гб. Это я ещё установил openssh, k3b и mc :)
понедельник, 2 марта 2009 г.
Вопросы этики
Сегодня мне не дают покоя некоторые вопросы.
1. Этично ли веб-мастеру (человеку, чья работа целиком и полностью связана с интернетом) лимитировать объём входящего трафика? Не просто лимитировать, а ограничивать его 800 мегабайтами. И при этом заставлять его пользоваться системой управления проектами, которая не просто основана на веб-технологиях, а размещена в интернете и, соответственно, потребляет эти мегабайты.
2. Этично ли ставить ему в вину то, что он что-то не дотестировал до запуска проекта при том, что о самом факте запуска он узнаёт пост-фактум опять-таки по наезду "у нас тут посетители вовсю регаются, реклама вовсю идёт, а у тебя вот эта фича неправильно работает"?
3. Вообще, насколько этично валить всё на подчинённых, когда само начальство что-то недодумало и не учло при описании функционала в ТЗ? Пример - недостающие поля в форме, которые есть по ТЗ в базе, и которых нет на предоставленном макете дизайна.
4. Насколько этично разработчику, принимая во внимание эти факты, а также неправильную настройку корпоративного файрвола взять и поставить дома прокси-сервер и ходить через него, экономя трафик (объём трафика считается только по 80-му порту)?
5. Насколько этично будет разработчику послать всех нахуй, бросить полусобранный проект (который сопровождать без слёз не сможет ни один нормальный человек) и тупо уволиться, когда его наконец достанет такое отношение?
PS:
Потом в милицию накапал
И успокоившись душой
В глазке три буквы нацарапал
И потихонечку ушёл
1. Этично ли веб-мастеру (человеку, чья работа целиком и полностью связана с интернетом) лимитировать объём входящего трафика? Не просто лимитировать, а ограничивать его 800 мегабайтами. И при этом заставлять его пользоваться системой управления проектами, которая не просто основана на веб-технологиях, а размещена в интернете и, соответственно, потребляет эти мегабайты.
2. Этично ли ставить ему в вину то, что он что-то не дотестировал до запуска проекта при том, что о самом факте запуска он узнаёт пост-фактум опять-таки по наезду "у нас тут посетители вовсю регаются, реклама вовсю идёт, а у тебя вот эта фича неправильно работает"?
3. Вообще, насколько этично валить всё на подчинённых, когда само начальство что-то недодумало и не учло при описании функционала в ТЗ? Пример - недостающие поля в форме, которые есть по ТЗ в базе, и которых нет на предоставленном макете дизайна.
4. Насколько этично разработчику, принимая во внимание эти факты, а также неправильную настройку корпоративного файрвола взять и поставить дома прокси-сервер и ходить через него, экономя трафик (объём трафика считается только по 80-му порту)?
5. Насколько этично будет разработчику послать всех нахуй, бросить полусобранный проект (который сопровождать без слёз не сможет ни один нормальный человек) и тупо уволиться, когда его наконец достанет такое отношение?
PS:
Потом в милицию накапал
И успокоившись душой
В глазке три буквы нацарапал
И потихонечку ушёл
Новости фотосайта
Сегодня перенёс Фотосайт на "наш" сервер. Также добавил оптимизацию загружаемых изображений при помощи jpegtran. Такие новости.
суббота, 28 февраля 2009 г.
Последний день зимы
В последний день зимы моя боевая подруга вытащила меня на пикник с её коллегами по работе. Ничто не предвещало беды (с)
Коллеги (все - девушки от 23 до 35+), некоторые взяли с собой мам. В общем, сначала мы заехали за парой коллег и одной мамой, а потом направились в Бутаковку. В процессе заезжания за последней коллегой (семиместная машина оказалась как нельзя кстати) разбили термос. Он тупо вывалился из багажника на асфальт, когда я открыл его чтобы впустить эту коллегу на её место. Термос мы выбросили.
Едем на Бутаковку, уже на подъезде к месту встречаем одну из коллег, которая приехала на своей машине. Она едет навстречу. Интересуемся, какого она едет не вполне туда, на что получаем вполне логичный ответ - гольф буксует. Сначала мы пытаемся прицепить её к джипу троссом, чтобы затащить наверх, но у этого гольфа по какой-то непостижимой причине нет спереди крюка. В итоге, после нескольких попыток, гольф заезжает сам. При этом у него лопается патрубок охлаждающей системы и вытекает весь антифриз. Кроме того он обрывает защиту двигателя.
В процессе попыток мимо пролетает другая коллега на джетте. Хвала небесам - благополучно.
Гольф не доезжает до места и оставляется на одной из первых парковок. Из него выгружаются люди, пакеты со жратвой и мамы перебрасываются в джип, джип уезжает наверх. После разгрузки решено вернуться на джипе за оставшимися на парковке людьми. Поскольку развернуться негде я качусь задом и попутно ищу место, где можно развернуться. Нахожу. Даже почти разворачиваюсь. Если бы не всесезонная резина, не отсутствие блокировки дифференциала, не наканунешний снегопад... В общем, подгребают пешком оставшиеся внизу, подъезжает другой джип, совместными усилиями ~10 барышень и джипа Mazda Proceed моего бегемота вытаскивают-таки из кювета и я въезжаю обратно на гору.
Там выясняется, что шашлык мы не взяли, понадеявшись на то, что его будут продавать на месте "как в прошлый раз", а на месте никто его не продаёт. Едим блины, бутерброды и прочие холодные закуски, пьём чай, вино, водку и коньяк.
Для гольфа вызван на 4 часа эвакуатор, поэтому к четырём мы закругляемся, погружаемся в две оставшиеся машины и едем к гольфу. Ждём. Эвакуатора нет. Начинаем спускаться вниз. Выясняется, что эвакуатор не может подняться, т.к. сам буксует. Думаем, как спустить гольф к нему. Попутно встречаем Сюрф, который остановился на обочине набрать из родника водичку, да что-то неподрассчитал и свалился двумя колёсами в ручей. Помогаем выбраться ему.
С целью спустить гольф к эвакуатору вызываем папу одной из коллег, который разбирается в машинах. Мы с Наргис отвозим на джипе мам до такси и возвращаемся как раз к тому моменту, когда из сугроба барышни вытаскивают уже папу.
Дальше не особо интересно - папину машину бросаем на середине дороги, отвозим всю ораву на джипе наверх, спускаем гольф с заглушенным двигателем до эвакуатора, разъезжаемся по домам.
В общем, за один день мы вытащили из сугробов 5-6 машин. В очередной раз подтвердилась поговорка - "Джип застрянет там, куда другая машина не доедет". А отдохнули хорошо. Сегодня болят все мышцы, но это здорово!
Коллеги (все - девушки от 23 до 35+), некоторые взяли с собой мам. В общем, сначала мы заехали за парой коллег и одной мамой, а потом направились в Бутаковку. В процессе заезжания за последней коллегой (семиместная машина оказалась как нельзя кстати) разбили термос. Он тупо вывалился из багажника на асфальт, когда я открыл его чтобы впустить эту коллегу на её место. Термос мы выбросили.
Едем на Бутаковку, уже на подъезде к месту встречаем одну из коллег, которая приехала на своей машине. Она едет навстречу. Интересуемся, какого она едет не вполне туда, на что получаем вполне логичный ответ - гольф буксует. Сначала мы пытаемся прицепить её к джипу троссом, чтобы затащить наверх, но у этого гольфа по какой-то непостижимой причине нет спереди крюка. В итоге, после нескольких попыток, гольф заезжает сам. При этом у него лопается патрубок охлаждающей системы и вытекает весь антифриз. Кроме того он обрывает защиту двигателя.
В процессе попыток мимо пролетает другая коллега на джетте. Хвала небесам - благополучно.
Гольф не доезжает до места и оставляется на одной из первых парковок. Из него выгружаются люди, пакеты со жратвой и мамы перебрасываются в джип, джип уезжает наверх. После разгрузки решено вернуться на джипе за оставшимися на парковке людьми. Поскольку развернуться негде я качусь задом и попутно ищу место, где можно развернуться. Нахожу. Даже почти разворачиваюсь. Если бы не всесезонная резина, не отсутствие блокировки дифференциала, не наканунешний снегопад... В общем, подгребают пешком оставшиеся внизу, подъезжает другой джип, совместными усилиями ~10 барышень и джипа Mazda Proceed моего бегемота вытаскивают-таки из кювета и я въезжаю обратно на гору.
Там выясняется, что шашлык мы не взяли, понадеявшись на то, что его будут продавать на месте "как в прошлый раз", а на месте никто его не продаёт. Едим блины, бутерброды и прочие холодные закуски, пьём чай, вино, водку и коньяк.
Для гольфа вызван на 4 часа эвакуатор, поэтому к четырём мы закругляемся, погружаемся в две оставшиеся машины и едем к гольфу. Ждём. Эвакуатора нет. Начинаем спускаться вниз. Выясняется, что эвакуатор не может подняться, т.к. сам буксует. Думаем, как спустить гольф к нему. Попутно встречаем Сюрф, который остановился на обочине набрать из родника водичку, да что-то неподрассчитал и свалился двумя колёсами в ручей. Помогаем выбраться ему.
С целью спустить гольф к эвакуатору вызываем папу одной из коллег, который разбирается в машинах. Мы с Наргис отвозим на джипе мам до такси и возвращаемся как раз к тому моменту, когда из сугроба барышни вытаскивают уже папу.
Дальше не особо интересно - папину машину бросаем на середине дороги, отвозим всю ораву на джипе наверх, спускаем гольф с заглушенным двигателем до эвакуатора, разъезжаемся по домам.
В общем, за один день мы вытащили из сугробов 5-6 машин. В очередной раз подтвердилась поговорка - "Джип застрянет там, куда другая машина не доедет". А отдохнули хорошо. Сегодня болят все мышцы, но это здорово!
Подписаться на:
Сообщения (Atom)
