{"id":39916516,"url":"https://github.com/hexqnt/langrank","last_synced_at":"2026-04-13T10:02:00.131Z","repository":{"id":321901399,"uuid":"1087188259","full_name":"hexqnt/langrank","owner":"hexqnt","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-15T10:56:03.000Z","size":145,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-15T15:51:15.045Z","etag":null,"topics":["programming-language","ranking"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hexqnt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-31T14:07:58.000Z","updated_at":"2026-01-15T10:54:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"e869d8d3-1fb2-43ed-8ae1-f485aea64efa","html_url":"https://github.com/hexqnt/langrank","commit_stats":null,"previous_names":["hexqnt/langrank"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/hexqnt/langrank","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexqnt%2Flangrank","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexqnt%2Flangrank/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexqnt%2Flangrank/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexqnt%2Flangrank/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hexqnt","download_url":"https://codeload.github.com/hexqnt/langrank/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexqnt%2Flangrank/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28543495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["programming-language","ranking"],"created_at":"2026-01-18T17:00:34.323Z","updated_at":"2026-04-13T10:02:00.122Z","avatar_url":"https://github.com/hexqnt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌟 LangRank\n\n[![CI](https://github.com/hexqnt/langrank/actions/workflows/ci.yml/badge.svg)](https://github.com/hexqnt/langrank/actions/workflows/ci.yml)\n\nLangRank — утилита на Rust, которая собирает свежие рейтинги популярности языков программирования (TIOBE, PYPL, Languish), объединяет их с данными Benchmarks Game и TechEmpower Framework Benchmarks, и вычисляет итоговое ранжирование по методу Шульце.\n\n![LangRank poster](img/poster.gif)\n\n\u003csup\u003e🎨 Визуализация итогового рейтинга\u003c/sup\u003e\n\n## 📋 Содержание\n\n- [📚 О проекте](#-о-проекте)\n- [🛠️ Сборка и запуск](#️-сборка-и-запуск)\n- [💾 Сохранение выгрузок](#-сохранение-выгрузок)\n- [🖼️ HTML-отчёт](#️-html-отчёт)\n- [🧮 Алгоритм Шульце](#-алгоритм-шульце)\n- [🤖 Автодополнение команд](#-автодополнение-команд)\n- [🌐 Источники данных](#-источники-данных)\n- [🧱 Статическая сборка](#-статическая-сборка)\n\n## 📚 О проекте\n\nПриложение ориентировано на быструю сверку разных метрик популярности языков. Оно:\n\n1. Подтягивает сводки рейтингов [TIOBE](https://www.tiobe.com/tiobe-index/), [PYPL](https://pypl.github.io/PYPL.html) и [Languish](https://tjpalmer.github.io/languish/).\n2. Нормализует названия языков и объединяет показатели.\n3. Скачивает CSV Benchmarks Game и вычисляет относительную скорость (геометрическое среднее по отношению к лучшим результатам на задачах).\n4. Считывает TechEmpower Framework Benchmarks и берёт лучший фреймворк языка по композитному score.\n5. Строит итоговую таблицу по методу Шульце, учитывая популярность и производительность.\n\n## 🛠️ Сборка и запуск\n\n```bash\n# Запуск с выводом топ-10 в терминале\ncargo run --release\n\n# Подробный вывод с полным Schulze-ранжированием\ncargo run --release -- --full-output\n```\n\n## 💾 Сохранение выгрузок\n\nКаждый флаг можно передать без пути — в этом случае используется значение по умолчанию. Добавьте `--archive-csv`, чтобы сохранять CSV в `.gz` (удобно для публикации на сайте).\n\n```bash\n# Сохраняем комбинированные рейтинги и Schulze-таблицу\ncargo run --release -- \\\n  --save-rankings data/output/rankings.csv \\\n  --save-schulze\n\n# Сохраняем CSV Benchmarks Game в кастомный путь\ncargo run --release -- --save-benchmarks data/raw/alldata.csv\n\n# Сохраняем CSV в gzip-архивы\ncargo run --release -- --save-rankings --save-schulze --archive-csv\n```\n\n## 🖼️ HTML-отчёт\n\nLangRank умеет генерировать красивую HTML-страницу с итоговой таблицей, которую можно раздавать статически через nginx.\nЕсли включён `--full-output`, в отчёт попадёт полная таблица, иначе — топ‑10.\nПри использовании `--archive-csv` ссылки в HTML будут указывать на `.gz`.\nМинификация HTML включена по умолчанию; отключить её можно флагом `--no-minify-html`.\n\n```bash\n# Сохранить HTML-отчёт (по умолчанию data/output/report.html)\ncargo run --release -- --save-html\n\n# Сохранить HTML-отчёт в кастомный путь\ncargo run --release -- --save-html report.html\n\n# Полная таблица в HTML\ncargo run --release -- --save-html report.html --full-output\n\n# Отключить минификацию HTML\ncargo run --release -- --save-html report.html --no-minify-html\n```\n\n## 🧮 Алгоритм Шульце\n\nLangRank строит четыре «бюллетеня» предпочтений: по позициям в TIOBE, PYPL, Languish и по итоговому показателю Perf (объединение Benchmarks Game и TechEmpower). Затем для каждого языка вычисляется количество побед над конкурентами в матрице сильнейших путей Шульце. При равенстве используется комбинированный счёт: доли рейтингов + Perf.\n\nBG считается по данным Benchmarks Game так:\n\n$$\n\\mathrm{ratio}_t = \\frac{\\mathrm{best\\_time}_t}{\\mathrm{lang\\_time}_t}\n$$\n\n$$\n\\mathrm{BG} = \\exp\\left(\\frac{1}{N}\\sum_{t=1}^{N} \\ln(\\mathrm{ratio}_t)\\right)\n$$\n\nгде $\\mathrm{best\\_time}_t$ — лучшее (минимальное) время среди всех языков на задаче $t$,\n$\\mathrm{lang\\_time}_t$ — время языка на этой задаче, $N$ — число задач с валидными данными.\nЗначение лежит в (0, 1]: чем ближе к 1, тем быстрее относительно лучшего результата.\n\nTechEmpower (TE) считается так:\n\n1. Берём последний доступный официальный round `roundN/ph.json` (для поддерживаемых раундов `N \u003e= 21`) со страницы\n   `https://www.techempower.com/benchmarks/results/` (round определяется из JS-бандла страницы benchmarks).\n2. Для каждого фреймворка считаем пропускную способность (RPS) по каждому тесту:\n   JSON, Plaintext, Single Query (db), Multi Query (query), Fortunes (fortune), Updates (update).\n3. Нормализуем RPS по каждому тесту, деля на максимальный RPS среди всех фреймворков в этом тесте.\n4. Считаем композитный score фреймворка с весами (TPR bias coefficients):\n   JSON=1.0, Plaintext=0.75, db=0.75, query=0.75, fortune=1.5, update=1.25.\n5. Для языка берём лучший (максимальный) score среди всех его фреймворков.\n\nФормулы:\n\n$$\n\\mathrm{RPS}_{f,t} = \\frac{\\mathrm{total\\_requests}_{f,t}}{(\\mathrm{end}_t - \\mathrm{start}_t)/1000}\n$$\n\n$$\n\\mathrm{norm}_{f,t} = \\frac{\\mathrm{RPS}_{f,t}}{\\max\\_f \\mathrm{RPS}_{f,t}}\n$$\n\n$$\n\\mathrm{TE\\_framework}_f = \\sum_{t \\in T} w_t \\cdot \\mathrm{norm}_{f,t}\n$$\n\n$$\n\\mathrm{TE\\_language} = \\max_{f \\in \\mathrm{frameworks(language)}} \\mathrm{TE\\_framework}_f\n$$\n\nЕсли у языка нет данных TE, используется 0.\n\nPerf — объединённый показатель на основе BG и TE. TE нормализуется к диапазону 0..1, после чего берётся среднее. Если у языка нет BG или TE, соответствующий компонент считается 0 (в таблицах для BG/TE отображается «-»). Если нет ни BG, ни TE, Perf также показывается как «-».\n\n$$\n\\mathrm{TE\\_norm} = \\frac{\\mathrm{TE}}{6}\n$$\n\n$$\n\\mathrm{Perf} = \\frac{\\mathrm{BG} + \\mathrm{TE\\_norm}}{2}\n$$\n\n \n\n## 🤖 Автодополнение команд\n\nУтилита умеет генерировать скрипты автодополнения для популярных оболочек:\n\n```bash\n# Сгенерировать и установить автодополнение для Bash\ncargo run -- completions bash --install\n\n# Вывести скрипт для fish в stdout\ncargo run -- completions fish\n```\n\n## 🌐 Источники данных\n\n- 🔵 TIOBE Index — \u003chttps://www.tiobe.com/tiobe-index/\u003e\n- 🔶 PYPL Popularity Index — \u003chttps://pypl.github.io/PYPL.html\u003e\n- 🟢 Languish (Programming Language Trends) — \u003chttps://tjpalmer.github.io/languish/\u003e\n- 🟥 Benchmarks Game — \u003chttps://salsa.debian.org/benchmarksgame-team/benchmarksgame/-/raw/master/public/data/alldata.csv\u003e\n- 🟣 TechEmpower Framework Benchmarks — \u003chttps://www.techempower.com/benchmarks/\u003e\n  и `https://www.techempower.com/benchmarks/results/round21+/ph.json`\n\n## 🧱 Статическая сборка\n\nДля сборки статического бинарника под Linux/musl используйте скрипт:\n\n```bash\n./build_musl.sh\n```\n\nОн запускает официальный контейнер `clux/muslrust:nightly` и собирает релизную версию.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexqnt%2Flangrank","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhexqnt%2Flangrank","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexqnt%2Flangrank/lists"}