Рубрика «ненормальное программирование» - 65

Некоторое время назад в московский офис Яндекса приезжал Игорь Пак — ученый с множеством научных работ, выпускник мехмата МГУ и аспирантуры Гарварда. Сейчас Игорь работает в Калифорнийском университете. Его лекция в Яндексе была посвящена различным классам последовательностей и перестановкам. В том числе прямо по ходу лекции он представил выкладки, опровергающие гипотезу Нунана и Зайлбергера — одну из ключевых в области перестановок.

Под катом — подробная текстовая расшифровка и большинство слайдов.
Читать полностью »

История одной одержимости, или как я писал календарный скрипт для Photoshop - 1

Эта статья о том, как я писал скрипт для создания календарей в Photoshop, от самого начала и до самого конца, с багами и пасхалками. Много текста, некоторого кода и чуть-чуть иллюстраций.
Читать полностью »

Вы задумывались над тем, что если в конструкторе и методах использовать не this, а переменную, то после минификации экономия байтов начнётся уже с четвёртого this?

// просто сравните длину строк
this.this.this.this.
var s=this;s.s.s.s.

Я использовал этот и некоторые другие упоротые способы для участия в конкурсе js13kGames, цель которого — написать игру, размер которой не превысит 13 килобайт.

Скриншот ранней версии игры

Игра почти готова, осталось всего-то пару дней не спать...

Читать полностью »

Моим самым важным проектом был интерпретатор байт-кода (или «как увидеть матрицу») - 1

В форумах я часто вижу вопросы от начинающий программистов на С++: «какую посоветуете литературу?». Обычно я отвечаю набором надежных книг с дополнением: никакое количество прочитанных книг не заменит практику. Нужно на самом деле делать что-то. Но что? Что может быть хорошим проектом? Нужно что-то, что научит многому, но при этом достаточно простое и интересное, чтобы не заскучать. Я недавно задумался над этим вопросом, и, кажется, нашел ответ. Вам несомненно стоит написать интерпретатор байт-кода. Для меня такой проект оказал решающее значение в становлении всей последующей карьеры.

Как все началось

В 200Х году я учился на втором курсе в университете. У меня уже был небольшой опыт в программировании. Я умел использовать абстракции, доступные в С++, я не понимал на самом деле как все работает. Для меня компилятор и операционная система были просто черными коробками, работающими благодаря магическим заклинаниям, и я в целом считал это приемлемым.Читать полностью »

image
Если мне не изменяет память первым устройством оснащённым разъёмом USB Type-C был планшет от компании Nokia, увы он стал надгробным камнем для этого Величайшего производителя мобильных телефонов. Тем не менее новый разъём начал активно применяться в новой технике и с каждым днём количество девайсов поддерживающих USB Type-C интерфейс становится всё больше и больше, с этим надо что-то делать. )) С вами Dark_Purple и сегодня мы будем убивать Brand New Apple MacBook 12” (Early 2016), однако здравствуйте!
Читать полностью »

Немногие слышали про IPFS, ещё более немногие добрались до детального изучения. И совсем уж единицы погрузились в проект поглубже.

Если вкратце, IPFS это химера, созданная из технологий, лежащих в основе git и bittorrent, с одной особенностью — адресация объектов по содержимому (CAS).

Любой объект, файл или пользовательские данные хэшируются, и получившийся хэш становится адресом этого файла в системе IPFS. Далее, этот контент могут запросить другие узлы сети, и он расползётся по планете, и в идеале, никогда больше не исчезнет, будучи доступным по хэшу. Из этого свойства так же вытекает иммутабельность объектов в системе, ведь любое изменение содержимого создаёт новый адрес-хэш в сети.

Типичная ссылка на объект: http://ipfs.io/ipfs/QmPQGujZ4K1xPNNcCjBWMoSuYrcJae43dukJP51mbfftDK

Читать полностью »

Тут на днях писали про аналитическое нахождение производных, что напомнило мне об одной моей маленькой библиотечке на C++, которая делает почти то же, но во время компиляции.

Аналитическое вычисление производных на шаблонах C++ - 1

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

using Formula_t = decltype (k * (_1 - r0) / (_1 + r0) * (g0 / (alpha0 - logr0 / Num<300>) - _1));    // сама формула
const auto residual = Formula_t::Eval (datapoint) - knownValue;    // регрессионный остаток

// производные по параметрам:
const auto dg0 = VarDerivative_t<Formula_t, decltype (g0)>::Eval (datapoint);
const auto dalpha0 = VarDerivative_t<Formula_t, decltype (alpha0)>::Eval (datapoint);
const auto dk = VarDerivative_t<Formula_t, decltype (k)>::Eval (datapoint);

вместо крокодилов, которые получатся, если брать частные производные функции на картинке вначале (вернее, некоторого её упрощённого варианта, но он выглядит не так страшно).

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

Под катом — небольшое описание, как оно там всё работает.

Читать полностью »

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

Но при использовании GIT под Windows есть некоторые проблемы, например все найденные мною клиенты GIT, даже в Portable (без установки) версии:
• Занимают много памяти на диске, много требуется скачивать (от 15 до 450 МБ)
• Содержат множество папок и файлов, неудобно их все переносить вместе со своим приложением

Решением данных проблем я и занялся. Что из этого вышло:
Клиент для GIT, который имеет 2 функции (Clone и Pull) на основе LibGit2Sharp
Вес клиента 1,5 Мб в архиве и 3 Мб на диске
Запуск из командной строки
• Всего 5 файлов, которые при желании можно объединить в 1. (1 исполняемый и 4 dll библиотеки)
Читать полностью »

Думаю, все помнят telnet версию SW:New Hope. В связи с блокировкой PornHub'а, возникла идея сделать что-то подобное с их видео. Вооружимся питоном и попробуем реализовать задумку.

Тот самый StarWars.
Читать полностью »

Одним томным пятничным вечером взбрела мне в голову безумная идея: а почему бы мне не поразмять мозг, и не написать HelloWorld на ассемблере. Однако это показалось слишком простым. А давайте соберем не x86 программу, а java class? Сказано — сделано.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js