HabrastatisticsαŸ– αžŸαŸ’αžœαŸ‚αž„αžšαž€αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž…αžΌαž›αž˜αžΎαž›αž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αž αž“αž·αž„αžαž·αž…αž”αŸ†αž•αž»αžαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš

ហេ αž αžΆαž”αŸ‹

Π’ αž•αŸ’αž“αŸ‚αž€αž˜αž»αž“αŸ” αž…αžšαžΆαž…αžšαžŽαŸαžšαž”αžŸαŸ‹ Habr αžαŸ’αžšαžΌαžœαž”αžΆαž“αžœαž·αž—αžΆαž‚αžαžΆαž˜αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž…αŸ†αž”αž„ - αž…αŸ†αž“αž½αž“αž’αžαŸ’αžαž”αž‘ αž‘αžŸαŸ’αžŸαž“αŸˆ αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž”αž‰αŸ’αž αžΆαž“αŸƒαž”αŸ’αžšαž‡αžΆαž”αŸ’αžšαž·αž™αž—αžΆαž–αž“αŸƒαž•αŸ’αž“αŸ‚αž€αž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αžαŸ‚αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αŸ” αžœαžΆαž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αžΎαž›αžšαžΏαž„αž“αŸαŸ‡αž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž›αž˜αŸ’αž’αž·αž αž“αž·αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αž αž“αž·αž„αž˜αž·αž“αž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαŸ” αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž₯αž‘αŸ’αž’αž·αž–αž› geektimes αž±αŸ’αž™αž”αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αžŠαŸ„αž™αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαŸ’αž˜αžΈαž“αŸƒαž’αžαŸ’αžαž”αž‘αž›αŸ’αž’αž”αŸ†αž•αž»αžαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž…αŸ†αžŽαžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αžαŸ’αž˜αžΈαŸ”

HabrastatisticsαŸ– αžŸαŸ’αžœαŸ‚αž„αžšαž€αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž…αžΌαž›αž˜αžΎαž›αž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αž αž“αž·αž„αžαž·αž…αž”αŸ†αž•αž»αžαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„ αž€αžΆαžšαž”αž“αŸ’αžαž‚αžΊαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹αŸ”

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αž˜αŸ’αžαž„αž‘αŸ€αžαžαžΆ αžŸαŸ’αžαž·αžαž· αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαž‘αŸ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αžαžΆαž„αž€αŸ’αž“αž»αž„αžŽαžΆαž˜αž½αž™αž‘αŸαŸ” αžœαžΆαž€αŸαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αžΆαžαžΆ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž’αŸ’αžœαžΎαžαž»αžŸαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™ αž¬αžαž€αžαžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ„αŸ‡αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ‚αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαžœαžΆαž”αŸ’αžšαŸ‚αž‡αžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ” αž™αžΎαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž€αžΌαžŠαž‡αžΆαž˜αž»αž“ αž’αŸ’αž“αž€αžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž’αžΆαž…αžšαŸ†αž›αž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ†αž”αžΌαž„αž”αžΆαž“αŸ”

αž€αžΆαžšβ€‹αž”αŸ’αžšαž˜αžΌαž›β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‰αŸ‚αž€ αž˜αžΆαž“αžαŸ‚αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž˜αžΎαž› αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαž’αžαŸ’αžαž”αž‘αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αž˜αž€αž–αž·αž…αžΆαžšαžŽαžΆαŸ” αž“αŸαŸ‡αž‚αžΊαž›αŸ’αž’αžšαž½αž…αž‘αŸ…αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž½αžšαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž‘αŸαŸ” αžœαžΆαžŠαž›αŸ‹αž–αŸαž›αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚αž•αŸ’αž“αŸ‚αž€αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž§αž‘αžΆαž αžšαžŽαŸ αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ’αžšαž‡αžΆαž”αŸ’αžšαž·αž™αž—αžΆαž–αž“αŸƒαž•αŸ’αž“αŸ‚αž€ "C++" αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αž†αŸ’αž“αžΆαŸ†αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‰αŸ‚αž€αž’αžαŸ’αžαž”αž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αž›αž˜αŸ’αž’ αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαžαŸ’αžšαž‘αž”αŸ‹αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αžŠαŸ‚αž›αž’αžαŸ’αžαž”αž‘αž‡αžΆαž€αž˜αŸ’αž˜αžŸαž·αž‘αŸ’αž’αž· αž€αŸαžŠαžΌαž…αž‡αžΆαžˆαŸ’αž˜αŸ„αŸ‡αž αŸ…αž€αŸ’αžšαŸ…αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’ αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹ (αžšαžΏαž„αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž’αžΆαž…αž’αŸ’αžœαžΎαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž“αžΉαž„αž˜αž€αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™)αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš 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
...

αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ”

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)

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αžŠαžΆαž€αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž€αŸ’αžšαž»αž˜αžαžΆαž˜αžαŸ’αž„αŸƒ αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ”

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 only" αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž’αžαŸ’αžαž”αž‘αž˜αž½αž™αž’αžΆαž…αž‡αžΆαž€αž˜αŸ’αž˜αžŸαž·αž‘αŸ’αž’αž·αžšαž”αžŸαŸ‹αž•αŸ’αž“αŸ‚αž€αž‘αžΆαŸ†αž„αž–αžΈαžšαž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™ (αž§αž‘αžΆαž αžšαžŽαŸ "DIY" + "microcontrollers" + "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 αž”αžΆαž“αž‘αŸ…αžœαž·αžŸαŸ’αžŸαž˜αž€αžΆαž› ;)

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž€αŸ’αžšαžΆαž αŸ’αžœαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž…αŸ†αžŽαž»αž…αž€αŸ†αž–αžΌαž›αž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž–αžΈαžšαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž˜αžΎαž›αž’αžαŸ’αžαž”αž‘ - αžαŸ’αž„αŸƒαžˆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž€αž†αŸ’αž“αžΆαŸ†αžαŸ’αž˜αžΈ αž“αž·αž„αžαŸ‚αž§αžŸαž—αžΆαŸ”

αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŠαŸ‚αž›αž”αžΆαž“αžŸαž“αŸ’αž™αžΆαž“αŸƒαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αŸ” αž…αžΌαžšαžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž€αŸ†αž–αžΌαž›αž‘αžΆαŸ†αž„ 20 αžαžΆαž˜αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž˜αžΎαž›αŸ–

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αŸ– αžŸαŸ’αžœαŸ‚αž„αžšαž€αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž…αžΌαž›αž˜αžΎαž›αž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αž αž“αž·αž„αžαž·αž…αž”αŸ†αž•αž»αžαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„αž˜αž½αž™ αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž€αŸ†αž–αžΌαž›αž€αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αžΎαž›αžƒαžΎαž‰αž•αž„αžŠαŸ‚αžšαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž˜αžΎαž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž€αŸαžŠαŸ„αž™αŸ”

αž€αžΆαžšαžœαžΆαž™αžαŸ†αž›αŸƒ

αž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αžŸαž“αŸ’αž™αžΆαŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αžΆαžšαžœαž·αž—αžΆαž‚αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž› αž™αžΎαž„αž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αž’αžαŸ’αžαž”αž‘αž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž†αŸ’αž“αžΆαŸ† 2019 αž“αŸαŸ‡αŸ”

αžŸαž“αŸ’αžαž·αžŸαž»αžαž–αŸαžαŸŒαž˜αžΆαž“

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αžœαž·αž‘αŸ’αž™αžΆαžŸαžΆαžŸαŸ’αžαŸ’αžšαž–αŸαž‰αž“αž·αž™αž˜

αž’αžΆαž‡αžΈαž–

αž…αŸ’αž”αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ IT

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš

GTK

αž αžΎαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž€αŸ‹αž’αž“αŸ‹αž…αž·αžαŸ’αž αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž…αŸ†αžŽαžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž“αŸƒαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αžŠαŸ‚αž›αž”αžΆαž“αž…αžΌαž›αž˜αžΎαž›αžαž·αž…αž”αŸ†αž•αž»αž "gtk" αŸ” αž€αŸ’αž“αž»αž„αž˜αž½αž™αž†αŸ’αž“αžΆαŸ†αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž– αž˜αž½αž™ αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž› "αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·" αž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹αž‡αž½αžšαž‘αžΈαž˜αž½αž™αž“αŸƒαž€αžΆαžšαžœαžΆαž™αžαž˜αŸ’αž›αŸƒαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžœαžΆαž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“αž‘αŸαŸ” αžšαžΈαž€αžšαžΆαž™αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹