Профиль пользователя заблокирован сроком «навсегда» без указания причины
Ответы пользователя по тегу PHP
  • Уникальный ключ (Алгоритм)?

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

    Восемь символов каждый по пять бит дают 40 бит информации, то есть 1,099,511,627,776 номеров. Для миллиарда номеров достаточно 30 бит (2^30 = 1,073,741,824). Оставшиеся десять бит (которые, естественно, могут идти не по порядку) можно заполнить случайной информацией и/или использовать для контрольной суммы, дополнительных пометок (номер серии) и т. п. Разумеется, если у вас будут более длинные номера, то простора еще больше.
    Ответ написан
    Комментировать
  • Генерация уникального ID

    @MikhailEdoshin
    Один из приемов генерации непоследовательных уникальных номеров — взять последовательный номер и применить к нему маскирующую операцию, например, инвертировать заданные биты, а затем переставить по фиксированной схеме. Пусть у нас будут трехбитные номера от 0 до 7: 000, 001, 010, 011, 100, 101, 110, 111. Сначала инвертируем второй бит: 010, 011, 000, 001, 110, 111, 100, 101. Получаются все те же номера, но уже в другом порядке — 2, 3, 0, 1, 6, 7, 4, 5. Затем, считая что биты нумеруются 321, переставим их в 132: 001, 101, 000, 100, 011, 111, 010, 110 — 1, 5, 0, 4, 3, 7, 2, 6.

    Может быть, имеет смысл также добавить контрольную сумму, пусть хоть бит четности — 0010, 1010, 0001, 1001, 0110, 1110, 0101, 1101 или 2, 10, 1, 9, 6, 14, 5, 13. Числа остаются уникальными, и полностью обратимыми, но расползаются по большему диапазону.
    Ответ написан
    2 комментария
  • Как компрессировать упорядоченный массив уникальных натуральных чисел огр. диапазона?

    @MikhailEdoshin
    Учитывая, что чисел мало, проще хранить их в отсортированном массиве — 5 млн 32-битовых чисел займут 19 МБ, пересечение и разность находятся так же параллельным просмотром за O(N + M), проверка вхождения элемента двоичным поиском — O(log N).
    Ответ написан
    4 комментария
  • Как компрессировать упорядоченный массив уникальных натуральных чисел огр. диапазона?

    @MikhailEdoshin
    Вообще это run-length encoding. Находить пересечение и разность можно без распаковки, просматривая параллельно оба набора, а вот проверку произвольного числа можно будет сделать тоже только просмотром, не очень эффективно.
    Ответ написан
    Комментировать
  • Sсhemaless для MYSQL, как?

    @MikhailEdoshin
    Schemaless. Shemaless — это, надо думать, присказка Горлума-извращенца.
    Ответ написан
    1 комментарий
  • Генерация 1млн билетов со случайными уникальными ID

    @MikhailEdoshin
    Мне нравится вариант с перемешать заранее, но если вам требуется не настоящая случайность, а просто чтобы номера не выглядели последовательными, то можно использовать последовательные номера с перемешанными битами. Например, если взять пять бит, перенумеровать биты по порядку справа налево 5, 4, 3, 2, 1 и перемешивать их, например, как 4, 1, 2, 5, 3, то последовательность 1, 2, 3, 4, 5, 6 превратится в 8, 4, 12, 16, 24, 20.

    PS: Неужели MySQL затормозит на индексе в 1 млн. чисел?
    Ответ написан
  • Как сгенерировать xml с подменой данных в определенных тегах?

    @MikhailEdoshin
    XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="node()|@*">
        <xsl:copy>
          <xsl:apply-templates />
        </xsl:copy>
      </xsl:template>
      <xsl:template match="url">
        <xsl:copy>
          <xsl:text>http://www.mytracker.ru/track.php?query=</xsl:text>
          <xsl:value-of select="substring-after(., "http://heverest.ru/" )" />
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    Применять:

    xsltproc this-xslt.xslt source.xml > target.xml
    

    или, для форматирования:

    xsltproc this-xslt.xslt source.xml | xmllint --format - > target.xml
    
    Ответ написан
    6 комментариев
  • Обработка исключений с диспетчеризацией?

    @MikhailEdoshin
    Вообще идея не очень. Одно и тоже исключение в одном случае может быть фатальным, в другом — игнорируемым. (Кстати, еще один вариант обработки — выброс нового исключения.) Записывать исключение в лог или нет больше зависит от режима логирования — при отладке записывать все, при обычной работе записывать только важное. Ну и да, смысл использования исключений теряется, если в каждой функции у вас try/catch.

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

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

    На самом верху стоит универсальный обработчик, который записывает все исключения, которые до него долетели, и дальше или завершает работу, или, скажем, выводит сообщение для пользователя (хотя не знаю, применимо ли это к PHP).
    Ответ написан
  • mysql: выборка дней по порядку

    @MikhailEdoshin
    Мне кажется, тут не обойтись без таблицы дней в каком-то виде. Хотя бы как таблицы дней, привязанной к таблице событий — при создании события во вспомогательной таблице создавалось бы нужное число записей для диапазона дат. Но чтобы заполнять такую таблицу все равно потребуется хотя бы массив чисел от 1 до максимального количества дней в событии.

    В SQLite можно создавать виртуальные таблицы — там, наверное. можно и генерировать даты по запросу. MySQL не знаю — может быть там есть какие-то процедуры, которые могут возвращать выборку? Или, например, создать view из 31 дня, из 12 месяцев и из нужного числа лет, и, соединяя их в нужных комбинациях, генерировать таблицу дней.
    Ответ написан
    Комментировать
  • Удаление стандартных консольных приложений в Mac OS X?

    @MikhailEdoshin
    Да их там довольно прилично — Perl, Python, куча инструментов командной строки… А зачем их удалять?
    Ответ написан
  • Схема хранения изменяющихся данных с историей

    @MikhailEdoshin
    Вообще натуральная модель, насколько я понимаю, будет такой:

    Таблица 1. Vehicle (ID, Last Reading ID).

    Таблица 2. Reading (ID, Vehicle ID, Date, и измеренные значения: Fuel, Oil, Tire Pressure, и т. д.).

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