เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดนเดฒเต‹, เดนเดฌเตเตผ.

ะ’ เดฎเตเตป เดญเดพเด—เด‚ เดชเตเดฐเดงเดพเดจ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดนเดฌเดฑเดฟเดจเตเดฑเต† เดŸเตเดฐเดพเดซเดฟเด•เต เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดคเต - เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚, เด…เดตเดฏเตเดŸเต† เด•เดพเดดเตเดšเด•เตพ, เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เตเด•เตพ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดธเตˆเดฑเตเดฑเต เดตเดฟเดญเดพเด—เด™เตเด™เดณเตเดŸเต† เดœเดจเดชเตเดฐเต€เดคเดฟเดฏเตเดŸเต† เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดชเตเดชเต†เดŸเดพเดคเต† เดคเตเดŸเตผเดจเตเดจเต. เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเต เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ เดนเดฌเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเต เดฐเดธเด•เดฐเดฎเดพเดฏเดฟ. เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เดžเดพเตป เด—เต€เด•เตเด•เตเดŸเตˆเด‚เดธเต เด‡เดซเด•เตเดฑเตเดฑเต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚, เดชเตเดคเดฟเดฏ เดฑเดพเด™เตเด•เดฟเด‚เด—เดฟเดจเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดฎเดฟเด•เดšเตเดš เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเด‚.

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต†เดจเตเดจเต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดตเตผเด•เตเด•เต, เดคเตเดŸเตผเดšเตเดš เดตเต†เดŸเตเดŸเดฟเด•เตเด•เตเดฑเดšเตเดšเดคเดพเดฃเต.

เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เดณเตเด‚ เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เตเด•เดณเตเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด•เดฎเดฒเตเดฒ, เดŽเดจเดฟเด•เตเด•เต เด†เดจเตเดคเดฐเดฟเด• เดตเดฟเดตเดฐเด™เตเด™เดณเตŠเดจเตเดจเตเด‚ เด‡เดฒเตเดฒเต†เดจเตเดจเต เด’เดฐเดฟเด•เตเด•เตฝ เด•เต‚เดŸเดฟ เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เดŸเตเดŸเต†. เดŽเดจเดฟเด•เตเด•เต เดŽเดตเดฟเดŸเต†เดฏเต‹ เดคเต†เดฑเตเดฑเต เดชเดฑเตเดฑเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เดจเตเดจเต‹ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดจเดทเตเดŸเดฎเดพเดฏเต†เดจเตเดจเต‹ เด‰เดฑเดชเตเดชเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดฟเดŸเตเดŸเตเด‚, เด…เดคเต เดฐเดธเด•เดฐเดฎเดพเดฏเดฟ เดฎเดพเดฑเดฟเดฏเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต. เดžเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เด•เต‹เดกเดฟเตฝ เดคเตเดŸเด™เตเด™เตเด‚; เด‡เดคเดฟเตฝ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดตเตผเด•เตเด•เต เด†เดฆเตเดฏ เดญเดพเด—เด™เตเด™เตพ เด’เดดเดฟเดตเดพเด•เตเด•เดพเด‚.

เดกเดพเดฑเตเดฑ เดถเต‡เด–เดฐเดฃเด‚

เดชเดพเตผเดธเดฑเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดชเดคเดฟเดชเตเดชเดฟเตฝ, เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚, เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เตพ, เดฒเต‡เด–เดจ เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เตเด•เตพ เดŽเดจเตเดจเดฟเดต เดฎเดพเดคเตเดฐเดฎเต‡ เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเด•เตเด•เต‚. เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดฎเดฟเด•เดšเตเดšเดคเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดจเดŸเดคเตเดคเดพเตป เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดธเตˆเดฑเตเดฑเดฟเดจเตเดฑเต† เดคเต€เดฎเดพเดฑเตเดฑเดฟเด•เต เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต; เด‡เดคเต เดตเดณเดฐเต† เดฐเดธเด•เดฐเดฎเดพเดฏ เด—เดตเต‡เดทเดฃเด‚ เดจเดŸเดคเตเดคเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, "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'}

เดคเดพเดฐเดคเดฎเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เด—เต€เด•เตเด•เต เดŸเตˆเด‚เดธเต เดตเดฟเดญเดพเด—เด™เตเด™เตพ เด•เต‚เดŸเตเดคเตฝ เดŽเดณเดฟเดฎเดฏเตเดณเตเดณเดคเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

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'}

เดฌเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดนเดฌเตเดฌเตเด•เตพ เด…เดคเต‡ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเต. เดฒเต‡เด–เดจเด‚ เด—เต€เด•เตเด•เตโ€ŒเดŸเตˆเด‚เดธเดฟเดจเตเดฑเต‡เดคเดพเดฏเดพเดฒเตเด‚ เดชเตเดฐเตŠเดซเตˆเตฝ เดนเดฌเตเดฌเดฟเดจเตเดฑเต†เดคเดพเดฏเดพเดฒเตเด‚ เดซเดฒเด‚ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เดŽเดดเตเดคเตเดจเตเดจเดคเต เด‡เดชเตเดชเต‹เตพ เดŽเดณเตเดชเตเดชเดฎเดพเดฃเต.

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 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเดšเตเดš เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดžเด™เตเด™เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต:

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดšเดพเตผเดŸเตเดŸเดฟเตฝ "เด—เต€เด•เตเด•เต เดŸเตˆเด‚เดธเต", "เด—เต€เด•เตเด•เต เดŸเตˆเด‚เดธเต เดฎเดพเดคเตเดฐเด‚" เดŽเดจเตเดจเต€ เดฒเต‡เด–เดจเด™เตเด™เตพ เดžเดพเตป เดตเดฟเดญเดœเดฟเดšเตเดšเต, เด•เดพเดฐเดฃเด‚ เด’เดฐเต เดฒเต‡เด–เดจเด‚ เด’เดฐเต‡ เดธเดฎเดฏเด‚ เดฐเดฃเตเดŸเต เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเดฒเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเดพเด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, "DIY" + "เดฎเตˆเด•เตเดฐเต‹ เด•เตบเดŸเตเดฐเต‹เดณเดฑเตเด•เตพ" + "C++"). เดธเตˆเดฑเตเดฑเดฟเดฒเต† เดชเตเดฐเตŠเดซเตˆเตฝ เดฒเต‡เด–เดจเด™เตเด™เตพ เดนเตˆเดฒเตˆเดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป "เดชเตเดฐเตŠเดซเตˆเตฝ" เดŽเดจเตเดจ เดชเดฆเดตเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด’เดฐเตเดชเด•เตเดทเต‡ เด‡เดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเตŠเดซเตˆเตฝ เดŽเดจเตเดจ เด‡เด‚เด—เตเดฒเต€เดทเต เดชเดฆเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดถเดฐเดฟเดฏเดฒเตเดฒ.

เดˆ เดตเต‡เดจเตฝเด•เตเด•เดพเดฒเดคเตเดคเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ เด—เต€เด•เตเด•เตโ€ŒเดŸเตˆเดฎเตเด•เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เดชเต‡เดฏเตโ€Œเดฎเต†เดจเตเดฑเต เดจเดฟเดฏเดฎเด™เตเด™เดณเดฟเดฒเต† เดฎเดพเดฑเตเดฑเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ โ€œเด—เต€เด•เตเด•เตโ€ŒเดŸเตˆเด‚เดธเต เด‡เดซเด•เตเดฑเตเดฑเดฟเดจเต†โ€ เด•เตเดฑเดฟเดšเตเดšเต เดฎเตเดฎเตเดชเดคเตเดคเต† เดญเดพเด—เดคเตเดคเต เดžเด™เตเด™เตพ เดšเต‹เดฆเดฟเดšเตเดšเต. เดจเดฎเตเด•เตเด•เต เด—เต€เด•เตเด•เต เดŸเตˆเด‚เดธเต เดฒเต‡เด–เดจเด™เตเด™เตพ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚:

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()

เดซเดฒเด‚ เดฐเดธเด•เดฐเดฎเดพเดฃเต. เด—เต€เด•เตเด•เตโ€ŒเดŸเตˆเด‚เดธเต เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เด†เด•เต† เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดเด•เดฆเต‡เดถ เด…เดจเตเดชเดพเดคเด‚ เดเด•เดฆเต‡เดถเด‚ 1:5 เด†เดฃเต. เดŽเดจเตเดจเดพเตฝ เดฎเตŠเดคเตเดคเด‚ เด•เดพเดดเตโ€Œเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเด•เตเด•เตเดฑเดšเตเดšเดฟเดฒเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดชเตเดชเต‹เตพ, โ€œเดตเดฟเดจเต‹เดฆโ€ เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เดตเต€เด•เตเดทเดฃเด‚ เดเด•เดฆเต‡เดถเด‚ เด…เดคเต‡ เดคเดฒเดคเตเดคเดฟเตฝ เดคเดจเตเดจเต† เดคเตเดŸเตผเดจเตเดจเต.

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดจเดฟเดฏเดฎเด™เตเด™เตพ เดฎเดพเดฑเตเดฑเดฟเดฏเดคเดฟเดจเต เดถเต‡เดทเดตเตเด‚ โ€œเด—เต€เด•เตเด•เตโ€ŒเดŸเตˆเด‚โ€ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต† เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เด†เด•เต† เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด‡เดชเตเดชเต‹เดดเตเด‚ เด•เตเดฑเดžเตเดžเต, เดŽเดจเตเดจเดพเตฝ โ€œเด•เดฃเตเดฃเดฟเดฒเต‚เดŸเต†โ€, เดฎเตŠเดคเตเดคเด‚ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดŸเต† 5% เตฝ เด•เต‚เดŸเตเดคเตฝ เด•เตเดฑเดฏเตเดจเตเดจเดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚.

เด“เดฐเต‹ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเด‚ เดถเดฐเดพเดถเดฐเดฟ เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดจเต‹เด•เตเด•เตเดจเตเดจเดคเต เดฐเดธเด•เดฐเดฎเดพเดฃเต:

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

"เดตเดฟเดจเต‹เดฆ" เดฒเต‡เด–เดจเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดถเดฐเดพเดถเดฐเดฟ 40% เด•เต‚เดŸเตเดคเดฒเดพเดฃเต. เด‡เดคเต เด’เดฐเตเดชเด•เตเดทเต‡ เด†เดถเตเดšเดฐเตเดฏเด•เดฐเดฎเดฒเตเดฒ. เดเดชเตเดฐเดฟเดฒเดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเดฒเต† เดชเดฐเดพเดœเดฏเด‚ เดŽเดจเดฟเด•เตเด•เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด’เดฐเตเดชเด•เตเดทเต‡ เด…เดคเดพเดฃเต เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‡เดคเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเดพเดดเตโ€Œเดธเดฟเด‚เด—เต เดชเดฟเดถเด•เดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด—เต€เด•เตเด•เตเดŸเตˆเด‚เดธเต เดฐเดšเดฏเดฟเดคเดพเด•เตเด•เดณเดฟเตฝ เด’เดฐเดพเตพ เด…เดตเดงเดฟเด•เตเด•เดพเดฒเดคเตเดคเต เดชเต‹เดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚;).

เดตเดดเดฟเดฏเดฟเตฝ, เดฒเต‡เด–เดจเด™เตเด™เดณเตเดŸเต† เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเตฝ เด—เตเดฐเดพเดซเต เดฐเดฃเตเดŸเต เดถเตเดฐเดฆเตเดงเต‡เดฏเดฎเดพเดฏ เด•เตŠเดŸเตเดฎเตเดŸเดฟเด•เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต - เดชเตเดคเตเดตเตผเดทเดตเตเด‚ เดฎเต†เดฏเต เด…เดตเดงเดฟเดฏเตเด‚.

เด•เต‡เดจเตเดฆเตเดฐเด™เตเด™เตพ

เดนเดฌเตเด•เดณเตเดŸเต† เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดค เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฎเตเด•เตเด•เต เดชเต‹เด•เดพเด‚. เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เดฎเดฟเด•เดšเตเดš 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()

เดซเดฒเด‚:

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด…เดคเดฟเดถเดฏเด•เดฐเดฎเต†เดจเตเดจเต เดชเดฑเดฏเดŸเตเดŸเต†, เด•เดพเดดเตโ€Œเดšเด•เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏ เด•เต‡เดจเตเดฆเตเดฐเด‚ "เดตเดฟเดตเดฐ เดธเตเดฐเด•เตเดท" เด†เดฏเดฟเดฐเตเดจเตเดจเต; เดฎเดฟเด•เดšเตเดš 5 เดจเต‡เดคเดพเด•เตเด•เดณเดฟเตฝ "เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต", "เดœเดจเดชเตเดฐเดฟเดฏ เดธเดฏเตปเดธเต" เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เด†เดจเตเดฑเดฟเดŸเต‹เดชเตเดชเต Gtk, Cocoa เดŽเดจเตเดจเดฟเดต เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต.

เดนเดฌเตเดฐเดพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดธเตเดฑเตเดฑเดฟเด•เตเดธเต: เดธเตˆเดฑเตเดฑเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเดจเตเดฆเตผเดถเดฟเดšเตเดšเดคเตเด‚ เด•เตเดฑเดžเตเดžเดคเตเดฎเดพเดฏ เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เด’เดฐเต เดฐเดนเดธเตเดฏเด‚ เดชเดฑเดฏเดพเด‚, เดŸเต‹เดชเตเดชเต เดนเดฌเตเด•เดณเตเด‚ เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚ เด‡เดตเดฟเดŸเต†, เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เด…เดตเดฟเดŸเต† เด•เดพเดฃเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚.

เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต

เด’เดŸเตเดตเดฟเตฝ, เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดค เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต. เดนเดฌเต เดตเดฟเดถเด•เดฒเดจ เดกเดพเดฑเตเดฑ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดˆ เดตเตผเดทเดคเตเดคเต† 2019-เดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏ เดนเดฌเตเดฌเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดžเด™เตเด™เตพเด•เตเด•เต เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏ เดฒเต‡เด–เดจเด™เตเด™เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดตเดฟเดตเดฐ เดธเตเดฐเด•เตเดท

เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต

เดœเดจเดชเตเดฐเดฟเดฏ เดถเดพเดธเตเดคเตเดฐเด‚

เดœเต€เดตเดฟเดคเด‚

เดเดŸเดฟเดฏเดฟเดฒเต† เดจเดฟเดฏเดฎเดจเดฟเตผเดฎเตเดฎเดพเดฃเด‚

เดตเต†เดฌเต เดตเดฟเด•เดธเดจเด‚

เดœเดฟเดŸเดฟเด•เต†

เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เด†เดฐเตเด‚ เด…เดธเตเดตเดธเตเดฅเดฐเดพเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป, เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดตเต เดธเดจเตเดฆเตผเดถเดฟเดšเตเดš เดนเดฌเตเดฌเต "gtk" เดจเตเดฑเต† เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดžเดพเตป เดจเตฝเด•เตเด‚. เด’เดฐเต เดตเตผเดทเดคเตเดคเดฟเดจเตเดณเตเดณเดฟเตฝ เด…เดคเต เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเดšเตเดšเต ะพะดะฝะฐ เดฑเต‡เดฑเตเดฑเดฟเด‚เด—เดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดตเดฐเดฟ "เดฏเดพเดจเตเดคเตเดฐเดฟเด•เดฎเดพเดฏเดฟ" เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจ เดฒเต‡เด–เดจเด‚.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เด’เดฐเต เดจเดฟเด—เดฎเดจเดตเตเด‚ เด‰เดฃเตเดŸเดพเด•เดฟเดฒเตเดฒ. เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚ เดตเดพเดฏเดจเดฏเดฟเตฝ เดธเดจเตเดคเต‹เดทเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•