• Бан телефонных номеров в веб-приложении

    ruskar
    @ruskar
    Conflict Intelligence Team
    Имхо, обычные способы бана по телефону бесполезны. Просто очень хорошо знаком с работой досок «изнутри» и с методами работы этих самых «некоторых товарищей».

    Вот что эти товарищи будут делать, когда увидят сообщение «объявление не размещено, т.к. ваш номер телефона забанен на нашем сайте!»? Да они тупо возьмут другой номер и запостят своё объявление. И так до следующего раза.

    На одном из своих проектов я решил проблему по-другому. Задача такая: максимально достоверно опознать «нехорошего человека».

    Что я для этого делаю?



    Если пользователь указал для своего объявления номер телефона, который у меня в чёрном списке, я:
    1. ставлю ему бессрочные Cookie с меткой что данный пользователь — тот ещё петрушка;
    2. также запоминаю в базе максимальное количество идентифицирующих его данных (IP, юзер агент браузера и т.д.);
    3. его объявление сохраняю в базе и помечаю его как «полускрытое». Это значит, что объявление видно исключительно ему, для него создаётся видимость, будто всё прошло успешно и объявление опубликовано. На самом же деле, всем остальным пользователям сайта оно не показывается (в том числе незалогиненным);
    4. если «нехороший человек» догадался, что я его обманул и теперь он вбивает очередной свой шлак, то, используя пункты 1 и 2 я снова его определяю, заношу в чёрный список уже новый номер, повторяю по новой пукнты 1 и 2.

    В результате все «редиски» смотрят на мой сайт довольные, думают что я нормально опубликовал их объявления, не пытаются всеми возможными и невозможными способами обойти защиту (поскольку они подумали, что они её обошли), а в действительности сайт остаётся чистым.
    Ответ написан
    4 комментария
  • С чем связано увеличение цены на iPad 2 в России?

    sledopit
    @sledopit
    Да не изменилась цена практически. Просто доллар вырос. В июне был 28.2, а теперь 32.2.
    Если поделите, то сразу станет ясно, что цена осталась прежней.
    Ответ написан
    Комментировать
  • Вопрос для гуру регулярных выражений

    @Bonart
    Классические регулярные выражения из математики такую задачу не решают. Но на практике последние версиии популярной библиотеки PCRE умеют:
    my $bal = qr/
        (?<bal>            # Name the rule (optional)  
        \{                 # Open brace
        (?>                # Possessive subgroup
            (?> [^{}]+ )   #  Grab all the non braces
        |                  #    or
            (?&bal)        #  Recurse
        )*                 # Zero or more times
        \}                 # Close brace
        )                  # End named rule
    /x;
    
    if ('{x{x}y{x}x}' =~ /^$bal$/ ){
        print "It's balanced\n";
    }
    
    $_= 'XXXX function xxx() {x{x}y{x}x} XXXX';
    
    while ( /\bfunction\s+(\w+)\(\)\s*($bal)/g ){
        print "function: $1\nbody: $2\n";
    }
    


    Да и дотнет не отстает:

    string pattern = 
        @"^((?<openBracket>\{) | [^\{\}] |" + 
        @"(?<closeBracket-openBracket>\}))*" +
        @"(?(openBracket)(?!))$";
    Regex r = new Regex(pattern, RegexOptions.IgnorePatternWhitespace);
    
    Ответ написан
    Комментировать
  • Arm ассемблер в ядре Linux?

    apangin
    @apangin
    flag используется как возвращаемое значение (обратите внимание на последнюю строчку).
    В результате, __range_ok вернет 0 тогда и только тогда, когда addr + size <= addr_limit, и при этом не произошло переполнения при сложении.

    Работает это так:
    0. flag = addr_limit (предполагается, что addr_limit != 0);
    1. roksum = addr + size;
    2. если в п.1 не произошло переполнения, то roksum = roksum — addr_limit — 1;
    3. если в после п.2 rok_sum >= 0, то flag = 0
    Ответ написан
    2 комментария
  • Регулярное выражение

    @Neir0
    А вообще зачем для этого регулярные выражения использовать? Помойму проще и быстрей проверить строковыми функциями
    Ответ написан
    Комментировать
  • Регулярное выражение

    @GreenPeace
    Проблема заключается в следующем(для удобства я сокращу ваше длинное или до одного варианта):
    ^(?:(?!00).)*$
    Проверка (?! ...) находится внутри группы со знаком *, то есть выполняется каждый раз когда reg Exp engine переходит к следующему символу. Для вашего случая данную проверку надо вынести за группу(а сами скобки группы вообще убрать — так как в ней останется только 1 элемент):
    ^(?!00).*$
    Ответ написан
    Комментировать
  • WinXP => Win7?

    girichev
    @girichev
    Вы наверное шутите, мистер программист-интерфейсник?
    Ответ написан
    3 комментария
  • WinXP => Win7?

    a3x
    @a3x
    Надо просто перейти и все, дальше интуитивно понятно.
    Ответ написан
    Комментировать
  • RAID-0 на 15K SAS-дисках вместо SSD для игрового ПК — годная идея?

    opium
    @opium
    Просто люблю качественно работать
    Это тупизм, возьмите просто ссд и не парьтесь.
    Ответ написан
    Комментировать
  • IDE для разработки на PHP?

    rasa
    @rasa
    Вот такой же вопрос в Q&A с 32-мя ответами
    Ответ написан
    3 комментария
  • На чем писать проект сегодня? На PHP(Zend, Symfony) или Python(Django)?

    @lesha_penguin
    Если вы расчитываете на рост и развитие своего проекта то однозначно PHP.

    Потому что если для PHP вы можете потом найти (само собой, за дорого) пару-тройку действительно опытных разработчиков у которых за плечами 5-10 лет реальной веб-разработки.

    То насчет опытных разработчиков Python — вы много можете назвать действительно опытных? Т.е. не тех, кто позавчера прочел «Самоучитель Python для Чайников», а тех, у кого с десяток реальных проектов за плечами?
    Может полтора таких супер-питониста найдется на всю Москву, но только эти супер-опытные питонисты сидят на таких теплых местах, что поверьте, у вас никаких денег не хватит их к себе переманить.

    Кстати, в этом плане я бы не рекомендовал использовать всякие «красивости» типа Java и «модности» типа Ruby.
    Ответ написан
  • За что минусуют карму?

    @ChemAli
    Во-первых, за вопросы и любые замечания о флуктуациях своей кармы.

    Во-вторых, за то, что ваше мнение кому-то не понравилось. Моя карма, например, следствие двух «неудачных» комментариев. Первый о том, что банкоматы везде тупо в розетку включаются и их легко обесточить (что я иногда делаю). Второй о том, что если государство декларирует борьбу с порнографией, то нужно заблокировать порнодомен ххх. В итоге 50 => -27 :)

    Комментарии тут нужно писать осторожно и подумав 3 раза. Любое неостоорожное слово ранит массу и она набигает. При этом чаще всего никакой аргументации вы не получите.

    Это Спарта. Лучше просто забить :)
    Ответ написан
    13 комментариев
  • Авто публикация твитов(раз в час, к примеру). Не могу найти сервис?

    opium
    @opium
    Просто люблю качественно работать
    Хотите бесплатно, напишите сами.
    Ответ написан
    Комментировать
  • Сортировка по схожести?

    Dzuba
    @Dzuba
    Предложение 1: поскольку поля с фильмами представляют собой биты, то имеет смысл хранить их в виде чисел. Максимальное целое в mysql — 8-байтовый BIGINT. То есть, если всего фильмов тысяча, то потребуется полтора-два десятка таких чисел в каждой записи. Пусть N — количество таких чисел-1, userF0, ..., userFN — эти числа в записи выбранного пользователя. Тогда поиск 10 похожих пользователей в таблице с полями (user_id, f0, ..., fN) будет выглядеть так:
    SELECT user_id FROM таблица
    ORDER BY (BIT_COUNT(f0 & userF0) + ... + BIT_COUNT(fN & userFN)) DESC LIMIT 10;
    Минусы подхода: пробегать при запросе будет все записи, при добавлении новых фильмов нужно вызывать ALTER TABLE. За скорость тоже ручаться не могу.

    Предложение 2: создать 1 таблицу с юзерами и столько таблиц, сколько фильмов, в каждой из которых хранить список id юзеров, выбравших фильм. Тогда поиск похожих юзеров сведется к:
    SELECT tmp.user_id FROM (SELECT user_id FROM таблица1
        UNION ALL
        SELECT user_id FROM таблица2
        UNION ALL
        ...
        UNION ALL
        SELECT user_id FROM таблицаN) AS tmp
    GROUP BY tmp.user_id ORDER BY COUNT(tmp.*) DESC LIMIT 10;
    
    Минусы подхода: большое количество подзапросов, группировка.

    Предложение 3: создать 1 таблицу с юзерами (users) и 1 таблицу с юзеро-фильмами (user_films), т.е. с записями о предпочтениях юзеров следующего вида (user_id, film_id). Тогда для списка фильмов выбранного юзера (film_id0, ..., film_idN) поиск похожих юзеров сведется к:
    SELECT user_id FROM user_films
    WHERE film_id IN (film_id0, ..., film_idN)
    GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 10;
    
    Минусы подхода: группировка.
    Хотя при индексированном поле film_id может будет и не сильно медленно.
    Ответ написан
    6 комментариев
  • Как защитить свой код на PHP от стороннего использования?

    zizop
    @zizop
    Код защифрованный через IonCube или Zend Encoder расшифровываются через установку специального php расширения. Как вариант можно обфусцировать код, а потом уже через IonCube зашифровать. Тогда после первичной расшифровки, всё равно будет нечитабельная абракадабра.
    Ответ написан
    Комментировать
  • Выбор смартфона на Android 2.2

    Cheese
    @Cheese
    100501 вопрос про android-смартфон.

    LG optimus one.
    Ответ написан
    Комментировать
  • YouTube перестал дружить с Chrome и Opera

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

    Помогло чтение ФАКа с ютаба, где была рекомендация в таком случае зайти в свойства флеша (право клавишей и т.д.) и на первой закладке свойств отключить аппаратную поддержку. Сразу видео заработало во всех браузерах без каких-либо «incubator build».

    Надеюсь мой опыт вам поможет.
    Ответ написан
    1 комментарий
  • YouTube перестал дружить с Chrome и Opera

    la0
    @la0
    Поставил incubator build флеша. Помогло.
    Ответ написан
    3 комментария
  • Каким образом лучше всего делать анонс на хабре предстоящего подкаста?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    Анонс предстоящего подкаста делать лучше тогда, когда подкаст будет не предстоящим.
    Надоели бессмысленные посты. Скоро ЖеЖешечка получится — «а я вот собираюсь статью такую-то написать. Ну через пару месяцев напишу».
    Ответ написан
    1 комментарий
  • Хабр скукожился

    @DimonCJ
    Уважаемая администрация, верните как было пожалуйста!
    Ответ написан
    1 комментарий