Как стать автором
Обновить
206
-2.4
Андрей @impwx

Программист

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

Фамильный вики-движок Bonsai: 6 лет спустя

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров2.8K
Прошло шесть с лишним лет с момента, когда я начал работать над проектом Bonsai. Если в двух словах, то это вики-движок, заточенный под хранение семейной истории и построение генеалогических деревьев. Он распространяется в полностью открытом и бесплатном виде, подразумевая установку на ваш собственный сервер в качестве docker-контейнера.



Более подробно о его устройстве и истории создания можно почитать в моих предыдущих статьях 3+ годичной давности: раз, два. Изначально я планировал выпускать мажорную версию и писать про нее статью раз в год, но родительство и переезд вносят в планы изрядную долю хаоса. Тем не менее, проект все еще активен и развивается. Сегодня я расскажу о том, что было реализовано и улучшено за последнее время.
Читать дальше →
Всего голосов 14: ↑14 и ↓0+14
Комментарии21

Как в Индиане чуть не узаконили π = 3.2

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров19K

Поздравляю всех с днем числа Пи! (день числа Пи отмечается 14 марта, поскольку эта дата в американском формате записывается в как 3.14 - прим. перев.) Чтобы отметить его как следует, я хочу ненадолго отвлечься от программного обеспечения и поговорить о чем-то особом. Возможно, вы слышали байку о том, как в штате Индиана пытались законодательно приравнять число Пи к чем-то типа 3, или 4, или 3.15. Обычно ее рассказывают в качестве доказательства того, что жители Индианы - бестолковая деревенщина, но это далеко не вся история. Зачем они пытались поменять значение π и на что они рассчитывали?

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

Мне придется объяснить немало математических концепций.

Читать далее
Всего голосов 47: ↑44 и ↓3+41
Комментарии141

Скриптинг без скриптинга

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

Уже давно считается, что многие (если не все) игры или приложения можно улучшить, добавив в них поддержку скриптов.

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

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

Читать далее
Всего голосов 11: ↑8 и ↓3+5
Комментарии12

Заговор против IE6

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

У невероятного роста Youtube есть одно последствие, радостное и грустное одновременно - множество историй потеряются под слоями новой краски. Именно поэтому я хочу рассказать одну из них - историю того, как 10 лет назад маленькая команда веб-разработчиков задумала убить IE6 с помощью Youtube и даже не получила за это по шапке.

Я не могу вспомнить то конкретное событие, из-за которого наша команда разработки начала строить планы убийства браузера за обедом в столовой Youtube. Возможно, в тот раз я случайно отправил в релиз CSS-стиль, где был указан селектор атрибута на нестандартном HTML-элементе. Любой здравомыслящий веб-разработчик предположил бы, что если браузер не может распознать элемент - он молча пропустит данное описание. Но со старыми версиями IE дело обстояло не так. В определенных условиях это приводило либо к внутренней рекурсии и падению браузера (если повезет), или даже к синему экрану смерти (если не повезет).

А может быть, в сотый раз кто-то из наших разработчиков использовал тег <img> без указания атрибута src. От новичков никто не требовал быть в курсе, что в старых версиях IE вместо пустого аттрибута src подставляется корневой путь ("/"). Это внезапно превращает тег <img> в <iframe>, загружая главную страницу и все связанные с ней ресурсы, что может привести к бесконечной рекурсии. Когда пустой тег <img> случайно просачивался на главную страницу - вся команда в экстренном режиме искала его, пока сервера не расплавились под нагрузкой.

В общем, не вдаваясь в подробности - это была настоящая жесть, и она была связана с IE6. Этот браузер сильно отравлял жизнь всей нашей команде разработки. По меньшей мере 1-2 недели из каждого мажорного релиза отводились на то, чтобы заставить новый UI работать под IE6. Несмотря на всю эту боль, нас заставляли поддерживать его ради пользователей, которые не могут обновиться или работают в компаниях, где обновление запрещено политиками безопасности. Пользователи IE6 на тот момент составляли примерно 18% от общего числа. Все понимали, что просто так прекратить его поддержку нельзя, но когда мы сидели в той столовой после нескольких бессонных ночей, на сопереживание тем несчастным пользователям просто не оставалось сил. Мы начали коллективно фантазировать о том, как отомстить IE6. Одна идея сразу привлекла всеобщее внимание: а что, если мы просто пригрозим прекратить поддержку? Как отреагируют пользователи? Они поднимут бунт против Youtube, начнут присылать нам письма с угрозами расправы (как это уже случалось раньше)? Или вдруг станут апологетами новых браузеров? Мы мечтали о том, как офисные работники по всему миру внезапно начнут придумывать причины, по которым обновление браузеров жизненно необходимо для бизнеса, а бабушки и дедушки возьмут своих технически прошаренных внуков в заложники, чтобы те "починили им ютубы". То, что началось как сеанс групповой психотерапии, стало превращаться в конкретный план действий, для реализации которого у нас были уникальные условия.

Читать далее
Всего голосов 218: ↑214 и ↓4+210
Комментарии86

История двух стандартных библиотек Си

Время на прочтение5 мин
Количество просмотров24K
Сегодня мне пришел баг-репорт от пользователя Debian, который скормил какую-то ерунду в утилиту scdoc и получил SIGSEGV. Исследование проблемы позволило мне провести отличное сравнение между musl libc и glibc. Для начала посмотрим на стектрейс:

==26267==ERROR: AddressSanitizer: SEGV on unknown address 0x7f9925764184
(pc 0x0000004c5d4d bp 0x000000000002 sp 0x7ffe7f8574d0 T0)
==26267==The signal is caused by a READ memory access.
    0 0x4c5d4d in parse_text /scdoc/src/main.c:223:61
    1 0x4c476c in parse_document /scdoc/src/main.c
    2 0x4c3544 in main /scdoc/src/main.c:763:2
    3 0x7f99252ab0b2 in __libc_start_main
/build/glibc-YYA7BZ/glibc-2.31/csu/../csu/libc-start.c:308:16
    4 0x41b3fd in _start (/scdoc/scdoc+0x41b3fd)

В исходниках на данной строчке написано вот что:

if (!isalnum(last) || ((p->flags & FORMAT_UNDERLINE) && !isalnum(next))) {

Подсказка: p — это корректный, ненулевой указатель. Переменные last и next имеют тип uint32_t. Сегфолт случается на втором вызове функции isalnum. И, самое важное: воспроизводится только при использовании glibc, но не musl libc. Если вам пришлось перечитать код несколько раз, вы не одиноки: тут попросту нечему вызывать сегфолт.
Читать дальше →
Всего голосов 75: ↑71 и ↓4+67
Комментарии77

Как ошибка из 2009 вызывает конфликт Docker for Windows и Razer Synapse

Время на прочтение2 мин
Количество просмотров18K
Сегодня мне попался весьма любопытный баг: Docker for Windows не запустится, если у вас запущена панель управления драйвером Razer Synapse.

Но интереснее всего то, почему так случилось…

Читать дальше →
Всего голосов 35: ↑34 и ↓1+33
Комментарии17

Цензура в исходном коде .NET Framework

Время на прочтение2 мин
Количество просмотров54K
Пятничным вечером, проглядывая исходники с Reference Source, случайно наткнулся на подозрительно выглядящий комментарий:



Некоторые слова заменены на 4 тире. Ну ладно, иногда разработчики действительно бывают весьма экспрессивны и не стесняются резких выражений… Но при всем желании я не смог вспомнить ни одного ругательства, которое бы подошло здесь по смыслу. Откуда же оно взялось?
Читать дальше →
Всего голосов 289: ↑288 и ↓1+287
Комментарии123

Запускаем игру на C# в MS-DOS

Время на прочтение2 мин
Количество просмотров14K
Меня всегда раздражало, что я не могу запустить 64-битную игру на C# под MS-DOS. Сегодня я это исправил.


Всего голосов 61: ↑61 и ↓0+61
Комментарии14

Фамильный вики-движок Bonsai: итоги 2019 года

Время на прочтение5 мин
Количество просмотров7.5K
В начале прошлого года я рассказывал про проект Bonsai — движок для создания семейного вики и фотоальбома с открытым исходным кодом. С тех пор проект планомерно развивался. За год сделано несколько фич, благодаря которым движок теперь значительно проще попробовать в у себя и приятнее использовать в дальнейшем.



Под катом — подробности, планы на будущее и немного bounty.
Читать дальше →
Всего голосов 27: ↑27 и ↓0+27
Комментарии31

Почему отписка от рассылки занимает несколько дней?

Время на прочтение2 мин
Количество просмотров45K
В одном твите спрашивали, почему отписка от рассылки может «занимать несколько дней». Пристегнитесь покрепче, я сейчас расскажу вам невероятную историю о том, как это делается в энтерпрайз-разработке™…


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

Банк рассылает маркетинговые письма. В подвале каждого письма есть маленькая ссылка «отписаться». Люди иногда на эти ссылки кликают.
Читать дальше →
Всего голосов 162: ↑159 и ↓3+156
Комментарии115

Объясняем код с помощью ASCII-арта

Время на прочтение2 мин
Количество просмотров20K
Примечание от переводчика: типично пятничная статья во вторник утром… почему бы и нет?



Большинство людей — визуалы. Они используют изображения, чтобы вникнуть в суть проблемы. А вот мэйнстримные языки программирования, напротив, основаны на текстовом представлении. Возникающую пропасть между текстом и графикой заполняют ASCII-изображения, нарисованные с помощью текстовых символов и вставленные в исходный код программы. Я их обожаю! Как-то раз я кинул клич в Twitter и мне прислали гораздо больше примеров, чем я ожидал. Спасибо всем участвовавшим. В этой теме попалось несколько прекрасных примеров, которые я собрал и разложил на категории. Для каждого изображения дается ссылка на соответствующий репозиторий.
Читать дальше →
Всего голосов 69: ↑68 и ↓1+67
Комментарии23

Bonsai: фамильный вики-движок

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

Лирическое вступление


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

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



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

Идеальным решением для хранения семейных данных мне представлялся гибрид вики-движка и фотоальбома. Готовых подходящих решений не оказалось, поэтому пришлось написать собственный. Он называется Bonsai и доступен с открытым кодом по лицензии MIT. Дальше будет история о том, как он устроен и как им пользоваться, а также история его разработки и немного ДРАМЫ.
Читать дальше →
Всего голосов 67: ↑67 и ↓0+67
Комментарии40

Advent of Code 2016

Время на прочтение1 мин
Количество просмотров6.5K
Вчера начался Advent Of Code 2016.

Advent Of Code 2016

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

Прошлогодняя турнирная таблица Хабра по-прежнему активна, восемь человек в ней уже участвуют в этом году. Всем остальным можно присоединиться, введя код:

55074-c2e83c69
Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии8

Как эмодзи могут улучшить ваш код (на самом деле)

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

Примечание переводчика: в перерывах между холиварами про JS предлагаю обсудить несерьёзную, пятничную тему:


Кто не любит эмодзи? Активно используя их в мессенджерах и почтовых приложениях, я решил проэкспериментировать с тем, как можно применить их с умом в повседневной разработке приложений. Хотя поначалу это была просто шутка, эмодзи действительно оказались полезными в ряде случаев. Как так?


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

Читать дальше →
Всего голосов 43: ↑23 и ↓20+3
Комментарии76

Удивительная история document.write

Время на прочтение3 мин
Количество просмотров49K
Метод document.write — один из самых странных методов. Он вставляет HTML-код на страницу сразу после себя. Точнее говоря, сразу после тега <script>, внутри которого он расположен. И только в том случае, если документ еще не был загружен полностью. А если был? Тогда страница очищается и заменяется на, что было указано.

Можно вставить строку, которая явно сломает остальную страницу:

document.write('<plaintext>')

Или можно поиграть в русскую рулетку:

if (Math.random() > 0.9)
  document.write('<!--')
Читать дальше →
Всего голосов 86: ↑82 и ↓4+78
Комментарии36

Чем полезен мономорфизм?

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


Выступления и посты в блогах о производительности JavaScript часто обращают внимание на важность мономорфного кода, однако обычно не дается внятного никакого объяснения, что такое мономорфизм/полиморфизм и почему это имеет значение. Даже мои собственные выступления зачастую сводятся к дихотомии в стиле Невероятного Халка: «ОДИН ТИП ХОРОШО! ДВА ТИП ПЛОХО!». Неудивительно, что когда люди обращаются ко мне за советом по производительности, чаще всего они просят объяснить, что на самом деле такое мономорфизм, откуда берется полиморфизм и что в нем плохого.

Ситуацию осложняет еще и то, что само слово «полиморфизм» имеет множество значений. В классическом объектно-ориентированном программировании полиморфизм связан с созданием дочерних классов, в которых можно переопределить поведение базового класса. Программисты, работающие с Haskell, вместо этого подумают о параметрическом полиморфизме. Однако полиморфизм, о котором предупреждают в докладах о производительности JavaScript – это полиморфизм вызовов функции.

Я объяснял этот механизм столькими различными путями, что наконец-то собрался и написал данную статью: теперь можно будет не импровизировать, а просто дать на нее ссылку.

Я также попробовал новый способ объяснять вещи – изображая взаимодействие составных частей виртуальной машины в виде коротких комиксов. Кроме того, данная статья не покрывает некоторые детали, которые я посчитал незначительными, излишними или не связанными напрямую.
Читать дальше →
Всего голосов 50: ↑49 и ↓1+48
Комментарии11

Advent of Code

Время на прочтение1 мин
Количество просмотров16K
Удивлен, что ссылки на Advent of Code до сих пор не видно на Хабре.



Если вкратце, то это рождественский календарь, где каждый день открывается по небольшой задачке на программирование. Сегодня пятница, и уже открыто 18 штук — отличный повод размять мозги, или потренироваться в написании программ на новом языке, до изучения которого никак не доходили руки.
Читать дальше →
Всего голосов 15: ↑15 и ↓0+15
Комментарии12

Когда программа падает только по средам

Время на прочтение3 мин
Количество просмотров64K
Откиньтесь на спинку кресла и отдохните – пришло время рассказать об одном из моих самых любимых багов.

Это была моя самая первая работа в сфере IT – летняя практика в компании, разрабатывающей очень серьезное медицинское оборудование, в частности системы подачи анестезии и мониторы для пациентов больниц. Монитор для пациента – это такая попискивающая коробка рядом с лежачим больным, которая меряет пульс, давление, частоту дыхание и прочее, а также оповещает медсестер в случае неприятностей. Офис был полон двухметровых баллонов с веселящим газом, по нему расхаживали роскошнобородые гуру-эксперты по встраиваемым системам, и были целые комнаты-хранилища специально для документации, необходимой для сертификации различного оборудования. Народ до сих пор шепотом рассказывал об одном баге, пропущенном тестировщиками с десяток лет назад, из-за которого система подачи анестезии перезапустилась посреди операции. Стоит ли говорить, что зеленого сопляка-студента вроде меня и за километр бы не подпустили к боевым системам?

Вместо этого мне поручили проект-прототип с целью опробовать в действии самые горячие технологические новинки 1997 года – сервер на C++, который бы слушал мониторы по последовательному порту, сливал интересные данные в базу на SQL Server и отправлял их на Java-апплет через CORBA, чтобы доктора и родственники могли следить за самочувствием больного через интернет. Красота же! Особенно с учетом того, что практического опыта у меня не было ни с одной из этих систем и технологий!
Читать дальше →
Всего голосов 146: ↑136 и ↓10+126
Комментарии42

Семь удивительных «возможностей» Javascript

Время на прочтение5 мин
Количество просмотров66K
За последние несколько месяцев я сделал несколько доработок для JSHint, в основном с целью изучить ES6 (я особенно горжусь тем, как переделано обнаружение областей видимости для переменных). Во время этого процесса я наткнулся на несколько вещей, которые меня удивили — в основном, в ES6, однако есть и кое-что про ES3, что я до этого никогда не использовал.

Break из любого блока


Наверняка вы знаете, что в любом цикле можно использовать ключевые слова break и continue — это стандартная возможность в современных языках программирования. Однако не все знают, что циклам можно давать метки и с их помощью прерывать любой конкретный цикл:

outer: for(var i = 0; i < 4; i++) {
    while(true) {
        continue outer;
    }
}
Читать дальше →
Всего голосов 78: ↑65 и ↓13+52
Комментарии71

Предварительная версия Microsoft Office для Windows 10

Время на прочтение1 мин
Количество просмотров37K
Команда разработчиков объявила в своем блоге, что они выпустили Technical Preview следующей версии Microsoft Office. Это будут универсальные приложения, которые можно запускать на компьютере, планшете и даже телефоне под Windows 10.

Пока опробовать Office for Windows 10 в действии смогут только те, кто зарегистрировался в бета-программе и скачал себе Windows 10 Technical Preview. Скоро обещают выпустить и версию для телефонов.

Новый офисный пакет будет предустановлен в телефоны и планшеты. На других платформах он будет доступен для скачивания через Windows Store.

Word для Windows 10


Word for Windows 10
Первое, что бросается в глаза — это супер-компактная панель инструментов. Непонятно, насколько глубоко придется лезть за привычными функциями, но выглядит очень чисто и приятно.

Из нововведений — некая фича под названием Office Insights. Судя по всему, это контекстный поиск всяких определений в режиме чтения документа. Работает, само собой, через Bing.
Читать дальше →
Всего голосов 20: ↑14 и ↓6+8
Комментарии15
1

Информация

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

Специализация

Fullstack Developer
Lead
От 10 000 €
C#
.NET
SQL
TypeScript
Vue.js
Angular