Pull to refresh
15
0
Vladislav Vasiliev @vladec

User

Send message

Хотите, чтобы ваша компания развивалась? Избавьтесь от менеджеров!

Reading time4 min
Views164K
Многие сотрудники работают на своих боссов, нежели на компанию или своих клиентов. В наше время бизнес пронизан менеджерами разных уровней, и сотрудники часто обнаруживают, что они, играя в политику, фокусируются на задачах, которые осчастливливают их босса.

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

Если вы заметили такое на вашем текущем месте работы, знайте, что в этом виновата иерархическая структура организации.

Устранив иерархическую модель в моем агентстве digital маркетинга Ciplex, мы создали компанию, в которой люди любят работать, и при этом сэкономили деньги. Удовлетворенность наших клиентов увеличилась, и улучшилось качество нашей работы. Наши сотрудники стали счастливее, клиенты удовлетворены, расходы снизились, в целом компания стала значительно лучше.

Далее описание того, как я это сделал.
Читать дальше →
Total votes 125: ↑96 and ↓29+67
Comments104

Пишу игрушечную ОС (о планировщике)

Reading time4 min
Views22K

Продолжаю вести блог о разработке игрушечной ОС.

В прошлом посте я писал о том, как добиться возможности реализовывать на C обработчики прерываний. Теперь, пользуясь написанными ранее макросами, можно реализовать простой SMP-планировщик. Он будет предоставлять минимально возможный функционал, на базе которого в будущем нужно будет возводить различные надстройки, в частности, примитивы синхронизации (например, мьютекс). Опять же, красивая модульная структура не способствует высокой производительности, но красота, как известно, спасёт мир, так что отдадим ей предпочтение.

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

Кроме того, было бы здорово, если бы планировщик не занимался выделением памяти, а мог принимать и возвращать память, выделенную под поток кем-то другим. С одной стороны, это бы обеспечило гибкость произвольного резервирования памяти потоков. С другой – дало бы уникальную возможность сохранять поток во внешней памяти (например, на жёстком диске) с последующей его загрузкой и запуском с прерванного места.
Читать дальше →
Total votes 61: ↑55 and ↓6+49
Comments16

Пираты XX века

Reading time21 min
Views35K
В 1990-х годах рынок ПО в свежеобразованной России развивался активно, но несколько однобоко: основную часть программ на ПК составляли зарубежные программы со снятой (или изначально отсутствовавшей) защитой от копирования; зачастую одни и те же отечественные умельцы переводили программу на русский язык (порой — затирая исходные копирайты), разбирались с защитой от копирования, и в итоге продавали программу по цене носителя и безо всякой поддержки. Это отличалось от современной варез-сцены, полуподпольной и целиком виртуальной: российские продавцы чужого ПО нисколько не скрывались, наоборот — они давали рекламу в журналах, выпускали вполне физические дискеты и (позднее) CD-диски, и в компьютерных магазинах ими были заставлены целые полки. Понятно, что отечественная разработка ПО в такой среде была не слишком жизнеспособна: уже упомянутый Лексикон — программа вполне достойного качества, которую свежеобразованные российские бизнесмены попытались поставить на коммерческие рельсы — покупался «легально» хорошо если одним пользователем из ста.

(Когда я только поступил на матмех, наш профессор нас предупреждал: "Даже не рассчитывайте, что в России вы сможете программированием зарабатывать себе на жизнь. Из отечественных софтверных компаний прибыль имеет только 1С, да и та лишь потому, что нормативные документы меняются каждый год, и украденная версия софта через год становится бесполезной. Наверное, это такая государственная политика по поддержке программистов — менять каждый год требования к бухгалтерии.")

Поэтому естественно, что журналы 1990-х годов активно обсуждают сложившуюся неблагоприятную для программистов ситуацию, и предлагают способы на неё повлиять. Все сходятся в том, что засилье пиратства — черта переходного периода, вызванная временным недостатком интереса западных правообладателей к российскому рынку; и что уже через несколько лет рынок ПО в России разовьётся в аналогичный европейскому. Но и сейчас, пятнадцать лет спустя, отношение обывателя к авторскому праву на ПО мало изменилось. Значит, некоторые рекомендации той поры остаются актуальными до сих пор.

В прошлый раз я пообещал опубликовать статью Ольги Усковой — ныне обладательницы стольких наград и почётных званий, что ими удалось наполнить целую статью на Википедии:



(КомпьютерПресс, январь 1995)
В предлагаемой статье поднимет тему маркетинга программных продуктов в России вице-президент фирмы Cognitive Technologies О.А.Ускова.

Как продавать программы в России,

или Ягодки коммерческого директора


Полтора года назад в России бытовало представление, что программа — это такая штука, которую ученые чудаки или наивные инофирмы бесплатно предоставляют находчивым российским пользователям. Иметь лицензированную копию считалось так же стыдно, как покупать билет в общественном транспорте или соблюдать правила дорожного движения. Обсуждение психологических аспектов этой проблемы пришлось бы начинать со времен Ивана Грозного…
Читать дальше →
Total votes 60: ↑43 and ↓17+26
Comments55

Перевод статьи «Pimp My Pimpl», часть 1

Reading time7 min
Views26K
В первой части статьи рассматривается классическая идиома Pimpl (pointer-to-implementation, указатель на реализацию), показываются её преимущества и рассматривается дальнейшее развитие идиом на её основе. Вторая часть будет сосредоточена на том, как уменьшить недостатки, которые неизбежно возникают при использовании Pimpl.
Читать дальше →
Total votes 42: ↑41 and ↓1+40
Comments19

Нелинейное сжатие размерности, используя ограниченную машину Больцмана

Reading time3 min
Views16K
Привет. В этом посте мы продолжим экспериментировать с ограниченной машиной Больцмана. В предыдущем посте о регуляризации в РБМ мы увидели как можно получить более локальные фичи, которые обладают большей обобщающей способностью. Но мы не оценили их робастность по сравнению с более простыми и быстрыми алгоритмами. Для этого эксперимента мы обратимся к линейному методу главных компонент (вы можете ознакомиться с этим методом и глянуть реализацию на c# в моем первом посте). Желающим ознакомиться с первоисточником по теории сжатия размерности с использованием РБМ рекомендую глянуть статьи Джеффри Хинтона тут и тут. Мы же продолжим тестирование на множестве печатных больших букв: обучим РБМ, построим главные компоненты, сгенерируем сжатые представления данных, а из них восстановим первоначальные изображения, и затем оценим разницу между оригинальными изображениями и восстановленными.

Читать дальше →
Total votes 38: ↑35 and ↓3+32
Comments5

ASP.NET MVC. Урок 0. Вступление

Reading time2 min
Views783K
Я пишу сайты на asp.net mvc. В этих 16 главах я хочу рассказать, как я это делаю. Это некий учебник-справочник всех тех знаний, которые я накопил в течение трех лет.

Почему именно asp.net mvc

ASP.NET MVC я люблю потому что:
  • Это .net. Я знаю .net и С#.
  • Это компилируемый код.
  • Это не ASP.NET WebForms, я работаю с html-кодом.
  • Используется MVC-паттерн.
  • Visual Studio – самое популярное средство разработки, в котором есть IntelliSense.
  • Отличные инструменты отладки.


Читать дальше →
Total votes 290: ↑215 and ↓75+140
Comments67

Raven Software выпускает исходники Jedi Outcast и Jedi Academy в дань почтения закрытой LucasArts

Reading time1 min
Views28K
Студию Raven, разработчика таких игр расширенной вселенной «Звездных войн» как Jedi Knight II: Jedi Outcast и Jedi Knight: Jedi Academy, уже давно просили выпустить исходный код компонентов синглплеера их игр по Star Wars. И вот, достаточным поводом для этого стало окончательное расформирование LucasArts, издателя этих видеоигр.

В комментарии от «Рейвен» для сайта «Котаку» было сказано следующее:
Читать дальше →
Total votes 44: ↑42 and ↓2+40
Comments27

C++ MythBusters. Миф о виртуальных функциях (дополнение)

Reading time4 min
Views14K

Преамбула


Добрый вечер (ну, или кому чего).

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

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

Статья расчитана на программистов средней и высокой квалификации. Приятного чтения.
Читать дальше →
Total votes 35: ↑27 and ↓8+19
Comments43

Виртуальные функции и деструктор

Reading time6 min
Views170K
Когда-то давным давно я собирался и даже обещал написать про механизм виртуальных функций относительно деструкторов. Теперь у меня наконец появилось свободное время и я решил воплотить эту затею в жизнь. На самом деле эта мини-статья служит «прологом» к моей следующей статье. Но я постарался изложить доходчиво и понятно основные моменты по текущей теме. Если вы чувствуете, что еще недостаточно разобрались в механизме виртуальных вызовов, то, возможно, вам следует для начала прочитать мою предыдущую статью.

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

Все-таки интересно?
Total votes 48: ↑40 and ↓8+32
Comments66

C++ MythBusters. Миф о виртуальных функциях

Reading time9 min
Views81K
Здравствуйте.

В прошлой статье я рассказывал, с какой не всем известной особенностью можно столкнуться при работе с подставляемыми функциями. Статья породила как несколько существенных замечаний, так и многостраничные споры (и даже холивары), начавшиеся с того, что inline-функции вообще лучше не использовать, и перешедшие в стандартную тему C vs. C++ vs. Java vs. C# vs. PHP vs. Haskell vs. …

Сегодня пришла очередь виртуальных функций.
Читать дальше
Total votes 55: ↑49 and ↓6+43
Comments109

Pthread_cond_timedwait: проблема, решение, дискуссия

Reading time4 min
Views15K
Здравствуйте, уважаемые Хабраюзеры!

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

Рассмотрим простой пример использования сигнальной переменной:

struct timeval now;
struct timespec timeout;
gettimeofday(&now, 0);
timeout.tv_sec = now.tv_sec + 2;      // 2 sec
timeout.tv_nsec = now.tv_usec * 1000; // nsec

retval=0;
pthread_mutex_lock(&mutex);
while(!somethingHappens() && retval==0)
{
    retval=pthread_cond_timedwait(&condition, &mutex, &timeout);
}
pthread_mutex_unlock(&mutex);


Читать дальше →
Total votes 35: ↑30 and ↓5+25
Comments37

Blind Deconvolution — автоматическое восстановление смазанных изображений

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


В последние несколько лет интенсивно развивается новое направлении в теории восстановления изображений — слепая обратная свертка (Blind Deconvolution). Появилось достаточно много работ по этой теме, и начинается активное коммерческое использование результатов.
Многие из вас помнят конференцию Adobe MAX 2011, на которой они как раз показали работу одного из алгоритмов Blind Deconvolution: Исправление смазанных фотографий в новой версии Photoshop
В этой статье я хочу подробнее рассказать — как же работает эта удивительная технология, а также показать практическую реализацию SmartDeblur, который теперь тоже имеет в своем распоряжении этот алгоритм.
Внимание, под катом много картинок!
Читать дальше →
Total votes 243: ↑239 and ↓4+235
Comments150

Дистанционное обучение с помощью мобильных устройств

Reading time4 min
Views104K
Еще 10—20 лет назад полноценное дистанционное обучение было практически невозможным. Необходимость переезда в другой город или даже страну являлась, наверное, одной из наиболее частых причин, почему предпочтение отдавалось местным вузам, вместо того чтобы поступать в университеты своей мечты. Да, существует заочное образование, но мы прекрасно понимаем, что в большинстве случаев данная форма образования — всего лишь для галочки. К счастью, в настоящее время есть возможность учиться, было бы желание. Для тех, у кого с желанием все в порядке, прошу под кат.

image
Читать дальше →
Total votes 63: ↑59 and ↓4+55
Comments18

Регулярные выражения изнутри

Reading time5 min
Views122K
Регулярные выражения (РВ) — это очень удобная форма записи так называемых регулярных или автоматных языков. Поэтому РВ используются в качестве входного языка во многих системах, обрабатывающих цепочки. Рассмотрим примеры таких систем:

  • Команда grep операционной системы Unix или аналогичные команды для поиска цепочек, которые можно встретить в Web-броузерах или системах форматирования текста. В таких системах РВ используются для описания шаблонов, которые пользователь ищет в файле. Различные поисковые системы преобразуют РВ либо в детерминированный конечный автомат (ДКА), либо недетерминированный конечный автомат (НКА) и применяют этот автомат к файлу, в котором производится поиск.
  • Генераторы лексических анализаторов. Лексические анализаторы являются компонентом компилятора, они разбивают исходную программу на логические единицы (лексемы), которые могут состоять из одного или нескольких символов и имеют определенный смысл. Генератор лексических анализаторов получает формальные описания лексем, являющиеся по существу РВ, и создает ДКА, который распознает, какая из лексем появляется на его входе.
  • РВ в языках программирования.


В данной статье мы сначала ознакомимся с конечными автоматами и их видами (ДКА и НКА), и далее рассмотрим пример построения минимального ДКА по регулярному выражению.
Читать дальше →
Total votes 77: ↑69 and ↓8+61
Comments38

Опции JVM. Как это работает

Reading time7 min
Views94K
С каждым днем слово java все больше и больше воспринимается уже не как язык, а как платформа благодаря небезызвестному invokeDynamic. Именно поэтому сегодня я бы хотел поговорить про виртуальную java машину, а именно — об так называемых Performance опциях в Oracle HotSpot JVM версии 1.6 и выше (server). Потому что сегодня почти не встретить людей, которые знают что-то больше чем -Xmx, -Xms и -Xss. В свое время, когда я начал углубляться в тему, то обнаружил огромное количество интересной информации, которой и хочу поделится. Отправной точкой, понятное дело, послужила официальная документация от Oracle. А дальше — гугл, эксперименты и общение:

-XX:+DoEscapeAnalysis


Начну, пожалуй, с самой интересной опции — DoEscapeAnalysis. Как многие из Вас знают, примитивы и ссылки на объекты создаются не в куче, а выделяются на стеке потока (256КБ по умолчанию для Hotspot). Вполне очевидно, что язык java не позволяет создавать объекты на стеке на прямую. Но это вполне себе может проделывать Ваша JVM 1.6 начиная с 14 апдейта.

Про то, как работает сам алгоритм можно прочитать тут (PDF). Если коротко, то:

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


Для реализации данного алгоритма строится и используется так называемый — граф связей (connection graph), по которому на этапе анализа (алгоритмов анализа — несколько) осуществляется проход для нахождения пересечений с другими потоками и методами.
Таким образом после прохода графа связей для любого объекта возможно одно из следующих следующих состояний:

  • GlobalEscape — объект доступен из других потоков и из других методов, например статическое поле.
  • ArgEscape — объект был передан как аргумент или на него есть ссылка из объекта аргумента, но сам он не выходит из области видимости потока в котором был создан.
  • NoEscape — объект не покидает область видимости метода и его создание может быть вынесено на стек.


После этапа анализа, уже сама JVM проводит возможную оптимизацию: в случае если объект NoEscape, то он может быть создан на стеке; если объект NoEscape или ArgEscape, то операции синхронизации над ним могут быть удалены.

Следует уточнить, что на стеке создается не сам объект а его поля. Так как JVM заменяет цельный объект на совокупность его полей (спасибо Walrus за уточнение).

Вполне очевидно, что благодаря такого рода анализу, производительность отдельных частей программы может возрасти в разы. В синтетических тестах, на подобии этого:

    for (int i = 0; i < 1000*1000*1000; i++) {
        Foo foo = new Foo();
    }

скорость выполнения может увеличится в 8-15 раз. Хотя, на казалось бы, очевидных случаях из практики о которых недавно писалось (тут и тут) EscapeAnalys не работает. Подозреваю, что это связано с размером стека.

Кстати, EscapeAnalysis как раз частично ответственен за известный спор про StringBuilder и StringBuffer. То есть, если Вы вдруг в методе использовали StringBuffer вместо StringBuilder, то EscapeAnalysis (в случае срабатывания) устранит блокировки для StringBuffer'а, после чего StringBuffer вполне превращается в StringBuilder.
Читать дальше →
Total votes 72: ↑70 and ↓2+68
Comments18

Предельная производительность: C#

Reading time56 min
Views262K
performanceЯ поделюсь 30 практиками для достижения максимальной производительности приложений, которые этого требуют. Затем, я расскажу, как применил их для коммерческого продукта и добился небывалых результатов!
Приложение было написано на C# для платформы Windows, работающее с Microsoft SQL Server. Никаких профайлеров – содержание основывается на понимании работы различных технологий, поэтому многие топики пригодятся для других платформ и языков программирования.
Читать дальше →
Total votes 135: ↑90 and ↓45+45
Comments289

Simple-Science — Простые опыты (дайджест #14)

Reading time1 min
Views90K
image

Представляем 14-й дайджест и очередные шесть опытов из цикла "Простая наука".

Сегодня в выпуске #14:


  • зажигаем спичку водяным паром;
  • ледяное пламя из жидкого кислорода;
  • извлекаем яйцо из бутылки;
  • снег из подгузников;
  • химический запал для пистонов;
  • гнущееся стекло.

Внимание:
Некоторые опыты могут быть опасны для здоровья. При их проведении нужно обязательно соблюдать технику безопасности.

Ниже смотрите 6 видео.
Читать дальше →
Total votes 89: ↑70 and ↓19+51
Comments34

Введение в CMake

Reading time7 min
Views541K
imageCMake — кроcсплатформенная утилита для автоматической сборки программы из исходного кода. При этом сама CMake непосредственно сборкой не занимается, а представляет из себя front-end. В качестве back-end`a могут выступать различные версии make и Ninja. Так же CMake позволяет создавать проекты для CodeBlocks, Eclipse, KDevelop3, MS VC++ и Xcode. Стоит отметить, что большинство проектов создаются не нативных, а всё с теми же back-end`ами.
Читать дальше →
Total votes 62: ↑56 and ↓6+50
Comments23

Разработка игры под Windows Phone

Reading time9 min
Views37K


В этой статье я хочу рассказать о своем опыте написания игры под платформу Windows Phone. Несмотря на кажущуюся простоту, путь от идеи до принятия игры в Windows Phone Store занял практически год и был полон неожиданных подводных камней — как с технической, так и с организационной сторон. Статья рассчитана на начинающих разработчиков, которые имеют представление о .NET / C#, но не пробовали делать полноценных игр.
Читать дальше →
Total votes 59: ↑52 and ↓7+45
Comments28

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity