เจนเฉˆเจฌเจฐเจพเจธเจŸเฉˆเจŸเจฟเจ•เจธ: เจธเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ…เจคเฉ‡ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจœเจผเจฟเจŸ เจ•เฉ€เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจจเจพ

เจนเฉ‡ เจนเจฌเจฐ.

ะ’ เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ— เจนเฉˆเจฌเจฐ เจฆเฉ‡ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฎเฉเฉฑเจ– เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ - เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจพเจฐ เจ…เจคเฉ‡ เจฐเฉ‡เจŸเจฟเฉฐเจ—. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจธเจพเจˆเจŸ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจธเจฟเฉฑเจงเฉ€ เจฆเจพ เจฎเฉเฉฑเจฆเจพ เจ…เจฃเจœเจพเจฃ เจฐเจฟเจนเจพเฅค เจ‡เจธ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเฉ‡เจ–เจฃเจพ เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ—เฉˆเจฐ-เจชเฉเจฐเจธเจฟเฉฑเจง เจนเฉฑเจฌ เจฒเฉฑเจญเจฃเจพ เจฆเจฟเจฒเจšเจธเจช เจนเฉ‹ เจ—เจฟเจ†เฅค เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจฎเฉˆเจ‚ เจ—เฉ€เจ•เจŸเจพเจˆเจฎ เจชเฉเจฐเจญเจพเจต เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เจพ, เจจเจตเฉ€เจ‚ เจฐเฉˆเจ‚เจ•เจฟเฉฐเจ— เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจšเฉ‹เจฃ เจฆเฉ‡ เจจเจพเจฒ เจ–เจคเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆ.

เจนเฉˆเจฌเจฐเจพเจธเจŸเฉˆเจŸเจฟเจ•เจธ: เจธเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ…เจคเฉ‡ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจœเจผเจฟเจŸ เจ•เฉ€เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจจเจพ

เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจœเฉ‹ เจ‡เจธ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจ เจ•เจฟ เจ•เฉ€ เจนเฉ‹เจ‡เจ†, เจจเจฟเจฐเฉฐเจคเจฐเจคเจพ เจ•เฉฑเจŸ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจนเฉˆ.

เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจพเจฐ เจซเจฟเจฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ…เฉฐเจ•เฉœเฉ‡ เจ…เจคเฉ‡ เจฐเฉ‡เจŸเจฟเฉฐเจ— เจ…เจงเจฟเจ•เจพเจฐเจค เจจเจนเฉ€เจ‚ เจนเจจ, เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ•เฉ‹เจˆ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจน เจตเฉ€ เจ—เจพเจฐเฉฐเจŸเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจฎเฉˆเจ‚ เจ•เจฟเจคเฉ‡ เจ—เจฒเจคเฉ€ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚ เจ•เฉเจ เจ–เฉเฉฐเจ เจ—เจฟเจ†. เจชเจฐ เจซเจฟเจฐ เจตเฉ€, เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจฆเจฟเจฒเจšเจธเจช เจจเจฟเจ•เจฒเจฟเจ†. เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เฉ‹เจก เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡; เจœเฉ‹ เจ‡เจธ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเฉ‡ เจ‰เจน เจชเจนเจฟเจฒเฉ‡ เจญเจพเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจกเจพเจŸเจพ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ

เจชเจพเจฐเจธเจฐ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš, เจธเจฟเจฐเจซ เจตเจฟเจฏเฉ‚เจœเจผ, เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจฒเฉ‡เจ– เจฐเฉ‡เจŸเจฟเฉฐเจ—เจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจšเฉฐเจ—เจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจธเจตเจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ. เจ‡เจน เจธเจพเจˆเจŸ เจฆเฉ‡ เจฅเฉ€เจฎเฉˆเจŸเจฟเจ• เจญเจพเจ—เจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ; เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจพเจซเจผเฉ€ เจฆเจฟเจฒเจšเจธเจช เจ–เฉ‹เจœ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฆเฉ‡เจ–เฉ‹ เจ•เจฟ "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 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

เจนเฉˆเจฌเจฐเจพเจธเจŸเฉˆเจŸเจฟเจ•เจธ: เจธเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ…เจคเฉ‡ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจœเจผเจฟเจŸ เจ•เฉ€เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจจเจพ

เจฎเฉˆเจ‚ เจšเจพเจฐเจŸ เจตเจฟเฉฑเจš เจฒเฉ‡เจ–เจพเจ‚ "เจ—เฉ€เจ•เจŸเจพเจˆเจฎเจœเจผ" เจ…เจคเฉ‡ "เจธเจฟเจฐเจซเจผ เจ—เฉ€เจ•เจŸเจพเจˆเจฎ" เจจเฉ‚เฉฐ เจตเฉฐเจกเจฟเจ†, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจฆเฉ‹เจตเจพเจ‚ เจญเจพเจ—เจพเจ‚ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, โ€œDIYโ€ + โ€œmicrocontrollersโ€ + โ€œ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()

เจจเจคเฉ€เจœเจพ เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ. geektimes เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ‡ เจตเจฟเจฏเฉ‚เจœเจผ เจฆเจพ เจ•เฉเฉฑเจฒ เจฆเจพ เจ…เจจเฉเจชเจพเจค เจฒเจ—เจญเจ— 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 เจจเฉ‡เจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš "เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—" เจ…เจคเฉ‡ "เจชเฉเจฐเจธเจฟเฉฑเจง เจตเจฟเจ—เจฟเจ†เจจ" เจตเฉ€ เจธเจผเจพเจฎเจฒ เจธเจจเฅค

เจเจ‚เจŸเฉ€เจŸเฉŒเจช เจœเฉ€เจŸเฉ€เจ•เฉ‡ เจ…เจคเฉ‡ เจ•เฉ‹เจ•เฉ‹ 'เจคเฉ‡ เจ•เจฌเจœเจผเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจนเฉˆเจฌเจฐเจพเจธเจŸเฉˆเจŸเจฟเจ•เจธ: เจธเจพเจˆเจŸ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ…เจคเฉ‡ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจœเจผเจฟเจŸ เจ•เฉ€เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจจเจพ

เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฐเจพเจœเจผ เจฆเฉฑเจธเจพเจ‚เจ—เจพ, เจšเฉ‹เจŸเฉ€ เจฆเฉ‡ เจนเฉฑเจฌ เจตเฉ€ เจตเฉ‡เจ–เฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจ เจ‡เฉฑเจฅเฉ‡, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจตเจฟเจฏเฉ‚เจœเจผ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจ‰เฉฑเจฅเฉ‡ เจจเจนเฉ€เจ‚ เจฆเจฟเจ–เจพเจˆ เจ—เจˆ เจนเฉˆเฅค

เจฐเฉ‡เจŸเจฟเฉฐเจ—

เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจตเจพเจ…เจฆเจพ เจ•เฉ€เจคเจพ เจฐเฉ‡เจŸเจฟเฉฐเจ—. เจนเฉฑเจฌ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ…เจธเฉ€เจ‚ เจ‡เจธ เจธเจพเจฒ 2019 เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง เจนเฉฑเจฌเจพเจ‚ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง เจฒเฉ‡เจ– เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ†

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจชเฉเจฐเจธเจฟเฉฑเจง เจตเจฟเจ—เจฟเจ†เจจ

เจ•เจฐเฉ€เจ…เจฐ

IT เจตเจฟเฉฑเจš เจ•เจพเจจเฉ‚เฉฐเจจ

เจตเฉˆเฉฑเจฌ เจตเจฟเจ•เจพเจธ

GTK

เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจคเจพเจ‚ เจœเฉ‹ เจ•เฉ‹เจˆ เจจเจพเจฐเจพเจœเจผ เจจเจพ เจนเฉ‹เจตเฉ‡, เจฎเฉˆเจ‚ เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจตเจฟเจœเจผเจฟเจŸ เจ•เฉ€เจคเฉ‡ เจนเฉฑเจฌ "gtk" เจฆเฉ€ เจฐเฉ‡เจŸเจฟเฉฐเจ— เจฆเฉ‡เจตเจพเจ‚เจ—เจพเฅค เจ‡เฉฑเจ• เจธเจพเจฒ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ‡เจน เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจนเฉ‹ เจ—เจฟเจ† เจ‡เจ• เจฒเฉ‡เจ–, เจœเฉ‹ "เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ•เจฒเฉ€" เจฐเฉ‡เจŸเจฟเฉฐเจ— เจฆเฉ€ เจชเจนเจฟเจฒเฉ€ เจฒเจพเจˆเจจ 'เจคเฉ‡ เจตเฉ€ เจ•เจฌเจœเจผเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจธเจฟเฉฑเจŸเจพ

เจ•เฉ‹เจˆ เจธเจฟเฉฑเจŸเจพ เจจเจนเฉ€เจ‚ เจจเจฟเจ•เจฒเฉ‡เจ—เจพเฅค เจนเจฐ เจ•เจฟเจธเฉ‡ เจจเฉ‚เฉฐ เจชเฉœเฉเจน เจ•เฉ‡ เจ–เฉเจธเจผเฉ€.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹