?

Log in

Заметки перфекциониста
Свежий бред 
30-мар-2011 11:11 pm - Сдохла моя X-Fi XM
Конечно видел в инетах жалобы на встроенный звук, но не думал, что все настолько плохо.... А между прочим, в обзорах на метеринку хвалили встроенную звуковуху, мол, на достойном уровне.
Разницу слышно сразу: как будто сидишь в шерстяной шапке, на которую надеты наушники. Или же в наушники набили ваты (завал ВЧ). Басы стали громче, но потеряли четкость чтоли. Они как бы и есть, но больше стали похоже на просто гул.

Смотрю в сторону Xonar D2...
Нет, я не гонюсь за "теплым ламповым звуком". Меня вполне устраивал младший X-Fi XtremeMusic. Просто меня ЗАДРАЛИ ГЛЮЧНЫЕ ДРАЙВЕРА от Кривотива.
29-окт-2010 09:23 pm - Outpost7 [security, всякое]
Недавно обновился на новенький Outpost 7.04. Уж лучше б этого не делал...
Зависоны начались еще с инсталлятора.... он ставился минут десять! Точнее не ставился, а висел, долго раздумывая ставить/не ставить. Далее просто посреди работы, без какой либо видимой причины, комп начал зависать. Поработает с полчаса — и на отдых. А в чувство приводится только резетом. Полное отключение фаерволла не спасло — очевидно что глюк где-то в минидрайвере (или как оно там) сетевых интерфейсов.

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

Вот теперь я без фаерволла. Вообще. Даже антивируса нет.
Зато как быстрее начала работать машина! Винда грузится быстрее, все приложения стартуют моментально, торрент никогда не отнимает 100%CPU... Никогда бы не подумал, что просто фаерволл может аж настолько все тормозить!

Забавно, что в каждой новой версии агнитумовцы пишут, что "кардинально снижена загрузка процессора и значительно увеличена производительность и стабильность брандмауэра".

Теперь думаю, либо ставить Outpost 2009 Free(хм, лишний тормоз?), либо настраивать штатный виндовый фаер — в семерке он значительно похорошал (эх, ему бы еще вменяемый интерфейс)...
12-май-2010 11:51 pm - Про XSS [security, web, xss]
Замечательная флешка, все красиво и доходчиво (правда, на английском):
http://www.virtualforge.de/vmovie.php
5-дек-2009 07:41 pm(без темы)
Все люди делятся на две группы - те, кто делает бэкапы, и те, кто будет их делать.
1-дек-2009 01:45 pm - Гугл учит плохому [web]
Собственно вот: Reducing the file size of HTML documents
Уменьшить ХТМЛ это конечно хорошо, но не путем же уродования православного и идеологически верного XHTML, преобразуя его в еретичный говно-HTML 4.0!
30-июл-2009 01:53 pm - One large step for open source code...

К 40-летию мисии Apollo 11 (да, той самой с высадкой человеков на Луну) в гуглокоде были опубликованы исходные коды командного(Comanche054) и лунного(Luminary099) модуля.

Собственно коды модулей, а также виртуальной машины AGC можно найти тут.

Интересно:

Вот что написано в википедии (офф. версия):

Фактически Армстронг перешёл на ручной режим управления спуском гораздо раньше, поскольку бортовой компьютер работал с перегрузкой, и всё время горел аварийный сигнал, нервировавший экипаж, несмотря на заверения наземного оператора, что на сигнал можно не обращать внимания (позже оператор, принявший решение несмотря на аварийные сигналы, не отказываться от посадки на Луну, получил специальную награду NASA).

Хотя по слухам (найду источник - уточню) это был просто баг в программе.

А вот забавный кусочек кода оттуда же:

VRTSTART TS WCHVERT
# Page 801
CAF TWO # WCHPHASE = 2 ---> VERTICAL: P65,P66,P67
TS WCHPHOLD
TS WCHPHASE
TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE
CADR STOPRATE # TEMPORARY, I HOPE HOPE HOPE
TC DOWNFLAG # PERMIT X-AXIS OVERRIDE
ADRES XOVINFLG
TC DOWNFLAG
ADRES REDFLAG
TCF VERTGUID

В проект вложено столько веры и надежды, на этом и долетели :)

9-июл-2009 05:50 pm - www.govnocode.com [security, web]
GovnkocodeСегодня утром от работы меня отвлек смех из соседней комнаты: смеялись долго и громко. Заинтриговавшись причиной оваций решил сходить посмотреть в чем же дело. Как оказалось, девчонки смеялись над смешным и новым для них словом — govnocode. Я же посмеялся над "красивым" дефейсом и задумкой.

Ранее я писал о найденных мною многочисленных уязвимостях на софтварных архивах. Этот сайт как раз оказался них.

СкриныСвернуть )
2-апр-2009 11:01 pm - Где мой CSS ??? [web, wtf, жы-журнал]
Lost

Ну какой толк от ЖЖ-шного Custom CSS, если сия фича работает только для заглавной страницы?

Баг так баг. Только с заподлянкой. Дело в том, что фича исправно работает еще и при предпросмотре: отредактировал новый пост, глянул — все отлично. Отправил на печать, глянул в журнале — все как надо. А вот горькую правду узнаешь только спустя некоторое время, когда зайдешь на страницу статьи и в комментарии...

... вот и пришлось переписать всю подсветку синтаксиса в предыдущем посте...

2-апр-2009 10:42 pm - Wicked, Wicked Web [security, web]
Wicked, Wicked Web

Вот уже скоро будет год, как я начал заниматься вебдевелопингом. Скажу сразу, что веб не является моей основной профессией — я по прежнему делфи-программист. А веб — это как часть моей широкопрофильности :)
За год довольно много чему научился, приобрел опыт. Чем и хочу поделиться.

Спам.

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

Тем не менее, со спамом можно бороться и без капчи. Способ очень простой и довольно известный: на форме есть скрытое поле, назовем его ver-code, заполненное заранее известным значением. Значение меняется раз в день/неделю/месяц. При постинге скрипт проверяет это значение и если оно не совпадает, посылает спам-бота куда подальше. Суть метода заключается в том, что спаммеры не успевают обновлять свои базы и постят, используя старый ver-code либо вовсе без него. Конечно, это не спасает от более умных ботов, которые каждый раз загружают страницу, но поверьте, спам сократится в разы — проверенно на собственном опыте. Также есть очень малая вероятность, что за бота примут добропорядочного пользователя: в этом случае матюганы в сторону бота меняем на вежливую просьбу перезагрузить(Refresh) страницу и повторить попытку — боту то все-равно, а вот пользователь поймет вас правильно :)

Также есть вполне рабочий способ, не использующий капчу, и в то же время использующий ее. Все банально: вместо капчи вешаем статическую картинку. Все. Чтоб боты прошли такую тривиальную защиту нужно, чтоб кто-то постарался. А именно увидел, что капча не меняется, оторвал свою пятую точку, и подкрутил настройки спаммерского ПО. Но кто это будет делать для сайта vasia.pupkin.org? Сей метод уже более полугода работает для сайта, и никого спама я не видел (точнее видел в логах, подробнее тут). Хех, интересно то, что несколько клиентов сообщали о "заклинившей" капче :)

Безопасность

Первое правило: никогда не доверяй клиентской стороне. Это учат в школе. Этим прожужжали все уши. И тем не менее многие вебдевелоперы допускают ошибки.

Думаете что если вы владелец http://vasia.pupkin.org то его никто не будет ломать? А вот и ошибаетесь. Не хакер, так бэд-бот: будьте готовы, что ваш сайт начнут пробовать на прочность несколько десятков раз в день. Бэд-боты как любые другие краулеры гуляют по сети и пробуют сайты на уязвимости: будь то известные дыры в различных CMS или стандартный набор SQL-injection — вся информация о найденных брешах отправляется создателю бота, а он уже придумает, что с вами делать.

Думаете, что если у вас все входящие данные экранируются, то SQL-injection не страшен? А про то, что в SQL'е все это нужно обернуть в апострофы не забыли? Я на вот этом и попался. Модифицированный пример из википедии:

$id = mysql_real_escape_string($_REQUEST['id']);
$res = mysql_query("SELECT * FROM news WHERE id_news = $id");

Вроде экранирование есть, но дыра так и осталась не прикрытой: если в id передать "-1 OR 1=1" то вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости.

Хорошо, что сайт сделан вручную, без никаких CMS — ошибка не стала уязвимостью, и никак себя не проявляла. Вообще хорошее правило вместо универсального "SELECT * FROM Table" выбирать только то, что требуется в данный момент: "SELECT field1, field2 FROM Table".

А еще хорошим правилом является просмотр логов, благодаря коим и была выявлена эта ошибка. Вообще логирование — очень важная штука. Думаю, это все знают и понимают: будь то ругательства MySQL-ля, ерроры в скриптах, или что-то еще — все нужно логировать. Но также будет очень полезным записывать и все "подозрительные" запросы, смахивающие на попытки взлома системы: кроме того, что можно всегда быть в курсе ее состояния (или хотя бы знать, что же с ней произошло :), так еще и параноидальный админ (прям как я:) сможет вовремя увидеть и быстренько подлатать брешь или сомнительный участок. А такие участки были мною исправлены.... "Подозрительность" определяется просто: например, если там где должно быть целочисленное поле идет что-то левое. В таком случае ругаемся пользователю и тихонечко пишем в лог. Такая штука полезна и для определения "а была ли попытка взлома?" — всегда можно посмотреть access-логи и восстановить полную картину: вполне возможно, что не все записалось и часть действий хакера осталась незамечена (и никак не обработана/заблокирована!).

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

PHP-Apache

Эта связка глючная. Причем безнадежно. В одной версии фиксят баг — он появляется в следующей, причем приводит с собой еще семеро.

Нельзя быть уверенным, что скрипты прекрасно работающие в одной верcии, успешно заведутся на следующей. Взять, например server-side includes. Я нашел три баг-репорта для разных версий (!!!) и везде они были пофиксены и везде предлагали скачать свежий CVS-снапшот. Хотя у меня была версия, для которой "якобы" этот баг был исправлен, но, увы, можно было отправлять и четвертый баг-репорт... Та же история и с оверрайдом 404-го статус-кода на обработчике ErrorDocument: в одной версии работает, в более поздней — нет, причем баг-фикс идет где-то посередине. Хорошо, когда такой баг проявляется только на одном сайте/скрипте к которому имеешь доступ. Гораздо хуже, когда пользователь не может установить и заставить работать твой "бажный" скрипт (как было с DynamicPAD).

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

Ошибки и ворнинги php-интерпретатора в браузере видели все — такое есть на каждом n-ом сайте. И каждый мог судить о некомпетентности программистов написавших тот сайт или скрипт. А вы тоже хотите афишировать свою безграмотность? Чтоб вас также само судили? Нет? Тогда нечего выводить интимные подробности тому, кому они не предназначены:

error_reporting('E_NONE');

В то же время показываем их только тому, кому нужно (ни в коем случае не глушите все ошибки "ухом" - @. Это плохо кончится):
  1. в php.ini:

    log_errors = on
    error_log = /var/logs/php/errlog.txt

  2. в .htaccess

    php_flag log_errors on
    php_value error_log /var/logs/php/errlog.txt

  3. в коде php-скрипта

    log_errors("on");
    error_log("/var/logs/php/errlog.txt");

Ну и пару слов про почту.

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

SQL-запросы экранируете? Будьте добры экранировать передаваемые в mail хидера (обычно это From, Reply-To, Subject). Иначе не удивляйтесь, что ваш мейл-сервер занесли в черный список как злобного спаммера. Достаточно просто "резать" все переносы строк в этих полях (они обязаны быть однострочными).

На последок. Как говорил вождь, учится, учится, и никогда не расслабляться. Помните: выживут только параноики :)

21-мар-2009 01:50 pm - ... [one-liner]
юзая больше копипастче пишем код мы фастче...
21-фев-2009 12:27 pm - Browser Security Handbook [security, web]
Browser MalwareПерешедший чуть более года назад в Google Михал Залевски (Michal Zalewski), ранее известный по ряду уязвимостей, обнаруженных им в различных браузерах, опубликовал Browser Security Handbook — обзор подходов к обеспечению безопасности в браузерах вместе со сводными таблицами, описывающими эффективность их реализации (равно как и наличие таковой) в девяти версиях современных браузеров — от IE6 до Chrome.

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

  • обработка и интерпретация URL'ов (включая Юникод, схему file://)
  • работа с протоколом HTTP, способы обработки поступающего контента (включая интерпретацию content-disposition, трюки с content-type и пр.)
  • использование браузерного кеша
  • работа с куками
  • обработка HTML'я, DOM
  • стандартные политики безопасности применительно к DOM'у, Java, Falsh, Silverlight и т.д. и т.п.
  • экспериментальные и устаревшие, но еще используемые, механизмы безопасности

и многое много другое.

>>> Рекомендуется к обязательному прочтению и распространению <<<

9-фев-2009 11:37 pm - The Zen of Python [python, программинг]
The Zen of Python Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one and preferably only one obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let's do more of those!
Qt becomes LGPL licensedКомпания Nokia объявила, что начиная с версии 4.5 (ориентировнчно март 2009) платформа Qt будет доступна также под лицензией LGPL 2.1.
Это означает что разработчики могут использовать более либеральную, по сравнению с GPL, схему лицензирования. Другими словами, это даcт возможность бесплатно использовать библиотеку Qt для коммерческого ПО.

За столь щедрым жестом компании стоит тот факт, что в отличии от Trolltech, Nokia не ставит целью заработать на Qt. Ее стратегия продолжает линию «10х», анонсированную в прошлом году, суть которой сводится к десятикратному увеличению количества разработчиков и пользователей библиотеки. Такая популяризация позволит компании расширить клиентскую базу именно за счет большего числа коммерческих разработчиков и является заключительным этапом кампании «Qt повсюду» ("Qt Everywhere").
____

Бесплатно — это хорошо, но что дальше? Дальше есть надежада, что Embarcadero все же сможет включить поддержку Linux в следующей версии Delphi (Comodore, середина 2010-го года). Ну или в следующей.

На самом деле, это может означать, мы, наконец, сможем получить основательно преработанную и "подчищенную" CLX позволяющую писать кроссплатформенные программы, в нативном для платформы коде. Это означает, что заброшенный Kylix может возродится.

Но пойдем дальше. Если архитектура компонентов Delphi будет пересмотрена в пользу возможности создания настоящих Qt виджетов, то выиграют все. Embarcadero сможет расширить свою базу клиентов за счет компоненто-писателей для Qt. А те тоже будут плодится как грибы в благоприятных условиях — это как освоение целины: Qt не имеет большого выбора из сторонних компонентов, и такие компании как DevExpress или ТМС, смогут сделать неплохой апгрейд к ее базе виджетов. Ну и по понятным причинам выиграет сама Qt.
7-дек-2008 10:23 pm - first meet... [игры]
...
Lt. Sarah Kerrigan: Captain Raynor, I've finished scouting out the area, and... you pig!
Jim Raynor: What! I haven't even said anything to you yet.
Lt. Sarah Kerrigan: Yeah, but you were thinking it.
Jim Raynor: Oh, yeah! you're a telepath.
...
2-дек-2008 01:46 pm - Дзен [wtf]
Читать нужно быстро:

Мандатное управление доступом(англ. Mandatory access control, MAC) — разграничение доступа субъектов к объектам, основанное на назначении метки конфиденциальности для информации, содержащейся в объектах, и выдаче официальных разрешений (допуска) субъектам на обращение к информации такого уровня конфиденциальности.
© Wikipedia
24-ноя-2008 08:29 pm - Забавный спам [web]
spam.jpg

Полезно вести логи. Полезно вести логи всего и вся что происходит с сервером. Также полезно их просматривать... Хотябы изредка :).

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

От уныло-похвальных...

Very nice design ;) Good work,webmaster!
It's a very good site !! Very nice work, admin :) Good luck !
Thanks for all you do in helping me fulfill my dreams.
Yo have nice site, admin! keep up good work man!
Wow!! It's getting better and better. Keep it up man.
I think your site is very good and complete, but the information you have here
Wow!! It's getting better and better.
I love this site so so so much :) Cool site!!
I love you so much! Great place to visit!

Весьма забавных...

Grant you just made yourself something to do with it
Yep you are jack our maniac in my chat box and your mental here
I love the great insight!
we better get on the tinatic because sinking is rising on saturday morning!
Not much on my mind worth mentioning. What can I say? I haven't been up to much lately. It's not important. Oh well.
I've just been sitting around waiting for something to happen.
Greetings! and test of guestbook, coming up here to show love to the site.
Not bad... Not bad.
Not bad... Not bad.

До просто настоящих приколов:

DAESH ONOTOLE V PRAVITELI VSELENNOI!
DAESH ONOTOLE V PRAVITELI VSELENNOI!
Im nuts with big nuts, i love saying that XD


Интересно еще то, что во многих случаях спам не рекламирует чего либо: там просто нету ссылки! Хотя, судя по введенному полю капчи и повторам, форму заполнял робот.
23-ноя-2008 08:08 pm - Помним.... [c'est la vie]
candle.jpg
День памяти голодомора... 75 годовщина...
...
«Голод 1932–1933 годов в Советском Союзе не был направлен на уничтожение какой-либо отдельной нации. Он стал следствием засухи и проводившихся в отношении всей страны, а не одной только Украины, насильственной коллективизации и раскулачивания» — это слова Медведева, и официальная позиция России. Ладно, фиг с ним, Медведевым: на то он и политик чтоб быть поуши в грязи (все политики такие). Но обычные граждане... почитать на форумах, то, что думают "рядовые" россияне...

Ну как можно отрицать то, что было? Как можно отрицать очевидцев? Какое право "они" имеют решать за "нас"? "Они" там были? "Они" видели? У "них" есть среди родственников бабушки и дедушки, которые с ужасом вспоминают "закон о пяти колосках"? "Они" знают, что "не выполнившие план колхозы распускались или в них менялось правление, имущество единоличников-контрактантов описывалось и продавалось, твердосдатчики высылались на выселки, в ряде колхозов по местной инициативе изымался посевной материал, на уровне районов проводилась замена руководства и ограничение в поставке промышленных товаров". И это в самой "голодающей" стране. "Они" знают, как у крестьян отбиралось последнее?

С каких это пор после далеко не самой сильной засухи (бывало и похуже, да) умирали с голоду МИЛЛИОНЫ? Почему если умирающий с голоду крестьянин подбирал "пять колосков" на (!!!) уже собранном поле его судили на расстрел, без возможности амнистии? Где такое видано?

Россияне, у вас совесть есть? Какое вы имеете право решать за "нас"?
Нифига себе! Незнал что такая штука работает в дельфе:

case i of
 0: ;
 1: ;
 else  // Несколько операторов вне блока begin..end !!!!
   D:=SQRT(abs(sin(random)*cos(random)));
   D:=SQRT(abs(sin(random)*cos(random)));
   D:=SQRT(abs(sin(random)*cos(random)));
end;

Работает как в Delphi7 так и в Delphi 2009
WTF?Не совсем патология. Но знать полезно.

Вопрос: с какой целью в реализациях IUnknown.Release используют InterlockedDecrement? Наверное, для потокобезопасности. Но реализация Release вовсе не выглядит потокобезопасной: что будет если другой поток в этот момент вызовет IUnknown.AddRef?

На пальцах:

1. Поток 1 проверяет валидность и копирует указатель на интерфейс
2. Выполняется переключение контекста. Управление передается потоку 2
3. Поток 2 вызывает Release(). Счетчик ссылок достигает нуля. Объект уничтожается. Указатель зануливается
4. Переключение контекста. Передача управления обратно в поток 1
5. Поток 1 для скопированного указателя (уже невалидного) вызывает AddRef(). Бабах!!!

Баг или фича? Решать вам.
(Хм, наверное для устранения сей баго/фичи и придумали межпотоковый маршаллинг интерфейсов ☺)

Ссылки:
  1. If there's already a bug, it's not surprising that there's a possibility for error

  2. Avoiding double-destruction when an object is released

Читать дальше...Свернуть )

Сегодня очередной раз, сидя за отладкой, обнаружил интересную особенность дельфовского компилятора. Ну не то чтоб особенность, но данная штука для меня была не очевидной.

Итак, код:

procedure Foo;
  function Bar: string;
  var
    i: integer;
  begin
    for i := 1 to 5 do
      Result := Result + IntToStr(i);
  end;
var
  i: integer;
begin
  for i := 1 to 5 do
    Writeln(Bar);
end;

Что не так? Забыл инициализировать Result?

Хех, менеджед-типы инициализируются автоматически при входе во scope (тем более что ни D7 ни D2009 даже не пискнули о неинициализированном Result), ответил бы я, да не тут то было....

Вот вывод:

12345
1234512345
123451234512345
12345123451234512345
1234512345123451234512345

Оказывается, что для локальных процедур не создается отдельный фрейм стека, а используется фрейм родителя. Потому Result и хранила состояние от предыдущего вызова. Вот так вот.

30-сент-2008 11:15 pm - Адварь [жы-журнал]
Только что зашел незалогиненым на свой блог и....
реклама уже и до басик-аккаунтов добралась...

Вот так вот. Ничего не бывает забесплатно.

Теперь обьясните мне, в чем тогда разница между басик и адвансед? В количестве рекламы? )
WTF?Для маршаллинга COM-интерфейсов между потоками есть такой функционал системы COM, как CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream.

Функции выполняют именно то, что указанно в названии. А именно работу по облегчению "обмена" информацией об интерфейсе между потоками: в одном потоке сохранили данные о интерфейсе в IStream, а в другом восстановили их из этого же IStream’а.
Вроде ничего проще быть не может, все ясно, все понятно и очень удобно. Но разработчики подсунули свои грабли…

Читать далее...Свернуть )
WTF?К сожалению, далеко не у всех и не всегда удается сходу придумать хорошую архитектуру и "правильный" API. Часто бывает, что архитектура и API должна пройти несколько итераций и метаморфоз перед тем как лишится недостатков и "устаканится". Но на это нужно время. Хотя бы на то, чтоб кто-то мог опробовать это дизайнерское решение в действии.

Настоящая засада начинается когда это "действие" некому и некогда пробовать и ляпы API просачиваются в стандарты.

Речь идет о ляпе в жизненно важном для COM методе QueryInterface, о способе оповещении, что интерфейс не поддерживается. Казалась бы, что тут может быть проще, либо интерфейс поддерживается, либо — нет. Но грабли нашлись даже в такой простой вещи. Вот что написано в MSDN:
"If the object does not support the interface specified in iid, *ppvObject is set to NULL. ... S_OK if the interface is supported, E_NOINTERFACE if not”
Т.е. согласно спекам, любая "хорошая" имплементация QueryInterface, в случае отсутствия запрашиваемого интерфейса, должна вернуть как код ошибки, так и занулить out-параметр *ppvObject.

Читать далее...Свернуть )
Кросспост на perfectcoding
Не очень долго думал как написать:
* написать базовый класс, с общим функционалом
* или завести еще один класс путем откопипастчивания от имеющегося
Выбрал второе

Вот так из идеалиста, я потихоньку превращаюсь в говнокодера...
OpenGL3
11 августа в публичном доступе появилась спецификация долгожданного OpenGL 3.0. Но, увы, ожидания не оправдались. В новой версии стандарта практически не добавилось ничего нового: только стандартизированы старые расширения, и введен раздел "The Deprecation Model". Это почти тот же облом что и с версией 2.0, когда по-сути ничего не изменилось. Вот и новую версию тоже следовало б назвать, скажем, OpenGL 2.2, а не так как сейчас.

Хотя на официальном форуме полно матов и ругани в сторону Khronos'а, но считаю что не все так плохо, и хоронить OpenGL еще очень и очень рано...Свернуть )
Стали известны подробности долгожданных нововведений в языке Delphi

Читать далее...Свернуть )
Страница загружена июл 23 2017, 12:30 pm GMT.