Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Примеси VS делегирование: преимущества и недостатки при реализации «плагинов»

Время на прочтение5 мин
Количество просмотров2.4K
В данной статье я предлагаю вам свой взгляд на выбор использования примесей или делегирования в проектах для добавления в класс нового функционала.

Начальные условия такие: мы рассматриваем примеси, имеющие свое состояние и имеющие доступ ко всем членам класса-агрегатора. Все публичные члены класса примеси становятся частью агрегатора. Мы оставляем за кадром вопрос быстродействия. Вопрос исследуем на примере добавления нового функционала в модель выдуманного ORM.

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

Читать дальше →
Всего голосов 35: ↑25 и ↓10+15
Комментарии32

5 вещей, которых вы не знали о многопоточности

Время на прочтение10 мин
Количество просмотров292K
Хоть от многопоточности и библиотек, которые её поддерживают, отказываются немногие Java-программисты, но тех, кто нашёл время изучить вопрос в глубину ещё меньше. Вместо этого мы узнаём о потоках только столько, сколько нам требуется для конкретной задачи, добавляя новые приёмы в свой инструментарий лишь тогда, когда это необходимо. Так можно создавать и запускать достойные приложения, но можно делать и лучше. Понимание особенностей компилятора и виртуальной машины Java поможет вам писать более эффективный, производительный код.

В этом выпуске серии «5 вещей …», я представлю некоторые из тонких аспектов многопоточного программирования, в том числе synchronized-методы, volatile переменные и атомарные классы. Речь пойдет в особенности о том, как некоторые из этих конструкций взаимодействуют с JVM и Java-компилятором, и как различные взаимодействия могут повлиять на производительность приложений.
Читать дальше →
Всего голосов 86: ↑77 и ↓9+68
Комментарии40

Почему я работаю на почасовой оплате

Время на прочтение3 мин
Количество просмотров24K
Перевод статьи молодого греческого программиста «Why I bill hourly»

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

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

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

Любой инженер-строитель шарахнется от такого предложения, программисты же в своей жажде заключить сделку прикинут смету, удвоят ее, добавят 30% и будут надеяться на лучшее. Как отвечаю на такой вопрос я?

Читать дальше →
Всего голосов 219: ↑199 и ↓20+179
Комментарии203

iOS SDK — CoreAnimation, программируем красивые кнопки

Время на прочтение3 мин
Количество просмотров5.2K
Многие наверняка сталкивались с необходимостью быстрого создания контролов в мобильном пользовательском интерфейсе. Рассмотрим стандартные кнопки UIButton. Базовый контрол мало устраивает взыскательного заказчика и зачастую стандартное решение, это натягивание на кнопки битмапов состояния. Растянутая ли это картинка или целиком вырезаная кнопка — решение требует дополнительных временных затрат на дизайн пользовательского интерфейса. Хорошо было бы иметь универсальный контрол, с более широкими визуальными возможностями, чем базовый UIButton.
Читать дальше →
Всего голосов 29: ↑23 и ↓6+17
Комментарии35

Стоит ли гоняться за тремя копейками, когда под ногами лежит рубль?

Время на прочтение3 мин
Количество просмотров2K
image
Я часто задаю вопрос, что лучше, много маленьких проектов по три рубля, или один большой за 30? Что лучше, 30 дешевых работников, или 3 высококвалифицированные специалиста? Спорить можно долго, но правильный ответ находится не в самом вопросе, а за его пределами.

Маленькие проекты позволяют получить высокую доходность при низкой себестоимости. Масштабирование доходов решается путем привлечения новых работников. Форс-мажоры не особо влияют на благосостояние компании. Самое главное, что это быстрые деньги. Звучит очень привлекательно!

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

Читать дальше →
Всего голосов 104: ↑92 и ↓12+80
Комментарии122

Когда не нужна тригонометрия

Время на прочтение4 мин
Количество просмотров53K
Просматривая различный код по выводу на экран какой-нибудь даже примитивной графики, я заметил чрезмерную любовь некоторых программистов к тригонометрии. Часто код пестрит синусами, косинусами и арктангенсами там, где без них можно обойтись. Этим грешат даже хорошие программисты, которые способны спроектировать сложную систему, но почему-то не освоили вектора в объёме школьной программы. Буквально азов векторной алгебры хватает для решения многих насущных проблем. В этом топике я хочу провести краткий ликбез, напомнить основные действия с векторами на плоскости и в качестве примера решить две задачи без тригонометрии: поиск отражённого луча по падающему лучу и произвольно расположенному зеркалу, а также рисование наконечника стрелки. Если вы можете представить в голове рисование произвольно направленной стрелки без синусов и косинусов, смело пропускайте этот топик. Для остальных постараюсь объяснять попроще.
Читать дальше →
Всего голосов 219: ↑209 и ↓10+199
Комментарии67

Penisland, или как написать спеллчекер

Время на прочтение7 мин
Количество просмотров12K
Есть хорошая статья Питера Норвига, в которой он рассказывает как написать спеллчекер в 20 строк кода. В этой статье он показывает как поисковые системы могут исправлять ошибки в запросах. И делает это довольно элегантно. Однако, у его подхода есть два серьезных недостатка. Во-первых, исправление более трех ошибок требует больших ресурсов. А гугл, кстати, неплохо справляется и с четырьмя ошибками. Во-вторых, нет возможности проверки связного текста.



Итак, хочется исправить эти проблемы. А именно, написать корректор коротких фраз или запросов, который:
  • умел бы выявлять три (и более) ошибки в запросе;
  • умел бы проверять «разорванные» или «слипшиеся» фразы, например expertsexchange — experts_exchange, ma na ger — manager
  • не требовал много кода для реализации
  • мог бы достраиваться до исправления ошибок на других языках и других типов" ошибок

Остальное — под катом.
Читать дальше →
Всего голосов 133: ↑131 и ↓2+129
Комментарии49

Алгоритм Флойда — Уоршелла

Время на прочтение6 мин
Количество просмотров172K
Алгоритм Флойда — Уоршелла — алгоритм для нахождения кратчайших расстояний между всеми вершинами взвешенного графа без циклов с отрицательными весами с использованием метода динамического программирования. Это базовый алгоритм, так что тем кто его знает — можно дальше не читать.

Этот алгоритм был одновременно опубликован в статьях Роберта Флойда (Robert Floyd) и Стивена Уоршелла (Stephen Warshall) в 1962 г., хотя в 1959 г. Бернард Рой (Bernard Roy) опубликовал практически такой же алгоритм, но это осталось незамеченным.
Читать дальше →
Всего голосов 132: ↑126 и ↓6+120
Комментарии33

Метод динамического программирования для подсчёта числа циклов на прямоугольной решетке

Время на прочтение11 мин
Количество просмотров13K
Эта статья адресована тем читателям, кто занимается программированием алгоритмов, и особенно интересуется труднорешаемыми задачами. Тем хабралюдям, которые против размещения алгоритмов на Хабре следует немедленно прекратить читать данную работу.

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

Предупреждаю, что статья содержит около 2000 слов (8 страниц А4), но дорогу осилит идущий.

Читать дальше →
Всего голосов 101: ↑95 и ↓6+89
Комментарии16

Загрузка классов в Java. Теория

Время на прочтение4 мин
Количество просмотров197K


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

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

Читать дальше →
Всего голосов 62: ↑49 и ↓13+36
Комментарии29

Самый главный алгоритм

Время на прочтение1 мин
Количество просмотров4.6K
От всей души рекомендую видео лекцию А. Степанова (человека создавшего STL): «о истории алгоритма нахождения наибольшего общего делителя», это популярная лекция оказалась бесконечно интересной, в ней рассказывается, на примере этого алгоритма о развитие алгоритмического знания всего человечества с эпистемологической точки зрения в разрезе истории с античных времен с Пифагора до наших дней до Кнута.

image
Посмотреть можно здесь:
часть1
video.yandex.ru/users/ya-events/view/129
часть2
video.yandex.ru/users/ya-events/view/128
Читать дальше →
Всего голосов 107: ↑102 и ↓5+97
Комментарии62

Fugue Icons 3.0

Время на прочтение1 мин
Количество просмотров4.9K
Fugue Icons 3.0

Всеми любимый набор иконок — Fugue, обновился (16 июля) до версии 3.0. Изменения небольшие, были добавлены 32 гипер-маленькие иконки.

Мега-превью! (3Mb)
Иконки
Иконки + исходники

А вот и сами изменения...
Всего голосов 105: ↑93 и ↓12+81
Комментарии27

Концептуальная уязвимость в механизме загрузки DLL (MSA2269637)

Время на прочтение3 мин
Количество просмотров17K
На прошлой неделе на Хабре уже писали о заявлении HD Moore и найденной им уязвимости, которая содержится в достаточно большом количестве приложений и работает на всех версиях MS Windows. Но все оказалось куда серьезнее, так как речь идет не просто о найденной уязвимости, а о концептуальной ошибке в дизайне механизма загрузки динамических библиотек. По этому поводу вчера Microsoft официально выпустила Security Advisory (2269637), что означает официальное признание серьезности данной уязвимости. Но давайте попробуем разобраться в сути этой проблемы, так как она ничуть не менее серьезная, нежели недавно найденная уязвимость в загрузке LNK-файлов.

Уязвимость заключается в том, что многие программы при вызове функции LoadLibrary() не проверяют корректность пути, по которому эта библиотека может быть загружена. Таким образом, они позволяют произвести подмену выполняемой библиотеки. Это связано с тем, что поиск загружаемой библиотеки осуществляется в первую очередь в директории, содержащей образ исполняемого файла, который породил процесс (подмененная библиотека выполняется с привилегиями пользователя, запустившего процесс). К примеру, Georgi Guninski предложил следующую демонстрацию (PoC) данной уязвимости:
Читать дальше →
Всего голосов 80: ↑59 и ↓21+38
Комментарии73

Паттерны проектирования (design patterns) — agilepod #13

Время на прочтение1 мин
Количество просмотров8.4K
Шаблоны (паттерны) проектирования – это то, что знают архитекторы. На тренинги по “ШП” отправляют старших разработчиков. Нужно ли это простому труженнику села? Какой секрет в этом скрыт? Или секрета там нет?

* Что такое паттерны и зачем они нам
* Каталоги паттернов: GoF, PoEAA, IP и др.
* Секретная структура любого каталога
* Почему нужно изучать паттерны
* Развитие командной культуры и профессиональной интуиции
* С чего начинать?

Упоминалось:
Шаблоны уровня архитектуры (хотя бы я бы с этим поспорил, так как классикой является Бушман)
Шаблоны проектирования уровня классов и взаимодействий (банды четырёх)
О том же, но вариант попроще (переосмысленная переделка)
Шаблоны низкого уровня, уровня написания строчек кода и «кодо-стиля»
Всего голосов 39: ↑32 и ↓7+25
Комментарии14

Оптимизация ПО для iPhone: живой пример

Время на прочтение7 мин
Количество просмотров2.7K
Программирование на платформе iOS (той, что еще недавно называлась iPhone OS) – странное сочетание радости от плодотворной работы и муки плавания против течения. У каждого разработчика свое мнение относительно того, какая из этих компонент преобладает. Лично мне это занятие нравится, поэтому мне показалось уместным поделиться впечатлениями от процесса работы над очередным проектом.

В конце марта мне предложили написать мобильную версию Bookmate для iPhone. Дизайн большей части приложения был уже готов в виде толстенного PSD, на стороне сервера работа кипела, мне же оставалось, как говорится, «всего лишь» написать клиентскую часть на Objective-C.

В этой статье речь пойдет о первом контейнере с граблями, нас атаковавшими. Если Вы играете в Starcraft, более подходящей будет аналогия с зергами, которые вдруг полезли изо всех щелей в типично-неимоверных количествах.
Читать дальше →
Всего голосов 88: ↑82 и ↓6+76
Комментарии83

Декартово дерево: Часть 1. Описание, операции, применения

Время на прочтение15 мин
Количество просмотров152K

Оглавление (на данный момент)


Часть 1. Описание, операции, применения.
Часть 2. Ценная информация в дереве и множественные операции с ней.
Часть 3. Декартово дерево по неявному ключу.
To be continued...

Декартово дерево (cartesian tree, treap) — красивая и легко реализующаяся структура данных, которая с минимальными усилиями позволит вам производить многие скоростные операции над массивами ваших данных. Что характерно, на Хабрахабре единственное его упоминание я нашел в обзорном посте многоуважаемого winger, но тогда продолжение тому циклу так и не последовало. Обидно, кстати.

Я постараюсь покрыть все, что мне известно по теме — несмотря на то, что известно мне сравнительно не так уж много, материала вполне хватит поста на два, а то и на три. Все алгоритмы иллюстрируются исходниками на C# (а так как я любитель функционального программирования, то где-нибудь в послесловии речь зайдет и о F# — но это читать не обязательно :). Итак, приступим.

Введение


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

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


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

Сейчас за кадром остается вопрос, каким образом в кучу можно добавлять и удалять из нее элементы. Во-первых, эти алгоритмы требуют отдельного места на осмотр, а во-вторых, нам они все равно не понадобятся.
А теперь собственно про декартово дерево
Всего голосов 166: ↑161 и ↓5+156
Комментарии30

Целебное зелье для IE5+ или IE7.js

Время на прочтение2 мин
Количество просмотров7.1K
Разбирая код очередного проекта внутри тега head наткнулся на интересный код:

<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta3)/IE9.js"></script>
<![endif]-->

Только одно слово «IE9» меня пустило в замешательство. Первое что пришло мне в голову — это то, что при помощи этого .js кода браузеры под печальным клеймом Internet Explorer можно заставить работать используя свойства многообещающего IE9. Больше всего я ожидал что будут доступны свойства CSS3.0, но не тут-то было!
Читать дальше →
Всего голосов 159: ↑125 и ↓34+91
Комментарии73

Как перестать думать о часовых поясах и начать жить

Время на прочтение7 мин
Количество просмотров18K
В вашей системе время играет важную роль? Ваши пользователи/компоненты распределены по территории всего земного шара, или хотя бы нашей необъятной родины? Значит, вам нужны часовые пояса. Что ж, это просто. Самое сложное, что вам придется сделать — не запутаться. Об этом мы с вами и поговорим. Для начала вам нужно научиться правильно думать. Думая правильно, все остальное будет для вас либо самоочевидным, либо достаточно простым.

Начнем с часов. Все мы привыкли определять время, глядя на часы на стене. При работе с часовыми поясами такое время называется Wall clock time. В принципе, ничего плохого в нем нет, только в разных местах земного шара в один и тот же момент времени часы показывают разное время. Если задаться целью, можно придумать алгоритм перевода wall clock time одного часового пояса в wall clock time другого. Обычно надо прибавить/отнять разницу в часах между часовыми поясами, кроме (внимание) моментов перехода на летнее/зимнее время. Вот когда начинается переход, вычисления становятся по-настоящему сложными.

Нам же нужно что-то простое и пуленепробиваемое, как… целое число.
Читать дальше →
Всего голосов 74: ↑63 и ↓11+52
Комментарии70

Асинхронность: почему это никак не сделают правильно?

Время на прочтение7 мин
Количество просмотров6.8K
Асинхронные программы чертовски неудобно писать. Настолько неудобно, что даже в node.js, заявленном как «у нас все правильное-асинхронное», понадобавляли таки синхронных аналогов асинхронных функций. Что уж говорить про питоновский синтаксис, не дающий объявить лямбду со сколь-либо сложным кодом внутри…

Забавно, что красивое решение проблемы не требует ничего экстраординарного, но почему-то до сих пор не реализовано.
Читать дальше →
Всего голосов 86: ↑81 и ↓5+76
Комментарии78

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург и область, Россия
Зарегистрирован
Активность