Обсуждение модуля:Ballot

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску


Начальная сортировка[править код]

Carn а есть какой простой способ делать таблицу в алфавитном порядке кандидатов? Сейчас вообще хаотично. — Neolexx (обс.) 13:08, 31 января 2021 (UTC)

  • Да, пока никакой сортировки, кроме той, которая возникает, когда тыцнешь по стрелочкам. Отдельное спасибо что убрали «подвал» таблицы из этого процесса! У меня было в планах сделать сортировку по голосам «за», но те кто набирает нужный % сначала.·Carn 13:44, 31 января 2021 (UTC)
    • Идеальной сортировкой будет та, по которой проходят в арбитры: выше порога - по голосам за, ниже - по проценту. MBH 13:55, 31 января 2021 (UTC)
      • Да бог с ними с идеалами, хотя бы алфавитно по никам кандидатов, как в шапке страниц выборов. А не как сейчас, Fedor Babkin - Venzz - Сайга20К - Sir Shurf - ... Кто-нибудь начнёт некий глубокий смысл в этом изначальном хаосе искать. Есть table.sort, то есть должно быть очень просто? Сам я в mwLua не очень, поэтому самостоятельно править не рискую. — Neolexx (обс.) 14:50, 31 января 2021 (UTC)
      • Как я читаю, это в фукции line_processor. Было бы достаточно заменить return candidates на return table.sort(candidates) - если бы функция не возвращала две независимые таблицы candidates и candidatrue. Если первую отсортировать, то порвётся связь со значениями в candidatrue. Что последняя таблица делает, я пока не понял. Может, её безболезненно выкинуть можно? — Neolexx (обс.) 15:02, 31 января 2021 (UTC)
        • Порядок связан со строкой for candidate, votes in pairs(valid_votes) do — тут происходит обращение к таблице valid_votes, которая содержит значения (другие таблицы), выдаваемые по ключу (имени кандидата). Функция pairs позволяет нам точно обойти всё содержимое таблицы, но вот на то в каком порядке она это делает не повлиять — тут уж только другой итератор писать, проще сделать отдельную нумерованную таблицу (которая поддаётся сортировке) с именами кандидатов, отсортировать и строить цикл построения таблицы на ней. Но если уж это делать — сортировать надо так, чтобы был порог, выше — предварительно проходящие арбитры, ниже — предварительно не проходящие. ·Carn 05:04, 1 февраля 2021 (UTC)
  • Ну вот, правильной сортировки всё ещё нет… Точнее, она там начиналась при > 2/3 вместо >= 2/3, поправил. adamant.pwncontrib/talk 00:36, 30 июля 2021 (UTC)

Рекомендуемые изменения[править код]

  • Модулю вообще не нужен список формально имеющих право голоса участников. Бюрократам может быть полезен, модулю показа предварительных итогов - нет. Потому что формально имеющий право голоса может быть вычеркнут бюрократом (как накрутивший правки, как нарушивший топик-бан, другие причины). А формально не имеющий права голоса вполне может быть засчитан (потому что набирает логируемые действия до 100+ через патрулирования, другие причины).
    То есть всё что модуль должно интересовать - данный голос в данный момент вычеркнут бюрократами или оставлен.
    Это сразу облегчит использование модуля. А в случае вандализации страницы выборов (набег автоподов заведомо без права голоса) - такого на моей памяти не случалось, а случится - решается через временную защиту и чистку страницы, модулю тут опять-таки думать не надо.
  • Ненужное усложнение выборки списка кандидатов парсингом разных страниц. Зачем? Удобнее окончательный список задавать параметром в вызове шаблона. С разделителем, которого заведомо не будет в нике, например, /
    {{#invoke:Ballot|open_vote|1=Википедия:Выборы арбитров/Зима 2021/Голосование|2=Adamant.pwn/AndreiK/Artificial123/Fedor Babkin/Ouaf-ouaf2010/Sir Shurf/Venzz/Vyacheslav Bukharov/Wild lionet/Джекалоп/Кронас/Сайга20К/Юлия 70}}
    Тогда в модуле алфавитный список получается банальным split('/') и больше голова не болит. А если вдруг кто из кандидатов уже в ходе выборов снимется с выборов или будет снят (прецеденты были), то убираем его из параметра и он исчезает из списка предварительных результатов.
  • Кандидаты по умолчанию сортируются алфавитно. В отсортированном столбце TH соответственно class="headerSortUp", чтобы понятна была сортировка по умолчанию.
    Потом можно будет придумать самые разные крутые сортировки, даже разные в разных частях таблицы, но как прожиточный минимум пока так.
  • Разделители целой и дробной частей у нас запятые, а не точки. поэтому в графе проценты стоило бы обернуть значения в {{formatnum: }} Принципиальные возражения по предложениям? — Neolexx (обс.) 16:28, 31 января 2021 (UTC)
    • Отвечу по пунктам:
      • Предварительный учёт должен идти максимально близко к итоговому, так как показывает пользователям учтён их голос или нет и они обращаются к бюрократам, которые уже могут решить эту проблему не при окончательном подсчёте результатов, а заранее.
      • Усложение с парсингом подстраниц выборов уже сделано и нужно, чтобы можно было просто без параметров вставить шаблон на страницу /Голосование и всё заработало. Оттуда необходимо исключить будет, да, какие-то подстраницы, которые не будут использоваться в будущем и добавить возможность указывать список кандидатов параметром (тогда можно будет из любого места вызывать шаблон).
      • Про сортировку написал выше, class="headerSortUp" попробую добавить, или вы сделайте, я планировал заняться оформлением после того как определимся с содержанием. Точки/запятые — это происходит в строке :tag( 'td' ):wikitext( mw.ustring.format("%.2f %%", percent) ):done() при помощи аналога функции string.format, и там просто можно поменять число знаков после запятой, но не разделитель, пока на ум приходит только взять число, получить целую часть, потом отдельно десятые с сотыми прилепить, но это явно негодный способ. Я пробовал через frame:expandTemplate вызывать шаблон, но это надо всё на объекты frame переводить, я в этом не силён. Возможно frame:extensionTag сработает, но это будет более «дорогой» способ применить форматирование, чем указанный мной плохой способ средствами самой lua.
    • Спасибо большое за фидбек, мне так сильно проще строить дальнейшую работу! Сортировка — первая на очереди. Вчера хотел заняться, даже открыл всё, но дома случился форс-мажор. ·Carn 06:57, 1 февраля 2021 (UTC)
      • Сделал запятые вместо точек в дробях через frame:callParserFunction. У нас ещё ни разу не было больше 10-20 кандидатов, на такое число вызовов это совершенно ничтожная трата ресурсов. — Neolexx (обс.) 08:34, 1 февраля 2021 (UTC)
        • Спасибо большое, что можно на это не отвлекаться!·Carn 09:23, 1 февраля 2021 (UTC)
      • По фидбеку в целом и надеюсь никого сильно не обидеть... У меня уже с год ощущение, что вы (и Джек, и другие технически подкованные и заинтересованные в деле участники) упорно делаете какой-то тостер, который заодно варит кофе, а если перевернуть и потрясти, то играет хиты Бейонсе :-) То есть некий модуль, старающийся решать совершенно разные и слабо связанные задачи.
        1. Решившие проголосовать должны автоматически определяться (из готового списка) как имеющие или нет право голоса. Если имеют, то голосуют. Если не имеют, то получают заблокированную кнопку и пояснение, 1) почему у них нет голоса и 2) куда обратиться, если считают это ошибкой.
        2. Бюрократы должны иметь максимально удобный интерфейс, чтобы при подозрениях быстро проверить любого уже проголосовавшего по ряду критериев. Плюс при получении запроса от лишённого голоса максимально удобно проверить, действительно ошибка или всё верно.
        3. Заинтересованные в ходе выборов хотят быстро посмотреть предварительные итоги, т.е. голоса с учётом переголосовавших и за минусом анулированных бюрократами на ^-странице
          Отмечу, что многие не прочь были бы видеть ход голосования в динамике по дням и часам. Что было раньше достаточно тривиально через подключение к построителям графиков JSON-данных (см. для АК-30). А сейчас это вообще отсутствует как класс. Ну да ладно, пока "не до жиру, быть бы живу", как в народе говорят. — Neolexx (обс.) 09:12, 1 февраля 2021 (UTC)
      • Общего между этими тремя вещами только сама тема выборов в АрбКом, а программно это независимые вещи, и мы сейчас налаживаем №3. А №1 и №2 пока где-то там как-то работают и слава богу, до этого пока руки не дошли. IMO. — Neolexx (обс.) 08:50, 1 февраля 2021 (UTC)
        • Не хочу никого обидеть, [но].. и на этом месте надо остановиться обычно, если желание никого не обидеть ненароком сильное 😉 (не про себя, но люди разные, подобное может демотивировать). (1) - да, согласен, это было бы правильным включить эту часть функционала в скрипт голосования; Serhio Magpie затратил много сил, чтобы его переписать в вид, когда его можно будет более просто менять, но я в JS не силён (2) - это, опять же, на lua модулями реализовывать бессмысленно, тут должен быть какой-то внешний сервис, который должен понимать что кнопочки в нём нажимает бюрократ, это сложно, но можно попросить Фонд помочь. Согласен что (3) сейчас основная задача, я делал модуль в расслабленном режиме как запасную штуку скорее с мотивацией поиграться парсингом как-раз (не ожидал что оно так быстро пригодится), которая должна полностью была повторять функционал предварительных итогов, поэтому, пока проверка активности не включена в скрипт голосования, её нужно проводить, я считаю. И перевод этой функции в скрипт, выполняемый на компьютере голосующего может привести к тому что люди смогут оставлять голоса, подделываясь под работу скрипта и это сложно будет отловить. В любом случае, это вопрос для бюрократов, нужно сделать и такой и эдакий вариант, а они выберут тот, который будет удобен.·Carn 09:23, 1 февраля 2021 (UTC)
        • А про графики, да, я подумал заранее, поэтому в функции compute уже есть параметр date, который позволит её использовать для построения таких графиков. ·Carn 09:28, 1 февраля 2021 (UTC)
          • "и на этом месте надо остановиться обычно, если желание никого не обидеть ненароком сильное" - желание обидеть - не вас, а весь мир, у меня было в субботу. Когда после в целом удачной пятницы, на субботнем бодуне смотрел на всякие 404, а потом общался со своим ботом на предмет данных. Но перетерпел и был в целом паинькой, ведь правда? ;-)
            "который должен понимать что кнопочки в нём нажимает бюрократ" (про задачу №2) - а зачем ему это понимать? Это же не чекюзинг какой, проверка всем открытых данных (число патрулирований, характер последних правок и т.п.) Главное чтобы всё наглядно и удобно было. А если по результатам проверки нужно кого добавить/удалить на ^-странице, то обычной правкой ручками под аккаунтом бюрократа. Ничего в этом страшного нет, в среднем за выборы 5-10 таких действий выходит, автоматизация только лишний простор для багов и проблем создаст.
            Я сейчас под сортировку кандидатов по алфавиту ваш код чуть-чуть хакну. Если что, сразу откачу. — Neolexx (обс.) 09:57, 1 февраля 2021 (UTC)
          • Нет, по-простому не получилось. Я бы рекомендовал в любом случае полностью отделить блок со строками данных (result) от всех table_start и иных несортируемых компонентов таблицы, соединять всё вместе только перед самым выводом результата. — Neolexx (обс.) 10:11, 1 февраля 2021 (UTC)
            • @Neolexx — сделал сортировку по проценту прохождения, сейчас есть возможность делать алфавитную сортировку нажатием на стрелочку столбца «User». Для опытов, пожалуйста, пользуйтесь функцией «Предварительный просмотр страницы с использованием этого шаблона или модуля» — в качестве такой можно сейчас указывать Участник:MBH/Черновик. Ваш вызов frame я убрал — если так делать, то нужно frame передавать в саму функцию и возвращать из неё, у меня были не очень приятные баги, связанные с замыканиями, я теперь опасаюсь. Плюс, в данном случае пришло в голову простое решение — заменить в текстовой строке точку на запятую, его и реализовал. ·Carn 11:22, 1 февраля 2021 (UTC)
              • Где-то сбоит сортировка: Adamant.pwn 57,43 % на позицию выше Vyacheslav Bukharov 69,88 % — Neolexx (обс.) 11:28, 1 февраля 2021 (UTC)
                И Sir Shurf 82,40 % на позицию выше Юлия 70 85,45 %
                Только эти два случая, не пойму почему. — Neolexx (обс.) 11:32, 1 февраля 2021 (UTC)
                • Это-то как раз норм, цитирую по ВП:ВАК: «Кандидаты, набравшие менее 2/3 голосов „за“ от общего числа голосов „за“ и „против“ них, а также кандидаты, набравшие менее 20 голосов „за“, дисквалифицируются. Из оставшихся кандидатов составляется список, который сортируется по количеству голосов за кандидата (в порядке убывания)». То есть если много кандидатов будет, то это будет важно, чтобы точно знать где границу провести. А вот что у меня в предпросмотре было всё ок, а без него не ок и Adamant.pwn был шестым почему-то — вот это было не норм, пока поставил неверную сортировку по проценту. ·Carn 11:50, 1 февраля 2021 (UTC)
          • Про графики. @Carn: а можешь сделать какой-нибудь легко доступный способ получить список действительных голосов с таймстампами в каком-нибудь легко разбираемом формате типа json, чтобы можно было брать его и строить графики сторонними средствами? Конечно, круто было бы и это автоматизировать, но это долго, а у меня хотя бы есть программа с выборов в 30-й созыв, которую я смогу переиспользовать. Браунинг (обс.) 15:18, 29 января 2022 (UTC)
            • если на формируемых таблицах сработает mw.text.jsonEncode ·Carn 15:41, 29 января 2022 (UTC)

Мелкие улучшения[править код]

  • для TD к именами кандидатов добавить стиль white-space: nowrap - чтобы все по одной строке получали
  • у таблицы вместо width="33%" сделать style="min-width:33%;" - что минимально по ширине, но при каком длинном нике чуть растягивалось
  • Вместо User сделать заголовок Кандидаты

Это ОК? (а что такое Нет данных, Расхождения, Исключения, это какие ситуации?) — Neolexx (обс.) 15:09, 1 февраля 2021 (UTC)

  • ✔ Сделано ·Carn 15:24, 1 февраля 2021 (UTC)
    • max-width это не совсем то что я имел в виду, однако дефолтное поведение min-width в таблице поломано (откатил уже), видимо, какой-то конфликт стилей. пусть как есть. — Neolexx (обс.) 15:37, 1 февраля 2021 (UTC)
      • Да, я же проверил в предпросмотре сначала, результат работы модуля лежит на достаточно посещаемой странице. ·Carn 15:47, 1 февраля 2021 (UTC)

Переголосование[править код]

Что происходит и где в коде при переголосовании? Я изменил свой голос (не для теста, действительно так хотел) для кандидата Venzz. Сначала (см. № 23) я проголосовал "против". Сейчас (см. № 78) через скрипт для голосования поменял голос на "за". На момент написания этой темы Предварительные итоги не изменились (61,34 %). Зато в "Дополнительная информация" добавилось "Neolexx change: ? ?" Если навести курсор на знаки вопроса, то всплывает "Venzz (2)". — Neolexx (обс.) 19:17, 4 февраля 2021 (UTC)

  • Я надеялся грешным делом что тулсервер оживёт к этому моменту. Завтра попробую двумя разными способами это посчитать, оставлю тот который будет работать. ·Carn 20:34, 4 февраля 2021 (UTC)
    • Когда выборы завершатся, процитирую бессмертное из Ключевского... Не про вас, вообще про всё в целом. Я, повторюсь, крайне слаб в mwLua плюс мне в нём психологически трудно работать, так как я глубоко и искренне ненавижу этот "язык" - практически в каждой точке его архитектуры и дизайна. Психологический фактор такого рода весьма влияет на процесс программирования.
    • Если же без лирики и по возможности аппроксимируя из привычной мне парадигмы Javascript + API:
    • Всем абсолютно всё равно, менял избиратель свой голос или нет. Если только не менял >3 раз за неделю выборов. Последнее уже похоже либо на непонятные метания, либо попытку испытать что-то на прочность — и достойно внимания бюрократов (с полным ПДН всё равно как минимум "у вас всё в порядке, коллега, или помочь?"). <=3 всем, повторюсь, всё равно: бюрократам, избирателям, просто следящим за выборами — а значит, и вашему скрипту может быть всё равно.
    • То есть вообще не париться с отдельными фактами переголосования - ни с их учётом, ни с их выводом в какие-либо таблицы. Избиратель И имеет тот голос по кандидату К, который на данный момент последний по времени, все более ранние значения не имеют.
    • С такой аксиомой, принимаемой за верную пока не показано обратное, я, например, делал выборки данных для построения графиков голосов по времени. В данном же случае (интересует лишь последняя точка) всё ещё проще. Например, Adamant.pwn:
      1. Берём все правки типа "голос" от самой старой к самой новой в секции "за": https://ru.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&list=recentchanges&rcslot=main&rctype=edit&rcshow=!bot%7C!anon%7C!minor&rcdir=newer&rclimit=max&rcprop=timestamp%7Cuser%7Ccomment&rctitle=Википедия:Выборы_арбитров/Зима_2021/Голосование/%2B/Adamant.pwn
      2. Берём все правки типа "голос" от самой старой к самой новой в секции "против": https://ru.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&list=recentchanges&rcslot=main&rctype=edit&rcshow=!bot%7C!anon%7C!minor&rcdir=newer&rclimit=max&rcprop=timestamp%7Cuser%7Ccomment&rctitle=Википедия:Выборы_арбитров/Зима_2021/Голосование/-/Adamant.pwn
      3. Из двух массивов data.query.recentchanges находим все дубликаты по data.query.recentchanges[i].user и delete тот, в котором data.query.recentchanges[i].timestamp меньше.
    • В итоге остаются только те "за" и "против", которые нужно считать и из которых вычислять % поддержки.
    • Не знаю, помогли эти мысли или только добавили сумбура - так как только примерно представляю, что из настоящих языков доступно в mwLua - и насколько подходит к вашим собственным принципам программирования. Во всяком случае искренне хотел помочь. — Neolexx (обс.) 22:08, 4 февраля 2021 (UTC)
      • Ну в Module:Ballot#L-105 так и делается по-идее, просто баг где-то сидит. Сейчас начал с самого начала собирать данные, возможно каждый последний голос против не обрабатывает, либо я неверно считал первый раз.·Carn 10:55, 5 февраля 2021 (UTC)
# Кандидат + Σ % +raw −raw +dif −dif
1 Джекалоп 154 20 174 88,51 % 161 22 7 2
2 Сайга20К 152 8 160 95,00 % 156 10 4 2
3 Sir Shurf 143 29 172 83,14 % 150 30 7 1
4 Юлия 70 141 17 158 89,24 % 146 18 5 1
5 Кронас 94 40 134 70,15 % 100 41 6 1
6 Vyacheslav Bukharov 93 26 119 78,15 % 96 28 3 2
7 Ouaf-ouaf2010 87 30 117 74,36 % 93 30 6 0
8 Venzz 80 46 126 63,49 % 85 46 5 0
9 Adamant.pwn 85 55 140 60,71 % 90 57 5 2
10 Fedor Babkin 70 54 124 56,45 % 74 56 4 2
11 Artificial123 24 52 76 31,58 % 25 55 1 3
12 Wild lionet 15 73 88 17,05 % 16 76 1 3
13 AndreiK 15 83 98 15,31 % 18 86 3 3

Результаты по AndreiK парадоксальные, ничего не понятно, у него 86 голосов против (просто по списку, без вычета переголосований), почему-то всего 76 записалось вторым методом подсчёта голосов, который я хотел использовать.А, нет, это я при копировании ошибся·Carn 10:55, 5 февраля 2021 (UTC) Что-то голова не варит, буду сюда промежуточные результаты сваливать. В графе change общее кол-во смен голоса за кандидата, без разбора, за или против. В общем видно что всю функцию compute необходимо переписывать, стыд то какой.·Carn 11:14, 5 февраля 2021 (UTC)

table#172 {
    ["Venzz"] = table#173 {
      ["change"] = 1,
      ["raw_opp"] = 47,
      ["raw_pro"] = 85,
    },
  },
  [table#174] = table#175 {
    ["Artificial123"] = table#176 {
      ["change"] = 0,
      ["raw_opp"] = 55,
      ["raw_pro"] = 25,
    },
  },
  [table#177] = table#178 {
    ["Wild lionet"] = table#179 {
      ["change"] = 0,
      ["raw_opp"] = 76,
      ["raw_pro"] = 16,
    },
  },
  [table#180] = table#181 {
    ["AndreiK"] = table#182 {
      ["change"] = 0,
      ["raw_opp"] = 86,
      ["raw_pro"] = 18,
    },
  },
  [table#183] = table#184 {
    ["Сайга20К"] = table#185 {
      ["change"] = 0,
      ["raw_opp"] = 10,
      ["raw_pro"] = 156,
    },
  },
  [table#186] = table#187 {
    ["Юлия 70"] = table#188 {
      ["change"] = 0,
      ["raw_opp"] = 18,
      ["raw_pro"] = 146,
    },
  },
  [table#189] = table#190 {
    ["Vyacheslav Bukharov"] = table#191 {
      ["change"] = 1,
      ["raw_opp"] = 28,
      ["raw_pro"] = 96,
    },
  },
  [table#192] = table#193 {
    ["Sir Shurf"] = table#194 {
      ["change"] = 0,
      ["raw_opp"] = 30,
      ["raw_pro"] = 150,
    },
  },
  [table#195] = table#196 {
    ["Джекалоп"] = table#197 {
      ["change"] = 0,
      ["raw_opp"] = 22,
      ["raw_pro"] = 161,
    },
  },
  [table#198] = table#199 {
    ["Fedor Babkin"] = table#200 {
      ["change"] = 0,
      ["raw_opp"] = 56,
      ["raw_pro"] = 74,
    },
  },
  [table#201] = table#202 {
    ["Adamant.pwn"] = table#203 {
      ["change"] = 0,
      ["raw_opp"] = 57,
      ["raw_pro"] = 90,
    },
  },
  [table#204] = table#205 {
    ["Ouaf-ouaf2010"] = table#206 {
      ["change"] = 0,
      ["raw_opp"] = 31,
      ["raw_pro"] = 93,
    },
  },
  [table#207] = table#208 {
    ["Кронас"] = table#209 {
      ["change"] = 0,
      ["raw_opp"] = 41,
      ["raw_pro"] = 100,
    },
  },
  • Как раз хотел посоветовать добавить предупреждение на форуме, но вы уже сделали. Я бы даже написал на всякий случай "существенно отличаться", а не просто "отличаться".
    Какой-то особой вины за вами не вижу. Вы более жертва обстоятельств: спокойно и неспешно тестировали личный модуль, изучали язык - и тут MBH вытащил его на публику как единственную как-то работающую альтернативу убитой стандартной системе. Потом сделали главной ссылкой на "Промежуточные результаты", потом ажно стал "критический шаблон или модуль". Всё это менее чем за неделю, не оставляя попыток вывести пре-альфу в релизное состояние.
  • Я, к сожалению, просто не могу прочитать текущий алгоритм - другой язык, другие подходы. Плюс именно сегодня IRL заедает. То есть и с конкретным советом помочь не могу. На всякий случай - там учитывается снятие голосов на Википедия:Выборы_арбитров/Зима_2021/Голосование/^ ? Наверняка да, просто чтобы хоть что-нибудь умное сказать. :-)
  • Выборы явно состоялись (в плане достаточного числа проходящих кандидатов). Выборы полностью провалены бюрократами (в плане стандартного отлаженного за долгие годы процесса). Однако Track13 пояснил на форуме выборов, что ответственность бюрократов "за проведение выборов" ограничивается и исчерпывается вовремя подведёнными итогами выборов. Тогда моё последнее утверждение неверно.
  • В общем, пусть бюрократы вовремя выполнят всё в рамках своей ответственности как могут и где могут, а "Предварительные итоги выборов" пока будем считать просто игрушкой. Сломанной. — Neolexx (обс.) 11:46, 5 февраля 2021 (UTC)
    • Я сделал вообще по-простому — сортировка всего массива голосов по их времени и потом работа с «верхним» элементом (тут, правда, выяснилось что так как в таймстампе секунды не записываются — мой голос за Кронас’а учитывается как данный против, я в пределах одной минуты переголосовывал для того чтобы посмотреть как будет отображаться сообщение). Сейчас я вынужден отвлечься, надо как-то ручками посчитать и проверить, правильно ли сейчас считает или нет (попробую на старых выборах АК-30 это установить, там есть альтернативные результаты с тулфоржа). ·Carn 12:07, 5 февраля 2021 (UTC)
      • Напомню, что я откопировал сохранившийся там JSON сюда: Википедия:JSON-данные выборов АК. Это если где понадобится грузить данные без cross-domain origin проблем. — Neolexx (обс.) 12:23, 5 февраля 2021 (UTC)
      • "в таймстампе секунды не записываются" — записываются: 2021-01-30T00:00:35Z, 30 января 00:00:35 UTC например (тестовое голосование Track13). Технически можно представить себе "за" и "против", поданные в течение той же секунды. Но такое не припоминается, а если когда случится - просто снимается (и "за" и "против") с блокировкой участника до конца выборов (за злой НИП, пусть и с хай-теком). — Neolexx (обс.) 12:36, 5 февраля 2021 (UTC)
        • О, ещё бы я знал как сделать API-запрос из модуля! Я про страницу голосов, увы. Результаты проверил Землеройкин, всё сходится сейчас. ·Carn 13:23, 5 февраля 2021 (UTC)
          • Этот технический момент (недоступность API из mwLua и усечённость меток времени здесь) я упустил.
            Это, к сожалению, вообще закрывает вопрос об обеспечении выборов модулями mwLua. Потому что "да" и "нет" в ту же секунду - явный сбой или попытка хака. "да" и "нет" в ту же минуту вполне себе случается.
            Сейчас до конца дело уже дотянется, при необходимости ручными правками в алгоритме, как с вашим голосованием, скажем. А потом всё: либо toolforge.org, либо Javascript через {{выполнить скрипт}}, других альтернатив нет.
            Плюс на днях подготовлю аргументированный запрос на phabricator: открыть для mwLua доступ к API как необходимый пререквизит для обеспечения выборов через модули. Либо для всей руВики (очень вряд ли), либо хотя бы из пространства Википедия: или даже подпространства Википедия:Выборы арбитров/ (вряд ли, но шансы есть).
            Если запрос в какой-либо его части удовлетворят, можно будет вернуться к идеям с модулями. — Neolexx (обс.) 14:47, 5 февраля 2021 (UTC)
            • никто не станет менять механизм по такому ничтожному поводу, как выборы в рувики (все остальные АК же как-то обходятся без апи-запросов из луа)? Не, я только за возможность запрашивать апи из луа, я к тому, что повод ничтожен. Не было бы модуля Карна - я бы попробовал написать свой счётчик предитогов, и запрашивать апи из луа ему бы не потребовалось (он был бы веб-сервисом на тулфорже, как калановый, а не инвики-скриптом). MBH 15:13, 5 февраля 2021 (UTC)
              • Поводы в проекте не делятся на чтожные и ничтожные. Они делятся на "сообществом по аргументам 1, 2,... достигнут консенсус, что ему это нужно" и "сообществом по аргументам 1, 2,... достигнут консенсус, что ему это нафиг не нужно". Возможно, MediaWiki и упрётся рогом в стенку из-за каких-либо концептуальных принципов. Потому и написал "вряд ли, но шансы есть" (как минимум они не отрицательные). Про прочее напишу чуть позднее в новой теме. — Neolexx (обс.) 19:12, 5 февраля 2021 (UTC)

Блок-схема работы[править код]

Возможно, это даже лучше не новой темой здесь, а на ВП:Ф-Б. Если так и есть, давайте перенесём.

Предположим, Kalan - не Мэри Поппинс, он "улетел и больше не вернётся". Как и его программы. Я не то чтобы великий программист (по первому диплому - вообще не программист), но за годы чувство оптимального и нептимального в алгоритмах развилось. В данном случае у меня есть чувство чего-то крайне неоптимального во всех этих борах-переборах голосов в моих скриптах (да в модуле Ballot). Хоть они и дают результаты, близкие к реальным. Должно быть что-то более очевидное, простое и надёжное, вот чувствую.

Поэтому есть предложение абстрагироваться от mwLua, Javascript, PHP и любого другого языка. Думать в самых общих терминах блок-схемы: есть то-то, если так то, иначе это и пр.

По каждому кандидату на каждый момент голосования и после голосования у нас есть:

  1. все голоса на странице "за", упорядоченные по времени с точностью до секунды, либо от самого первого к последнему, либо от самого последнего к первому - как удобнее, так и берём.
  2. все голоса на странице "против", упорядоченные по времени с точностью до секунды, либо от самого первого к последнему, либо от самого последнего к первому - как удобнее, так и берём.
  3. И есть состояние ^-страницы (not-страницы) на момент проверки (с точностью до секунды же). С которой, правда, сложнее: так как из истории правок просто так непонятно (программе), указано ли такого-то участника считать или наоборот не считать. Тут нужен сам текст правки и проверка на наличие | в ней - только это формально отличает, насколько я понимаю, "не считать" от "считать".

Допустим, последняя проблема разрешима и разрешена. Логика подсказывает, что таких данных должно быть достаточно для точного показа голосов и % в любой момент для любого кандидата. Но если чего-то не хватает, можно ещё запросить, хоть число картинок на Заглавной :-)

Вопрос: какой общий алгоритм должен быть для точного показа голосов и % в любой момент для любого кандидата? Чтобы именно безошибочный и чтобы при его переводе в любой доступный язык программирования не начинала болеть голова и не хотелось запустить компьютером в стену. 1) → ... — Neolexx (обс.) 19:52, 5 февраля 2021 (UTC)

Доп. инфо?[править код]

Wikisaurus — можно ещё указывать общее кол-во проголосовавших (и % проголосовавших по кандидату). На выборах АК-30 и АК-31 у меня получилось что 252 человека голосовали (разные наборы, одинаковое кол-во). ·Carn 20:01, 30 января 2022 (UTC)

  • Коллега @Carn, да, общее количество интересно. Про долю проголосовавших за кандидата не уверен, вроде для сравнения кандидатов между собой хватает абсолютного количества, хотя, может, кому-то интересно сравнить динамику одного кандидата в разные годы) Викизавр (обс.) 20:17, 30 января 2022 (UTC)
  • Общее кол-во будет кстати. ~~‍~~ Jaguar K · 01:29, 30 июля 2022 (UTC)

activity в подвале шаблона[править код]

Это вероятное несоответствие требованиям или гарантированное?
В первом случае, вероятно, его можно отбросить для всех, у кого в указанный период не имелось флага А/ПИ, т.к. кроме правок, ничего не учитывается априори.
Или проблема в отсечении правок страниц выборов? ~~‍~~ Jaguar K · 22:10, 30 июля 2022 (UTC)

  • Если нет списка избирателей, показывает всех, если есть, то считает, что те, кто не в списке, по неактивности не могут участвовать если бюрократы не внесут в исключения ·Carn 05:06, 31 июля 2022 (UTC)
    • > показывает всех
      То есть в луа нельзя делать запросы к апи?
      А что с отсечением правок на выборах? Судя по коду quarry, этот пункт не учтён ~~‍~~ Jaguar K · 05:17, 31 июля 2022 (UTC)
      • Да, lua-модуль должен отработать до загрузки страницы, куча запросов к API каждый раз это исключает, возможности кэшировать где-то результаты прошлых вызовов отсутствуют, насколько я знаю (хотя .tab данные с Коммонс вполне себе загружаются). Запрос формировал MBH, я не проверял, если честно, это в любом случае предварительные, а не окончательные результаты, плюс люди просят себя внести в исключения, если что-то ещё надо учесть. ·Carn 08:17, 31 июля 2022 (UTC)
        • Запрос я лишь правил, писал его не я. MBH 08:21, 31 июля 2022 (UTC)
        • > плюс люди просят себя внести в исключения
          Я про обратный случай. Пример - Служебная:Вклад/Nebydlogop. Будь у участника больше правок на прошлых выборах АК или ЗСА, его бы легко приняли за подходящего по критериям. Где гарантия, что сейчас и ранее таких участников нет? Мб у бюров есть скрипты для проверки, потому не критично? ~~‍~~ Jaguar K · 08:30, 31 июля 2022 (UTC)
          • Good Will Hunting — насколько критично, чтобы список допущенных в точности соответствовал правилам? ·Carn 08:44, 31 июля 2022 (UTC)
  • Глянул по диагонали сноску про правки на выборах - ничего не нашел. Оно точно в том обсуждении принято было? ~~‍~~ Jaguar K · 11:40, 31 июля 2022 (UTC)

оформление[править код]

подсказки у вычеркнутого голоса
https://i.imgur.com/Ejrcrx4.png думаю, лучше переместить на ник голосовавшего ~~‍~~ Jaguar K · 11:28, 31 июля 2022 (UTC)
Нет данных
К чему эта надпись? ~~‍~~ Jaguar K · 23:49, 4 августа 2022 (UTC)
restricted
Эта надпись одинаково относится к нелигитимным голосам и к голосам, от которых отказались. Вторые, полагаю, должны быть change.
Кроме того, нет необходимости отображать change у нелигитимных голосов (Sheretz2022 change: ? restricted: − − − ). ~~‍~~ Jaguar K · 23:54, 4 августа 2022 (UTC)
change
Желательно заменить (если не используется в специальном значении) ? на +/- (текущий голос). В таком случае change ? будет значить отказ от голоса на зкб. ~~‍~~ Jaguar K · 00:05, 5 августа 2022 (UTC)
  • по всем выше, они генерятся на лету, когда программа ещё не знает, какой голос текущий (может быть несколько голосов за и против), т.е. нужно генерить "в стол", а потом, когда закончится - уже ещё раз проходить и отображать.
    По поводу change/restricted посмотрю, там тоже - либо нашли более новый голос, либо бюрократы что-то написали. Что именно написали - ну, программа просто передаёт, не понимая. ·Carn 06:01, 5 августа 2022 (UTC)
    • > когда программа ещё не знает, какой голос текущий
      Как я понимаю, это касается только change.
      > Что именно написали - ну, программа просто передаёт, не понимая.
      Это как? Код ведь отделяет зачет/незачет, плюс проверяет, является ли параметр после первого | ником или просто текстом = сверяет со списком кандидатов. Если ник, то это change. (это по первой части restricted) ~~‍~~ Jaguar K · 06:11, 5 августа 2022 (UTC)

Пожелание[править код]


Хотелось бы, чтобы в списке кандидатов, отображаемых этим модулем, после ника кандидата в скобках показывались буквы, указывающие на флаги, которые есть у кандидата. Насколько я понял, для этого надо изменить строчку № 203: :tag( 'td' ):css('text-align','center'):css('white-space','nowrap'):wikitext( table.concat{"[[".. arb_page .."/Голоса#", candidate, '|', candidate, "]] ([[", main_arb_page,"/Форум#", candidate,"|обс.]])"}):done(). MFot (обс.) 07:12, 2 августа 2022 (UTC)

  • Изменений нет. Речь про гаджет? Имхо он не будет добавлять флаги левым страницам, если специально не настроить. ~~‍~~ Jaguar K · 07:37, 2 августа 2022 (UTC)
  • сейчас ссылка стоит на страницу с голосами, вы хотите поставить на ЛС ·Carn 06:03, 5 августа 2022 (UTC)
    • Нет, Вы меня неправильно поняли. MFot (обс.) 14:38, 5 августа 2022 (UTC)
  • Предлагается вместо «Голоса (форум)» сделать «ЛС (голоса, форум)»? Не уверен, честно говоря: в предытогах самая полезная ссылка — как раз голоса, хотелось бы иметь её основной. Викизавр (обс.) 14:36, 5 августа 2022 (UTC)
    • Нет, я предлагаю не это. MFot (обс.) 14:38, 5 августа 2022 (UTC)
      • А, если вы предлагаете добавить флаги к странице с голосами, не к ЛС, то это нетривиально, так что нужен код. За его неимением техзапрос закрыл пока. Викизавр (обс.) 14:55, 5 августа 2022 (UTC)
        • Я предлагаю просто выводить информацию о флагах рядом с ником кандидата, а не добавить флаги к странице с голосами. MFot (обс.) 06:15, 6 августа 2022 (UTC)
          • 1) Вам придется написать код, который изменит поведение гаджета.
            Песочница для JS не существует, но можно тестировать прямо в браузере или размещать JS файлы в личном пространстве.
            или
            2) Вам придется написать код, который подтянет из гаджета список флагов в модуль и разместит их там, где вы хотите.
            Песочница для модулей: Модуль:Песочница. ~~‍~~ Jaguar K · 09:11, 6 августа 2022 (UTC)

обратная совместимость[править код]

На зкб есть такая тема, которая скоро уйдет в архив, так что предлагаю обсудить здесь.
Судя по комментариям в коде, старая система путей не поддерживается.
При замене /Форум на (главная) будет аналогично.

Я лично за поддержку путем добавления параметров навроде:
if(args[oldstyle]) // старая система путей
if(args[forum]) // /Форум
В случае с форумом, наверное, есть более элегантное решение. ~~‍~~ Jaguar K · 22:42, 4 августа 2022 (UTC)

  • Наверное проще пробегаться по всем вариантам и оставлять тот, который откликается. ·Carn 06:09, 5 августа 2022 (UTC)
    • А не будет ошибок? Нигде нет одновременно старой и новой ситстемы путей. например? Форум, вроде, везде один.. ~~‍~~ Jaguar K · 06:13, 5 августа 2022 (UTC)