ํค์ด ํ๋ธ๋ฅด.
ะ
๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด ์ํธ์ ์ปทํ
์ค์
๋๋ค.
ํต๊ณ์ ํ์ ์ ๊ณต์์ ์ธ ๊ฒ์ด ์๋๋ฉฐ ๋ด๋ถ ์ ๋ณด๊ฐ ์๋ค๋ ์ ์ ๋ค์ ํ ๋ฒ ์๊ธฐ์์ผ๋๋ฆฝ๋๋ค. ๋ํ ๋ด๊ฐ ์ด๋๊ฐ์ ์ค์๋ฅผ ํ์ง ์์๊ฑฐ๋ ๋ญ๊ฐ๋ฅผ ๋์น ๊ฒ์ด ์๋๋ผ๋ ๋ณด์ฅ๋ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋๋ ํฅ๋ฏธ๋ก์ ๋ ๊ฒ ๊ฐ์์. ๋จผ์ ์ฝ๋๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๊ด์ฌ์ด ์๋ ๋ถ๋ค์ ์ฒซ ๋ฒ์งธ ์น์
์ ๊ฑด๋๋ฐ์
๋ ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์์ง
ํ์์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์๋ ์กฐํ์, ๋๊ธ ๋ฐ ๊ธฐ์ฌ ํ์ ๋ง ๊ณ ๋ ค๋์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์ข์ง๋ง ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ์ด์ ์ฌ์ดํธ์ ์ฃผ์ ๋ณ ์น์ ์ ๋ถ์ํ ์ฐจ๋ก์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ช ๋ ๋์ "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์ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ๊ธฐ์ฌ ์๋ฅผ ํ์ํฉ๋๋ค.
์ฐจํธ์์ ๊ธฐ์ฌ๋ฅผ "geektimes"์ "geektimes only"๋ก ๊ตฌ๋ถํ์ต๋๋ค. ๊ธฐ์ฌ๋ ๋์์ ๋ ์น์
์ ์ํ ์ ์์ต๋๋ค(์: "DIY" + "๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ" + "C++"). ๋๋ ์ฌ์ดํธ์ ํ๋กํ ๊ธฐ์ฌ๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํด "ํ๋กํ"์ด๋ผ๋ ๋ช
์นญ์ ์ฌ์ฉํ์ต๋๋ค. ์๋ง๋ ์ด์ ๋ํ ์์ด ์ฉ์ด ํ๋กํ์ด ์์ ํ ์ ํํ์ง๋ ์์ ๊ฒ์
๋๋ค.
์์ ๋ถ๋ถ์์๋ ์ฌ์ฌ๋ฆ๋ถํฐ ๊ธฑํ์์ฆ ๊ธฐ์ฌ ๊ฒฐ์ ๊ท์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ '๊ธฑํ์์ค ํจ๊ณผ'์ ๋ํด ์ง๋ฌธํ์ต๋๋ค. 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 ์ ๋์ ๋๋ค. ํ์ง๋ง ์ ์ฒด ์กฐํ์๋ ๋์ ๋๊ฒ ๋ณ๋ํ์ง๋ง, '์๋ฅ' ๊ธฐ์ฌ ์กฐํ์๋ ๊ฑฐ์ ๊ฐ์ ์์ค์ ์ ์งํ์ต๋๋ค.
๊ท์น์ ๋ณ๊ฒฝํ ํ์๋ "geektimes" ์น์
์ ์๋ ๊ธฐ์ฌ์ ์ด ์กฐํ์๋ ์ฌ์ ํ ๊ฐ์ํ์ง๋ง "๋์ผ๋ก"๋ ์ด ๊ฐ์ 5%๋ฅผ ๋์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๊ธฐ์ฌ๋น ํ๊ท ์กฐํ์๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
"์ค๋ฝ" ๊ธฐ์ฌ์ ๊ฒฝ์ฐ ํ๊ท ๋ณด๋ค ์ฝ 40% ๋์ต๋๋ค. ์ด๊ฒ์ ์๋ง๋ ๋๋ผ์ด ์ผ์ด ์๋ ๊ฒ์
๋๋ค. XNUMX์ ์ด์ ์คํจ๋ ์ ๊ฒ๋ ๋ถ๋ถ๋ช
ํฉ๋๋ค. ์๋ง๋ ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋ฌ์ ์๋ ์๊ณ , ์ผ์ข
์ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ์ผ ์๋ ์๊ณ , ์๋๋ฉด ๊ดด์ง ์๊ฐ ์ค ํ ๋ช
์ด ํด๊ฐ๋ฅผ ๊ฐ์ ์๋ ์์ต๋๋ค ;).
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ทธ๋ํ๋ ๊ธฐ์ฌ ์กฐํ์์์ ์ํด์ 5 ์ ๊ณตํด์ผ์ด๋ผ๋ ๋ ๊ฐ์ง ๋์ ๋๋ ์ต๊ณ ์ ์ ๋ณด์ฌ์ค๋๋ค.
ํ๋ธ
์ฝ์๋ ํ๋ธ ๋ถ์์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค. ์กฐํ์ ๊ธฐ์ค์ผ๋ก ์์ 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๊ฐ ๋ฆฌ๋์๋ 'ํ๋ก๊ทธ๋๋ฐ'๊ณผ '๋์ค ๊ณผํ'๋ ํฌํจ๋์์ต๋๋ค.
Antitop์ Gtk์ Cocoa๋ฅผ ์ฐจ์งํฉ๋๋ค.
๋น๋ฐ ํ๋ ์๋ ค๋๋ฆด๊ป์ ์์ ํ๋ธ๋ ๋ณผ ์ ์์ด์
ํ๊ฐ
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ฝ์๋ ๋ฑ๊ธ์ ๋๋ค. ํ๋ธ ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ 2019๋ ์ฌํด ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๋ธ์ ๋ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๊ธฐ์ฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ ๋ณด ๋ณด์
๋ด๊ฐ Sberbank์์ XNUMX๋ ๋์ ์ผํ์ง ์์ ์ด์ ์กฐํ์ 304000ํ, ๋๊ธ 599๊ฐ, ํ์ +457.0/-14.0๋ฒ๋ ค์ง ์ค๋งํธ ์ ๊ตฌ๋ ์์คํ ๊ฐ์ธ์ ๋ณด์ ์์ฒ์ ๋๋ค ์กฐํ์ 232000ํ, ๋๊ธ 147๊ฐ, ํ์ +75.0/-11.0์ฌ๊ธฐ๊พผ๊ณผ ๋์งํธ ์๋ช - ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๋์ฉ๋๋ค. ์กฐํ์ 176000ํ, ๋๊ธ 778๊ฐ, ํ์ +356.0/-0.0Megafon์ด ๋ชจ๋ฐ์ผ ๊ตฌ๋ ์ ์์งํ ๋ฐฉ๋ฒ ์กฐํ์ 166000ํ, ๋๊ธ 676๊ฐ, ํ์ +624.0/-2.0VK ํดํน, ์ด์ค ์ธ์ฆ์ ์ ์ฅ๋์ง ์์ต๋๋ค ์กฐํ์ 148000ํ, ๋๊ธ 332๊ฐ, ํ์ +124.0/-17.0๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณต ๋์ง๋ฅผ ๋๋ ๋ฐฉ๋ฒ ์กฐํ์ 132000ํ, ๋๊ธ 321๊ฐ, ํ์ +246.0/-19.0์ญ์ฌ์ ์ต๋ ๊ท๋ชจ์ ๋คํ: 2,7์ต ๊ฐ์ ๊ณ์ ์ค 773์ต XNUMX์ฒ XNUMX๋ฐฑ๋ง ๊ฐ์ ๊ณ ์ ํ ๊ณ์ ์ด ์์ต๋๋ค. ์กฐํ์ 123000ํ, ๋๊ธ 154๊ฐ, ํ์ +86.0/-5.0์ฌ๋ณด, ์ฐ๋ฆฌ๊ฐ ์ธํฐ๋ท์ ์ฃฝ์ด๊ณ ์์ด์ ์กฐํ์ 121000ํ, ๋๊ธ 933๊ฐ, ํ์ +392.0/-83.0'๋ชจ๋ฐ์ผ ์ฝํ ์ธ '๋ SMS๋ ํ์๊ฐ์ ์์ด ๋ฌด๋ฃ์ ๋๋ค. Megafon์ ์ฌ๊ธฐ ์ธ๋ถ์ ๋ณด ์กฐํ์ 114000ํ, ๋๊ธ 478๊ฐ, ํ์ +488.0/-8.0Rostelecom ๊ฐ์ธ ๊ณ์ ์ ํฌํธ ์ค์บ๋ ์กฐํ์ 111000ํ, ๋๊ธ 194๊ฐ, ํ์ +300.0/-8.0
ํ๋ก๊ทธ๋๋ฐ
ํ ๋จ์์ ๋ํด์ ์กฐํ์ 167000ํ, ๋๊ธ 249๊ฐ, ํ์ +239.0/-33.0OOP๋ฅผ ๋นจ๋ฆฌ ์์ด๋ฒ๋ฆด์๋ก ๊ทํ์ ๊ทํ์ ํ๋ก๊ทธ๋จ์ ๋ ์ข์ต๋๋ค ์กฐํ์ 129000ํ, ๋๊ธ 1271๊ฐ, ํ์ +131.0/-63.0์ ์ ๊ฐ๋ฐ์๊ฐ ์ทจ์ ํ ์ ์๋ ์ด์ ์กฐํ์ 119000ํ, ๋๊ธ 901๊ฐ, ํ์ +151.0/-14.0์ด๊ณณ์ ๋ ธ์ธ๋ค์ด ์ฌ ๊ณณ์ด ์๋๋? ์๋ฅธ ๋ค์ฏ ์ดํ ํ๋ก๊ทธ๋๋ฐ ์กฐํ์ 116000ํ, ๋๊ธ 649๊ฐ, ํ์ +222.0/-16.0์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ํ์ค๊ณผ์ ์ฐ๊ฒฐ์ ์กฐ์ฉํ ๋๊ณ ์์ต๋๋ค. ์กฐํ์ 106000ํ, ๋๊ธ 764๊ฐ, ํ์ +164.0/-52.0ํ๋ค๊ฒ ๋ฐฐ์ด ๊ฒ (์ํํธ์จ์ด ๊ฐ๋ฐ ๊ฒฝ๋ ฅ 30๋ ์ด์) ์กฐํ์ 101000ํ, ๋๊ธ 128๊ฐ, ํ์ +178.0/-9.0๊ฐ์ฅ ํฌ๊ทํ๊ณ ๊ฐ์ฅ ๋น์ผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์กฐํ์ 82900ํ, ๋๊ธ 119๊ฐ, ํ์ +38.0/-10.0KPI์์ JavaScript ๋ฐ Node.js ๊ฐ์ ๊ณผ์ ์กฐํ์ 80300ํ, ๋๊ธ 14๊ฐ, ํ์ +34.0/-2.0๊ฐ์ ์ฌ๋ฐฐ ๊ณผ์ ์ ์๋ก ๋ค์ด IT ์ฉ์ด ์กฐํ์ 78000ํ, ๋๊ธ 86๊ฐ, ํ์ +84.0/-14.0256์ค์ ์์ C++: ๋ช ์๊ฐ ์์ ์ฒ์๋ถํฐ ๋ ์ด ํธ๋ ์ด์ ์์ฑ ์กฐํ์ 77600ํ, ๋๊ธ 124๊ฐ, ํ์ +241.0/-0.0
๋์ค๊ณผํ
๋์์ด๋๊ฐ ํผ์ด ๊ฒ: ํน์ดํ ์ด๊ธฐ ์กฐํ์ 236000ํ, ๋๊ธ 123๊ฐ, ํ์ +119.0/-9.0๊ณผํ์๋ค์ด ์ง๊ตฌ์์์ ๊ฐ์ฅ ์ค๋๋ ์ฒ์ถ๋๋ฌผ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์กฐํ์ 234000ํ, ๋๊ธ 212๊ฐ, ํ์ +82.0/-14.0TV ์๋ฆฌ์ฆ '์ฒด๋ฅด๋ ธ๋น': ๋ณด๊ณ ์๊ฐํ๊ธฐ ์กฐํ์ 173000ํ, ๋๊ธ 803๊ฐ, ํ์ +164.0/-25.012์ธ ์ญ๋๊ฐ ์์ ์ ์ง ์คํ์ค์์ ํต์ตํฉ ๋ฐ์์ ์ํํ์ต๋๋ค. ์กฐํ์ 145000ํ, ๋๊ธ 280๊ฐ, ํ์ +126.0/-29.0ํฉ๊ธ์ฅ๋ฏธ์ ๋ชฐ๋ฝํ ํฌ๋ ์นด์ ์ด์ผ๊ธฐ ์กฐํ์ 134000ํ, ๋๊ธ 244๊ฐ, ํ์ +217.0/-1.0๋ ํฌ๊ฒ ๋ง๋ค์ด๋ณด์ธ์! ์ต์ ํด์๋ ํฅ์ ์กฐํ์ 134000ํ, ๋๊ธ 235๊ฐ, ํ์ +377.0/-1.0Boeing 737 Max์ฉ ์ํํธ์จ์ด๋ ์๊ฐ๋น 9๋ฌ๋ฌ๋ฅผ ๋ฐ๋ ์์์์ฑ ์ ์ฒด์ ์ํด ์์ฑ๋์์ต๋๋ค. ์กฐํ์ 126000ํ, ๋๊ธ 560๊ฐ, ํ์ +153.0/-6.0๊ธด์ฅํ์ง ๋ง๊ณ , ์๋๋ฅด์ง ๋ง๊ณ , ๋ฐฉํดํ์ง ๋ง์ธ์: ๋น๊ทน์ ์ด์ผ๊ธฐ ์กฐํ์ 121000ํ, ๋๊ธ 384๊ฐ, ํ์ +242.0/-4.0์ํ์๋ค์ด ์ซ์๋ฅผ ๊ณฑํ๋ ์๋ฒฝํ ๋ฐฉ๋ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์กฐํ์ 108000ํ, ๋๊ธ 222๊ฐ, ํ์ +173.0/-10.0์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ํ์ค๊ณผ์ ์ฐ๊ฒฐ์ ์กฐ์ฉํ ๋๊ณ ์์ต๋๋ค. ์กฐํ์ 106000ํ, ๋๊ธ 764๊ฐ, ํ์ +164.0/-52.0
์ง์
๋ด๊ฐ Sberbank์์ XNUMX๋ ๋์ ์ผํ์ง ์์ ์ด์ ์กฐํ์ 304000ํ, ๋๊ธ 599๊ฐ, ํ์ +457.0/-14.0๋ด ์ฝ๋ ๋ฆฌ๋ทฐ๋ก ๊ฐ๋ฐ์์ ์ถ์ ๋ง์น๊ณ ๋ฏธ์ํด์ ์กฐํ์ 187000ํ, ๋๊ธ 21๊ฐ, ํ์ +37.0/-3.0๊ฐ๋ฐ์ ์ ์กฐํ์ 179000ํ, ๋๊ธ 668๊ฐ, ํ์ +315.0/-60.0ํ ๋จ์์ ๋ํด์ ์กฐํ์ 167000ํ, ๋๊ธ 249๊ฐ, ํ์ +239.0/-33.022์ธ์ ์ํด ์กฐํ์ 158000ํ, ๋๊ธ 927๊ฐ, ํ์ +259.0/-100.0ํด๊ณ ๋นํ์ง ์๊ณ ์ง์ฅ์์ ์ ๊ตฌ๋ฅผ ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ์กฐํ์ 139000ํ, ๋๊ธ 762๊ฐ, ํ์ +200.0/-20.0๋ฌ์์์ด์ ํ์ ์กฐํ์ 128000ํ, ๋๊ธ 612๊ฐ, ํ์ +480.0/-33.0์ ์ ๊ฐ๋ฐ์๊ฐ ์ทจ์ ํ ์ ์๋ ์ด์ ์กฐํ์ 119000ํ, ๋๊ธ 901๊ฐ, ํ์ +151.0/-14.0'๋ฒํธ' ์ง์๋ค: ํ์ถ๊ตฌ๋ ์์๊น? ์กฐํ์ 117000ํ, ๋๊ธ 398๊ฐ, ํ์ +210.0/-14.0์ด๊ณณ์ ๋ ธ์ธ๋ค์ด ์ฌ ๊ณณ์ด ์๋๋? ์๋ฅธ ๋ค์ฏ ์ดํ ํ๋ก๊ทธ๋๋ฐ ์กฐํ์ 116000ํ, ๋๊ธ 649๊ฐ, ํ์ +222.0/-16.0
IT ์ ๋ฒ
์ฌ๊ธฐ๊พผ๊ณผ ๋์งํธ ์๋ช - ๋ชจ๋ ๊ฒ์ด ๋งค์ฐ ๋์ฉ๋๋ค. ์กฐํ์ 176000ํ, ๋๊ธ 778๊ฐ, ํ์ +356.0/-0.0Megafon์ด ๋ชจ๋ฐ์ผ ๊ตฌ๋ ์ ์์งํ ๋ฐฉ๋ฒ ์กฐํ์ 166000ํ, ๋๊ธ 676๊ฐ, ํ์ +624.0/-2.0๋ฌ์์์ด์ ํ์ ์กฐํ์ 128000ํ, ๋๊ธ 612๊ฐ, ํ์ +480.0/-33.0'๋ชจ๋ฐ์ผ ์ฝํ ์ธ '๋ SMS๋ ํ์๊ฐ์ ์์ด ๋ฌด๋ฃ์ ๋๋ค. Megafon์ ์ฌ๊ธฐ ์ธ๋ถ์ ๋ณด ์กฐํ์ 114000ํ, ๋๊ธ 478๊ฐ, ํ์ +488.0/-8.0์นด์ํ ๋น๊ตญ์ด ์ธ์ฆ์ ๊ตฌํ ์คํจ๋ฅผ ์ํํ๋ ค๊ณ ํ๋ ๋ฐฉ๋ฒ ์กฐํ์ 111000ํ, ๋๊ธ 77๊ฐ, ํ์ +122.0/-14.0๋ฌ์์์์ Protonmail์ด ์ฐจ๋จ๋๋ ๋ฐฉ๋ฒ ์กฐํ์ 102000ํ, ๋๊ธ 398๊ฐ, ํ์ +418.0/-7.0Runet์ ๋ถ๋ฆฌ์ ๊ดํ ๋ฒ๋ฅ ์ State Duma์์ ์ธ ๊ฐ์ง ๋ ์๋ก ์ฑํ๋์์ต๋๋ค. ์กฐํ์ 88200ํ, ๋๊ธ 878๊ฐ, ํ์ +73.0/-18.0ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํ์ ์ ํํ๊ณ ๊ณ์ฝ์๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ ์กฐํ์ 87200ํ, ๋๊ธ 611๊ฐ, ํ์ +166.0/-9.0ํต์ ๋งค์ค์ปด๋ถ๋ RuNet ๋ถ๋ฆฌ ๋ฒ์์ ์น์ธํ์ต๋๋ค. ์กฐํ์ 83600ํ, ๋๊ธ 364๊ฐ, ํ์ +79.0/-9.0์๊ฒฌ์ ๋ํ ์์ธํ ๋ต๋ณ๊ณผ ๋ฌ์์ ์ฐ๋ฐฉ ์ ๊ณต์์ ์ถ์ ๋ํ ์ฝ๊ฐ์ ์ค๋ช ์กฐํ์ 74700ํ, ๋๊ธ 389๊ฐ, ํ์ +290.0/-1.0
์น ๊ฐ๋ฐ
์ด๊ณณ์ ๋ ธ์ธ๋ค์ด ์ฌ ๊ณณ์ด ์๋๋? ์๋ฅธ ๋ค์ฏ ์ดํ ํ๋ก๊ทธ๋๋ฐ ์กฐํ์ 116000ํ, ๋๊ธ 649๊ฐ, ํ์ +222.0/-16.02019๋ ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ ์กฐํ์ 110000ํ, ๋๊ธ 278๊ฐ, ํ์ +233.0/-11.0Docker ํ์ต 1๋ถ: ๊ธฐ๋ณธ ์ฌํญ ์กฐํ์ 91300ํ, ๋๊ธ 24๊ฐ, ํ์ +52.0/-10.0KPI์์ JavaScript ๋ฐ Node.js ๊ฐ์ ๊ณผ์ ์กฐํ์ 80300ํ, ๋๊ธ 14๊ฐ, ํ์ +34.0/-2.0ํ๋ จ์ Vasya์ API ๋ฉฑ๋ฑ์ฑ์ ๊ดํ ๊ทธ์ ์ด์ผ๊ธฐ ์กฐํ์ 68900ํ, ๋๊ธ 160๊ฐ, ํ์ +216.0/-3.0์กฐ์ธ์ ๋ํ ์ดํด๊ฐ ์์๋์์ต๋๋ค. ์์งํ ๋งํด์ ์ด๊ฒ์ ์์ ๊ต์ฐจ์ ์ด ์๋๋๋ค. ์กฐํ์ 65900ํ, ๋๊ธ 223๊ฐ, ํ์ +138.0/-41.0ํ์ ์ฃผ์ ๋ณ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํด์๋ ์ ๋๋ ์ด์ ์กฐํ์ 62700ํ, ๋๊ธ 243๊ฐ, ํ์ +179.0/-13.0์ฒ์๋ถํฐ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ ์กฐํ์ 62200ํ, ๋๊ธ 122๊ฐ, ํ์ +56.0/-8.0Vue.js์ ์ด๋์ด ๋ ์กฐํ์ 60800ํ, ๋๊ธ 133๊ฐ, ํ์ +77.0/-6.0ํ๋ ์น ๊ฐ๋ฐ์ด ์ ๊ทธ๋ ๊ฒ ๋ณต์กํ๊ฐ์? 1 ๋ถ ์กฐํ์ 57700ํ, ๋๊ธ 319๊ฐ, ํ์ +101.0/-6.0
GTK
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์๋ฌด๋ ๊ธฐ๋ถ์ ์ํ๊ฒํ์ง ์๋๋ก ๊ฐ์ฅ ์ ๊ฒ ๋ฐฉ๋ฌธํ ํ๋ธ "gtk"์ ๋ฑ๊ธ์ ๋ถ์ฌํ๊ฒ ์ต๋๋ค. 1๋ ๋ง์ ์ถํ๋๋ค. ะพะดะฝะฐ ์ด ๊ธฐ์ฌ๋ "์๋์ผ๋ก" ๋ฑ๊ธ์ ์ฒซ ๋ฒ์งธ ์ค์ ์ฐจ์งํฉ๋๋ค.
GtkApplication์ ์ฌ์ฉํฉ๋๋ค. librsvg ๋ ๋๋ง ๊ธฐ๋ฅ ์กฐํ์ 1700ํ, ๋๊ธ 9๊ฐ, ํ์ +9.0/-1.0
๊ฒฐ๋ก
๊ฒฐ๋ก ์ ์์ ๊ฒ์
๋๋ค. ๋ชจ๋๋ค ์ฆ๊ฑฐ์ด ๋
์ ๋์ธ์.
์ถ์ฒ : habr.com