comments by Administrator

Primary tabs

Ну во-первых, регистрация новых пользователей с момента голосования запрещена. А во-вторых, я периодически вычищаю голоса дублонов и пользователей из-за 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 комментариев становится сложнее, и это хорошо.

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

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

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

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

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

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

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

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

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

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

Готово.

Умельцы — если бедные и неизвестные. Предприятия — если богатые и знаменитые.

Считаете ли Вы приемлемым держать в модераторах форума автора этих мыслей?

Ни одного правила ВБР этим высказыванием не нарушил. Читателей он не оскорбил, грубо и нецензурно не выразился. Некрасиво — да, но не нецензурно. Законов Бельгии тоже вроде не нарушал, Холокост не отрицал, к свержению конституционного стороя насильственным путём не призывал. Проблем не вижу.

Зал славы — начало списка, а позорный стол — конец того же самого списка, отсортированного по оценкам.

Здравствуйте,

Мы создаём новый раздел в Каталоге предприятий и организаций — Няни. Мы вас туда запишем и отрекламируем совершенно бесплатно, но для этого нам нужно от вас получить:

1. название коммуны, где вы живёте
2. ваше имя
3. ваше фото
4. ваш номер телефона

Всё это не просто так. Название коммуны нужно для того, чтобы посетители могли искать нянь поблизости, имя и фото —чтобы было проще звонить незнакомому человеку — вся-таки, вам собираются доверить ребёнка. Ну и номер телефона — для связи.

Как напишете — так мы ваше объявление и опубликуем.

Пишите на webmaster@russian-belgium.be.

Спасибо, исправил.