• А вот про Sphinx 3.0
    0

    Мысли понятны и такое и здесь и там, но… то все лирика.
    А вот как вот это ниже "сочетается" по вашему с опенсорсным проектом?


    При этом… нужно написать мне в почту и я выдам билд.

    Вас правда здесь ничего не смущает? Совсем, совсем?

  • «Магическая константа» 0x5f3759df
    +1

    Покреативив вокруг да около, сделал чуть более "покладистый" вариант, вдруг кому буде нужно:


    Example
    $ echo '
    #include <stdio.h>
    #include <assert.h>
    
    #if defined(static_assert) || (__STDC_VERSION__ >= 201100L)
    static_assert(sizeof(int) == sizeof(float), "Cannot cast types of different sizes (int/float)");
    #else
    #warning Unknown sizes of int/float to the compile time: assumed are equal (4/4).
    #endif
    
    float FastInvSqrt(float x) {
      char *buf = (char *)&x;
      float xhalf = 0.5f * x;
      int i = *(int*)buf;
      i = 0x5f3759df - (i >> 1);
      buf = (char *)&i;
      x = *(float*)buf;
      x = x*(1.5f-(xhalf*x*x));
      return x;
    }
    
    int main()
    {
      printf("fastinvsqrt of 9.0: %10.5f\n", FastInvSqrt(9.0));
      return 0;
    }
    ' > test.c; gcc -Ofast -Wall -Wextra test.c -o test; ./test

    Как видно собирается даже с fast оптимизацией без всяких...


    По хорошему к assert по размерности, сюда еще нужен бы assert, проверяющий endianness (если вдруг оне различные для int и float)…
    Ну да это сильно муторно компиляторо-платформозависимо… потому, пусть будет так.

  • «Магическая константа» 0x5f3759df
    0

    Да нашел уже, см. выше
    Звиняюсь ещё раз...

  • «Магическая константа» 0x5f3759df
    0

    Сорри за спам, забылось -O2 (вот блин что autoconf с людьми делает)…
    Т.е. воспроизводится везде, начиная с 3.4…
    Еще раз звиняюсь...

  • «Магическая константа» 0x5f3759df
    0

    Да кстати о птичках...


    GCC… warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

    $ cd /tmp/
    $ echo '#include <stdio.h>
    
    float FastInvSqrt(float x) {
      float xhalf = 0.5f * x;
      int i = *(int*)&x;
      i = 0x5f3759df - (i >> 1);
      x = *(float*)&i;
      x = x*(1.5f-(xhalf*x*x));
      return x;
    }
    
    int main()
    {
      printf("fastinvsqrt of 9.0: %10.5f\n", FastInvSqrt(9.0));
      return 0;
    }
    ' > test.c
    $ gcc -Wstrict-aliasing test.c -o test
    $ # и даже совсем усе-усе:
    $ gcc -Wall -Wextra test.c -o test
    $ ./test
    fastinvsqrt of 9.0:    0.33295

    Чисто для самообразования… На которой версии gcc (и/или платформе) вы видите такое?
    А то я перепробовал от 3.4 до 6.2 (linux, win, и от отчаянья даже mac и solaris), нигде не увидел...

  • Как Яндекс научил искусственный интеллект понимать смысл документов
    0

    Не зная внутрянку тех механизмов в Яндексе, могу предположить что фактор "популярность" гораздо менее прожорливый (по накладным расходам, как например LA, так и по времени исполнения запроса) чем фактор "число совпавших слов".
    Если конечно запрос не повторялся и оно (пара слова/число) не "кэшируется"...

  • «Магическая константа» 0x5f3759df
    +1
    Вы сузили контекст до конкретного куска кода. Этого не было в предыдущем обсуждении.

    Чего это? Велось обсуждение конкретного куска кода из статьи — ничего я не "сужал"!
    Мы что обсуждаем-то и где?
    Во вторых там выше черным по белому стоит "конкретно тут — ни о чем…".


    Вы же влезли в эту ветку с доказательствами "О чем, еще как о чем!" А потом выясняется, что для какого-то отстраненного теоретического случая (который здесь ни к месту и ни про то вовсе).


    К этому, все Ваши реплики как относятся к совсем другим аспектам, но не к этому.

    (Подавившись) вы очень нахальны, молодой человек...


    *(int*)&x = i;
    то проблема уже, очень вероятно, вылезла бы в полный рост, — компилятор мог бы просто не заметить, что x изменено.

    Да ну? А ничего что в данном случае его должно интересовать что i (а не x) изменено, и "не заметить" этого компилятор ну никак не сможет (сдается мне сударь, вы не совсем понимаете о чем здесь пишете)…
    Действительно есть такие компиляторы, которые при использования подобного "тухлого" каста (ударение на подобного) имеют UB (который описан у них в доку и как минимум выкинет warning при агрессивной оптимизации), но...


    Но во вторых и у ув. мистера Уолша и у мистера Кармака хватило ума не использовать такой "гнилой" каст, и они таки написали x = *(float*)&i; вместо вот этого вот *(int*)&x = i;.


    Если хотите возражать — прошу это делать со ссылками на стандарты.

    Я вам вовсе ничего не собираюсь не доказывать не возражать...


    Для начала, что бы не быть голословным быть может вы мне приведете пример ("стандарт, публичные final drafts") где описан такой UB и на каком основании компилятор не заметит изменения "x" после даже такого "гнилого" каста и использует старое (не измененное) значение.


    *(int*)&x = i;
    x = x*(1.5f-(xhalf*x*x));
  • «Магическая константа» 0x5f3759df
    0
    В том числе то, что атомарные переменные вообще-то не объявляют volatile
    Давайте Вы внимательно прочтёте, на что отвечаете.

    Вы про что вообще? Здесь вообще-то речь про int i (который атомарный) и про функцию FastInvSqrt (в которой ни в каком её месте не нужен volatile от того самого слова).


    Настоятельно прошу… вести обсуждение по сути.

    По сути: расскажите где в этом куске из трех строчек нужен volatile и почему и где "компилятор обязан записать в память сразу"...


    float FastInvSqrt(float x) {
      ...
      int i = *(int*)&x;
      i = 0x5f3759df - (i >> 1);
      x = *(float*)&i;
      ...
    }

    Даже если компилятор соптимизирует это совсем без использования памяти (т.е. будет использовать например регистр EAX для преобразования — он обязан следовать логике преобразования для каста как написано (а не как вы думаете).


    Т.е. для того-же x86:


    ; int i = *(int*)&x;
    mov         eax,dword ptr [x]
    ; i = 0x5f3759df - (i >> 1);
    sar         eax,1
    mov         ecx,5F3759DFh
    sub         ecx,eax
    ; x = *(float*)&i;
    mov         dword ptr [x],ecx

    ВСЕ!


    Причем здесь вообще "strict aliasing"? Тип int (как и float) не являются структурами...


    Если вы про это, почему mov dword ptr [x],ecx вместо например:


    ; x = *(float*)&i;
    mov         dword ptr [i],ecx
    fld         dword ptr [i]
    fstp        dword ptr [x]

    То и это совсем из другой оперы и не имеет ни к volatile ни к "strict aliasing", ни даже к выравниванию никакого отношения.


    Под UB же я имел ввиду как раз например если типы для платформы есть не равной длинны, и/или для этой платформы биты перевернуты LSB/MSB или little-endian vs. big-endian или подобное (однако и тут при желании оно лечится двумя строчками обернутыми в #if… #endif).

  • «Магическая константа» 0x5f3759df
    –1
    К тредовости оно вообще-то отношения в C/C++ не имеет от слова «никак»

    Да ну? А вы про атомарные операции (конструкты, инструкции) что-нибудь слышали?
    Т.е. простейшие вещи (ака одна переменная типа int) вы правда мютексами защищаете?


    Мютекс кстати тут вообще никаким местом и именно что "от слова никак", ибо если явно не указан volatile, то мютекс вокруг вам в случае не очевидной (нежелательной) оптимизации не поможет "от слова ничем"…
    Например если компилятор выпилит установку переменной, как неиспользуемой далее.


    Про остальное же я промолчу, да…
    Например:


    Компилятор не имеет права кэшировать чтение или запись переменной даже без volatile через вызов любой неизвестной компилятору функции

    А то что эту функцию (неявно для компилятора) исполняет прямо сейчас другой поток, это куда?
    Я вам еще раз повторю volatile однопоточно не интересен (ну если не нативно какой либо контроллер с мапой переменная<->чего-нибудь железное, что сравнимо с многопоточностью, ибо есть еще один актер)...


    И да здесь не про Java...

  • «Магическая константа» 0x5f3759df
    –2

    volatile нужен platform-agnostic, multi-threaded ONLY.
    Грубо говоря не даст прочитать некоторому потоку (соптимизированное компилятором) промежуточное значение (явно не указанный программистом v1 = v2) или не даст вырезать (оптимизировать до 0 инструкций) неочевидную для компилятора установку такой переменной.
    Грубо говоря, он думает что переменная тут (или ниже) не используется (этим потоком), зато может вполне себе — другим.
    Т.е. конкретно тут — ни о чем...


    khim
    С современными компиляторами этот код вообще использовать нельзя
    Компилятор вполне может «соптимизировать» весь этот код в «return 0».

    С первым высказыванием согласиться могу, условно. Только не "нельзя" а не комильфо… И assert-ами обвязать желательно…
    Со вторым не согласен в корне — с какого это перепуга он его вырежет?
    В худшем случае UB (да и UB на касте int/float мне очень сомнительно)...

  • Как Яндекс научил искусственный интеллект понимать смысл документов
    +1

    Справедливости ради у гугла тоже нередко вылазит (но я за корпоративным прокси, т.ч. вероятно поэтому)…
    Выглядит так (просто поставь галочку), но иногда и твердоломная alnum-капча, где раз пять подбираешь пока разберешь...


  • Как Яндекс научил искусственный интеллект понимать смысл документов
    0

    Может быть BarakAdama имел ввиду это:


    Возможно, но 20 раз по пять и будет 100

    [КО] Ибо 20 лет по -5% будет "только" лишь -62%. [/КО]


    А серьезно если, то я сам Яндексом редко пользуюсь, как раз по вышеозвученной многими причине "не релевантная выдача", а то и вовсе неадекват.
    Про айтишный же (а так-же инженерный, научный и т.д.) поиск я вовсе лучше промолчу… Как блин сегодня можно не индексировать специальные символы (ну или худо-бедно хоть какой-нибудь whitelist для парсеров и алгоритмов рассечения, стоп-листов и т.д. должен же быть).


    П.С. Про "Королёв" — попробовал тоже, хмм (немного разочарован)… А оно точно AI как обещано ("по смыслу запроса, а не по ключевым словам")? Или оно ещё учится?
    И прикрутили бы они возраст что-ли (если человек залогинен), чтобы ЦА значит с поправкой на возраст… (хотя бы парочке нейронов его скормите, а?).

  • «Магическая константа» 0x5f3759df
    +3

    Интересно какие ксплойты повылазят, если опубликовать перевод к "0x5f3759df(appendix)"...


    ReferenceError: appendix is not defined?

    Ради какого-то там SEO портить авторскую задумку — несправедливо.

    +1
    Про заворот слепых кишок у SEO-шников опосля второй статьи я помолчу лучше...

  • С новым (айтишным) «годом» Вас, други
    0

    Вы правда считаете что для пруфа 290 лярдов != 1.5 мильена важно что там в каком-то шестом порядке стоит?
    Ну-ну...

  • С новым (айтишным) «годом» Вас, други
    0

    я стесняюсь спросить — вы число Пи до которого знака пишете?
    А по теме, кто его знает как високосные года через столько лярдов лет считать начнут...

  • С новым (айтишным) «годом» Вас, други
    +1

    Опа! Бага нашлась! Видать софтина которая тут пользовалась где-то чего-то переполняет при расчете (подозреваю что собственно год или количество julian days)…
    Т.к. год много больше должен быть в случае __int64:


    1970 + 0x7fffffffffffffff / int(365.25 * 24*60*60) == 1583316
    292271025015 != 1583316
  • С новым (айтишным) «годом» Вас, други
    –1

    Не страшно… это для своих токма.


    Unix epoch (also known as POSIX time or epoch time)

  • С новым (айтишным) «годом» Вас, други
    +4

    Уточните тип, пожалуйста...


    0x7fffffff         => Tue Jan 19 03:14:07 GMT 2038
    0xffffffff         => Sun Feb 07 06:28:15 GMT 2106
    0x7fffffffffffffff => Sun Apr 24 15:30:07 GMT 1583316
    ...
  • С новым (айтишным) «годом» Вас, други
    0

    Ну так он выпадает на 12-е (из-за високосности), официально то празднуется все равно 13-го числа, нет? Или он в России все-таки плавающий?

  • С новым (айтишным) «годом» Вас, други
    +1

    Ну так совпало. Пятница… повод...

  • Атака на АБ-тест: рецепт 'R'+t(101)+'es46'
    +1

    Как вариант — разносить по разным доменам (суб-доменам)… + SOP + не юзать кросс-доменные куки ...

  • Анонимность в Tor: что нельзя делать
    0

    Побуду кэпом чуть-чуть...


    c -"c++" -"cpp" -"c#" standard library


    Найдите там C++ и ко...

  • Европа меняет законодательство в области авторского и смежных прав
    –2

    А теперь подумайте еще раз про то, что вы спросили… 70% от чего? (мы еще помним, что TTT монополист, правда?)
    Для математиков: 70% от трафика != 70% от новостей...


    И потом:


    • сколько тех 70% просто потому, что если чел не пришел вовсе, то он и дальше не стал кликать
    • сколько по вышеупомянутой причине (ака точка входа — чел смотрит новости начиная с агрегатора и уходит к "конкуренту" издателя)
    • сколько упало по причине снижения рейтинга (честно-честно просто таким образом работает наш "секретный" алгоритм, который учитывает ленту новостей...)
    • сколько из тех 70% правда (сколько раздули и т. п.)

    Это на вскидку, а если подумать то таких сколько...

  • Европа меняет законодательство в области авторского и смежных прав
    0
    Аналогия...

    Ну вы тут немного передергиваете (либо еще не совсем поняли, либо нарочно путаете теплое с мягким): в качестве контр-примера...


    Другая аналогия: Телекомпания ТТТ — монополист. Размещая чужой контент в блоке новостей она лишает людей его изготовивших заработка. При этом она не хочет никому ничего отчислять и в случае обращения просто забывает про издателя от слова совсем (т.е. не размещая чужой контент, но и не упоминая его вовсе), при этом снова тем самым лишая людей заработка (а мы помним что ТТТ — монополист).
    Вопрос: Как долго ТТТ сможет размещать чужой контент, когда все те люди его создающие пойдут по миру?
    Другой вопрос: как при этом затронут интерес другой группы — потребителя (не лишает ли их монополист ТТТ тем самым возможности узнать про новость, чтобы прочитать/посмотреть ее где-нибудь у издателя), а в долгосрочной перспективе и новостей совсем?


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


    Размещает новости целиком и без ссылки на источник?

    А вот это уже хороший вопрос ибо где та граница, когда ссылка остается еще интересна. Если новость сама по себе — новость и выжимки google практически достаточно, то на ту ссыль нажмут единицы.

  • Европа меняет законодательство в области авторского и смежных прав
    0

    А там вовсе не про рекламу в прямом смысле — google используется потребителем как агрегатор новостей, и он действительно фактически монополист, т.е. избирательно "выбросив" кого-либо из выборки, он тем самым практически "исключает" издателя для огромной аудитории.
    Т.е. понять можно обе стороны:


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

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

  • Европа меняет законодательство в области авторского и смежных прав
    +2
    Axel Springer не оставалось ничего другого, как разрешить Google ссылаться на тексты бесплатно.

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


    Т.е. если коротко, то:


    • Издатели утверждают, что google — фактически монополист, и поэтому обязан размещать (но и посему платить в соответствии с новым положением от 2013 в Leistungsschutzrecht).
    • В google настаивают на — либо бесплатно, либо не размещаем вовсе.

    Как мне видится — это еще очень на долго...


    Статья про это на немецком от марта 2016 — weiter auf Deutsch (и с выключенным адблокером).

  • Выходим на уровень эксперта! 50 оттенков экзамена 1Z0-047 (сертификация Oracle Database SQL Certified Expert)
    0
    Максимальная размерность… RAW = 4000 байт

    Небольшая поправка:
    Лимит для RAW = 2000 байт (если MAX_STRING_SIZE = STANDARD)

  • Заклиная техническое интервью
    +1

    А это художественное произведение и есть...

  • Заклиная техническое интервью
    +3
    Гению откажет… Искать и удерживать.

    Ну вот не откажет, а через год-два "гения" собьет машиной, или он с Эвереста скувыркнётся, тем самым не "удержится". Как вам такая альтернатива?.. Оцените риски?


    Тут как-бы стоит не про гениальность соискателя поговорить… Дело вот в чем: написать jvm-ный байт-код (а то и в с десяток других, включая питоний или нативный, ака asm например) смогут возможно многие, и из моего окружения в том числе, но при этом:


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

    А так, да… как красивая история для бложика — возможно (т.е. написано-то и правда красиво, + понты, эго… все дела)…
    Но как "реальная" история из жизни, — упаси боже от таких гениев-коллег.

  • SystemD отстой, да здравствует SystemD
    +5
    systemd-escape

    может просто не надо писать баш-скрипты в systemd?
    Т.е. я про то, почему это должно быть непременно частью something.service, а не частью например something.sh, который отробатывает в ExecStart...


    IMHO systemd-escape сделана как helper, чтобы писать динамические systemd-скрипты (т.е. не руками, а "машинным" способом).

  • Простейший HTTP сервер на Golang и Elixir. Сравнение производительности
    +1

    А чего тут подробнее — Tcl.


    Ну а реализация конкретно этого http-server'a — собственная, асинхронная, на tpool-потоках, используя один пул listener/auth/supplier и второй пул workers, между ними асинхронный tcl reflected channel…
    Реализаций коих штук двадцать на просторах (и не думаю что моя быстрее). Так же как думаю, что и tcl нисколько не быстрее erlang (просто elixir, хмм..., ну да ладно не хочется холиварить)...


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


    Я его так и юзаю обычно, http-server на чистом тикле нужен когда тащить nginx тяжело или низя (embedded).


    Писать мне лично на тикле удобнее чем на erlang, нодах, рюстах и сях вместе взятых (даже питон думаю не сравним, я про удобство и лаконичность)… Но я немного предвзят, ибо уже сто лет как в TCT (разраб в tcl core team), т.е. я его делаю (и если что-то не нравится переделываю сам;).
    Но это не node.js, порог вхождения много-много выше (как минимум при "сборке" сервера)...

  • Простейший HTTP сервер на Golang и Elixir. Сравнение производительности
    +2
    статически скомпилированная программа просто обязана быть быстрее виртуальной машины с интерпретатором

    Оно как бы да, но это смотря а) как скомпилированна и б) с каким интерпретатором сравнивать...


    Вот вам для сравнения на чистом тикле (tcl, threaded, full-async), jit-интерпретатор в quad-code (если что;)
    Ответ запроса чуть побольчее в размере, но не критично (ну headers у меня там многовато, лень править да и throughput тут важнее запрос/сек.)...


    $ wrk -t10 -c100 -d10s http://172.18.105.109:80/app/empty.htm
    Running 10s test @ http://172.18.105.109:80/app/empty.htm
      10 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    15.00ms    8.18ms 145.16ms   95.58%
        Req/Sec   702.82    197.54     6.07k    96.68%
      69539 requests in 10.10s, 24.34MB read
    Requests/sec:   6885.13
    Transfer/sec:      2.41MB

    Для сравнения то-же (подогнал по размеру) на Elixir (результаты немного лучше чем у вас, я про Latency и ко):


    $ wrk -t10 -c100 -d10s http://172.18.105.109:8085/test-elixir
    Running 10s test @ http://172.18.105.109:8085/test-elixir
      10 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    33.86ms   30.49ms 281.11ms   82.70%
        Req/Sec   376.13    283.00     5.25k    77.16%
      36967 requests in 10.10s, 12.94MB read
    Requests/sec:   3660.63
    Transfer/sec:      1.28MB

    Причем на tcl 2 из 4-х cpu спят, справляется практически 2-мя потоками 30-40% usage (чтобы загрузить на все 100% надо wrk -t100 юзать).


    на Elixir же — все 4-е ядра под 100% busy и контекст-свич кернел-таймом погоняет.


    Так-что реализация тоже важна (я не думаю, что tcl "шустрее" elixir)...


    Ну и не компиляторами едиными…
    П.С. Go не держу, так что сравнить не можу...

  • Масштабирование Git (и кое-какая предыстория)
    0

    Я могу конечно ошибаться, но думается мне почему-то, что это ASLR (и-или DEP).
    Если на машинках, где обоих можно выключить, баг не воспроизводится — оно говорит за-то...


    Ну и если да, решения два (кроме как не юзать винду):


    • не использовать абсолютных указателей (только относительные, не думаю что вариант для mingw)
    • или бороться как я например тут для nginx делал, т.е. грубо говоря переалоцировать base, пока не выравняем блок у всех caller по одному адресу (good luck with its implementation;).

    Ну или тот-же воркараунд на секции .text (MEM_WRITE как сделал Jason Bell), хотя не сукьюрно оно как-то.

  • Прогнозы по развитию программ-вымогателей в 2017 году
    +2
    Для расшифровывания файлов действуйте в соответствии с одним из следующих сценариев

    Ну да, в этом конкретном "детском" случае — возможно что-то и получится.
    (Хотя гораздо проще тут было бы настроить "прокси" через роутинг к другому серверу, который вернет 1 по заданному адресу)


    Однако в основной своей массе — шифровальщики:


    • либо используют асимметричное шифрование, где для расшифровки нужен другой ключ (т.е. вызов URL как в примере вернет не 0/1, а ключик для расшифровки).
    • либо портят все насмерть (т.е. вовсе не предусмотрено восстановление, даже так сказать по факту оплаты)

    Ну и попробуйте подобрать даже 512-байтный ключ какой-нибудь эллиптической кривой (не обязательно стандартной кстати), встретимся через сотню лет (сколько там х-тилионов MIPS-лет нужно).


    Тут только или свезло (как в вашем случае)… или (правильно настроенный) бэкап спасает…
    Ну или 101 способ предотвратить запуск подобной нехорошей софтины (например тот же SRP и ко, если винда).

  • Масштабирование Git (и кое-какая предыстория)
    +2

    because it's the bug of mingw, вернее ее реализация вокруг mark_section_writable.
    Поэтому и не собираются, ибо нефиг плодить воркараунды.
    Т.е. баг делегирован дальше, имхо абсолютно правилно, см. MinGW-w64 — for 32 and 64 bit Windows / Bugs / #537 pseudo_reloc fails to mark pages writable

  • GUID-подобные первичные ключи в SQLite на Android
    +1

    Вот только не надо про вероятности, интуитивное восприятие и т.п.


    Вы кстати не поняли этот парадокс — он говорит как раз про обратное, что совпадения более вероятны, чем интуитивно воспринимается (ибо например для 23-х людей — на самом деле сравниваем 253 возможные пары).
    И закроем тему интуитивного восприятия на этом. Расскажите про "день рожденья" кому-нибудь другому (когда поймете).


    Теперь по теме: лично видел два одинаковых UUID, созданных на двух разных хостах в одном (правда большом и сильно нагруженном пуле) кластера.
    И то было в industries API 80-го уровня. Я бы вам даже имя сказал, но низя (связан подписью о не разглашении)…
    Однако с тех пор там та конкретная реализация UUID-api (рандомная кстати, ибо v4) — под строжайшим запретом (бьют по рукам если что).
    А так-то да — теоретически невероятно...


    Раз уж слово вероятность упало, попробуйте оценить разницу вероятностей:
    1) что два каких-то "случайных" 128-ми битных числа будут равны;
    2) например в сравнении с вероятностью, что два случайных 52-битных числа + цикличный инкремент (8 бит) про процесс, созданных в течении тех же десяти миллисекунд (48 бит), с одинаковым хэшем (20 бит) взятым от fqdn + thread-id — в результате тоже будут одинаковы;


    Вам сразу вопрос: тут фактор времени или количества чисел вообще в выборке важен или нет? Т.е. вопрос два числа из скольких...


    Поэтому, сделаем тут некоторые допущения — уточнения условий задачи:


    • одно-поточно реально создать максимально 1000 ключей за одну миллисекунду (только вот что с ними делать с такой-то скоростью, ну да пусть)
    • имеем 256 потоков на машинке
    • имеем ну пусть будет 100 машин в кластере
    • все это добро работает десятилетия.

    И не забываем что:
    Все это абсолютно не градиентно в первом случае, но чисто для оценки порядка:
    (1000 * 1000000 * 256 * 100) — уже 2 в 45-й — и это прошу заметить в секунду.
    И крайне важно во втором.

  • GUID-подобные первичные ключи в SQLite на Android
    0
    технически исключено

    Ну оно к тому стремится… Просто цель-то у него — "глобально уникальный", а не "случайный" т.е. менее зависим от тех же начальный и текущий сид, энтропии и т.п.
    Если у вас там даже хэш от uuid хоста замешан будет оно уже менее зависимо от "случайностей"…
    Я про то, что законы Мерфи еще никто не отменял — "если есть вероятность того, что какая-нибудь неприятность может случиться, ...." (я про коллизию, как бы мизерна не была вероятность последней).


    Да я и не спорю: то просто замечание было про между прочим (ибо режет глаз). В любом случае придумывать собственную реализацию guid, да еще и триггером обернуть имхо как-то не комильфо (о чем и поведал, выразив свое мнение, с которым совсем не обязательно нужно быть согласным).


    П.С. Вот в качестве примера: возьмем nginx-cache-модуль — раньше ключи там не сравнивали (т.е. тупо считалось, что т.к. вероятность коллизии хэша никакая, то достаточно сравнить хэш и все).
    И всем известный персонаж спорил с пеной у рта, что оно достаточно, и не нужно это, про всякие "дни рождения" рассказывал и т.д.
    Вот там я действительно спорил и настаивал, потому что во первых, хэш — это хэш — он там для скорости а не для крипто-стойкости, во вторых это очень просто и доп. сравнение стоит гроши. А в третьих я их (коллизии) там лично встречал (на очень большом и длинном кэш), причем доказуемо (хорошо еще что на тест-стенде, а не в продакшн).
    При том что частью ключа кэша может быть например user-id и nginx тогда при возникновении той "невозможной" коллизии покажет к примеру приватную информацию другому пользователю.
    И побоку тогда, что коллизии маловероятны — в корпоративном секторе вы за такое как минимум с работы вылетаете.
    Подробнее тут и в мэйл-архивах nginx можно поискать.
    Фикс то пустяковый, но нужно же сперва поспорить… Вероятности, это такое дело — их нужно уметь готовить.
    Все хотел про то статью тиснуть, да некогда — пусть побудет комментом.

  • GUID-подобные первичные ключи в SQLite на Android
    0

    Ну да SQLiteCustomFunction с рефлектом… А чему он хак-ом стал вдруг? Т.е. вы считаете trigger (который вообщето совсем для других целей придуман) менее хакиш вэй. Ну тады ОК.

  • GUID-подобные первичные ключи в SQLite на Android
    +1
    Если используется аппаратный источник энтропии

    Не используется там никакие источники энтропии — ибо GUID по определению криптографически нестоек.


    Каким же образом это «исключено»? :) Вы сами себе противоречите.

    Вы возможно слово "часть" пропустили в предложении "значительная часть которого действительно является псевдослучайной последовательностью".
    Во всех известных мне реализациях оного, там еще замешивают pid, tid, mac, clicks и тому подобное.


    Если бы вы внимательно читали, но заметили бы, что это невозможно на Android

    Если вы чего-то не умеете (не можете) — это еще не значит, что оно не возможно.
    И собственная сборка SQLite для этого абсолютно не нужна.

  • GUID-подобные первичные ключи в SQLite на Android
    0

    Ну делать-то я положим тоже так делаю (когда оно оправдано)…
    А вы при случае на execution plan гляньте.
    Вот простейший случай — без group by и т.д. (тупо слить из первой все, присутствующие и во второй таблице):


    CREATE TABLE records (id BLOB PRIMARY KEY, data CHARACTER)
    CREATE TABLE subrecords (subid BLOB, ...)
    
    EXPLAIN QUERY PLAN 
      select * from records where id in (
        select subid from subrecords
      )
    
    0 0 0 SEARCH TABLE records USING INDEX sqlite_autoindex_records_1 (id=?) (~25 rows)
    0 0 0 EXECUTE LIST SUBQUERY 1
    1 0 0 SCAN TABLE subrecords (~1000000 rows)
    
    CREATE TABLE records2 (id INTEGER, id2 INTEGER, data CHARACTER, PRIMARY KEY (id, id2))}
    CREATE TABLE subrecords2 (subid INTEGER, subid2 INTEGER, ...)}
    
    EXPLAIN QUERY PLAN
      select * from records2 
      inner join (select subid, subid2 from subrecords2) sub
      on sub.subid = id and sub.subid2 = id2
    
    0 0 1 SCAN TABLE subrecords2 (~1000000 rows)
    0 1 0 SEARCH TABLE records2 USING INDEX sqlite_autoindex_records2_1 (id=? AND id2=?) (~1 rows)

    Вопрос: почему и когда второй вариант может стать сильно медленнее (а главное когда это будет очень-очень критично). (Подсказка — N x M + concurrency).