amirul
+27
Как человек, весьма много работавший с ETW, хочу ответственно заявить, что автор статьи совершенно не понимает о чем говорит. И дело даже не в самом ETW API (которое, скажем прямо, далеко от идеального) — дело в непонимании кучи БАЗОВЫХ вещей.

Начнем с того, что автор пытается использовать низкоуровневое API и с удивлением обнаруживает, что оно… НИЗКОУРОВНЕВОЕ. Ну явно какие то дебилы писали. Использовать к примеру StartKernelTrace было бы можно, но как же тогда писать возмущенную статью. Если нужно более гибкое, но высокоуровневое API, можно использовать WPRControl (это тем более удобно, что тот же самый профайл можно будет запускать отдельно от собственной программы, а также менять состав собираемого лога без перекомпиляции — простой правкой конфигурационного файла).

Возмущение по поводу GUID вообще не в кассу. Здесь человеку нужно почитать о размещении значимых типов в C/C++ и единицах трансляции. Отличие INITGUID в том, что оно заставляет макрос DEFINE_GUID определять переменную (с выделением места в data секции для текущей единицы трансляции). По умолчанию (без INITGUID) данный макрос только объявляет (extern) переменную и предоставляет линкеру позаботиться о поиске определения (и, соответственно, размещения). Да-да, тупой Майкрософт «не смог найти способ внедрить их в заголовочные файлы (я могу насчитать несколько возможных способов, но, я полагаю, им не понравился не один из них)». На минуточку, здесь прозвучало предложение внедрять ОПРЕДЕЛЕНИЯ переменных (то есть выделение памяти для них) в заголовочне файлы ПО УМОЛЧАНИЮ. Конечно же, что может быть лучше заголовочных файлов с непустым вкладом в объектный файл? Ведь всегда можно налепить сверху хак вроде __declspec(selectany). Динамически выделяемую память, кстати, за собой тоже можно не чистить — достаточно просто прибить процесс и никто и не заметит утечек.

Возмущение по поводу ограниченного количества «флагов» в «kernel trace» провайдере забавны в свете того, что вот прямо сейчас вон там из 33, а «xperf -providers K» из Windows 8.1 SDK выдает список из 55 возможных флагов (это только публичная часть — возможно для «внутреннего потребления» их еще больше).

Предложенные варианты API забавны, ибо совершенно не попадают в сценарии использования ETW. Самое главное требование — низкая стоимость (околонулевая в случае, когда на событие никто не подписан и не более пары тысяч тактов, если подписан). При этом необходимо обеспечить возможность работы на *всех* IRQL (к примеру есть возможность писать в лог с IPI или CLOCK уровней, когда не только диспетчер не работает, но и большинство прерываний от устройств замаскированы). При этом все должно продолжать работать на многопроцессорных системах (из чего следует, что использование любых видов блокировок запрещено). Необходимо иметь возможность писать в кольцевой буфер (подумайте о флаге REFSET который трейсит все ОБРАЩЕНИЯ к памяти — хотите ли Вы в пользовательском режиме обрабатывать все такие события? В реальном времени?). Нужно иметь возможность начать лог до старта не только первого пользовательского процесса, который мог бы в ETWBeginTrace, а и до старта, собственно, ядра (да-да, winload умеет писать в ETW лог — предлагаю угадать как он это делает). Это только то, что пришло в голову прямо сейчас (мне даже представлять не хочется этап сбора требований в команде, которая разрабатывала этот компонент).

Собственно разделение сессий трассировки и потребителей трейса — вполне логичное следствие даже тех поверхностных требований, которые я уже привел. Поэтому и разделение StartTrace/OpenTrace — трейс запускается в сессии, а потреблять его может кто угодно (собственно, это ОСНОВНОЙ режим работы API — запуск трейса xperf/wpr на тестовой/проблемной машине и анализ лога на машине разработчика — я даже и не припомню когда бы мне пришлось сталкиваться с «realtime» трейсами).

Ну, не совсем. Очевидно, что Вы не хотите, чтобы любой процесс мог украсть отслеживание лога ядра у другого процесса. Поэтому Microsoft решила, что лучшим решением проблемы будет просто запрещение доступа до лога ядра всем процессам, кроме тех, которые имеют права администратора.

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

Кстати, по поводу «безумия». SystemTraceProvider и его же сессия — действительно выделены в отдельный специальный случай, что выглядит несколько некрасиво. Но, как и многие другие компромиссы, этот был сделан ради производительности — уж сильно много всего трейсит данный провайдер. Для остальных провайдеров API более универсально, но за универсальность, как обычно платят производительностью. Начиная с Win8, его можно включить до восьми раз. В принципе в моей практике почти всегда хватало одного. Исключения — это всякие когда запущен какой нибудь Process Explorer/Process Hacker (я активно исследую что-либо) и при этом мне хочется собрать трейс. Если включить эти случаи, то мне изредка нужно 2-3 сессии. И при этом я, в отличие от автора статьи, действительно не один год провел ковыряясь в производительности.
amirul
0
Сложно серьёзно относиться к постам и словам человека, который заявил, что настроенная винда без ущербных вирусов, а в линуксе их в любом случае полно.

Во-первых я не заявлял ни того ни другого.
Я лишь отметил, что профиль распространения «настоящей малвари» (в соответствии с определением моего оппонента) несколько отличается от «общеизвестного». Пожалуйста, не приписывайте мне заведомо ошибочных суждений

Правильно настроенная ОС это уже 95% защиты от вирусов. Только вот… В большинстве случаев ОС настроена не правильно, что линкус, что виндовс, что убунта.

Да, но ведь речь идет о «абы как» (хорошо если по умолчанию, но ведь полно ж твикеров, зверсиди, отключателей апдейтов для того чтоб «активация не слетела» и прочих — и они все попадают в общую статистику) настроенном Windows и о Linux (я говорю обобщенно о всем стеке, а не только о ядре), который настраивают хорошо оплачиваемые профессионалы с многолетним стажем.

Если же сравнивать «apples to apples» — сервера на Linux против серверов на Windows, то есть очень существенный перекос (гораздо выше, чем можно было бы ожидать просто от распространенности технологий, даже учитывая нелинейность зависимости). В прошлый раз, когда я просил показать мне high-profile взломы серверов на основе Windows, то всплыл только T-Mobile. При том, что на Linux кого только не ломали — и kernel.org и linuxfoundation и savannah.gnu.org и redhat.com (дважды) и mysql.com и кучу других, не говоря уже о просто коммерческих/вебдваноль вендорах типа target, gawker, sony, hyper-vm и пр…

На всякий случай: я не спорю, что Linux можно захарденить практически до непробиваемости (к примеру, я не думаю, что Google будет так или иначе взломан в обозримом будущем), но все таки это весьма нетривиально (не думаю, что у RedHat или kernel.org не хватило денег либо опыта в Linux для того, чтобы предотвратить взломы).
amirul
0
Из-за того, что соц инженерия — наиболее частый вектор проникновения, люди и придумывают всякие SafeBrowsing/SmartScreen. До некоторой степени помогают также антивирусы. В целом ставки постоянно поднимаются, но ситуация выглядит более-менее стабильной — существенного перевеса нет ни у одной из сторон.

Про повышение цены вопроса согласен.

то в одних случаях (Линукс) возможно заломить поднебесную цену вопроса, а в других (Вин и Мак) принципиально невозможно.

Вы очень сильно ошибаетесь. Причем в обеих оценках.
amirul
0
Файлы останутся совместимыми. Я предлагаю настроить KeePass под «конкретной ОС» так, чтобы получить бОльшую часть преимуществ работы под отдельными пользователями и практически без неудобств. Если ту же базу нужно использовать под Linux/OSX то для достижения подобного эффекта таки придется пользоваться отдельным пользователем.
amirul
0
Включите secure desktop для мастер пароля. Если злоумышленник сможет вытащить пароль оттуда, то система все равно уже не ваша — можете перестать беспокоиться :-)

Кстати, хром/хромиум и IE используют очень качественные песочницы для запуска недоверенного кода. Исследователи оттуда периодически выбираются, но для злоумышленников это пока нецелесообразно.
amirul
0
Спасибо за более предметный разговор.

Разные пользователи помогут от части атак, но далеко не ото всех. У того же KeePass есть опция, которая спрашивает мастер пароль в другой сессии — фактически проникнуть туда без повышения привилегий все равно нельзя. Собственно, эта опция помогает противостоять подавляющему большинству атак, против которых помогает отдельный пользователь и не помогает в случаях, когда отдельный пользователь тоже бессилен. И при этом secure desktop практически не влияет на удобство использования keepass.

chroot — небезопасен. Его нельзя использовать для ограничения доступа. Вот пара ссылок. По большому счету я бы и «настоящей» виртуализации не слишком бы доверял, если бы меня паранойя замучила («не слишком» — это только в случае запуска недоверенного кода на доверенном хосте, но в виртуалке, если же хост потенциально скомпрометирован, то любая виртуалка на нем точно также скомпрометирована). Только физическая изоляция — только хардкор.

Кстати, как в вашем случае защититься от вируса, который логирует все содержимое буфера обмена? Или еще лучше содержимое буфера обмена сразу после очередного изменения и скриншот экрана?

Здесь опять же нужно моделировать угрозы. Если речь идет о массовом сборе паролей, то вполне можно допустить, что когда-нибудь (когда это станет экономически целесообразно) будет использоваться модуль автоматического вытаскивания паролей из популярных менеджеров паролей. Простая обфускация keepass в этом случае отлично помогает, хотя, как Вы отметили, и является security through obscurity. Делать же постоянные снимки буфера обмена да еще и скриншоты — попросту не масштабируется и, соответственно, такие угрозы в ближайшем будущем ожидать не стоит.
Второй возможный вид угрозы — таргетированная атака конкретно на Вас лично. Ну в таком случае вообще никакая ОС общего назначения не поможет.
amirul
–1
О, ну наконец-то, пошли настоящие аргументы. Ну конечно же, Вы меня «затролели», у меня «бомбануло» и я теперь еще долго не смогу успокоиться.

Желаю удачи, но все же повторюсь со своей рекомендацией «хотя бы поверхностно поинтересоваться вопросом».
amirul
0
Вы про «холивар»? Так никто ж не собирается воевать — я всего лишь хочу «поверхностно разобраться с вопросом»
amirul
0
Ну право же, не стоит так подставляться. Нет, серьезно (Hint: еще раз перечитайте список Ваших собственных публикаций).

Но давайте все же поговорим предметно. Возьмем класс

реальное малваре (множество включающее вирусы), а не «пользователь скачал хз что и откуда и сам установил с максимальными правами»

и попробуем «хотя бы поверхностно поинтересоваться вопросом». В контексте данного топика нас интересуют только то «реальное малваре», которое привело либо к крупной утечке пользовательских данных либо к крупной эпидемии (пусть будет 0.5% популяции)

В качестве «ОС, распространенных на сегодня» возьмем Windows, OSX и Linux (используется в пределах погрешности измерения на «десктопах», но довольно широко распространена в некоторых других сегментах). Также возьмем мобильные ОС: Android, iOS и Windows Phone

1. Мобильные ОС можно сразу исключить из рассмотрения — ни по одной из платформ я не смог найти достоверной информации по «реальному малваре», которое бы привело к «реальному ущербу»

2. Windows — за последние 15 лет (включая Summer of Worms) я не смог обнаружить ни единого случая, когда «реальное малваре» (да-да, то которое может заразить полностью пропатченную ОС без явного согласия пользователя), которое бы привело к «реальному ущербу». Искренне надеюсь на Вашу помощь. Очень рекомендую «поверхностно поинтересоваться вопросом» перед тем как предлагать варианты.

3. OSX — есть как минимум Flashback который использовал 0-day уязвимость в «Apple Java» (на тот момент Sun Java была пропатчена, но Apple распространяла JRE по собственным каналам и в этом канале распространения патча еще не было — это на тот момент была историческая норма для Apple). Flashback привел к заражению 600к машин, что на тот момент составляло более процента популяции.

4. Linux. Здесь примеров полно. От червей в роутерах до крупных утечек данных (их десятки — могу привести еще, но можно ограничиться и утечкой 160 миллионов профайлов за раз).

Хотелось бы услышать про Ваш взгляд на то, что такое «нормальная ОС». Заранее спасибо
amirul
+1
Конечно, всегда пожалуйста: будет время — обязательно помогу. Стоить ли рассматривать Ваш «сарказм», как категорический отказ «хотя бы поверхностно поинтересоваться вопросом»?
amirul
–1
Опять проклятый Даннинг-Крюгер. Вы бы для начала хотя бы поверхностно поинтересовались вопросом перед тем как выдавать претенциозные «рекомендации».
amirul
+5
Сириусли, Майкрософт, уволь того чувака
amirul
+1
Да, я таки переборщил. Подход в статье сам по себе имеет право жизнь, более того, конфигурирование фреймворков (хоть чужих хоть самописных) — зачастую действительно гораздо более поддерживаемый подход, чем клепание всего под конкретную задачу. Спасибо, что поправили — я полностью с Вами согласен.
amirul
+6
Кто Вам сказал, что конфигурация кода — это метапрограммирование?
amirul
+12
Очень сильно не хватает пункта «Пользуюсь метапрограммированием давно, но то, что описано в статье — бред собачий».

Следим за руками.

Метаданные — это данные, описывающие данные
Метамодель — это модель, описывающая модели
Метаисследование — исследование, имеющее объектом другие исследования

Метапрограммирование — это парадигма программирования, построенная на программном изменении структуры и поведения программ.

Хм, «меня терзают какие то смутные сомнения» (с)

А почему бы не последовать за всем остальным миром и не пытаться переопределить существующие понятия (и метапонятия, хехе).
Метапрограммирование — это программы, которые генерируют программы. ВСЕ!

Скажем, старый добрый
#define MIN(a, b) ((a) < (b) ? (a) : (b))


Это метапрограммирование. Да, да, какой бы примитивной ни была сишная макросистема — она генерирует новый код в месте использования (который потом может быть а может и не быть «выброшен» оптимизатором) и поэтому является метапрограммированием.

template <typename T> T min(T lhs, T rhs) {return lhs < rhs ? lhs : rhs; }

Это тоже метапрограммирование. Для каждого типа порождается (инстанцируется) новая функция

И даже уродство вроде
$db->query("select * from users where name='" . $user . "'")

Это, очевидным образом, тоже метапрограммирование.

Логичнее всего метапрограммирование выражено в Scheme. Компиляция явным образом разделена на метауровни. Уровень meta-0 — это то, что, собственно, компилируется. Meta-1 — уровень который может генерировать код для meta-0 (собственно, макросы), meta-2 — уровень генерирующий код для meta-1 (макросы, генерирующие макросы). Количество метауровней стандартом не регламентируется.

Ну а то, что описано в статье — это именно, что «бред собачий» и попытка переопределить существующую терминологию
amirul
0
Здравствуйте, спасибо за интересные статьи, но мне кажется, что напрасно Вы пытаетесь «натянуть» реляционную модель на ваши данные.
Наиболее близким представлением, опять же, на мой взгляд, является triplestore/RDF, то есть тройки субъект-предикат-объект. Каждая такая тройка задает одно ребро направленного графа «знаний».
amirul
+5
Да там половина топ-менеджмента такая.
Что же до стереотипов, мне кажется, что здесь — один из немногих случаев, когда под идиотское «ну тупы-ы-ы-ы-ые» вполне уместно идиотское «сперва добейся».
amirul
+2
Доказательство — фронтальная кора.

Вот как описывает ее функции википедия:
The executive functions of the frontal lobes involve the ability to recognize future consequences resulting from current actions, to choose between good and bad actions (or better and best), override and suppress socially unacceptable responses, and determine similarities and differences between things or events.

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

А теперь, самое главное: «In humans, the frontal lobe reaches full maturity around only after the 20s» (у человека фронтальная кора полностью развивается после 20-ти лет — в статье ссылка на МРТ исследования реальных людей). Полное развитие, в общем то и не нужно для начала обучению программированию. Лобная кора развивается «достаточно» примерно ко времени «полового созревания» — те самые 12 лет.
amirul
+3
Бывает. Вот пример enterprise-quality кода, который соответствует всем правилам, изложенным в статье. Проект уже обсуждался на хабре.

amirul
+1
Не всем нравится самообслуживаться — многие предпочитают, чтоб живой человек им улыбнулся.

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

Это когда раньше, двести лет назад?
Кассовые аппараты используются с 1879 г.

Ну, скажем прямо, появились — не совсем то же самое, что повсеместно используются. Хотя я в любом случае согласен, что в крупном ритейле кассовые аппараты появились именно повсеместно еще до моего рождения. Но это, вообще говоря, никак не влияет на тот факт, что кассир в ретейл-сети мало чем отличается от велферщика.
amirul
+5
У меня есть смутное чувство, что люди не совсем понимают смысл данного призыва. «Ну будут бомжи говнокодить — и что?»

А то, что уже сейчас просто невероятное количество профессий не нужны — их вполне можно автоматизировать. Не делается почему? Да потому же, почему и откровенно убыточные предприятия (и банки) получают государственные дотации «лишь бы не обанкротились» — иначе безработица, социальный взрыв, кровь, кишки, вот это все.

Вон, даже кассиры из Волмарта протестуют в очередной раз — денег больше требуют, соцпакет получше. А вы видели работу тех кассиров? Подставляют баркоды под ридер и улыбаются посетителям — фактически тот же велфер, только замаскированный. Это все уже можно автоматизировать (а с RFID и NFC — это можно сделать еще и гораздо более удобным для покупателей), более того, во всех супермаркетах УЖЕ есть кассы самообслуживания. Не говоря уж о том, что этих кассиров можно заменить вообще любым иммигрантом без прав — раньше на кассах хотя бы навыки быстрого счета в уме были нужны.

Вот для вывода трудовых ресурсов из этого скрытого велфера призыв и нужен. Программист, даже самый препоганый быдлокодер — уже гораздо более ценный для внутренней экономики кадр, чем кассир в Волмарте (и тем более, чем тот бомж, который недавно зарелизил свое первое приложение — до того, как он стал, собственно, «программистом»). Мировой тренд таков, что все больше и больше ручного труда будет автоматизироваться и основной рабочей профессией будет программист: образно говоря, слесарей заменят станками с ЧПУ (или 3d принтерами) а слесарям — либо в операторы этих самых станков (читай те же «программисты» пусть и «быдло-»), либо на улицу.

Есть и другая сторона: талантливые люди встречаются примерно с одинаковой частотой, поэтому существует такое понятие как «пул талантов». Поэтому для увеличения количества медалей на Олимпиадах нужно вовлекать и «просеивать» как можно больше молодежи. То же и с программированием: чем больше попробует — тем больше перерастут «быдло-» стадию.
amirul
+1
Вообще, полный порядок загрузки dll под всеми поддерживаемыми версиями Windows описан здесь. Как было сказано, можно иметь в наличии все версии конкретной dll и при помощи манифестов связаться с конкретной версией, если же подобная гибкость не нужна — то есть SetDllDirectory/AddDllDirectory, которые в комбинации с SetDefaultDllDirectories позволяют полностью контроллировать откуда будут загружаться dll. Единственный нюанс: разрешение зависимостей в IAT происходит до выполнения кода, который может установить пути — в этом случае либо манифест, либо delayload для тех dll-ок, которые могут прийти из разных мест.
amirul
+1
Ну, прежде всего, в ORM-ах нет реляционной алгебры (по крайней мере на объектном конце — именно поэтому нужен «меппинг»).

Если же говорить конкретно про LINQ, то join-ы в нем семантически больше похожи на таковые в XQuery: декартово произведение сущностей с фильтрацией зависимых (вместо генерации нового множества кортежей со значениями). То что некоторые LINQ провайдеры генерируют на выходе SQL — отнюдь не означает, что LINQ это и есть SQL (просто с другим синтаксисом) — между ними семантическая (а не синтаксическая — как раз синтаксис относительно близок) пропасть.
То есть образно говоря, LINQ настолько же не SQL, насколько, например, C++ — это не машинный код.
amirul
+1
Нет, реляционной алгеброй в ORM-ах не пахнет. Все операторы реляционной алгебры отображают кортежи в кортежи. Любая агрегация (в смысле включения одних объектов и коллекций в другие, а не свертка набора значений в одно) — это уже очень существенно нереляционно (собственно говоря, это один из тех самых «impedance mismatch»-ей: O-часть ORM-а работает над графом зависимостей, а R-часть — над множествами кортежей).

Более того, тот факт что одна и та же модель может быть отображена в другую систему хранения (причем, например, отображение в document-based хранилища приводят к гораздо меньшему количеству «импедансов») говорит о том, что модель на O-конце не особо связана со своим R-концом.
amirul
+1
Ну дык это и не Ваше творение — оригинальный автор похоже не шутил (вернее, скорее всего он считал, что насмехается над «фанатами» Mongo).

Да мепперы спасают до определенной степени (я по возможности пытаюсь выносить запросы в LINQ, оставляя саму базу практически без хранимых процедур), но они лишь явственно очерчивают проблему с SQL, а не решают ее (ну и приносят импеданс, про который упомянул автор, а вернее пару десятков оных). То есть по сути ORM-ы — тоже NoSQL.

От RDBMS остается фактически только хранение B-деревьев, с чем вполне справляются всякие BDB, да и все остальные БД — как SQL так и NoSQL (включая Mongo) используют B-деревья как основную структуру данных для хранения индексов.

Что же до Mongo — да, глобальный лок — ОЧЕНЬ спорное решение изначально, с другой стороны она таки действительно масштабируется горизонтально (и, как Вы отметили, этот самый лок разбивается на несколько — в каждом mongod свой). Ну и отлично понимая, что я — «нерепрезентативная выборка», но в моем личном опыте неосторожное обращение с констрейнтами убило больше производительности, чем глобальный лок в Mongo.
amirul
–7
Браво, просто таки ошеломляющая победа над «чучелом Mongo».

Очень не люблю фанатиков, и ОСОБЕННО ненавижу фанатиков древних как окаменевшее говно мамонта технологий. Нет, я уже недостаточно молод для "… до основанья, а затем..." и вполне признаю право устаревших технологий на продолжение своего существования, но фанатеть от них?

Так как самым важным (и сложным) в программировании является управление сложностью создаваемых программ, то хороший язык программирования обязан:
1. Предоставлять средства построения абстракций, позволяющие разбивать задачу на относительно независимые подзадачи.
2. Предоставлять выразительные средства наиболее близкие к тому ЧТО хочет программист, а не к полному описанию алгоритма получения искомого результата. Данный пункт во многом перекликается с предыдущим (а в языках, поддерживающих создание синтаксических абстракций, полностью включен в него), но все таки стоит отдельно.

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

В SQL мы имеем глобальные процедуры и функции (триггеры и отображения являются специализированными процедурами), из типов данных — пучок примитивных типов данных (нет беззнаковых целых, но есть двоично-десятичные дроби — кто вообще до сих пор считает это хорошей идеей?) плюс таблицы. Все. Это настолько примитивно, что даже некоторые ассемблеры более выразительны.
amirul
+1
1. Можно войти в тот же самый стек фрейм (не путать с другим стек фреймом для той же самой функции) даже после выхода из этой функции
2. Точно так же как и __async/__await, собственно yield довольно тривиально пишется если есть __await (но сахар все равно лучше)
3. Возможных реализаций несколько и одна из них — та, что в шарпе — конечный автомат. На build2013 (кажется, хотя может это был и going native) был доклад о реализации __async/__await в VS. Для каждой операции, выполняющейся асинхронно, динамически выделяется отдельный стек фрейм и указатель стека перекидывается между фреймами в прологе/эпилоге функции.
amirul
+3
Вот как раз если Вы чувствуете личную ответственность, то Вы просто обязаны всеми силами избегать овертаймов (да, естественно, случаются форсмажоры, но они должны именно СЛУЧАТЬСЯ).

Чувство ответственности — это не «работать как можно больше», а пытаться максимизировать выгоду в средне и долгосрочной перспективе. Работая сверхурочно Вы, фактически, саботируете производство. Ну примерно, как если из-за «чувства ответственности» выходить на работу будучи больным. Ага, поприсутствуете (сомневаюсь, что с повышенной температурой будет сделано хоть что-то вменяемое), а потом минимум половина Ваших коллег тоже заболеют.
amirul
+14
Ага, работай по 20 часов в сутки (я реально однажды провел неделю в таком режиме, когда был помоложе и мог себе это позволить, не говоря уже о годах проведенных в режиме 12-16 часов работы в сутки — три работы, чо, две из которых — собственный мунлайтинг), выгори, получи проблемы в семье, вялотекущую депрессию и отсутствие мотивации (причем фишка в том, что разумом все понятно — работа «в принципе» нравится, семью нужно кормить опять же, но каждый раз нужно себя ЗАСТАВЛЯТЬ что-нибудь сделать), следом — получи проблемы уже на самой работе, углубись в собственную депрессию, наслаждайся паническими атаками и проблемами со здоровьем.

Фишка в том, что обязательную 40-часовую рабочую неделю «изобрели» не коммунисты (или хотя бы социалисты), которые неусыпно заботятся о правах трудящихся — там то как раз сплошные пятилетки за 3 года и «стахановщина». Ее ввел Генри Форд, который помимо прочего ввел конвейерную сборку — и то и другое для УВЕЛИЧЕНИЯ эффективности труда (причем на основании предварительно проведенного по этому поводу исследования). И да, интеллектуальный труд еще больше подвержен деградации при овертайме по сравнению с трудом сборщиков на фордовском конвейере.

Отдыхайте, товарищи, побольше — меньше проблем придется решать в будущем.
amirul
0
Дополнительно оплачиваются только те часы, которые по взаимному согласованию:
Extra pay for working weekends or nights is a matter of agreement between the employer and the employee (or the employee's representative).

ТК РФ/Украины и прочих говорят примерно то же самое.

То есть, если компания (в лице начальства) не «попросила» поработать дольше, то и плюшек дополнительных не будет. Как Вы уже сказали, если работнику требуется больше времени для выполнения своих рабочих обязанностей — то, возможно, он просто не соответствует своей должности (опять же — может быть как недостаток квалификации, так и завышенные требования, но проблема именно в несоответствии).
amirul
0
Полностью согласен, просто не стал повторять то, что уже сказано в первом комментарии. Хорошая практика — попробовать «покрутиться» на переменной и попытаться захватить ее без смены контекста. Если все равно занято — то выйти из busy-wait-а и не жечь впустую процессор.

Я, кстати, не уверен, что будет делать SwitchToThread если нет других потоков, готовых к исполнению на данном процессоре — как бы не перепланировался текущий поток и мы опять не свалились в тупой спинлок (с раундтрипами в ядро).
amirul
0
Вот «коробочная» реализация для Windows. Здесь вообще никаких проблем — это часть стандартного рантайма Visual Studio. Хотя я бы все таки рекомендовал SRWLock для нормальных систем (тем более, что Windows — для отладки и тестирования), а для XP можно уже и собственный велосипед оставить (ей все равно недолго жить осталось).

А здесь — для QNX.
amirul
0
Если все равно используются платформо-зависимые примитивы, то почему бы для Windows не использовать SRWLock-и?

Кроме того, Sleep(0) делает не совсем то, что думает большинство людей, использующих эту функцию. Если хочется отдать квант, следует использовать SwitchToThread. Если ресурс не удается захватить, а SwitchToThread возвращает FALSE, то, в зависимости от требований к задеркам (latency) и энергоэффективности, можно использовать Sleep в надежде, что поток, захвативший ресурс таки проснется и освободит его.

Ну и еще замечание. InterlockedCompareExchange и InterlockedExchangeAdd (почему ExchangeAdd с 1 и -1, а не Increment/Decrement?) вставляют полный барьер памяти, что может существенно повлиять на производительность. В идеале стоило бы расставить полубарьеры.
amirul
+1
Ну вообще, все движется к WinRT (собственно, в WP8 он и нарисовался, но еще не полностью), где есть Windows.Storage.KnownFolders для доступа к библиотекам. Пока же можно сохранять файлы себе в isolated storage (как делает та же Nokia Music) либо подбирать файлы с карты.

А в целом, согласен, что «неполноценность» WinPRT по сравнению с WinRT дает себя знать.
amirul
+2
Я так понимаю под «есть другой API» Вы имеете в виду MediaElement

Как Вы сами сказали, события начала/окончания проигрывания и перемотка на произвольную позицию в нем есть. Плейлист — это вообще за пределами компетенции данного контрола.

Что мне не совсем понятно, так это почему нельзя этим контролом проигрывать локальные файлы.
amirul
0
А мне почему-то вспоминается не Баш и не Хабр, а эссе 25-летней давности

К счастью, весьма нередко на длинных дистанциях «первые инженеры» побеждают, иначе я б наверное уже переквалифицировался в сантехники.
amirul
+7
А по-моему, без понимания того, что размер данных имеет пренебрежительно малое значение по сравнению с их структурой и паттернами запросов, вообще стоит прекратить спорить про data warehousing. Хоть на форумах, хоть здесь
amirul
0
то тут уж мне либо сутки (двое? трое? неделю?)

то тут уж мне либо сутки (двое? трое? неделю?) считать кубик
amirul
+15
Опять начинается.
Вы можете докупить себе второй винт и пострайпить, чтоб увеличь пропускную способность диска вдвое, вы можете заменить восьмиядерный сервер шестнадцатиядерным, чтоб увеличь вычислительную мощность вдвое (да-да, я знаю про старика Амдала), но ни в коем случае не используйте шардинг, чтоб увеличить доступ к данным вдвое. Либо у Вас один big-ass сервер — либо несколько сотен тысяч в датацентрах по всему миру. Иначе просто никак. Ну то есть вообще никак. Нет, ну правда, кому вообще может прийти в голову, что распараллеливание доступа к данным вдвое (впятеро, вдесятеро) может кому-нибудь когда-нибудь понадобиться? Забудьте эту ересь и никогда не вспоминайте — у Вас просто нет столько данных.

А если серьезно, то у меня возникли какие то смутные сомнения в компетентности чувака.
Что значит «слишком много для Excel»? Excel, знаете ли, может принимать данные из любых источников, включая все тот же SQL. Ему вообще плевать откуда они приходят.

Что за фиксация на размере данных. Что за утверждения, что распараллеливание НИКОГДА не может быть эффективнее SQL (скажем прямо, некоторые запросы на SQL попросту невыразимы вменяемо — для этого даже языки запросов новые выдумывают от XQuery до MDX). Вот как раз когда есть одна таблица с парой колонок, то совершенно неважно 500 мегабайт там или 5 терабайт — би-деревья все прожуют и выплюнут даже не успев толком осознать что происходит. А вот если у меня 500 мегабайт (5 гигабайт? 10? 1007) данных структурированных по двум десяткам измерений, причем эти данные постоянно обновляются, то тут уж мне либо сутки (двое? трое? неделю?) и анализировать его в PowerPivot (во всем том же Excel) с молниеносными запросами по любой комбинации измерений, либо кинуть запрос в кластер, где каждый каждый «прожует» свой небольшой кусочек и потом сагрегировать это все. Да, суммарно запрос будет все так же неэффективен как и обычный SQL (ну хреново SQL работает с многомерным датамайнингом — ну чего тут делать), но зато он будет ускорен ровно во столько раз сколько нод в кластере.

PS: Hadoop и BigData это сейчас «модно», но так же модно сейчас и быть «илитой» и начисто отрицать применимость MapReduce в любых сеттингах, кроме кеша Гугла
amirul
+1
Пара замечаний:

На powershell скрипт будет выглядеть не «аналогично», а раз эдак в 5-10 короче.

Багрепорт:
function OpenSqlWmiNamespace(instance) {
  var wmi = LookupInstanceContext(instance, "ComputerManagement10");
  if (wmi != null) {
    return wmi;
  }
  var wmi = LookupInstanceContext(instance, "ComputerManagement10");
  if (wmi != null) {
    return wmi;
  }


  throw new Error("Instance '" + instance + "' not found.");
}


Насколько я понимаю, скрипт оба раза пытается работать с одной и той же версией неймспейса. Кроме того, в mssql 2012 имя неймспейса ComputerManagement11. В принципе можно просто перечислить все объекты класса __NAMESPACE в неймспейсе \\root\Microsoft\SqlServer и выбрать подходящий ComputerManagement*