SELECT [DEFER] * FROM…

Я тут подумал, что было бы очень круто как помечать запросы флагом, который бы говорил СУБД «если такой же запрос уже выполняется, то меня устроят его результаты, новый запускать не надо». Было бы очень полезно для запросов, в которых не нужна оперативность и которые заказываются большим числом пользователей.

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

Со стороны СУБД было бы интереснее такое увидеть.

9 комментариев

«Жизнь» Конвея на «R» ★

«Жизнь» (18.72КиБ)
Одно поколение в игре «Жизнь», запущенной в терминале

  Игра «Жизнь» знакома, наверное, каждому программисту. Интересна она тем, что этот незатейливый алгоритм оказал существенное влияние на целый ряд научных дисциплин.

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

Сегодня ночью постарался написать классическую версию игры «Жизнь» на языке «Эр». Мне показалось это интересной задачей, так как «Эр» очень удобным образом позволяет работать со множествами так, как будто это скалярные значения.

Это можно увидеть почти сразу, в строке, где создаётся матрица случайных значений:

life <<- matrix(as.integer(runif(rows * cols) < ratio), rows, cols)

Сравнение с переменной ratio и вызов as.integer тут применяется к каждому значению из множества, генерируемого функцией runif (Random Uniform Distribution, генерирует случайные значения с нормальным распределением). Так матрица игры заполняется случайными нулями и единицами.

Ниже по коду довольно много манипуляций с этой матрицей и выполнение правил алгоритма за счёт конструкций языка занимает всего несколько строк.

Суть такова: матрица двигается во все восемь направлений (с шагом 45°), все получившиеся матрицы складываются, это позволяет оценить количество соседей любой клетки в каждом из направлений. Далее в две строки выполняются основные условия:

# Any dead cell with exactly three live neighbours becomes a live cell
life.new[life == 0 & life.neighbors == 3] <- 1
# Any live cell with fewer than two or more than three live neighbours dies
life.new[life == 1 & (life.neighbors < 2 | life.neighbors > 3)] <- 0

Тут участвуют три матрицы: life — поле игры на предыдущем шаге, life.new — поле игры на текущем шаге и life.neighbors — матрица соседей (точка в «Эре» не имеет специального значения). Как видите матрица сравнивается с числом, как будто она скаляр, результат этой операции тоже матрица, но из булевых значений, в каждой клетке — результат операции. Такую матрицу можно использовать как индекс, в результате чего вернутся только те ячейки, по адресам которых в булевой матрице было TRUE.

Дальше просто, поскольку ячейки возвращаются по ссылке, им скопом присваивается требуемое значение.

2 комментария

Небольшие новости по всяким программистким мелочам

Принятый коммит (71.85КиБ)
Коммит, принятый в репозиторий модуля для работы с сервером очередей из ПХП

В прошлом месяце я писал о неочевидных проблемах строгой типизации в ПХП, суть в том, что при её включении немного неудобно поменялась проверка типов входных параметров у внешнего модуля для работы с «Гиэрменом» (Gearman) — сервером очередей. Я сделал крошечный патч, который это исправляет, сегодня ночью его приняли.

Кроме того, мой погодный плагин для «Саблайма» приняли в официальный репозиторий, теперь его можно поставить одной командой.

2 комментария

Bashfuck-3

Hello world (69.01КиБ)
Очередной «Хеллоу ворлд» на «башфаке» — способе программирования на «баше» без алфавитно-цифровых символов

Вчера весь день болела голова и я, чтобы хоть как-то отвлечься, написал, на ночь глядя, ещё один «Хеллоу ворлд» на «баше» в стиле «Башфак» — три года назад эти увлёкся, тогда остались кое-какие нереализованные идеи.

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

В свежем варианте самое главное новшевство — использование функций.

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

А вот с функциями веселее, я использовал в именах точки и тире, и закодировал при помощи азбуки Морзе результат работы каждой функции. Например функция, которая генерирует букву «w» называется «.__» (то есть «точка»-«тире»-«тире»).

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

Имя этой команды легко получается из конструкции перенаправления ввода-вывода в специальный файла вида /dev/fd/XX. Получаем имя этого файла, берём буквы «f», «d» и запускаем полученную команду.

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

С цифрами особых проблем не было. Так, например измерением длины значения переменной «минус» (длина измеряется символом «решётка») получается цифра два, очень удобно. Цифра «один» получается измерением длины значения другой переменной — кода возврата последней команды (её имя — «вопрос»), остальные нужные цифры получались комбинацией этих двух.

Из всего вышеописанного получились все буквы, кроме «r» и «w». Первую я получил, запустив на выполнение ls /bin/?m — по маске гарантированно находится файл команды удаления /bin/rm, её имя содержит искомую букву.

Для получения второй воспользовался командой «tr» и идеей, похожей на реализацию ROT13 на «баше» — подобрал диапазоны из имеющихся в моём распоряжении букв так, чтобы одна подходящая буква сдвинулась нужным мне образом — стала буквой «w».

1 комментарий

F★ckJS на поло

Белая футболка с надписью «ПРАКТИКА» и кодом var phone = ... на фоне стола с зелёным держателем для ручек.
Поло с программой на ДжаваСкрипте, написанной четыре года назад

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

На поло программа на ДжаваСкрипте, которую я писал к какому-то событию, должно быть готовились к какой-то конфереции — если её запустить в консоли браузера, появляется надпись «prihodite rabotat 88002005221». У меня в «исходящих» сохранилось письмо от 11 марта 2013 года, где я высылаю оригинал этой программы нашему дизайнеру, четыре года уже прошло, надо же.

2 комментария

Что-то не вижу — быть или не быть?

Программа, выводящая монолог Гамлета (19.86КиБ)
Так выглядит программа, выводящая монолог Гамлета

Слово «выглядит» в подписи ко скриншоту выше упомянуто неслучайно — программа написана так, что видимое — только надводная часть айсберга.

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

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

С тех пор эти инструменты застыли примерно в том же состоянии, но теперь, мне кажется, в этом деле наметился прорыв.

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

Что такое суррогатные пары расписывать не буду, статей на эту тему предостаточно, главное, что их не видно и они могу быть частью (кроме первого символа) любого идентификатора ДжаваСкрипта.

Я попробовал использовать способ с суррогатными парами, чтобы скрыть монолог Гамлета внутри программы на ДжеЭсФаке (способ написания программ на ДжаваСкрипте, когда не используются алфавитно-цифровые знаки), плюс этими же парами закодировал имена переменных.

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

16 комментариев

Кружка душой из СССР

Новая кружка (78.00КиБ)
Похожие кружки лежали дном вверх в каждой деревне СССР на крышке ведра с ключевой водой

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

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

5 комментариев

Интеллектуальные машины Семёна Корсакова

Схема музыкальной композиции с нотами на линейках A–K, показывающая ритмические паттерны и длительности звуков в виде чёрных прямоугольников.
Перфокарта для интеллектуальных машин Семёна Николаевича Корсакова

Читая анонс книги об изобретениях в Российской Империи, наткнулся на новое для себя имя.

На рисунке вверху — перфокарта Корсакова, который является пионером отечественной кибернетики. Для 1832 года его идеи были настолько передовыми, что комиссия Императорской Академии наук в Санкт-Петербурге не смогла понять их значения, несмотря на то, что председательствовал сам Михаил Васильевич Остроградский — выдающийся российский механик и математик.

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

Суть была подробно описана в его книге «Начертание нового способа исследования при помощи машин, сравнивающих идеи», которую перевели с французского (языка дворянства того времени) и переиздали в 2009-м году, присовокупив биографию Семёна Николаевича.

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

Более сложная система могла так же учитывать значимость критерия — используя цвет или диаметр шляпки штырька.

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

3 комментария

Крещение дочки ★

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

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

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

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

Это не значит, что этот механизм единственный, в конце концов у меня в прошлом было полно таких ситуаций (наверняка будут и ещё), но я не тот атеист, что «до первой тряски в самолёте», у меня какие-то другие защитные механизмы срабатывают, уж не знаю какие.

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

49 комментариев

Сёстры Зайцевы и микрофон

Женщина с длинными светлыми волосами и челкой поет в микрофон, одетая в блестящий наряд, на темном фоне.
Одна из вокалисток российского женского вокального дуэта «Сёстры Зайцевы»

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

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

Не понимаю что мешает перевернуть его, взять в кулак и говорить, как в обычный большой микрофон?

7 комментариев

← сюда туда →