เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบฎเบทเบญเบ™เบ”เป‰เบงเบ Notion เปเบฅเบฐ Python

เบ‚เป‰เบญเบเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบชเบฐเป€เปเบตเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เปเบˆเบเบขเบฒเบเบ›เบถเป‰เบกเปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบญเบตเป€เบฅเบฑเบเป‚เบ—เบฃเบ™เบดเบเบ‚เบญเบ‡เบ‚เป‰เบญเบเบ”เบตเบ—เบตเปˆเบชเบธเบ”. เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เบ‚เป‰เบญเบเบกเบฒเบฎเบญเบ”เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เบ”เป‰เบงเบเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบฒเปเบฅเบฐเบชเบดเปˆเบ‡เบ”เบตเป†เบญเบทเปˆเบ™เป†. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเปƒเบซเป‰เบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเบชเบปเบ™เปƒเบˆเบžเบฒเบเปƒเบ•เป‰ cat.

เบชเปˆเบงเบ™เบ—เบต 1. Dropbox

เบ›เบถเป‰เบกเบ—เบฑเบ‡เปเบปเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆเปƒเบ™ dropbox. เบกเบต 4 เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เปเบšเปˆเบ‡โ€‹เบญเบญเบโ€‹เบ—เบธเบโ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบธเบโ€‹เบขเปˆเบฒเบ‡โ€‹: เบซเบ™เบฑเบ‡โ€‹เบชเบทโ€‹เบžเบดเบกโ€‹, เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹เบญเป‰เบฒเบ‡โ€‹เบญเบตเบ‡โ€‹, fictionโ€‹, เบšเปเปˆโ€‹เปเบกเปˆเบ™ fictionโ€‹. เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเป€เบžเบตเปˆเบกเบ›เบทเป‰เบกเบญเป‰เบฒเบ‡เบญเบตเบ‡เปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เบ›เบทเป‰เบกเบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™ .epub, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเปเบกเปˆเบ™ .pdf. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฒเบ™เปเบเป‰เป„เบ‚เบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบ•เป‰เบญเบ‡เบเบงเบกเป€เบญเบปเบฒเบ—เบฑเบ‡เบชเบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบ.

เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบ›เบทเป‰เบกเบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

/ะšะฝะธะณะธ/ะะตั…ัƒะดะพะถะตัั‚ะฒะตะฝะฝะพะต/ะะพะฒะพะต/ะ”ะธะทะฐะนะฝ/ะฎั€ะธะน ะ“ะพั€ะดะพะฝ/ะšะฝะธะณะฐ ะฟั€ะพ ะฑัƒะบะฒั‹ ะพั‚ ะ ะดะพ ะฏ.epub 

เบ–เป‰เบฒเบ›เบทเป‰เบกเปเบกเปˆเบ™เบ™เบดเบเบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ›เบฐเป€เบžเบ” (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, "เบเบฒเบ™เบญเบญเบเปเบšเบš" เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡) เบ–เบทเบเป‚เบเบเบเป‰เบฒเบ.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบšเปเปˆเบฅเบปเบšเบเบงเบ™ Dropbox API, เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบกเบตเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ—เบตเปˆ synchronizes เป‚เบŸเบ™เป€เบ”เบต. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปเบœเบ™เบเบฒเบ™เปเบกเปˆเบ™เบ™เบตเป‰: เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบ›เบทเป‰เบกเบˆเบฒเบเป‚เบŸเป€เบ”เบต, เปเบฅเปˆเบ™เปเบ•เปˆเบฅเบฐเบ›เบทเป‰เบกเบœเปˆเบฒเบ™เบ•เบปเบงเบ™เบฑเบšเบ„เปเบฒ, เปเบฅเบฐเป€เบžเบตเปˆเบกเบกเบฑเบ™เปƒเบชเปˆเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”.

เบชเปˆเบงเบ™เบ—เบต 2. เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เบ„เบงเบ™เป€เบšเบดเปˆเบ‡เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰. เป€เบญเบปเบฒโ€‹เปƒเบˆโ€‹เปƒเบชเปˆโ€‹: เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ”เบตเบโ€‹เบงเปˆเบฒโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบŠเบทเปˆโ€‹เบ–เบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบฅเบฒโ€‹เบ•เบดเบ™โ€‹.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบฎเบทเบญเบ™เบ”เป‰เบงเบ Notion เปเบฅเบฐ Python

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰ Notion API เบ—เบตเปˆเบšเปเปˆเป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบญเบฑเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบˆเบฑเบ”เบชเบปเปˆเบ‡เป€เบ—เบทเปˆเบญ.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบฎเบทเบญเบ™เบ”เป‰เบงเบ Notion เปเบฅเบฐ Python

เป„เบ›เบ—เบตเปˆ Notion, เบเบปเบ” Ctrl + Shift + J, เป„เบ›เบ—เบตเปˆ Application -> Cookies, เบ„เบฑเบ”เบฅเบญเบ token_v2 เปเบฅเบฐเป‚เบ—เบซเบฒเบกเบฑเบ™ TOKEN. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ”เป‰เบงเบเบ›เป‰เบฒเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบฅเบฐเบ„เบฑเบ”เบฅเบญเบเบฅเบดเป‰เบ‡. เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบตเป‰เบ™เบกเบฑเบ™เบงเปˆเบฒ NOTION.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš Notion.

database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()

เบ•เปเปˆเป„เบ›, เปƒเบซเป‰เบ‚เบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเปเบ–เบงเปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

def add_row(path, file, words_count, pages_count, hours):
    row = database.collection.add_row()
    row.title = file

    tags = path.split("/")

    if len(tags) >= 1:
        row.what = tags[0]

    if len(tags) >= 2:
        row.state = tags[1]

    if len(tags) >= 3:
        if tags[0] == "ะฅัƒะดะพะถะตัั‚ะฒะตะฝะฝะพะต":
            row.author = tags[2]

        elif tags[0] == "ะะตั…ัƒะดะพะถะตัั‚ะฒะตะฝะฝะพะต":
            row.tags = tags[2]

        elif tags[0] == "ะฃั‡ะตะฑะฝะธะบะธ":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

เบกเบตเบซเบเบฑเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบขเบนเปˆเบ™เบตเป‰. เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเปเบฅเบฐเป€เบžเบตเปˆเบกเปเบ–เบงเปƒเบซเบกเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™เปเบ–เบงเบ—เปเบฒเบญเบดเบ”. เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเปเบเบเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ•เบฒเบก "/" เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบš tags. Tags - เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡ "เบชเบดเบฅเบฐเบ›เบฐ", "เบเบฒเบ™เบญเบญเบเปเบšเบš", เบœเบนเป‰เบ—เบตเปˆเป€เบ›เบฑเบ™เบœเบนเป‰เบ‚เบฝเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ—เบปเปˆเบ‡เบ™เบฒเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เปเบœเปˆเบ™.

เบžเบฒเบเบ—เบต 3. เบเบฒเบ™เบ™เบฑเบšเบ„เปเบฒ, เบŠเบปเปˆเบงเป‚เบกเบ‡ เปเบฅเบฐเบ„เบงเบฒเบกเบชเบธเบเบญเบทเปˆเบ™เป†

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบฝเบเบ—เบตเปˆเบเบฒเบเบเบงเปˆเบฒ. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบทเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบญเบ‡เบฎเบนเบšเปเบšเบš: epub เปเบฅเบฐ pdf. เบ–เป‰เบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบกเบตเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™เบเบฑเบš epub - เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เปเบกเปˆเบ™เบญเบฒเบ”เบˆเบฐเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเปˆเบฝเบงเบเบฑเบš pdf: เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบ•เบดเบ”เบเบฒเบง.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบฑเบšเบ„เปเบฒเปƒเบ™ PDF เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰: เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบฒเปเบฅเบฐเบ„เบนเบ™เบ”เป‰เบงเบเบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™ (เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบเบ•เปเปˆเบซเบ™เป‰เบฒ).

เบ™เบตเป‰เปเบกเปˆเบ™เบ™เบฒเบ‡:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE เบ™เบตเป‰เบชเบณเบฅเบฑเบšเปœเป‰เบฒ A4 เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 300.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบžเบทเปˆเบญเบ™เบฑเบšเบซเบ™เป‰เบฒ. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ pyPDF2.

def get_pdf_pages_number(path, filename):
    pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
    return pdf.getNumPages()

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ‚เบฝเบ™เบชเบดเปˆเบ‡เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบฑเบšเบซเบ™เป‰เบฒเปƒเบ™ Epub. เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ epub_ converter. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบ›เบทเป‰เบก, เบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบชเบฒเบ, เปเบฅเบฐเบ™เบฑเบšเบ„เปเบฒเบชเบฑเบšเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเปเบ–เบง.

def get_epub_pages_number(path, filename):
    book = open_book(os.path.join(path, filename))
    lines = convert_epub_to_lines(book)
    words_count = 0

    for line in lines:
        words_count += len(line.split(" "))

    return round(words_count / WORDS_PER_PAGE)

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบ„เบดเบ”เป„เบฅเปˆเป€เบงเบฅเบฒ. เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป€เบงเบฅเบฒเบ™เบฑเบšเบ„เปเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบเปเบฅเบฐเปเบšเปˆเบ‡เบกเบฑเบ™เป‚เบ”เบเบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เบญเปˆเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

def get_reading_time(words_count):
    return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10

เบชเปˆเบงเบ™เบ—เบต 4. เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบธเบเบžเบฒเบเบชเปˆเบงเบ™

เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเบ›เบทเป‰เบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบตเบ›เบทเป‰เบกเบขเบนเปˆเปƒเบ™ Notion เบซเบผเบทเบšเปเปˆ: เบ–เป‰เบฒเบกเบต, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป€เบชเบฑเป‰เบ™.
เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เบ›เบฐเป€เบžเบ”เป„เบŸเบฅเปŒเปเบฅเบฐ, เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบ™เบตเป‰, เบ™เบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†. เป€เบžเบตเปˆเบกเบ›เบถเป‰เบกเบขเบนเปˆเบ—เป‰เบฒเบ.

เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš:

for root, subdirs, files in os.walk(BOOKS_DIR):
    if len(files) > 0 and check_for_excusion(root):
        for file in files:
            array = file.split(".")
            filetype = file.split(".")[len(array) - 1]
            filename = file.replace("." + filetype, "")
            local_root = root.replace(BOOKS_DIR, "")

            print("Dir: {}, file: {}".format(local_root, file))

            if not check_for_existence(filename):
                print("Dir: {}, file: {}".format(local_root, file))

                if filetype == "pdf":
                    count = get_pdf_pages_number(root, file)

                else:
                    count = get_epub_pages_number(root, file)

                words_count = get_words_count(count)
                hours = get_reading_time(words_count)
                print("Pages: {}, Words: {}, Hours: {}".format(count, words_count, hours))
                add_row(local_root, filename, words_count, count, hours)

เปเบฅเบฐเบŸเบฑเบ‡เบŠเบฑเบ™เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ›เบถเป‰เบกเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ›เบฑเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

def check_for_existence(filename):
    for row in current_rows:
        if row.title in filename:
            return True

        elif filename in row.title:
            return True

    return False

เบชเบฐเบซเบฅเบธเบš

เบ‚เบญเบšเปƒเบˆเบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเบญเปˆเบฒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เบˆเบฐโ€‹เบŠเปˆเบงเบโ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบก :)

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™