Блин

Apr. 6th, 2014 02:59 pm
vadimpanin: (Default)
где-то видел библиотечку плюсовую, даже скорее кусок исходника, который мог целые сериализовать в бинарный формат в зависимости от размерности значения (255, например, упаковывать в 1 байт, а не 4, предварительно затайпкодив), а флоаты и даблы - в IEEE стандарте
понятно конечно что это можно руками часа за 2-3 набросать, но было же где-то
vadimpanin: (Default)
Оно тупо не умеет писать и читать тем же сокетом одновременно. Поочередно может, одновременно - нет.
Как только вызываешь асинхронную запись, пока идет асинхронное чтение - бумц! 10054 An existing connection was forcibly closed by the remote host. Учитывая что UDP оно как бы connectionless - выглядит весьма забавно. Дуплексный режим.
Народ в интернетах предлагает эту ересь игнорировать и просто еще раз запускать чтение, но это ж странно как-то.
В принципе, это может быть и неплохо, например можно чтение перенести на другой порт и дать ему приоритет в QoS повыше, получать на него ARQ (Automatic Repeat-reQuest), и отдавать сами ретрансмиты. Oh, wait, тогда опять фуллдуплекс получается же. На линуксе при этом ошибок нет.
vadimpanin: (Default)
http://www.youtube.com/watch?v=BKorP55Aqvg
via ivan-gandhi

(кстати, немного с другой стороны баррикад, иногда инженеры в самом деле слишком рано считают что-то невозможным или закапываются в деталях реализации, тут в принципе поведение всех членов митинга вполне логичное, несмотря на идиотичность задачи)
vadimpanin: (Default)
Тут делал скриптик для AutoHotkey, чтобы автоматом мышку перемещать за активным окном по Alt-Tab (удобно при использовании двух мониторов) и встретил неожиданную проблему. В винде есть такое понятие как DPI awareness у приложения, т.е. способность его реагировать не нестандартные DPI экрана, настроенные пользователем. Если приложение не умеет нестандартные DPI - происходит DWM Scaling его окна (растягивание контента, при этом шрифты начинают выглядеть размазанно). Так вот, выяснилось что положение и размеры активного окна (которое берет AutoHotkey) зависят от способности приложения работать с DPI. Если приложение этого делать не умеет, то его координаты и размер считаются исходя из стандартных 96 DPI (то есть, соответственно, цифры меньше), поэтому попытки передвинуть курсор в середину этого окна заканчиваются странно.

UPD: А самое странное в этой истории то, что майкрософт до сих пор не научило Skype нормально работать с нестандартными DPI, в результате чего или контакт лист выглядит так, что его с лупой рассматривать приходится, или все приложение отвратительно размазывается DWM scaling'ом. На макоси (на той же ретине) при этом все хорошо.

Epic

Feb. 23rd, 2014 07:46 pm
vadimpanin: (Default)
В iOS и мэверике какое-то время была сломана проверка SSL сертификатов:
http://www.neowin.net/news/serious-vulnerability-found-in-ssltls-on-os-x-mavericks-and-ios-7-easily-exploitable

Эксперты нашли проблему:

Управление ошибочно уходило в fail, где возвращалась переменная err, содержащая успешный код возврата от предыдущей проверки :)

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

Хотя у нас тоже забавный "баг" в том году нашелся. В одном месте блокировка мьютекса была написана вот так:
boost::mutex::scoped_lock( mutex_ );
=)
vadimpanin: (Default)
Тут есть необходимость протестить работу софта в условиях непредсказуемых сетевых затупов. Т.е. буквально, есть источник, есть приемник. Приемник с источника получает бесконечный поток по HTTP. Нужно в середину поставить софтину-регулятор, которая позволит руками управлять скоростью отдачи потока приемнику. Скажем, от полного останова потока секунд на 20, до последующей отдачи с пятикратной скоростью.
Нет ли чего уже готового? Понятно что написать за день можно, но вдруг.
Можно конечно nginx попробовать с ratelimit, скриптиком менять циферку в конфиге и делать nginx reload :)

Dead what?

Feb. 7th, 2014 01:47 pm
vadimpanin: (Default)
Thread 12 crashed with X86 Thread State (64-bit):
rax: 0x0000610000010fa0 rbx: 0x0000610000010fa0 rcx: 0xbaddc0dedeadbead rdx: 0x00000001132cc918

Макось на креше в нашем софте выдала. Гугль, как ни странно, находит всего 7 что ли упоминаний.
vadimpanin: (Default)
Официальный туториал по JSF + Hibernate с сайта спонсируемого ораклом нетбинза. Обратите внимание на удобнейший современный ORM.

Глупо было бы говорить, что с гибернейтом что-то не то, в конце концов рельсовый эктиврекорд явно с него писали, но видеть такое в туториале как-то дико.
vadimpanin: (Default)
Ruby on Rails и Grails показывают примерно 200 запросов в секунду (рендерится примитивный темплейт, без запросов к БД). Только джава ест 600 мегабайт оперативки и 300% проца, а рельсы, из-за отсутствия многопоточки - 100% проца и 100 мегабайт памяти. Хотя, казалось бы, одно - интерпретируемый язык с динамической типизацией, второе - байт-код со статической.
Надо еще Play framework попробовать, там нет всего этого кровавого энтерпрайза со спрингом (зато зачем-то Скала в темплейтах).

UPD: Я ошибся с жабой. Перегрузился в винду (надоело глаза ломать), запустил Grails на винде - 100 запросов в секунду. Стал разбираться, оказывается он в девелопмент режиме запускался, в продакшне получилось 500 запросов в секунду, если учитывать нагрузку на проц - вполне на уровне рельсов. Рельсы на винде нет смысла запускать (они тут раз в 10 медленнее). Надо в макоси в продакшне попробовать тоже, но врядли сильно быстрее будет.
Попробовал еще JSP - 2800 (!) запросов в секунду.
Не, я понимаю что веб-приложения большую часть времени сидят ждут ответа от базы, но такая разница в рендере почти статического шаблона.
Есть вариант, что я тут вообще производительность вебсервера тестирую (рельсы - webrick, grails - томкэт, jsp - glassfish).
vadimpanin: (Default)
http://lists.cairographics.org/archives/cairo/2013-December/024858.html

Я не знаю что ему принес Санта (или он просто в Колорадо живет), но тащить в C++ стандарт API для отрисовки 2D графики - идея более чем странная. Особенно если брать за основу существующую реализацию Cairo на сишечке.
Причем, отрисовка 2D графики сама по себе нужна редко (ну, там, школьникам кружочки порисовать), обычно графика нужна для отрисовки гуя. А гуй -- это получается другая библиотека. Если сейчас в каком-нибудь Qt одновременно пилят и контролы и их отображение, то если это API проползет в стандарт - будут библиотеки чисто для контролов, с рендерингом на а-ля Cairo, и глючить будут по-разному, в зависимости от реализации API на конкретной платформе/конкретном компиляторе. Получаем уже две проблемы.
vadimpanin: (Default)
Что нормального обфускатора для C++ кода то ли не существует, то ли он стоит каких-то безумных денег (по причине того, что никому не нужен).
У меня тут есть проектик, который нужно уметь кросс-платформенно компилировать на кучке платформ, но код там несколько sensitive и поэтому приходится обходиться статическими сборками библиотечек, распространяемых в корпоративном гите в виде бинарей. Однако ж, C++ такой язык, при любой смене компилятора приходится или наблюдать пространные глюки (clang vs. gcc) или ошибки линковки (из-за разных версий stl, например), или пересобирать на том же наборе, что невернятно задалбывает.
Я было подумал, что смогу весь десяток cpp файлов и пару десятков хедеров загнать в какую-нибудь умную софтину, которая спросит меня что из этого является внешним интерфейсом, а остальному заобфускейтит идентификаторы, да сделает компактнее, на манер жабаскриптового минификатора. Что позволит собирать код где угодно, не заморачиваясь по поводу бинарной совместимости, сохраняя допустимый уровень приватности.
Однако, хрен там, нет такого софта. Синтаксис плюсов достаточно сложен, что фактически означает, что заобфускейтить код так чтобы он потом компилялся можно только распарсив все 100500 включаемых файлов различных библиотечек, т.е. в обфускатор должен быть встроен парсер уровня компилятора. Есть какие-то поделки на перле, но я их не смог заставить даже хедера boost оставить в покое. Психов делать это на базе gcc я не нашел, clang, по-идее, представляет достаточно удобный интерфейс до Abstract Syntax Tree, но, если я правильно понимаю, парсит он их уже после препроцессора, что достаточно логично, но для целей обфускации не очень удобно.
Короче говоря, какой-то геморрой на ровном месте, даже в жабе можно было бы собранный в байткод jar нормально распространять.
vadimpanin: (Default)
Меня коллеги не засмеют за такие идентификаторы функций? :)
"serializeFieldArrayOfObjects"
"serializeFieldMapOfScalarsOptional"
Написал тут сериализацию, которая одинаково хорошо и удобно упаковывает объекты как в json, так и в бинарное представление. Попутно пришлось избавиться от перегрузки функций, потому что интуитивно понятным образом serialize(anything) сделать не получается. Потому что те же вектора uint8_t можно засериализовать как массив, а можно как данные. Причем первое в json будет массивом, а второе - текстом (в base64, например).
vadimpanin: (Default)
Не то, чтобы я нашел конкретную книжку, но вот материалы с которыми может быть полезно ознакомиться:

A Fresh Graduate's Guide to Software Tools and Development
http://www.comp.nus.edu.sg/~seer/book/2e/
Книжку пишут бывшие и настоящие студенты университета Сингапура, состоит из нескольких глав по разным темам. Книжке не хватает глубины, но если вы не знаете что гуглить - это очень полезная книжка. Из нее я например узнал про Paxos algorithm и получил наглядное представление об облачных сервисах от Google и Amazon ("Chapter 06: Scalability", "Chapter 01: Cloud Computing"). Другие главы тоже могут быть полезны вне контекста сабжа, возможно доберусь до них позже.

Autopilot: Automatic Data Center Management
http://research.microsoft.com/pubs/64604/osr2007.pdf
Тоже достаточно поверхностное описание как Майкрософт строит свои датаценты, какие проблемы решает их софт для выпаски и мониторинга десятков тысяч машин. Там нет конкретных решений, but it just may get you thinking. Описана, например, базовая логика, которая позволяет обслуживать машины в датацентрах не 24/7, а 8/5.

Everything You Always Wanted to Know About Synchronization but Were Afraid to Ask
http://sigops.org/sosp/sosp13/papers/p33-david.pdf
Достаточно близкая к железу статья на тему распараллеливания софта. Анализируется несколько архитектур, включая Xeon'ы. Анализируются накладные расходы на когерентность кэшей в многопроцессорных машинах. Так я например узнал, что треды попавшие на соседний сокет (процессорный сокет), могут давать до 7.5 бОльший оверхед. Т.е., скажем, атомарные операции на многопроцессорной машине могут внезапно начать работать почти в 10 раз медленнее, только за счет того, что ядро выперло парочку тредов на соседний процессор. Даже при использовании memory fences (блоки памяти вокруг переменных изменяемых атомарно, чтобы эти атомарные переменные не кучковались рядом на одном кэш-лайне).

Это не полный список, я ощущаю что надо почитать что-то еще, но, например, MongoDB, насколько я понял, является единственной открытой БД, в которой реализован Paxos. При этом оно таки eventually consistent. В итоге, я пришел к выводу, что лучше использовать традиционные реляционные СУБД для "обычных данных" (в моем случае не так часто изменяемых), используя master-slave репликацию (и просто переключать все в read-only при отказе мастера). И использовать монгу для обработки тяжелых клиентских запросов, для которых не нужна жесткая согласованность между инстансами БД.

Еще есть вариант выпереть всякий веб в облако, а железный кластер оставить "реальным" для тяжелой математики, но не уверен, что паранойя позволит это сделать.
vadimpanin: (Default)
параллелизации и резервированию систем программного обеспечения. В частности, с реляционными СУБД и дисковыми массивами. С целью сохранения консистентности данных и обеспечения непрерывной работоспособности. А то создается ощущение, что приходится заниматься каким-то велосипедостроением.
vadimpanin: (Default)
Меня тут коллега спросил, почему из конторы ушел Д.? Мол, высокой концентрации разработчик, знает много всего и практически не ошибается.
В голове как-то появилась аналогия:
Представь что ты возишь фурами грузы из пункта А в пункт Б (пункты каждый раз разные). У тебя есть штат водителей. Есть один который умеет водить все возможные фуры, умеет объезжать пробки, не бьет машины и товар, но возит только когда ему удобно (обычно ночью), не всякий товар и большую часть других водителей считает чуть ли не быдлом.
И есть 10 других водителей, которые иногда и тупят и выпивают где-то по выходным и машины иногда бьют и товар бывает портят, но зато нормально работают группой и везут что скажут, куда скажут и когда скажут.

Бгг

Oct. 21st, 2013 09:06 am
vadimpanin: (Default)
"Ага, нормальные люди пишут на сях, и у них все течет да сегфолтится, зато очень быстро.
А если поменять порядок копирования байтиков в memcpy(3) на обратный, то у них КРОВЬ КИШКИ РАСП-ДОРАСИЛО...

А вот нормальные люди, которые пишут на PHP. У них всегда все как-то работает, но никто не знает, что будет в пограничных случаях: возможно, сообщение будет отправлено случайному пользователю, возможно, на сервере закончится место. Что стрясется — не знает никто, но все делают вид, что все в порядке.

Еще есть нормальные люди с козлиными бородками, мелировкой и в очках с толстенной оправой без диоптрий, которые писали бы на руби и пихали бы данные с охрененной скоростью в монгодб, да только у них времени нет, потому что они ездят по конференциям, делают в Keynote.app презентацию для инвесторов в очередной стартап, пишут бложеки

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

Чистые си [мне иногда кажется] надо отменить. Вообще отменить языки, где нельзя сделать нормальное автоматическое управление памятью (в C++, есличо - можно). C, Objective-C (в том обгрызенном виде в каком он в gcc представлен).
Я на выходных потратил три часа чтобы найти утечку где-то внутри ffmpeg'а, так и не нашел. Дотрейсил ее до bitstream filter'а aac_adtstoasc, и как бы все, где они там умудряются память выделять я не понял. При выгонке 250GB видеофайла в софте утекает примерно гигабайт памяти. Надо делать изолированный кейс и брейки ставить на маллоки всякие (чего я жутко не люблю).
vadimpanin: (Default)
http://www.reddit.com/r/programming/comments/1oi8wd/ruby_is_a_dying_language/ccs8yr8
Разумно, но часть аргументации странная.
Никто не застрахован от опечаток/описок в C++ тоже (причем, описка не поломает билд) и автотесты на сложных плюсовых проектах тоже отнюдь не две минуты выполняются.
Хорошо сказано про систему апгрейда гемов, там реальный бардак. Практически нет вариантов кроме как сидеть все версии руками приколачивать, либо обновлять только самый минимум (bundle update --source gemname).
Еще у нас буквально вчера забавная ситуация была. Машинки деплоятся через чеф. Вебаппы собраны в дебки и деплоятся аптом, но миграции запускает чеф. Чеф собран с одними рубями, вебаппы с другими. На машинку соответственно из репки прилетает две версии рубей. Чефовские рецепты запускаются в окружении родных чефу рубей, соответственно все что запускается оттуда - запускается в окружении этих рубей. У которых отличается гемсет and everything. Что там конкретно внутри случалось мы так и не разобрались, но миграции тупо не срабатывали, а успешно пошефленная тачка оставалась с пустыми базами. В итоге пришлось городить костыли в виде command "env -i bash -lc ...", которые запускали чистый баш без энвайронмента и из него уже запускали миграции с правильной версией рубей. Костыли потом переехали в провайдер.
Сейчас, вероятно, в комменты набижит Андрюша и скажет, что надо было юзать Docker, но типа вот.
vadimpanin: (Default)
На хабре какой-то крендель начал цикл статей о lock-free структурах данных, за обедом как-то подняли эту тему.
Вообще, сихронизация многопоточных программ - достаточно обширная и сложная тема. Даже опытные разработчики сталкиваясь со сложным софтом нередко натыкаются на дедлоки. Я не говорю про примитивы типа клиент-серверного веб-софта, где синхронизация заключается в простом разделении доступа к ресурсам. Я говорю про софт, который одновременно работает с десятком-другим достаточно разнородных объектов-тредов, параллельно работая с написанными левой ногой драйверами к какому-нибудь телевизионному железу (где внезапно приходят колбеки, когда объект уже давно удален, например). Ситуация усложняется если в проект приходят новые люди. Так как С++ поощряет выстрелы себе в ногу, дедлоки становятся реальной проблемой.
Я как-то потратил некоторое время пытаясь сформулировать правила, по которым можно писать "бездедлочные" приложения на плюсах. Свелось к тривиальному (потом про это). Думал про статический анализатор, который бы проверял код на потенциальные дедлоки, но сложность (в том виде в котором к ней заставляют подходить синхронизационные примитивы предоставляемые тем же posix) проблемы оказалась велика. В Microsoft DDK есть забавный софт, использующий движок SLAM, по которому написана куча whitepapers, где умные люди пытаются строить математическую модель безглючного софта (точнее, позволяющую детектить глюки в софте с всего порядка 10% ложных срабатываний). Но SLAM используется только для анализа кода драйверов на достаточно небольшом объеме кода.
Короче говоря, я на текущий момент не придумал ничего умнее примерно следующего
1) (очевидное) не делать мьютексов там, где можно обойтись незамороченным lock-free
2) объекты на стадии многопоточной работы (инициализация вполне может быть, и в идеале должна быть однопоточной) обращаются друг к другу только в одном, заранее известном направлении (получается граф, который нигде не замкнут)
3) любые обратные связи (ошибка в рабочем треде объекта, например) должны строиться через очередь сообщений, обрабатываемую асинхронно в основном рабочем потоке принимающего объекта
Потому что достаточно проблематично сделать дедлок в типичном кейсе, где один пишет, другой - читает. Таким образом, исключается возможность стандартной ошибки, когда, например, объект-менеджер дает команду объекту-исполнителю, в то время как объект-исполнитель репортит ошибку объекту-менеджеру (я неоднократно за годы натыкался на различные производные этого кейса).
Есть другой достаточно забавный подход, который в принципе похож, я его наблюдаю достаточно давно в соседнем отделе. Там просто не пишут многопоточный софт, эти ребята пишут на Objective-C и специально выпилили многопоточку, заменив главный loop программы на libev. Если им что-то нужно делать одновременно - они запускают другой или еще один процесс и общаются с ним через ZMQ. Тоже, в принципе, решение. Не без минусов, но принцип тот же. И гораздо более утойчиво к текучке на проекте, by design заставляет людей писать без дедлоков. Но на С++ писать таким образом я бы не хотел.
Параллельно меня забавляет ситуация с опытом по созданию многопоточных приложений среди С++ программистов, я неоднократно объяснял и видимо буду это на собеседованиях спрашивать. Но практически никто без подсказки не пользуется средствами языка для минимизации количества мьютексов.
Взять тот же пример объектом-менеджером и объектом-исполнителем. Объекту-менеджеру нужно знать статус объекта исполнителя, какую-нибудь статистику, которую удобно выводить в статус приложения. Статистика стоит из POD'ов каких-нибудь. Чтоб усложнить задачу - пусть там будет парочка string'ов. Что делает разработчик? Разработчик делает мьютекс, который лочится в момент изменения переменных статуса (в рабочем потоке) и в момент чтения из них (по запросу менеджера). Собственно вопрос - как избавиться от этого мьютекса (не жертвуя consistency данных и не заменяя все на POD'ы) используя средства STL или BOOST? (кстати, что характерно, человек на хабре, вещающий про lock-free для C++, говорит что не имел еще опыта с boost).
vadimpanin: (Default)
Вышел пакетный менеджер GNU Guix 0.4
http://www.opennet.ru/opennews/art.shtml?num=38024

На самом деле это достаточно крутая штука. Nix позволяет иметь на одной машине любое количество версий любого софта / библиотек. GNU практически приходит к тому что Windows предоставляет с 90-х годов - возможность распространения пакетов со всеми зависимостями внутри самого пакета, без костылей с LD_PRELOAD/LD_LIBRARY_PATH и прочим (например, все то что я писал в школе, без проблем запускается в 2013-м на текущих ОС и железе).
Да, arguably понижается общая безопасность системы за счет того, что найденные уязвимости не патчатся "автоматически" во всем софте что использует какую-либо библиотеку, но с позиции деплоймента софта и разработки - получается очень удобно.
Один из минусов, правда, - оно _все_ линкует динамически, что несколько сказывается на оптимизации/производительности.
vadimpanin: (Default)
(gdb) thread apply all bt

выводит колстеки для всех тредов в gdb
удобно сразу в тикеты закидывать

Profile

vadimpanin: (Default)
vadimpanin

May 2015

S M T W T F S
      12
3456 7 89
1011 1213 1415 16
17181920 212223
24252627282930
31      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 1st, 2025 05:45 pm
Powered by Dreamwidth Studios