comments by Administrator

Главные вкладки

Update. Более или менее верифицировано 7 голосов за Путина.

Это пишет тётка с популярного у русскоязычных лыжного курорта Val Thorens ;-)

О, уже 4 голоса за Путина. Я всех знаю либо шапочно, либо виртуально, либо через третьих лиц. Так что ошибки быть не может.

Это было почти 10 лет назад, однако. Да и то удаляли вас не за содержание, а за многочисленность призывов, т.е. за спам.

У нас конечно анонимность и всё такое, но вот действительно нашлось три живых человека за Путина. Я как мог — проверил.

За Путина был подан пока один голос сумасшедшего старпера из-под Люксембурга. Ну и боты, конечно. Сейчас опять прибегут накручивать.

Ну во-первых, регистрация новых пользователей с момента голосования запрещена. А во-вторых, я периодически вычищаю голоса дублонов и пользователей из-за VPN.

Сейчас SEO ссылку запостит и мы её удалим ;-)

Нет модераторов. См. тут.

Ок, давайте проведём эксперимент. Заберём на время модераторские права у всех и вернём elen elen, Deanna, tanechka.333, veranica.

Да вы уже 3 года как ник поменяли.

Видимо всё-таки славянка, а не Славянка. Судя по вашим комментариям, вы попали под раздачу, когда ответили ВБР, или как он там в то время назывался. Не связывайтесь с отбросами общества — и всё будет у вас хорошо. Логиньтесь как славянка, кто ж вам мешает-то.

1) А вы как определяете степень интересности дискуссий?

Ну например по тому, насколько часто в тему заходят посетители с поисковых машин. Скажем, в тему Хорошо на свете жить!!! Сплагиачено у Леденцовой...))) … вообще не заходят, а в тему Получение студенческой визы в Бельгию: (из России) я поступала в художественное… вполне себе заходят.

2) Почему вы решили, что на место "пауков" придут умные, интересные, вежливые юзеры?

Если даже и не придут, количество проблем, требующих ежедневного внимания, уменьшится. У нас есть пользователь, бывший ВБР, а теперь человек с тысячью ников, который пишет анонимки в полицию, постит гадости в социальных сетях, а когда вдруг прорывается на сайт — так просто всех подряд задирает.

17-20 ноября 2017.

Так можно ведь отменять свой голос. Кто-то отменил видно. А по поводу фальсификаций… ну кто будет этим заморачиваться? Только Глебов, но он уже даже не модератор.

Украина — это страна такая?

Да, виноват.

Вообще-то действительно нисколько. А от острой лучевой болезни погибло 134 человека. Детали, конечно, сложнее.

Ну хотя бы адрес и телефон можно было бы дать.

ОП пишет через прокси на LeaseWeb, шифруется. Надеюсь, читатели у нас не глупые и на разводку не попадутся.

Да, мы тут уже написали.

Ну так вы батенька нам не послали необходимые данные.

Гусаров буду удалять с особой жестокостью. Михаил — молодец.

Слушаюсь и повинуюсь, общественное мнение.

А ещё можно разрешить ссылки на картинки только через HTTPS. Заодно решится проблема со страшными сообщениями, что часть страницы не защищена от АНБ.

Так это ж стрельбы по Сирии.

Спамер. Удалили его уже.

Так он называется в Википедии.

Brat и Irina Ka. видимо.

Вместо того, чтобы писать точки, напишите на webmaster@russian-belgium.be, чтобы вас добавили в раздел Няни. Нужно ваше фото, телефон, примерный адрес (хотя бы коммуна и почтовый иднекс) и пару слов о себе.

Поездку в Баден и Страсбург отменили.

Так вы не проголосовали.

Видно надо расширение поставить для пользовательских скриптов. Что-то вроде Tampermonkey.

А можно в новом дизайне устроить так, чтобы юзернейм пользователя был привязан к контенту на уровне div class?

Можно написать пользовательский скрипт. У вас Google Chrome? Нажмите Ctrl-Shift-J, вставьте в появившуюся консоль вот эту строчку

jQuery('a[href=/user/10204]').parents('.comment').hide();

и все ваши комментарии исчезнут… до перезагрузки страницы.

Хорошие идеи будем копировать. Ну вот например объявления с фоновыми картинками — это свежо, берём.

надо учитывать, что сайт должен быть адаптивным

Вы на РвБ с планшета хоть раз зайдите, если уж с телефона не заходили.

Это по нормальному информация для админов, зачем мне, пользователю, ее знать?

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

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

Готово.

Гуглила-а-а? Вверху страницы огромными буквами написано Переводчики.

А у меня есть предложение к Администратору: опубликуйте алгоритм, а мы тут сообща попробуем довести его до кондиции.

Да пожалуста:

Делаем выборку данных


SELECT v1.uid uid1, v2.uid uid2, u1.name name1, u2.name name2,
  v2.entity_id entity_id, v1.value value1, v2.value value2
FROM votingapi_vote v1
JOIN (votingapi_vote v2, users u1, users u2)
 ON (v1.uid != v2.uid AND v1.entity_id=v2.entity_id
   AND v1.entity_type=v2.entity_type AND v1.uid=u1.uid AND v2.uid=u2.uid)
WHERE v1.uid < v2.uid AND v1.uid != 0 AND v2.uid != 0
ORDER BY v1.uid,v2.uid;


JOIN таблицы votingapi_vote на себя саму выбирает все пермутации пар пользователей, а условие v1.uid < v2.uid превращает пермутации в комбинации.

Условие v1.entity_id=v2.entity_id AND v1.entity_type=v2.entity_type позволяет выбрать голоса, которые пользователи отдали за одну и ту же тему или комментарий. Скажем, первая строчка в нашей выборке означает, что Administrator и Bob дали 100 очков одной и той же теме или одному и тому же комментарию.

Условие v1.uid != 0 AND v2.uid != 0 исключает анонимные комментарии.

В результате получаем таблицу из шести колонок:

uid1    uid2    name1    name2   value1  value2
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     20      20
1       2       Administrator   Bob     40      40
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     20      100
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     80      80
1       2       Administrator   Bob     100     20
1       2       Administrator   Bob     20      20
1       2       Administrator   Bob     60      60
1       2       Administrator   Bob     100     100
1       2       Administrator   Bob     100     100


  1. В первой колонке — id первого пользователя, в данном случае это администратор (uid=1)
  2. во второй колонке — id второго пользователя
  3. в третьей колонке — имя первого пользователя
  4. в четвёртой колонке — имя второго пользователя
  5. в пятой колонке — голос первого пользователя
  6. в шестой колонке — голос второго пользователя


Рассчитываем корреляцию голосов


Рассчёт конечно можно написать на PHP, но зачем тогда придумали R?

Берём табличку, сгенерированную на предыдущем этапе из записываем её в файл in.tsv. Затем:

#!/usr/bin/env Rscript
d <- read.delim("../in.tsv")

unique1 <- unique(c(d$uid1, d$uid2))

for (id1 in unique1) {
  if (file.exists(as.character(id1))) {
    file.remove(as.character(id1))
  }
  temp1 <- d[d$uid1==id1 | d$uid2==id1, ]
  unique2 <- unique(c(temp1$uid1, temp1$uid2))
  unique2 <- unique2[!unique2 == id1] # remove id1
  for (id2 in unique2) {
    if (id1 < id2) {
      result <- temp1[temp1$uid1==id1 & temp1$uid2==id2, ]
      name <- as.character(result$name2[1])
    } else {
      result <- temp1[temp1$uid1==id2 & temp1$uid2==id1, ]
      name <- as.character(result$name1[1])
    }
    n = nrow(result)

    if (n > 7) {
      x <- result$value1
      y <- result$value2
      pvalue <- cor.test(x,y)$p.value
      if (is.finite(pvalue) && pvalue < 0.05) {
        correlation <- cor(x,y)
        cat(id2, name, n, correlation, pvalue, "\n", sep = "\t", file = paste(id1, sep = ""), append = T)
      }
    }
  }
}


Вся работа по расчёту корреляции делается функцией cor(x,y). Функция cor.test(x,y) рассчитывает метрики корреляции, в том числе её значимость (p-value). По умолчанию считается, что всё, что имеет p-value ≥ 0.05 недостаточно значимо, поэтому отбираем только результаты с p-value < 0.05 и записываем в файл с именем, равным uid первого пользователя.

Игра с id1, id2 и if-else нужна для того, чтобы выбрать все комбинации пар пользователей, вне зависимости от порядка.

Из таблицы сверху должен получиться файл с названием «1» и следующим содержимым:

2       Bob     15      0.6039604       0.01710946

  1. В первой колонке id второго пользователя
  2. во второй колонке имя второго пользователя (для того, чтобы можно было его сразу же показать на экране)
  3. в третьей колонке количество тем и комментариев, за которые проголосовали оба пользователя
  4. в четвёртой колонке — корреляция
  5. в пятой колонке — p-value


С обработкой данных мы закончили.

Показываем результаты


Я решил показать результаты в профиле пользователя, вот соответствующий хук:

/**
 * Hook into the user menu
 */
function mymodule_menu() {
  $items['user/%user/likeminded'] = array(
    'access callback' => TRUE,
    'access arguments' => array(1),
    'page callback' => 'mymodule_likeminded', // function defined below
    'page arguments' => array(1),
    'title' => 'Likeminded',
    'weight' => 5,
    'type' => MENU_LOCAL_TASK,
  );
  return $items;
}

Ну и самая длинная часть — вывод результатов.

/**
 * Display likeminded users
 */
function mymodule_likeminded($arg){
 
  if (is_object($arg) && !$arg->uid) {
    return;
  }
  # this is my path to the results, your path may be different
  $path =  drupal_get_path('module', 'mymodule') . '/pearsons/' . $arg->uid; 
  $lines = array();
  $min = 0; $max = 0;
 
  if ($handle = @fopen($path, 'r')) {
    while($line = fgets($handle)) {
      $line = explode("\t", $line);
      if ($line[2] >= $max) { $max = $line[2]; }
      if ($line[2] <  $min) { $min = $line[2]; }
      $lines[] = $line;
    } 
  }
  $output = ''; 
  // Likeminded
  $output .= '<h1>' .t('Likeminded') .'</h1>' ;
  $output .= '<div class="likeminded">';
  foreach($lines as &$line) {
    if ($line[3] > 0 ) {
      $size =mymodule_font_size($min, $max, $line[2]);
      $opacity = $line[3];
      $output .= "<span style="\"font-size:"" .="" $size="" "pt;opacity:"="" $opacity="" "\"="">";
      $output .= l($line[1], 'user/' . $line[0]);
      $output .= "</span>";
    } 
  }
  $output .= '</div>';
 
 
  // Adversaries
  $output .= '<h1>' .t('Adversaries') .'</h1>' ;
  $output .= '<div class="adversaries">';
  foreach($lines as &$line) {
    if ($line[3] < 0 ) {
      $size =mymodule_font_size($min, $max, $line[2]);
      $opacity = abs($line[3]);
      $output .= "<span style="\"font-size:"" .="" $size="" "pt;opacity:"="" $opacity="" "\"="">";
      $output .= l($line[1], 'user/' . $line[0]);
      $output .= "</span>";
    }
  }
  $output .= '</div>';
 
  return $output;
} 
 
/**
 * calculate the font size in proportion to the maximum and minimum of common votes
 */
function mymodule_font_size($min_count, $max_count, $cur_count,
  $min_font_size=11, $max_font_size=36) {
  if ($min_count == $max_count) # avoid DivideByZero exception
  {
    return $min_font_size;
  }
  return (
    ($max_font_size - $min_font_size)
    /
   ($max_count - $min_count)
   *
   ($cur_count - $min_count) + $min_font_size);
}

Тут всё просто. Чем больше шрифт — тем больше пользователи голосовали в одних и тех же темах. Чем ярче текст — тем больше корреляция. Если корреляция позитивная — то показываем пользователя в единомышленниках, иначе — в противниках.

Не обязательно. У вас с пользователем Nevada много общих голосов, а у Nevada с пользователем LV в четыре раза больше общих голосов. Так что это нормально, что вы у него шрифтом поменьше.

Упс,

В первой версии алгоритма поиска единомышленников и противников была ошибка. Пользователи, зарегистрированные раньше, не учитывались в рассчёте. Теперь всё ок.

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

Это не так просто. К тому же, как заметил как-то Paolo_Cocoa, писать в темы больше чем на 50 комментариев становится сложнее, и это хорошо.

И еще: хотелось бы, чтобы на непрочитанное сообщение можно было попадать и из своего профиля.

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

А профиль пользователя ждут другие изменения. Например, выборка лучших и худших комментариев пользователя ;-)

Интересно, а можно сделать такую же штуку про единомышленников, пользуясь статистикой не по всем комментам и темам, а отдельно по каждому разделу. Ведь, возможно, что по купле-продаже люди единомышленники, а по политике - совсем наоборот.

Частые посетители зачастую голосуют за или против других пользователей, а не по политике и по купле-продаже. Те, кто заходит пореже, голосуют за содержимое поста или за оформление текста.

Лучше мы сделаем автоматическую кластеризацию — украинцы, строители, родители и так далее.

Всех посчитаем.

В последний раз.

Возможно, это два разных человека.

Так точно. Чем ярче цвет — тем более похожи у вас оценки. Чем больше шрифт — тем больше вы голосовали по одним и тем же темам и комментариям.