Pull to refresh
9
0
Толмачёв Дмитрий @FiresShadow

Разработчик ПО

Send message

Эмуляция LINQ for SQL на Delphi

Reading time6 min
Views6.6K
Постановка задачи.
Имеется большой Клиент-Сервер проект. Клиент программно строит динамические SQL запросы для выполнения на SQL сервере. Запросов много, логика построения размазана по всему клиентскому коду. Проект развивается во времени, необходимо модифицировать структуру базы данных. Как заставить компилятор показать все места, где в коде используются уже не существующие поля? Как заставить компилятор проверить, что целочисленному полю не присваивается строковый параметр? При этом паскалевский код должен быть приближен к SQL синтаксису.
Читать дальше →
Total votes 13: ↑11 and ↓2+9
Comments8

Улучшаем LINQ для работы с IReadOnly-коллекциями

Reading time7 min
Views16K
Как известно, при использовании интерфейса IEnumerable<> там, где подразумевается коллекция, могут случаться проблемы (см. например Проблемы использования IEnumerable и LINQ против LSP). К счастью, в .NET v4.5 в 2012-м году (немного поздновато, но лучше поздно, чем никогда), появились интерфейсы IReadOnlyCollection<>, IReadOnlyList<>, IReadOnlyDictionary<> (далее буду их обобщённо называть IReadOnly-интерфейсы). В отличие от IEnumerable<>, IReadOnly-интерфейсы дают возможность достаточно и без лишних требований обозначать функциональность коллекции, что и позволяет их рекомендовать для использования вместо IEnumerable<> везде, где подразумевается чтение коллекции. Но тут встречается одно затруднение. Одним из важных компонентов, потребляющим и создающим коллекции, является LINQ и, особенно, его часть «LINQ к объектам». К сожалению, IReadOnly-интерфейсы появились через 5 лет после LINQ, и в нём не используются. Все входные и выходные коллекции LINQ-операций имеют базовый тип IEnumerable<>, исходя из ограниченных возможностей которого, многие операции подразумевают лишние затраты: полный последовательный перебор или даже создание промежуточных копий входных коллекций. Более того, возвращая из операций тот же IEnumerable<>, LINQ требует при дальнейшем использовании результата опять использовать полный перебор и создание промежуточных копий. В связи с этим, у меня давно зрела мысль «подружить» LINQ с IReadOnly-интерфейсами.
Читать дальше →
Total votes 19: ↑16 and ↓3+13
Comments12

[видео] Как избежать незапланированного отката: разбор 7 реальных переговорных ситуаций

Reading time4 min
Views41K
Раз уже тема переговоров с заказчиками и коллегами оказалась интересна хабровчанам (48,000 просмотров видео за неделю), мы решили продолжить эту тему.

Предыдущие материалы:


На этот раз мы попросили Дмитрия Коткина, руководителя Санкт-Петербургской школы переговорщиков ШиП разобрать ситуации более подробно. Правда, и ситуации не такие простые. Более конкретные, про проектную работу в ИТ, с непростыми заказчиками и коллегами.

Надеемся, что это окажется вам полезным. Видео-разборы 7 реальных ситуация — под катом:
  • “На свободу — с готовой отчетностью!”
  • “4 часа, чтобы сделать клиенту чушь”
  • “Миссия невыполнима (с данным оборудованием)”
  • “Начинайте работы, через 14 часов открытие магазина”
  • “Наш бюджет в 3 раза меньше”
  • “Незапланированный откат”
  • “Если у вас в руках молоток, то все вокруг кажется гвоздем”


Читать дальше →
Total votes 47: ↑43 and ↓4+39
Comments16

Разные версии JIT в .NET

Reading time6 min
Views21K
Каждый C#-разработчик знает, что C#-компилятор переводит исходный код программы в промежуточный язык под названием Intermediate Language (IL). А за превращение IL в последовательность машинных команд чаще всего отвечает Just-In-Time-компилятор (JIT). Да, на сегодняшний день есть NGen, Mono AOT, .NET Native, но JIT-компиляция всё ещё лидирует в мире .NET-приложений. А вот работает этот самый JIT, знают далеко не все. Если брать в расчёт только реализацию .NET от Microsoft, то стоит различать JIT-x86 и JIT-x64. А ещё за дверями стоит RyuJIT который уже совсем скоро займёт почётное место основного JIT-компилятора. А если вы любите старые версии .NET, то полезно знать, что в разных версиях CLR логика работы JIT отличалась. Исходники у нас теперь открыты, вы можете их посмотреть и осознать, насколько же это большая и сложная тема. Сегодня мы не будем пытаться охватить её, а лишь кратко посмотрим на несколько интересных особенностей отдельных версий JIT-компиляторов. Итак, сегодня в номере:
  • Почему короткий метод может не быть заинлайнен и как этого избежать
  • JIT-баги: опасные и беспощадные
  • Кто и как разматывает циклы
  • Чем отличается размотка маленьких и больших циклов

Читать дальше →
Total votes 42: ↑42 and ↓0+42
Comments4

DuoCode: транслируем C# в JavaScript

Reading time10 min
Views25K
Есть такой язык программирования, который называется C#. И есть очень много разработчиков, которым он очень нравится. А ещё есть такой язык программирования, который называется JavaScript. Как-то так сложилось, что он нравится далеко не всем C#-разработчикам. А теперь представьте ситуацию: есть заядлый C#-разработчик. Он очень любит C#, все-все проекты на нём пишет. Но судьба распорядилась так, что ему понадобилось написать клиентское веб-приложение. Знаете, такое, чтобы пользователю не нужно было себе ничего скачивать и устанавливать, чтобы он мог просто открыть любой браузер в любой операционной системе на любом устройстве — а приложение уже там. И вот тут у нашего лирического героя возникла проблема: вроде бы JavaScript идеально подходит для этой задачи, но вот писать на нём отчего-то не очень хочется. К счастью, в современном мире существует много языков, которые транслируются в JavaScript (всякие TypeScript, CoffeScript и тысячи других). Но наш разработчик оказался очень упрямым: он упорно не хочет изменять своему любимому C# с «вражескими» технологиями.

К счастью для него, счастливое будущее уже практически наступило. Есть такой проект, который называется DuoCode. Он умеет транслировать C#-код в JavaScript. Пока он в состоянии beta, но у него уже весьма неплохо получается: поддерживаются нововведения C# 6.0, Generic-типы, Reflection, структуры и LINQ, а отлаживать итоговый JavaScript можно на исходном C#. Давайте посмотрим внимательнее, что же представляет из себя продукт.

Читать дальше →
Total votes 25: ↑21 and ↓4+17
Comments54

В поисках потерянной эффективности

Reading time4 min
Views39K
Все имена сохранены, все совпадения имеют под собой злой умысел.

Бонд оторвал взгляд от монитора, откинулся на спинку кресла и потянулся. Позвонки громко хрустнули, и кресло жалобно заскрипело в ответ. Агент 007 поморщился, и в который раз подумал, что ему пора на покой. Всем в этой конторе уже давно пора на покой. Даже креслу.

В комнату вошёл М.

— Пойдём в переговорку, Джеймс. И отчёт свой не забудь, — в голосе М звучали нотки обречённости.

— Может, ну его к чёрту? — спросил Бонд. — Я же достал этот чёртов чемоданчик с ядерной кнопкой. Мир спасён!

М скорчил кислую мину.

— Ты отстрелил палец китайскому психопату в тот момент, когда он запускал ракеты в сторону Лондона! Ещё бы полсекунды, и… — М не договорил, и в сердцах махнул рукой. — Пошли уже.
Читать дальше →
Total votes 151: ↑137 and ↓14+123
Comments29

Замечательное выступление настоящего программиста

Reading time1 min
Views150K
Не нашёл на хабре — спешу поделиться. Восхитительное выступление Александра Соловьёва ingspree на конференции JavaScript Frameworks Day 2013. На видео ниже просто набор отрывков из него, желающим посмотреть полностью — сюда.

Total votes 324: ↑272 and ↓52+220
Comments133

Как распознавать манипуляции и быстро обезвреживать их

Reading time16 min
Views84K
Как-то так происходит, что вопросы переговоров, вызывают большой интерес хабрапублики. Наши самые заплюсованные посты так или иначе касались переговоров:


Не так давно общаясь с директором одной крупной ИТ-компании мы как раз обсуждали эту тему. И он высказал мысль, что отрасль IT — это отрасль, где люди больше всего общаются друг с другом. Несмотря на, казалось бы, большое количество времени, которое мы проводим наедине с компьютером, много времени мы проводим и в общении: с коллегами по команде, коллегами из других городов и стран, заказчиками и т.д. Пообщаться за один день с ребятами из Новосибирска, Москвы, Питера, Санта Клары, Шанхая и Бангалора — в порядке вещей. Причем и письменно, и устно, и на совещаниях и в чатах — как хочешь. Сплошные переговоры. Это, вероятно, и объясняет столько плюсов в постах по этой теме.

Сегодня мы решили продолжить эту тему и опубликовать главу из новой книги Дмитрия Коткина «Переговорная книга быстрых рецептов».

Как распознавать манипуляции и быстро обезвреживать их

Читать дальше →
Total votes 22: ↑19 and ↓3+16
Comments9

Еще один взгляд на Entity Framework: производительность и подводные камни

Reading time10 min
Views44K
Ни для кого не секрет, что адаптация Entity Framework проходит очень медленно. Огромное количество компаний продолжают использовать Linq2Sql и не планируют менять его на что-то новое в обозримом будущем, несмотря на то, что EF – официально рекомендуемая Microsoft технология доступа к БД, а Linq2Sql уже почти не поддерживается.

Тех, кто всё еще сомневается, можно ли использовать EF (и особенно – code first) на реальных проектах, приглашаю под кат.
Читать дальше →
Total votes 30: ↑30 and ↓0+30
Comments12

Сайт с нуля на полном стеке БЭМ-технологий. Методология Яндекса

Reading time29 min
Views107K
На прошлой неделе BBC рассказала, что для новой версии главной страницы использовала методологию БЭМ, созданную в Яндексе. По такому случаю мы решили поднять материалы мастер-класса «Разрабатываем сайт с нуля на полном стеке БЭМ-технологий» и рассказать вам, как начать использовать полный стек БЭМ-технологий в своих проектах.

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



В статье мы расскажем, в чём преимущество вёрстки независимыми блоками и что такое уровни переопределения, познакомимся с готовыми библиотеками блоков и инструментами для автоматизации сборки. Покажем, как разные инструменты — например, autoprefixer, css-препроцессор Stylus или модульная система YModules — упрощают жизнь разработчика и создают по-настоящему удобную платформу, если встроить их в процесс разработки по БЭМ.

На живом примере мы объясним, в чём польза декларативного подхода, когда одни и те же идеи можно использовать как для CSS, так и для JavaScript. Отдельно остановимся на декларативных шаблонах BEMHTML и BEMTREE, которые позволяют преобразовывать данные в БЭМ-дерево, описанное в формате BEMJSON и, затем в HTML. Рассмотрим в деталях, как написать серверную часть приложения по БЭМ-методологии.
Читать дальше →
Total votes 96: ↑79 and ↓17+62
Comments37

Полная энергетическая автономия или как выжить с солнечными батареями в глубинке (часть 1. теоретическая)

Reading time5 min
Views326K


Все начиналось с того, что я приобрел участок земли в деревне, мимо которого не проходили электрические провода. «Ничего страшного, — подумал я. — Ведь по закону меня должны подключить к электросетям за 6 месяцев с момента заключения договора». Если бы я тогда знал, что мне придется освоить автономное энергоснабжение и окунуться в мир солнечной энергетики…

image
Как все начиналось
Total votes 145: ↑143 and ↓2+141
Comments244

Статические анализаторы JavaScript и ошибки, от которых они помогут отучиться (Часть 1)

Reading time5 min
Views34K
Далеко не каждая строка моего кода получается идеальной с первого же раза. Ну, в некоторых случаях… Иногда… Ладно – практически никогда. Правда заключается в том, что я трачу значительно больше времени на исправление своих собственных глупых ошибок, чем мне хотелось бы. Именно поэтому я использую статические анализаторы практически в каждом написанном мной файле JavaScript.

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

В больших проектах и при работе в больших командах вам не помешает небольшая помощь в поиске таких «простых» багов, которые на самом деле оказываются не такими простыми, как кажутся.
Читать дальше →
Total votes 28: ↑19 and ↓9+10
Comments48

Госнаркоконтроль преследует Ализара

Reading time2 min
Views26K
Сравнительно недавно — 14 октября 2011 года — alizar перевёл и выложил на Хабрахабре статью Гленна Гринуолда «Стив Джобс и политика в отношении оборота наркотиков», автор которой завершил свой труд следующим умозаключением:

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

(Конец цитаты.)

Я не уверен, возможна ли лучшая иллюстрация осуждаемой Гринуолдом суровости, нежели та, которая последовала в реальности. Не штатовская, а вполне российская Федеральная служба по контролю за оборотом наркотиков связалась с администрацией Хабрахабра и запросила все данные на Ализара, обвиняя его в пропаганде распространения наркотиков — об этом вчера поведал в Твиттере Денис Крючков (@deniskin, создатель Хабрахабра), а Владислав Михеев пересказал в «Вебпланете».

Читать дальше →
Total votes 551: ↑527 and ↓24+503
Comments612

Антипаттерны проектирования: Poltergeists

Reading time5 min
Views36K
«Я точно не знаю, что делает этот класс, но я уверен, что это важно!»

У паттернов проектирования — типовых решений, есть антиподы — типовые ошибки в проектировании. О паттернах проектирования написано достаточно книг, о антипаттернах — единицы. Вашему вниманию представлен вольный перевод статьи с сайта SourceMaking, описывающий один из таких антипаттернов (всего на сайте в разделе Software Development Antipatterns их представлено 14).

Наименование: Poltergeists (полтергейсты)
Другие наименования: Gypsy (цыган), Proliferation of Classes (рост количества классов), Big DoIt Controller Class
Масштаб: приложение
Рефакторинг: Ghostbusting (охота за привидениями)
Причина появления: непонимание концепций ООП, лень продумать архитектуру классов
Читать дальше →
Total votes 43: ↑30 and ↓13+17
Comments21

300 потрясающих бесплатных сервисов

Reading time11 min
Views1.6M


Автор оригинальной статьи Ali Mese добавил ещё 100 новых бесплатных сервисов. Все 400 потрясающих сервисов доступны здесь. И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



A. Бесплатные Веб-Сайты + Логотипы + Хостинг + Выставление Счета

  • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
  • Bootswatch: Бесплатные темы для Bootstrap.
  • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
  • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
  • Strikingly.com Domain: Конструктор веб-сайтов.
  • Logaster: Онлайн генератор логотипов и элементов фирменного стиля (new).
  • Withoomph: Мгновенное создание логотипов (англ.).
  • Hipster Logo Generator: Генератор хипстерских логотипов.
  • Squarespace Free Logo: Можно скачать бесплатную версию в маленьком разрешении.
  • Invoice to me: Бесплатный генератор счета.
  • Free Invoice Generator: Альтернативный бесплатный генератор счета.
  • Slimvoice: Невероятно простой счет.

Читать дальше →
Total votes 341: ↑325 and ↓16+309
Comments107

Количественная оценка понятности кода

Reading time3 min
Views18K
image

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

Но давайте посмотрим на проблему с другой стороны. Что мы делаем, когда разбираемся с чьим-то кодом? Как происходит сам процесс изучения кода? Мы листаем функции, ищем определения переменных, классов, переходим от функции к функции, от файла к файлу.

Читать дальше →
Total votes 31: ↑24 and ↓7+17
Comments34

Как распутывать лапшу, не впадая в депрессию

Reading time4 min
Views18K
Эта статья не про ваши сладкие интерфейсы на реакте, ангуляре или что вы там используете? Это статья про те ситуации, когда у вас есть кучка jQuery лапши. Нет, пусть это будут горы jQuery лапши, завернутой во вьюшки бэкбона.

В статье используется библиотека Backbone.View.Elements

Проблема первая: маловыразительные селекторы


Все мы видели лапшу, все мы знаем: лапша в JSе — наверно и в верстке не все хорошо. А раз все так, то код, скорее всего, кишит непонятными манипуляциями с домом. Читать такой код сложно, ведь надо, не упуская мысли автора о том, что здесь вообще происходит, держать в уме кучку невнятных названий для элементов. Итак, давайте придадим коду немножко выразительности:
_selectors: function () {
    return {
        elemName: '.block__elem-name'
    };
}
Сложим все селекторы в одном месте и дадим понятное название элементам, для выбора которых они нужны. Выбирать мы их, кстати, будем вот так:
this._elem('elemName');
вместо
this.$('.block__elem-name');

Неплохо? Поехали дальше..
Total votes 22: ↑19 and ↓3+16
Comments30

Почему OpenVPN тормозит?

Reading time3 min
Views184K
Описанная проблема присуща только ветке OpenVPN 2.3, в 2.4 размеры буферов не меняются без требования пользователя.

Время от времени, мне встречаются темы на форумах, в которых люди соединяют несколько офисов с использованием OpenVPN и получают низкую скорость, сильно ниже скорости канала. У кого-то это может быть 20 Мбит/с при канале в 100 Мбит/с с обеих сторон, а кто-то еле получает и 400 Кбит/с на 2 Мбит/с ADSL/3G и высоким пингом. Зачастую, таким людям советуют увеличить MTU на VPN-интерфейсе до чрезвычайно больших значений, вроде 48000, или же поиграться с параметром mssfix. Частично это помогает, но скорость внутри VPN все еще очень далека от канальной. Иногда все сваливают на то, что OpenVPN — userspace-решение, и это его нормальная скорость, учитывая всякие шифрования и HMAC'и. Абсурд!

Немного истории

На дворе июль 2004 года. Типичная скорость домашнего интернета в развитых странах составляет 256 Кбит/с-1 Мбит/с, в менее развитых — 56 Кбит/с. Ядро Linux 2.6.7 вышло не так давно, а 2.6.8, в котором TCP Window Scale включен по умолчанию, выйдет только через месяц. Проект OpenVPN развивается уже 3 года как, к релизу готовится версия 2.0.
Один из разработчиков добавляет код, который устанавливает буфер приема и отправки сокета по умолчанию в 64 КБ, вероятно, чтобы хоть как-то унифицировать размер буфера между платформами и не зависеть от системных настроек.
Читать дальше →
Total votes 90: ↑89 and ↓1+88
Comments61

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity