Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

Hey Habr.

ะ’ เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ‚เบญเบ‡ Habr เป„เบ”เป‰เบ–เบทเบเบงเบดเป€เบ„เบฒเบฐเบ•เบฒเบกเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป - เบˆเปเบฒเบ™เบงเบ™เบšเบปเบ”เบ„เบงเบฒเบก, เบ—เบฑเบ”เบชเบฐเบ™เบฐเปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ™เบดเบเบปเบกเบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบš. เบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบšเบดเปˆเบ‡เบ™เบตเป‰เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบŠเบญเบเบซเบฒเบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเบ™เบดเบเบปเบกเปเบฅเบฐเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบ™เบดเบเบปเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”. เบชเบธเบ”เบ—เป‰เบฒเบ, เบ‚เป‰เบญเบเบˆเบฐเป€เบšเบดเปˆเบ‡เบœเบปเบ™เบเบฐเบ—เบปเบš geektimes เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเปƒเบซเบกเปˆเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเปƒเบซเบกเปˆ.

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบเบฒเบ™เบชเบทเบšเบ•เปเปˆเปเบกเปˆเบ™เบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ•เบฑเบ”.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบงเปˆเบฒเบชเบฐเบ–เบดเบ•เบดเปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบšเปเปˆเปเบกเปˆเบ™เบ—เบฒเบ‡เบเบฒเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบžเบฒเบเปƒเบ™. เบกเบฑเบ™เบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบœเบดเบ”เบžเบฒเบ”เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบžเบฒเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบเปˆเบญเบ™; เบœเบนเป‰เบ—เบตเปˆเบšเปเปˆเบชเบปเบ™เปƒเบˆเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเบžเบฒเบเบ—เปเบฒเบญเบดเบ”.

เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบเปเบฒโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹

เปƒเบ™เบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡ parser, เบžเบฝเบ‡เปเบ•เปˆเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ views, เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเป„เบ”เป‰เบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เบ”เบตเปเบฅเป‰เบง, เปเบ•เปˆเบกเบฑเบ™เบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ. เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบงเบดเป€เบ„เบฒเบฐเบžเบฒเบเบชเปˆเบงเบ™เบซเบปเบงเบ‚เปเป‰เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ; เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบเบฒเบ™เบ„เบปเป‰เบ™เบ„เบงเป‰เบฒเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบ, เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ„เบงเบฒเบกเบ™เบดเบเบปเบกเบ‚เบญเบ‡เบžเบฒเบ "C++" เป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบ™เบงเปƒเบ”เปƒเบ™เบซเบฅเบฒเบเบ›เบต.

parser เบšเบปเบ”เบ„เบงเบฒเบกเป„เบ”เป‰เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡, เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เบเบฑเบšเบ„เบทเบ™เบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเบšเบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบŠเบทเปˆเบ‚เบญเบ‡เบœเบนเป‰เบ‚เบฝเบ™เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบ‚เบญเบ‡เบฅเบฒเบง (เบซเบผเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆเบกเบฑเบ™เบˆเบฐเบกเบฒเปƒเบ™เบžเบฒเบเบซเบฅเบฑเบ‡). เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™เป„เบŸเบฅเปŒ csv เบ—เบตเปˆเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ„เป‰เบฒเบเบ„เบทเบ™เบตเป‰:

2018-12-18T12:43Z,https://habr.com/ru/post/433550/,"ะœะตััะตะฝะดะถะตั€ Slack โ€” ะฟั€ะธั‡ะธะฝั‹ ะฒั‹ะฑะพั€ะฐ, ะบะพััะบะธ ะฟั€ะธ ะฒะฝะตะดั€ะตะฝะธะธ ะธ ะพัะพะฑะตะฝะฝะพัั‚ะธ ัะตั€ะฒะธัะฐ, ะพะฑะปะตะณั‡ะฐัŽั‰ะธะต ะถะธะทะฝัŒ",votes:7,votesplus:8,votesmin:1,bookmarks:32,
views:8300,comments:10,user:ReDisque,karma:5,subscribers:2,hubs:productpm+soft
...

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบนเบ™เบเบฒเบ‡ thematic เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ.

def get_as_str(link: str) -> Str:
    try:
        r = requests.get(link)
        return Str(r.text)
    except Exception as e:
        return Str("")

def get_hubs():
    hubs = []
    for p in range(1, 12):
        page_html = get_as_str("https://habr.com/ru/hubs/page%d/" % p)
        # page_html = get_as_str("https://habr.com/ru/hubs/geektimes/page%d/" % p)  # Geektimes
        # page_html = get_as_str("https://habr.com/ru/hubs/develop/page%d/" % p)  # Develop
        # page_html = get_as_str("https://habr.com/ru/hubs/admin/page%d" % p)  # Admin
        for hub in page_html.split("media-obj media-obj_hub"):
            info = Str(hub).find_between('"https://habr.com/ru/hub', 'list-snippet__tags') 
            if "*</span>" in info:
                hub_name = info.find_between('/', '/"')
                if len(hub_name) > 0 and len(hub_name) < 32:
                    hubs.append(hub_name)
    print(hubs)

เบŸเบฑเบ‡เบŠเบฑเบ™ find_between เปเบฅเบฐเบŠเบฑเป‰เบ™ Str เป€เบฅเบทเบญเบเบชเบฐเบ•เบฃเบดเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡เปเบ—เบฑเบ, เบ‚เป‰เบญเบเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™ เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰. เบชเบนเบ™เบเบฒเบ‡เบซเบปเบงเบ‚เปเป‰เบ–เบทเบเบซเบกเบฒเบเบ”เป‰เบงเบ "*" เป€เบžเบทเปˆเบญเปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเป„เบ”เป‰เบ‡เปˆเบฒเบ, เปเบฅเบฐเบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบเบปเบเป€เบฅเบตเบเบ„เปเบฒเบ„เบดเบ”เบ„เปเบฒเป€เบซเบฑเบ™เบ‚เบญเบ‡เบชเบฒเบเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบญเบทเปˆเบ™เป†.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ get_hubs เปเบกเปˆเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบซเบ™เป‰เบฒเบ›เบฐเบ—เบฑเบšเปƒเบˆ, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบšเบฑเบ™เบ—เบถเบเป€เบ›เบฑเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบก. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ•เบปเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบฒเบ”เบ„เบฐเป€เบ™เบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

hubs_profile = {'infosecurity', 'programming', 'webdev', 'python', 'sys_admin', 'it-infrastructure', 'devops', 'javascript', 'open_source', 'network_technologies', 'gamedev', 'cpp', 'machine_learning', 'pm', 'hr_management', 'linux', 'analysis_design', 'ui', 'net', 'hi', 'maths', 'mobile_dev', 'productpm', 'win_dev', 'it_testing', 'dev_management', 'algorithms', 'go', 'php', 'csharp', 'nix', 'data_visualization', 'web_testing', 's_admin', 'crazydev', 'data_mining', 'bigdata', 'c', 'java', 'usability', 'instant_messaging', 'gtd', 'system_programming', 'ios_dev', 'oop', 'nginx', 'kubernetes', 'sql', '3d_graphics', 'css', 'geo', 'image_processing', 'controllers', 'game_design', 'html5', 'community_management', 'electronics', 'android_dev', 'crypto', 'netdev', 'cisconetworks', 'db_admins', 'funcprog', 'wireless', 'dwh', 'linux_dev', 'assembler', 'reactjs', 'sales', 'microservices', 'search_technologies', 'compilers', 'virtualization', 'client_side_optimization', 'distributed_systems', 'api', 'media_management', 'complete_code', 'typescript', 'postgresql', 'rust', 'agile', 'refactoring', 'parallel_programming', 'mssql', 'game_promotion', 'robo_dev', 'reverse-engineering', 'web_analytics', 'unity', 'symfony', 'build_automation', 'swift', 'raspberrypi', 'web_design', 'kotlin', 'debug', 'pay_system', 'apps_design', 'git', 'shells', 'laravel', 'mobile_testing', 'openstreetmap', 'lua', 'vs', 'yii', 'sport_programming', 'service_desk', 'itstandarts', 'nodejs', 'data_warehouse', 'ctf', 'erp', 'video', 'mobileanalytics', 'ipv6', 'virus', 'crm', 'backup', 'mesh_networking', 'cad_cam', 'patents', 'cloud_computing', 'growthhacking', 'iot_dev', 'server_side_optimization', 'latex', 'natural_language_processing', 'scala', 'unreal_engine', 'mongodb', 'delphi',  'industrial_control_system', 'r', 'fpga', 'oracle', 'arduino', 'magento', 'ruby', 'nosql', 'flutter', 'xml', 'apache', 'sveltejs', 'devmail', 'ecommerce_development', 'opendata', 'Hadoop', 'yandex_api', 'game_monetization', 'ror', 'graph_design', 'scada', 'mobile_monetization', 'sqlite', 'accessibility', 'saas', 'helpdesk', 'matlab', 'julia', 'aws', 'data_recovery', 'erlang', 'angular', 'osx_dev', 'dns', 'dart', 'vector_graphics', 'asp', 'domains', 'cvs', 'asterisk', 'iis', 'it_monetization', 'localization', 'objectivec', 'IPFS', 'jquery', 'lisp', 'arvrdev', 'powershell', 'd', 'conversion', 'animation', 'webgl', 'wordpress', 'elm', 'qt_software', 'google_api', 'groovy_grails', 'Sailfish_dev', 'Atlassian', 'desktop_environment', 'game_testing', 'mysql', 'ecm', 'cms', 'Xamarin', 'haskell', 'prototyping', 'sw', 'django', 'gradle', 'billing', 'tdd', 'openshift', 'canvas', 'map_api', 'vuejs', 'data_compression', 'tizen_dev', 'iptv', 'mono', 'labview', 'perl', 'AJAX', 'ms_access', 'gpgpu', 'infolust', 'microformats', 'facebook_api', 'vba', 'twitter_api', 'twisted', 'phalcon', 'joomla', 'action_script', 'flex', 'gtk', 'meteorjs', 'iconoskaz', 'cobol', 'cocoa', 'fortran', 'uml', 'codeigniter', 'prolog', 'mercurial', 'drupal', 'wp_dev', 'smallbasic', 'webassembly', 'cubrid', 'fido', 'bada_dev', 'cgi', 'extjs', 'zend_framework', 'typography', 'UEFI', 'geo_systems', 'vim', 'creative_commons', 'modx', 'derbyjs', 'xcode', 'greasemonkey', 'i2p', 'flash_platform', 'coffeescript', 'fsharp', 'clojure', 'puppet', 'forth', 'processing_lang', 'firebird', 'javame_dev', 'cakephp', 'google_cloud_vision_api', 'kohanaphp', 'elixirphoenix', 'eclipse', 'xslt', 'smalltalk', 'googlecloud', 'gae', 'mootools', 'emacs', 'flask', 'gwt', 'web_monetization', 'circuit-design', 'office365dev', 'haxe', 'doctrine', 'typo3', 'regex', 'solidity', 'brainfuck', 'sphinx', 'san', 'vk_api', 'ecommerce'}

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, เบžเบฒเบเบชเปˆเบงเบ™ geektimes เป€เบšเบดเปˆเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบซเบผเบฒเบ:

hubs_gt = {'popular_science', 'history', 'soft', 'lifehacks', 'health', 'finance', 'artificial_intelligence', 'itcompanies', 'DIY', 'energy', 'transport', 'gadgets', 'social_networks', 'space', 'futurenow', 'it_bigraphy', 'antikvariat', 'games', 'hardware', 'learning_languages', 'urban', 'brain', 'internet_of_things', 'easyelectronics', 'cellular', 'physics', 'cryptocurrency', 'interviews', 'biotech', 'network_hardware', 'autogadgets', 'lasers', 'sound', 'home_automation', 'smartphones', 'statistics', 'robot', 'cpu', 'video_tech', 'Ecology', 'presentation', 'desktops', 'wearable_electronics', 'quantum', 'notebooks', 'cyberpunk', 'Peripheral', 'demoscene', 'copyright', 'astronomy', 'arvr', 'medgadgets', '3d-printers', 'Chemistry', 'storages', 'sci-fi', 'logic_games', 'office', 'tablets', 'displays', 'video_conferencing', 'videocards', 'photo', 'multicopters', 'supercomputers', 'telemedicine', 'cybersport', 'nano', 'crowdsourcing', 'infographics'}

เบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเป„เบ”เป‰เบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰เปƒเบ™เบ—เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™. เบ”เบฝเบงเบ™เบตเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบ‚เบญเบ‡ geektimes เบซเบผเบทเบชเบนเบ™เป‚เบ›เบฃเป„เบŸเบฅเปŒ.

def is_geektimes(hubs: List) -> bool:
    return len(set(hubs) & hubs_gt) > 0

def is_geektimes_only(hubs: List) -> bool:
    return is_geektimes(hubs) is True and is_profile(hubs) is False

def is_profile(hubs: List) -> bool:
    return len(set(hubs) & hubs_profile) > 0

เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบžเบฒเบเบชเปˆเบงเบ™เบญเบทเปˆเบ™เป† ("เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ", "เบเบฒเบ™เบšเปเบฅเบดเบซเบฒเบ™", เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡

เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ. เบžเบงเบเป€เบฎเบปเบฒเป‚เบซเบผเบ”เบŠเบธเบ”เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบชเบนเบ™.

def to_list(s: str) -> List[str]:
    # "user:popular_science+astronomy" => [popular_science, astronomy]
    return s.split(':')[1].split('+')

def to_date(dt: datetime) -> datetime.date:
    return dt.date()

df = pd.read_csv("habr_2019.csv", sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#')
dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ')
dates += datetime.timedelta(hours=3)
df['date'] = dates.map(to_date, na_action=None)
hubs = df["hubs"].map(to_list, na_action=None)
df['hubs'] = hubs
df['is_profile'] = hubs.map(is_profile, na_action=None)
df['is_geektimes'] = hubs.map(is_geektimes, na_action=None)
df['is_geektimes_only'] = hubs.map(is_geektimes_only, na_action=None)
df['is_admin'] = hubs.map(is_admin, na_action=None)
df['is_develop'] = hubs.map(is_develop, na_action=None)

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบธเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เปเบ•เปˆเบฅเบฐเบกเบทเป‰เปเบฅเบฐเบชเบฐเปเบ”เบ‡เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบžเบดเบกเบชเปเบฒเบฅเบฑเบš hubs เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.

g = df.groupby(['date'])
days_count = g.size().reset_index(name='counts')
year_days = days_count['date'].values
grouped = g.sum().reset_index()
profile_per_day_avg = grouped['is_profile'].rolling(window=20, min_periods=1).mean()
geektimes_per_day_avg = grouped['is_geektimes'].rolling(window=20, min_periods=1).mean()
geektimesonly_per_day_avg = grouped['is_geektimes_only'].rolling(window=20, min_periods=1).mean()
admin_per_day_avg = grouped['is_admin'].rolling(window=20, min_periods=1).mean()
develop_per_day_avg = grouped['is_develop'].rolling(window=20, min_periods=1).mean()

เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเปเบ”เบ‡เบˆเปเบฒเบ™เบงเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ•เบตเบžเบดเบกเป‚เบ”เบเปƒเบŠเป‰ Matplotlib:

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เปเบšเปˆเบ‡เบšเบปเบ”เบ„เบงเบฒเบก "geektimes" เปเบฅเบฐ "geektimes เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™" เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒ เบšเบปเบ”เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, "DIY" + "เป„เบกเป‚เบ„เบ„เบญเบ™เป‚เบ—เบฃ" + "C++"). เบ‚เป‰เบญเบเปƒเบŠเป‰เบเบฒเบ™เบญเบญเบเปเบšเบš "เป‚เบ›เบฃเป„เบŸเบฅเปŒ" เป€เบžเบทเปˆเบญเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบšเบปเบ”เบ„เบงเบฒเบกเป‚เบ›เบฃเป„เบŸเบฅเปŒเบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบ—เบตเบ„เปเบฒเบชเบฑเบšเบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”เบชเปเบฒเบฅเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”.

เปƒเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ–เบฒเบกเบเปˆเบฝเบงเบเบฑเบš "เบœเบปเบ™เบเบฐเบ—เบปเบš geektimes" เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบˆเปˆเบฒเบเป€เบ‡เบดเบ™เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบชเปเบฒเบฅเบฑเบš geektimes เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบฅเบฐเบ”เบนเบฎเป‰เบญเบ™เบ™เบตเป‰. เปƒเบซเป‰เบชเบฐเปเบ”เบ‡เบšเบปเบ”เบ„เบงเบฒเบก geektimes เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ:

df_gt = df[(df['is_geektimes_only'] == True)]
group_gt = df_gt.groupby(['date'])
days_count_gt = group_gt.size().reset_index(name='counts')
grouped = group_gt.sum().reset_index()
year_days_gt = days_count_gt['date'].values
view_gt_per_day_avg = grouped['views'].rolling(window=20, min_periods=1).mean()

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ. เบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เป‚เบ”เบเบ›เบฐเบกเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก geektimes เบเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡เบ›เบฐเบกเบฒเบ™ 1:5. เปเบ•เปˆเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบขเปˆเบฒเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”, เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบปเบ”เบ„เบงเบฒเบก "เบšเบฑเบ™เป€เบ—เบตเบ‡" เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ”เบฝเบงเบเบฑเบ™.

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบ™เบžเบฒเบ "geektimes" เบเบฑเบ‡เบซเบผเบธเบ”เบฅเบปเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบš, เปเบ•เปˆ "เป‚เบ”เบเบ•เบฒ", เบšเปเปˆเป€เบเบตเบ™ 5% เบ‚เบญเบ‡เบกเบนเบ™เบ„เปˆเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”.

เบกเบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบšเบดเปˆเบ‡เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบชเบฐเป€เบฅเปˆเบเบ•เปเปˆเบšเบปเบ”เบ„เบงเบฒเบก:

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบก "เบšเบฑเบ™เป€เบ—เบตเบ‡" เบกเบฑเบ™เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 40% เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบชเบฐเป€เบฅเปˆเบ. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเปเบ›เบเปƒเบˆ. เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เป€เบ”เบทเบญเบ™เป€เบกเบชเบฒเปเบกเปˆเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ, เบšเบฒเบ‡เบ—เบตเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™, เบซเบผเบทเบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เบซเบผเบทเบšเบฒเบ‡เบ—เบตเบœเบนเป‰เบ‚เบฝเบ™ geektimes เป„เบ”เป‰เป„เบ›เบžเบฑเบเบœเปˆเบญเบ™ ;).

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบชเบญเบ‡เบˆเบธเบ”เบชเบนเบ‡เบชเบธเบ”เบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบปเบ”เบ„เบงเบฒเบก - เบงเบฑเบ™เบžเบฑเบเบ›เบตเปƒเบซเบกเปˆเปเบฅเบฐเป€เบ”เบทเบญเบ™เบžเบถเบ”เบชเบฐเบžเบฒ.

เบชเบนเบ™เบเบฒเบ‡

เปƒเบซเป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ—เบตเปˆเบชเบฑเบ™เบเบฒเป„เบงเป‰เบ‚เบญเบ‡ hubs. เบ‚เปเปƒเบซเป‰เบˆเบฑเบ”เบฅเบฒเบเบเบฒเบ™ 20 hubs เบญเบฑเบ™เบ”เบฑเบšเบ•เบปเป‰เบ™เป‚เบ”เบเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบšเบดเปˆเบ‡:

hubs_info = []
for hub_name in hubs_all:
    mask = df['hubs'].apply(lambda x: hub_name in x)
    df_hub = df[mask]

    count, views = df_hub.shape[0], df_hub['views'].sum()
    hubs_info.append((hub_name, count, views))

# Draw hubs
hubs_top = sorted(hubs_info, key=lambda v: v[2], reverse=True)[:20]
top_views = list(map(lambda x: x[2], hubs_top))
top_names = list(map(lambda x: x[0], hubs_top))

plt.rcParams["figure.figsize"] = (8, 6)
plt.bar(range(0, len(top_views)), top_views)
plt.xticks(range(0, len(top_names)), top_names, rotation=90)
plt.ticklabel_format(style='plain', axis='y')
plt.tight_layout()
plt.show()

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เปเบ›เบเบ—เบตเปˆ, เบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเบ™เบดเบเบปเบกเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบ—เบฑเบ”เบชเบฐเบ™เบฐเปเบกเปˆเบ™ "เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ”เป‰เบฒเบ™เบ‚เปเป‰เบกเบนเบ™"; เบœเบนเป‰เบ™เปเบฒ 5 เบŠเบฑเป‰เบ™เบ™เปเบฒเบเบฑเบ‡เบฅเบงเบกเป€เบญเบปเบฒ "เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก" เปเบฅเบฐ "เบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เบ—เบตเปˆเบ™เบดเบเบปเบก".

Antitop เบ„เบญเบšเบ„เบญเบ‡ Gtk เปเบฅเบฐ Cocoa.

Habrastatistics: เบ„เบปเป‰เบ™เบซเบฒเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป„เบ”เป‰เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบฅเบฐเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒ

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบšเบญเบโ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบฅเบฑเบšโ€‹, เบชเบนเบ™โ€‹เบเบฒเบ‡โ€‹เป€เบ—เบดเบ‡โ€‹เบเบฑเบ‡โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบซเบฑเบ™โ€‹ เบ—เบตเปˆเบ™เบตเป‰, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡ views เบšเปเปˆเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™.

Rating

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบชเบฑเบ™เบเบฒ. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ™เบดเบเบปเบกเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเบ™เบดเบเบปเบกเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบ›เบต 2019 เบ™เบตเป‰.

เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เปเป‰เบกเบนเบ™เบ‚เปˆเบฒเบงเบชเบฒเบ™

เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก

เบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เบ—เบตเปˆเบ™เบดเบเบปเบก

เบญเบฒเบŠเบตเบš

เบ™เบดเบ•เบดเบเปเบฒเปƒเบ™ IT

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบงเบฑเบš

GTK

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบžเบทเปˆเบญเบงเปˆเบฒเบšเปเปˆเบกเบตเปƒเบœเบœเบดเบ”เบซเบงเบฑเบ‡, เบ‚เป‰เบญเบเบˆเบฐเปƒเบซเป‰เบ„เบฐเปเบ™เบ™เบ‚เบญเบ‡เบชเบนเบ™เบเบฒเบ‡เบ—เบตเปˆเป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ” "gtk". เบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เบ›เบตเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบžเบตเบกเบกเบฒ เบซเบ™เบถเปˆเบ‡ เบšเบปเบ”เบ„เบงเบฒเบก, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡ "เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”" เบ„เบญเบšเบ„เบญเบ‡เปเบ–เบงเบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบš.

เบชเบฐเบซเบฅเบธเบš

เบˆเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบฐเบซเบฅเบธเบš. เบ‚เปเปƒเบซเป‰เบ—เบธเบเบ„เบปเบ™เบกเบตเบ„เบงเบฒเบกเบชเบธเบเบเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™