рд╣реИрдмрд░ рдЯреИрдЧ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛: рдкрджреЛрдВ рдореЗрдВ рд░реБрдЭрд╛рди рдХреНрдпрд╛ рд╣реИрдВ?

HabrTrend
рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!

рдЖрдЬ рд╣рдо рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЯреНрд░реЗрдВрдб рдХреЛ рдХреИрд╕реЗ рдЯреНрд░рд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Google рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣реИрдмрд░ рдЯреИрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рди рд░реБрдЭрд╛рди рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдЪреНрдЫреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдореЗрдВ рдЯреИрдЧ рд╕реЗрдЯ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдЪ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЖрдЗрдпреЗ рдЖрдЬрдорд╛рддреЗ рд╣реИрдВред

1. рд╡рд┐рд╡рд░рдг


рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╕рднреА рдЯреИрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдПрдХ рддрд╛рд░реАрдЦ рдХреЛ рдЬреЛрдбрд╝рдХрд░, рд╕рдордп рдХреЗ рд╕рд╛рде рдЗрд╕ рдЖрд╡реГрддреНрддрд┐ рдХреЛ рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдл рдХреЛ рдЬреЛрдбрд╝рдирд╛ред рдпрд╣ рд╕рдм рдЕрдВрдд рдореЗрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдо рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ "рдЯреИрдЧ" рд╢рдмреНрдж рдмрд╛рдж рдореЗрдВ рдкрд╛рда рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЯреИрдЧ, рдЯреИрдЧ, рд▓реЗрдмрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо рдЕрдЬрдЧрд░ 3.3.2 рдХреЗ рддрд╣рдд рд▓рд┐рдЦреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред

2. рд╕рдВрд░рдЪрдирд╛ рдФрд░ рддреИрдпрд╛рд░реА


рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ 2 рдЯреЗрдмрд▓ рдкреЛрд╕реНрдЯ_рдЯреИрдЧ рдФрд░ рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдкрд╣рд▓реЗ pid рдХреА рдлреАрд▓реНрдбреНрд╕ рдкреЛрд╕реНрдЯ рдЖрдИрдбреА рд╣реИрдВ, tid рдЯреИрдЧ рдЖрдИрдбреА рд╣реИ, рддрд╛рд░реАрдЦ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ рдХреА рддрд╛рд░реАрдЦ рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЗ рдлрд╝реАрд▓реНрдб рдЯреИрдЧ рдЖрдИрдбреА рд╣реИрдВ, tag_title рдЯреИрдЧ рд╢реАрд░реНрд╖рдХ рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред

import sqlite3 class Base: def __init__(self,dbname): self.con=sqlite3.connect(dbname) def __del__(self): self.con.close( ) def maketables(self): """    """ self.con.execute('create table post_tags(pid,tid,date)') self.con.execute('create table tags(tag_title)') self.con.commit( ) 

рдЪреВрдБрдХрд┐ рд╕рдм рдХреБрдЫ рдЯреИрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

 import tags extend = tags.Base('tags.db') extend.maketables() 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЦрд╛рд▓реА рдЖрдзрд╛рд░ рд╣реИ, рдЪрд▓реЛ рдЗрд╕реЗ рднрд░реЗрдВред

3. рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреИрдЧ


рдЖрдкрдХреЛ рд╕рднреА рдЯреИрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдкреЛрд╕реНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреА рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, beautifulsoup рдФрд░ urllib.request рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛрдбрд╝реЗрдВ:

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
  def get_tag(self, name, added = True): """  ,    tid,    cur -   res -        added - /     ,     false """ cur=self.con.execute("select rowid from %s where %s='%s'" % ('tags','tag_title',name)) res=cur.fetchone( ) if res==None: if added: cur=self.con.execute("insert into %s (%s) values ('%s')" % ('tags','tag_title',name)) self.con.commit( ) return cur.lastrowid else: return False else: return res[0] def add_tag(self, pid, name, date): """    pid -   name -   date -   """ rowid = self.get_tag(name); print(pid,rowid ,name, date) self.con.execute("insert into %s (%s,%s,%s) values (%d,%d,'%s')" % ('post_tags','pid','tid','date',pid,rowid,date)) self.con.commit( ) def add_post(self, pid): """   (   ) """ if (self.get_post(pid)): return print('-'*10,'http://habrahabr.ru/post/'+str(pid),'-'*10) cur=self.con.execute("select pid from %s where %s=%d" % ('post_tags','pid',pid)) res=cur.fetchone( ) if res==None: try: soup=BeautifulSoup(urllib.request.urlopen('http://habrahabr.ru/post/'+str(pid)).read( )) except (urllib.request.HTTPError): self.add_tag(pid,"parse_error_404","") print("error 404") else: published = soup.find("div", { "class" : "published" }) tags = soup.find("ul", { "class" : "tags" }) if tags: for tag in tags.findAll("a"): self.add_tag(pid, tag.string, get_date(published.string)) else: self.add_tag(pid,"parse_access_denied","") print("access denied") else: print("post has already") 

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред 196,000 рддрдХ рд╕реАрдорд┐рдд , рд╡рд╣ 1 рдЕрдХреНрдЯреВрдмрд░ 2013 рдХреЛ рдЖрддрд╛ рд╣реИред

 for pid in range(196000): extend.add_post(pid+1) 

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрд░реАрдХрд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдореЗрдЧрд╛рдмрд┐рдЯ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 170 рдШрдВрдЯреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рдЖрдИрдбреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧ рд╕реЗ рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИред рдкреГрд╖реНрда рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯрдХреНрдХрд░реЛрдВ рдХреА рдШрдЯрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ, рдиреБрдХрд╕рд╛рди рдпрд╛ рдЖрдВрд╢рд┐рдХ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ 3% рдкрджреЛрдВ рдХреА рд░рд╛рд╢рд┐ рд╣реИ, рдЬреЛ рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 8 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╢реБрд░реВ рдореЗрдВ 9 рд╣реИрдмрд░ 503 рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, 6 рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ (рдЗрд╕ рддрд░рд╣ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдерд╛ рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛), рдПрдХ рдЖрдзрд╛рд░ (17 рдПрдордмреА) рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

4. рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рджрд░рдЕрд╕рд▓, рдЕрдм рдореБрдЦреНрдп рднрд╛рдЧ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред
рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛрдбрд╝реЗрдВ:

рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди рдХреЛрдб
  def get_count_byname(self, name, date = ''): """  name  tid       get_count_byid name -   date - (*)  mm_yyyy """ tid = self.get_tag(name, False) return self.get_count_byid(tid, date) def get_count_byid(self, tid, date = ''): """          """ if tid: if date: count=self.con.execute("select count(pid) from %s where %s=%d and %s='%s'" % ('post_tags','tid',tid,'date',date)) else: count=self.con.execute("select count(pid) from %s where %s=%d" % ('post_tags','tid',tid)) res=count.fetchone( ) return res[0] else: return False def get_graph(self, name): """    -  """ month = ('01',''),('02',''),('03',''),('04',''),('05',''),('06',''),('07',''),('08',''),('09',''),('10',''),('11',''),('12','') years = [2006,2007,2008,2009,2010,2011,2012,2013] graph = [] for Y in years: for M,M_str in month: date = str(M)+'_'+str(Y) graph.append((date, self.get_count_byname(name, date))) return graph def get_image(self, name): """   m_x -   X m_y -   Y img_x -   img_y -   """ img_x = 960 img_y = 600 img=Image.new('RGB',(img_x,img_y),(255,255,255)) draw=ImageDraw.Draw(img) graph = self.get_graph(name) max_y = max(graph,key=lambda item:item[1])[1] if max_y == 0: print('tag not found') return False m_x, m_y = int(img_x/(len(graph))), int(img_y/max_y) draw.text((10, 10), str(max_y), (0,0,0)) draw.text((10, 20), name, (0,0,0)) x,prev_y = 0,-1 for x_str, y in graph: x += 1 if (x%12 == 1): draw.text((x*m_x, img_y - 30), str(x_str[3:]),(0,0,0)) if prev_y >= 0: draw.line(((x-1)*m_x, img_y-prev_y*m_y-1, x*m_x, img_y-y*m_y-1), fill=(255,0,0)) prev_y = y img.save('graph.png','PNG') Image.open('graph.png').show() def get_all_tags_sorted(self, tags): """   """ return sorted(tags, key=lambda tag:tag[2], reverse=True) def get_all_tag_count(self): count=self.con.execute("select count(rowid) from %s" % ('tags')) res=count.fetchone( ) alltag_count = res[0] tags = [] for tag_id in range(alltag_count-1): tags.append((tag_id+1,self.get_tag_name(tag_id+1),self.get_count_byid(tag_id+1))) print (tag_id+1,self.get_tag_name(tag_id+1),self.get_count_byid(tag_id+1)) return tags 

5. рдкрд░рд┐рдгрд╛рдо (рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП)


рд╢реАрд░реНрд╖ 25 рдиреЗрддрд╛ рдЯреИрдЧ
  1. рдЧреВрдЧрд▓ - реиремрезрез
  2. Android - 2188
  3. Google - 2024
  4. linux - 1978
  5. php - 1947
  6. рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ - 1877
  7. microsoft - 1801
  8. рд╕реЗрдм - 1668
  9. рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ - 1509
  10. рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк - 1484
  11. рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк - 1317
  12. рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ - 1229
  13. рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ - 1220
  14. рдЬрд╛рд╡рд╛ - резрезavaреж
  15. рдЦреЗрд▓ - 1141
  16. рд╕реЗрдм - 1135
  17. рдЖрдИрдлреЛрди - 1122
  18. рдбрд┐рдЬрд╛рдЗрди - 1110
  19. рдЕрдЬрдЧрд░ - 1108
  20. рд╣рд╛рд╕реНрдп - резрежремрез
  21. рдЗрдВрдЯрд░рдиреЗрдЯ - 1040
  22. рдЧреАрдХ рдкрддреНрд░рд┐рдХрд╛ - 983
  23. рд╡реАрдбрд┐рдпреЛ - 970
  24. рд╡рд┐рдЬреНрдЮрд╛рдкрди - 968
  25. Android - 876

рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдЖрдИрдбреА рдкреНрд░рд╛рд░реВрдк, рд╢реАрд░реНрд╖рдХ_рдЯреИрдЧ, рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛)ред

рдЕрдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд░реБрдЭрд╛рдиреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ (рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп):
рдЕрдЬрдЧрд░рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯрдПрдВрдбреНрд░реЙрдпрдб
рдЖрдк get_image (tag_title) рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдРрд╕реА рдЫрд╡рд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди "рдореИрдВ рдПрдХ рдЬрд╛рджреВрдЧрд░ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВред" рдореИрдВ рд╕рднреА рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджреНрдпрдкрд┐ рдорд╛рдорд▓реЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдФрд░ рдЖрдХрд╛рд░рд┐рдХреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЯреИрдЧ рдХреА рд╕реВрдЪреА рдХреЛ рддреБрд░рдВрдд рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИред

рдкреВрд░рд╛ рдХреЛрдб github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдк рд╕рднреА рдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In197308/


All Articles