Архив ‘Работа’


Накрутки конкурсов

Сегодня речь пойдет о накрутках в конкурсах и как с ними бороться.
Имеется сферический конкурс в вакууме, с пользовательским голосованием и вводом кода с картинки. Приходит какой-то Ай******ов, регистрируется с фейкопочтой, с фейковконтактом. Чувак фултайм занимается отловом билетов на концерты. Ну, работа такая или совсем заняться нечем. В итоге несколько сотен подтвержденных голосов у нашего Ромы, а честные участники негодуют.

Ни одной ссылки на голосование он не опубликовал — странный метод привлечь друзей. Вместо этого он рассылает ссылку в личку на сайтах и мессенджеры. Хотя есть мнение, что это делает за него программа.

Как решать столь деликатную проблему? Вроде бы пользователи настоящие, все с разных компьютеров (ну, почти), умные (капчу вводят), такие же нищеброды, превосходно распределенные по времени и IP-адресам. С другой стороны, они зашли с целью накопить себе некий «капитал», который в свою очередь можно потратить на свои голоса в своих конкурсах. Данная схема хорошо работает, например, у vklike, а именно: ты кликаешь на то что я скажу, и я кликну в ответ.

Бороться надо так: в правилах необходимо указать, что любые системы накруток, пользовательских обменов голосами, призоловы и аналоги — запрещены. А при подведении итогов проводить анализ кто откуда сколько человек привел, сколько из них зарегистрированные и настоящие.

Ценность таких фейкоголосов стремится к нулю. Хотя, конечно, еще можно поразмышлять над концепцией такого конкурса. Какой резон голосовать в нем мимодрузьям? Например, можно давать им какие-то бонусы в случае если они зарегистрированы и голосуют. Тогда мы увидим, что голосующий пользователь настоящий, он проголосовал и получил бонусы. Мы будем присылать ему красивые новостные рассылки и уже дальше «работать». И конечно при голосовании зарегистрированного пользователя, голосов начисляется в N раз больше. Другой вариант — просто просить email, подтвердить его, и получай N голосов.

Addthis toolbox bug

Лишь опытным путем выяснил, что динамическая отрисовка тулбокса не работает для селекторов с фильтрами типа
l.addthis.toolbox('.addthis_toolbox:last'); // fail

Используйте вместо этого:
l.addthis.toolbox('.addthis_toolbox'); // ok

Ничего страшного, если перегенерит уже существующие кнопки.

Rescuetime Filter

Есть такая замечательная программа Rescuetime. Так я тоже думал, пока не решил заплатить им за целый год. Однако, платная версия не справляется со своей основной функцией — фильтровать правильно не умеет! С мая месяца общаюсь с их тех. поддержкой, все никак не исправят.

Мне это надоело, и я написал свой фильтр, который работает даже на бесплатной версии RescueTime и позволяет, с некоторыми оговорками, не только получить функционал платной версии, но и получить (внимание!) рабочий функционал платной версии.

Итак, встречайте:

RescueTime Filter Screenshot

Пользоваться фильтром очень просто — скачиваете подробный лог в формате CSV из раздела «Documents and Details», загружаете в фильтр — можно на демо-сайте, а можно установить на любом другом сервере, и вводите ключевые слова. Результат: корректно подсчитано общее количество затраченного времени по проектам, сайтам, играм или что вы там делали весь последний месяц.

Недоступная вкладка привилегий в phpmyadmin

С тех пор, как phpMyAdmin выпилил простое управление пользователями MySQL (WHOA?), пришлось найти замену от Оракла. Называется MySQL Workbench, которая раньше звалась MySQL GUI Tools. Скачать можно, авторизовавшись на офсайте.

Кстати, кажется, еще не все потеряно с pma. Начиная с какой-то из новых версий вкладка привилегий появляется только после установки «дополнительных возможностей».

jQuery ajax loader

Да-с, такая банальная вещь, как необходимость показать сообщение «Идет загрузка» во время ajax-запроса, привела меня к созданию своей «легкой версии» без картинки. Работает он глобально на всей странице, закрывая все элементы полупрозрачным слоем. Лоадер работает на jQuery, состоит из трех частей: HTML, CSS, и JS-кода.

ajax loader example

Итак,
html:
<div id="loader"><span>Загрузка...</span></div>

javascript:
<script>
  // вешаем колбэки для всех jQuery.ajax-запросов
  $('#loader').ajaxSend(function(){$(this).show()})
  .ajaxStop(function(){$(this).hide()});
</script>

css:
#loader {
  position:fixed; display:none;
  top:0; left:0;
  height:100%; width:100%;
  background:#ccc; opacity:.9;
}
#loader span {
  display:block; position:absolute; right:4px; top:4px;
  color:#fff; background:#C71D72;
  padding:5px 10px;
  -webkit-border-radius: 5px; -moz-border-radius: 5px;
  border-radius: 5px; cursor:default;
}

По желанию можно сменить выравнивание, но мне нравится в правом верхнем углу — там он никому не мешается. Гмейл ставит лоадер по середине, но там ведь ничего нет, поэтому и выглядит сносно. Короче, пользуйся и меняй по вкусу.

Проверка готовности symfony

Найден замечательный проект с полезными советами перед запуском сайта на symfony. Некоторые пункты касаются вообще любых сайтов:

  • Создание быстрых, но полезных страниц ошибок 403, 404, 500
  • Наличие иконки сайта favicon.ico (сюда же robots.txt)
  • Отказ от файлов .htaccess
  • Строгая фильтрация загружаемых пользователями файлов, запрет выполнения из папки загрузки
  • PHP-акселератор
  • HTML-атрибут языка lang="ru"
  • Задать свое название сессии в куках

Приятного выкатывания!

Перенос проекта cp1251 → utf-8

Этот маленький скрипт я написал для проекта в кодировке windows-1251, так как база данных MySQL оказалась в кодировке UTF-8 и все «поплыло». Чтобы исправить отображение русских букв, я решил перевести все файлы проекта в современный формат UTF.

Использование: Кидаем скрипт в папку с проектом, запускаем с параметром -p dirname, в результате все скрипты и шаблоны (*.php, *.tpl, *.conf, *.inc) переводятся на UTF-8. Для работы необходимо расширение iconv. Если файл уже в UTF-8, то пропускает.


<?php
/**
 * @usage
 * php recode.php -p www
 */

// ищем файлы
function browseCall($dir$regex$cb) {
  foreach(
glob(chop($dir,'/')."/*") as $file) {
    if (
is_dir($file)) browseCall($file$regex$cb);
    if (
is_file($file) && preg_match($regexbasename($file)))
      call_user_func_array($cb, array($file));
  }
}
// заменяем кодировку
function myRecode($file) {
  
$s file_get_contents($file);
  
$e detectEncoding($s);
  echo 
"[".$e."] $file";
  if (
'windows-1251'==$e) {
    
$r iconv('windows-1251','utf-8',$s);
    
file_put_contents($file$r);
    echo 
" [written ".strlen($r)." bytes]\n";
  }
  else echo 
"\n";
}
// определялка кодировки
function detectEncoding($string) {
  static 
$list = array('utf-8''windows-1251');
  foreach (
$list as $item) {
    
$sample = @iconv($item$item$string);
    if (
md5($sample) == md5($string))
      return 
$item;
  }
  return 
null;
}

if (preg_match("~-p ([^ ]+)~"implode(' ',$argv), $matches)) {
  
$path $matches[1];
  
browseCall($path"~\.php$|\.tpl$|\.conf$|\.inc$|\.js$~""myRecode");
}
?>

Как я ставил Pylons на Windows

Давно ждал момента, когда можно будет попробовать Pylons — веб-фреймворк на питоне. Сразу замечу, что легко не будет. А с моими требованиями к веб-фреймворку — особенно. Итак,

Требования

  • Поддержка БД MySQL вместо стандартного SQLite;
  • Мультиязычность, которую я также называю локализацей;
  • Наличие работающий плагинов
  • Наличие актуальной документации

(далее…)

Сделал новый сайт

dskrestov

С пылу, с жару, налетай! Запрограммировал новый сайт — портфолио дизайнера Дмитрия Крестова!

Обильно использованы эффекты из jQuery, даже подумываю, как бы их сократить. В интерфейсе флеш использован НЕ БЫЛ, только javascript!

В эксплодере подтормаживает анимация, но в остальном, для первого проекта на jQuery, сойдет.

Настраиваем gettext в wordpress

Тот самый gettext, при упоминании которого меня уже начинает бросать в дрожь, оказывается, можно встроить в WordPress, и выиграть в производительности вашего блога.

К сожалению, делается это пока только руками, а при накате обновлений вся малина потрется. Кроме того, установка обошлась мне в час времени.

Мои комментарии к статье:
1) Локаль не задавайте — умрут теги.
2) Объявите переменную LANG или LANGUAGE (в зависимости от платформы):

putenv("LANGUAGE=ru_RU");

Это нужно, чтобы gettext открыл папку вашего языка, например:
/wp-content/languages/ru_RU/LC_MESSAGES/default.mo

На этом наш сеанс магии заканчивается, до новых встреч!