SELECT [DEFER] * FROM…
Я тут подумал, что было бы очень круто как помечать запросы флагом, который бы говорил СУБД «если такой же запрос уже выполняется, то меня устроят его результаты, новый запускать не надо». Было бы очень полезно для запросов, в которых не нужна оперативность и которые заказываются большим числом пользователей.
Конечно такое можно кешировать со стороны приложения (что у нас и делается в продукте), но встают вопросы инвалидации кеша, предотвращения одновременного выполнения одного и того же запроса несколько раз, если в кеше
Со стороны СУБД было бы интереснее такое увидеть.
«Жизнь» Конвея на «R» ★
Игра «Жизнь» знакома, наверное, каждому программисту. Интересна она тем, что этот незатейливый алгоритм оказал существенное влияние на целый ряд научных дисциплин.
Не помню, чтобы я её
Сегодня ночью постарался написать классическую версию игры «Жизнь» на языке «Эр». Мне показалось это интересной задачей, так как «Эр» очень удобным образом позволяет работать со множествами так, как будто это скалярные значения.
Это можно увидеть почти сразу, в строке, где создаётся матрица случайных значений:
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.
Дальше просто, поскольку ячейки возвращаются по ссылке, им скопом присваивается требуемое значение.
Небольшие новости по всяким программистким мелочам
В прошлом месяце я писал о неочевидных проблемах строгой типизации в ПХП, суть в том, что при её включении немного неудобно поменялась проверка типов входных параметров у внешнего модуля для работы с «Гиэрменом» (Gearman) — сервером очередей. Я сделал крошечный патч, который это исправляет, сегодня ночью его приняли.
Кроме того, мой погодный плагин для «Саблайма» приняли в официальный репозиторий, теперь его можно поставить одной командой.
Bashfuck-3
Вчера весь день болела голова и я, чтобы хоть
Цель, напомню, написать программу, которая делает
В свежем варианте самое главное новшевство — использование функций.
В «баше» с именами переменных всё чересчур строго, если не использовать буквы и цифры остаются доллар и подчёркивание, смотрится однообразно
А вот с функциями веселее, я использовал в именах точки и тире, и закодировал при помощи азбуки Морзе результат работы каждой функции. Например функция, которая генерирует букву «w» называется «.__» (то есть
В этот раз я использовал более разнообразный набор свежевыдуманных трюков для получения букв. Большинство букв набрал из вывода команды df (показывает наличие места на смонтированных устройствах), первая строка вывода содержит заголовки полей (и разнообразных букв) и мало отличается от системы к системе.
Имя этой команды легко получается из конструкции перенаправления
Ещё немного помогла специальная переменная «минус» (да, у неё имя такое), в ней отображаются установленные флаги, в скриптах там всегда две буквы — «hB», их я тоже использовал. Так же мне нужны были цифры, чтобы получать буквы из строк по индексу (благо инструкции работы со строками делаются специальными значками, а не именованными функциями, как в большинстве языков).
С цифрами особых проблем не было. Так, например измерением длины значения переменной «минус» (длина измеряется символом «решётка») получается цифра два, очень удобно. Цифра «один» получается измерением длины значения другой переменной — кода возврата последней команды (её имя — «вопрос»), остальные нужные цифры получались комбинацией этих двух.
Из всего вышеописанного получились все буквы, кроме «r» и «w». Первую я получил, запустив на выполнение ls /bin/?m — по маске гарантированно находится файл команды удаления /bin/rm, её имя содержит искомую букву.
Для получения второй воспользовался командой «tr» и идеей, похожей на реализацию ROT13 на «баше» — подобрал диапазоны из имеющихся в моём распоряжении букв так, чтобы одна подходящая буква сдвинулась нужным мне образом — стала буквой «w».
F★ckJS на поло
Очень в тему к предыдущему посту на работе нашёлся мешок с поло размера XXL
На поло программа на ДжаваСкрипте, которую я писал
Что-то не вижу — быть или не быть?
Слово «выглядит» в подписи ко скриншоту выше упомянуто неслучайно — программа написана так, что видимое — только надводная часть айсберга.
Уже в те далёкие времена, когда я только ещё начинал писать на ДжаваСкрипте, программисты на форумах задавались вопросом можно ли
Позже, когда производительность интерпретаторов ДжаваСкрипта стала стремительно повышаться, появились всяческие обсуфкаторы, сильно запутывающие программу за счёт удаления форматирования, внесения шума, замены имён переменных и функций и сжатия по словарю поверх всех замен.
С тех пор эти инструменты застыли примерно в том же состоянии, но теперь, мне кажется, в этом деле наметился прорыв.
Некто ФейкЮникод, разместил скрытое послание внутри суррогатных пар Юникода.
Что такое суррогатные пары расписывать не буду, статей на эту тему предостаточно, главное, что их не видно и они могу быть частью (кроме первого символа) любого идентификатора ДжаваСкрипта.
Я попробовал использовать способ с суррогатными парами, чтобы скрыть монолог Гамлета внутри программы на ДжеЭсФаке (способ написания программ на ДжаваСкрипте, когда не используются
Получилась адская обфускация, глядя на которую и не заподозришь, что она после запуска выведет в консоль полтора килобайта английского текста.
Кружка душой из СССР
Заказал себе в Китае новую кружку, до тошноты надоели керамические, однотипные офисные. Одно время пил чай из стакана с подстаканником (спасибо жене, которая мне его подарила), но в после второго разбитого стакана пришлось признать относительную непрактичность такого решения.
Кружка тёплая, лаповая, вызывающая улыбку. От той, что родом из СССР, отличает металл —
Интеллектуальные машины Семёна Корсакова
Читая анонс книги об изобретениях в Российской Империи, наткнулся на новое для себя имя.
На рисунке вверху — перфокарта Корсакова, который является пионером отечественной кибернетики. Для 1832 года его идеи были настолько передовыми, что комиссия Императорской Академии наук
Семён Корсаков предложил на суд комиссии пять «интеллектуальных машин», представляющих из себя первые простые экспертные системы — устройства, помогающие быстро принимать решения на основании ряда критериев.
Суть была подробно описана в его книге «Начертание нового способа исследования при помощи машин, сравнивающих идеи», которую перевели с французского (языка дворянства того времени) и переиздали
Честно сказать, на слайдах презентации исследователей, раскопавших подробности, основную мысль уловить проще, чем в книге. Вкратце она такова — на перфокарту накладывается рейка с отверстиями, куда опускаются штырьки (проверяемые признаки), рейку сдвигаем до тех пор, пока максимальное количество штырьков не провалится.
Более сложная система могла так же учитывать значимость критерия — используя цвет или диаметр шляпки штырька.
Современники идею не оценили и о Семёне Николаевиче забыли на долгие годы, а жаль, возможно его работа могла бы намного ускорить появление кибернетики.
Крещение дочки ★
Неделю назад крестили дочку. Друзья и знакомые, когда об этом узнают, недоумевают — знают, что я атеист. Я атеист, да, правда, но это не значит, что я должен относиться к религии как ко злу.
Многие годы назад я был воинствующим атеистом и не понимал какой прок от религии. С годами многое изменилось, я понаблюдал за людьми, прочитал много статей на эту тему и понял, что религия многим нужна.
Не просто нужна, а очень нужна. Религия — последняя опора для многих людей в сложной ситуации, вера в то, что «всё не бессмысленно», что
Это не значит, что этот механизм единственный, в конце концов у меня в прошлом было полно таких ситуаций (наверняка будут и ещё), но я не тот атеист, что «до первой тряски в самолёте», у меня
Поэтому, совершенно не усматривая ничего плохого в религии, дочку я крестил даже
Сёстры Зайцевы и микрофон
Зайцевы мне вспоминаются каждый раз, когда я вижу как люди разговаривают по телефону, к которому подключены наушники — звук идёт оттуда, а говорить приходится в телефон. И, чёрт возьми, все держат телефон так же, как Зайцевы
Не понимаю что мешает перевернуть его, взять в кулак и говорить, как в обычный большой микрофон?