Pull to refresh

Comments 66

UFO just landed and posted this here
Капчу теперь тут тоже больше никто не видит
Вот по-моему лучше бы приглашения были примерно такого вида: image
Если уж делать интересный инвайт. Программистам не сильно сложней, а у пользователя полет фантазии.
Да уж, художники-абстракционисты останутся без хлеба.
Через лет 50 такие приглашения будут стоить миллионы!
Вместо Source Code Highlighter на Хабрахабре давно ужé можно пользоваться парою нестандартных элементов разметки <source></source>, обеспечивающих синтаксическую подсветку своего содержимого в качестве исходного кода. Достоинством этого подхода также является несколько больший размер шрифта.

Вот пример работы такой разметки:

function validate_invite($hash_serialize, $userfile) {    
// если при загрузке изображения не было ошибок, размер изображения не превышает допустимый и тип стоответсвует нужному
if (isset($userfile) && is_uploaded_file($userfile['tmp_name']) && $userfile['size'] < 5*1024 && $userfile['type'] == 'image/png' && $userfile['error'] == 0) { 
   // создаём изображение на основе загруженного
   $source = ImageCreateFromPNG($userfile['tmp_name']);  
   // определяем точки в которых будет проверяться цвет
   $x[] = 48; $y[] = 48; $x[] = 2; $y[] = 2; $x[] = 48; $y[] = 2; $x[] = 2; $y[] = 48;
   $rgb_array = Array();
   for ($i = 0; $i < 4; ++$i) { 
      // получает индекс цвета в точке
      $color_index = imagecolorat($source, $x[$i], $y[$i]);
      // получает цвет для индекса
      $color_tran = imagecolorsforindex($source, $color_index); 
      // записываеться в массив
      $rgb = Array();
      $rgb[] = $color_tran['red'];
      $rgb[] = $color_tran['green'];
      $rgb[] = $color_tran['blue'];
      $rgb_array[] = $rgb;
   }      
   // преобоазует массив в байтово-поточное представление для сопоставления с записью в массиве
   $serialize_rgb_array = serialize($rgb_array);  
   // получает хэш
   $hash_serialize_rgb_array = md5($serialize_rgb_array); 
   // ищет запись в бд
   $_CORE['db']->query('SELECT `di_invite`.`invite_id` FROM `di_invite` WHERE `di_invite`.`invite_hash` = ?;', $hash_serialize_rgb_array);
   // если найдено, очищает память, и возвращает true, иначе очищает память и возвращает false
   if ($_CORE['db']->num_rows() < 1) {
      imagedestroy($source);
      return false;
   } else {
      imagedestroy($source);
      $hash_serialize = $hash_serialize_rgb_array;
      return true;
   }
} else return false;
}
В следующий раз я это учту.
А нумерация линий? Вообще, по оформлению лучше все-таки Source Code Highlighter.
Подозреваю, что нумерацией линий лучше
А она тут кому-то на Хабре реально нужна?
Зодиаку нужна же
О, заминусовали. А аргументировать? Я же специально написал "реально нужна". Я вообще не припомню на хабре фраз типа «на такой-то строке в вашем скрипте ошибка» или ещё что-то такое. Вообще, любого упоминания номеров строк.

Поэтому и задал такой вопрос.
  1. Я вообще не припомню на хабре фраз типа «на такой-то строке в вашем скрипте ошибка» или ещё что-то такое.

быть может потому что их нет?
Дык это — чем хабровский )
Сколько уже можно позорить наш язык
и вопросительный знак?
Тоже мне проблема, картинку через gd сгенерить. Написал бы ты скрипт который реальные инвайты на хабру генерит)
UFO just landed and posted this here
Лол, можно попробовать перебор заранее сгенерированных изображений…
Интересно, сколько займет генерация 67108864 изображений и последующий перебор в форме регистрации?
Ошибочка вышла… 7.922816251426434e+28 изображений
Вы уж простите, но то, что написано в статье — быдлокод. Чему она, фактически, учит? Сгенерировать 4 случайных числа, записать их в базу и сделать на их основании картинку из 4 квадратиков?

Примеры кода
$rgb_array = Array();
for ($i=0; $i < 4; ++$i) {
 $rgb = Array();
 $randnum = intval(mt_rand(0,255)); $rgb[] = $randnum;
 $randnum = intval(mt_rand(0,255)); $rgb[] = $randnum;
 $randnum = intval(mt_rand(0,255)); $rgb[] = $randnum;
 $rgb_array[] = $rgb;
}


можно было бы переписать, например, так:
$rgb_array = Array();
for ($idx=0; $idx < 4; ++$idx) {
  $rgb = array();
  for($idx2 = 0; $idx2 < 3; ++ $idx2) $rgb[] = mt_rand(0, 255);
  $rgb_array[] = $rgb;
}


Потом дважды сериализуется массив, непонятно зачем:
$serialize = serialize($rgb_array);
$hash = md5(serialize($rgb_array));


Кроме того, в коде огромное количество магических констант, мешающих восприятию смысла кода.

Короче говоря, такое задание и такое решение к нему может существовать, но едва ли оно заслуживает статьи про это на хабре.
Да, признаю, некоторую часть кода можно было бы оптимизировать. Просто этот скрипт взят из живого проекта и там как раз эти переменные были нужны. Но всё таки до быдлокода, как мне кажется, он не дотягиваем.
Код в топике немного изменил, соответственно этим рекомендациям.
$rgb = array();
for($idx2 = 0; $idx2 < 3; ++ $idx2) $rgb[] = mt_rand(0, 255);

$rgb = array(mt_rand(0, 255),mt_rand(0, 255),mt_rand(0, 255));

не?
или ещё иначе:
$rgb = array();
for($idx2 = 0; $idx2 < 3; ++ $idx2) $rgb[] = mt_rand(0, 255);
$rgb_array[] = $rgb;

$rgb_array[] = array(mt_rand(0, 255),mt_rand(0, 255),mt_rand(0, 255));
Да, так даже лучше. Я поначалу подумал, что 3 раза писать mt_rand() не круто, особенно с magic numbers, но цикл for оказался уродливее. Жалко что в php нет array comprehensions, как в питоне:
rgb = [ random.randint(0, 255) for _ in range(0,3) ]
То Вам копипаст не нравится, то нравится. Вообще, тот код что Вы упрекали не есть быдлокод, не стоит «наводить красивости» на циклы в строку или две строки копипаста, оно того реально не стоит.
Если это проект на один раз или proof of concept — тогда да, любой код годится.
Если же предполагается, что над кто-то будет впоследствии работать, а особенно если его выкладывать на хабр — код должен быть красивым и понятным, а мысль разработчика — четко прослеживаться.
В таких статьях я код вообще не читаю, все равно его использовать не буду.
Мне бы понравились инвайты в виде смайликов. Типа того:
Вовремя поднятый сервер не считается упавшим.
Генерируем любую картинку, сэйвим как файл, берём от него мд5 и пихаем в базу, сам файл шлём на мыло, файл удаляем.
В статье зачем-то считываются 4 точки изображения и слишком много кода для такого действия. Массив откуда брать цвета совсем чудесен, потому что это именно тот случай, где помогла бы тригонометрия. Но лучше брать хэш от всей картинки и не думать о квадратах.
А если пользователь потеряет картинку? Или это случиться не по его вине, но картинка исчезнет.
Сгенерировать новую. Число инвайтов вычитать после регистрации.
Я так понимаю что не сложно будет сделать что бы использовано не 4 цвета, а например 6 или 8?
Да, но я думаю, что 4 цвета это уже достаточно хорошая защита.
SELECT `di_invite`.`invite_serialize`, `di_invite`.`invite_username_recipient` FROM `di_invite`.`di_invite` WHERE `invite_hash` = ?;

сработает, только если БД тоже названа `di_invite`.
CREATE TABLE IF NOT EXISTS `di_invite` (

Она так и названа, вроде бы.
Это у вас так названа таблица.

А часть «FROM `di_invite`.`di_invite`» — говорит «ИЗ таблицы `di_invite` в БД `di_invite`»
Ах, да, исправил. Спасибо, что заметили.
А ничего, что это кодстайл PEAR? Почему он должен считаться единственно верным? А если мне, например, Zend стиль больше нравится?
Хоть какой.
Достаточно что-бы по коду соблюдался один стиль.
Отбор кода для PEAR всегда отличался жестокостью, так как туда попадает только самое лучшее.
Я стараюсь писать в стиле «K&R», но всё же мне удобнее писать с отступами равными двум пробелам, а не 4 или табуляции, и также я не переношу открывающую фигурную скобочку на новую строку. В чём же мой стиль вам так не угодил?

P.S. Некоторые пробелы порезал Source Code Highlighter.
Я знаю одного программиста, так ему удобнее писать так, что потом коду обфускатор не нужен — всё равно никто не поймёт.
Есть некий набор правил, стили (Zend, PEAR ...) лишь группируют эти наборы правил на свое усмотрение. Нет ничего плохого, если человек будет придерживаться не конкретных стилей, а набору правил.
Если пишешь для себя — пиши хоть наскальными рисунками. Если работаешь в команде или пишешь open source — никаких наборов правил, только конкретный стиль, про «мне удобнее» лучше забыть.
Андрей, хороший стиль — он как хороший вкус.
Писать хорошо и красиво совсем не сложно, зато потом приятно читать.
И если пост на хабре — он только для своих глаз.
филиал обсуждения проблемы «пробелы против табуляции» можно считать открытым?
проблемы? не вижу никак проблем)
Не стоит, на хабре по этому вопросу статей больше, чем даже про капчу)
Сейчас еще откроется отделение «египетские скобки против прямых»
Объясните недалёкому, зачем делать инвайты картинками. Я раньше предполагал, чтобы наглядно видеть, использован ли инвайт или нет (картинка отдаётся сервером), а тут про какую — то защиту толкуют.
Картинку можно распечатать и в случае отключения интернета дойти до оффиса компании и показать её. // sɐrˈkazm //
Sign up to leave a comment.

Articles