<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Cozy Codespace</title><author><name>Cozy Codespace</name></author><id>https://teletype.in/atom/cozy_codespace</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/cozy_codespace?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/cozy_codespace?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-06T05:09:49.769Z</updated><entry><id>cozy_codespace:Hk70-Ntl4</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/Hk70-Ntl4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>Пишем Telegram бота на Python + хостинг на Heroku</title><published>2018-12-22T14:11:08.809Z</published><updated>2018-12-22T14:15:48.382Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/57/57370a0d-9449-4601-9538-8ba858460289.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/84/84d1c9f9-7637-4d8a-bb55-46052989685e.png&quot;&gt;Статья от автора канала @cozy_codespace</summary><content type="html">
  &lt;p&gt;Статья от автора канала &lt;a href=&quot;http://t.me/cozy_codespace&quot; target=&quot;_blank&quot;&gt;@cozy_codespace&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Приветствую вас, программисты! Сегодня я расскажу вам о том, как написать бота в Telegram с нуля и запустить его на бесплатной платформе по хостингу Heroku.&lt;/p&gt;
  &lt;p&gt;На просторах интернета похожих статей я не видел, поэтому, то, что вы прочитаете в этой статье будет являться уникальным контентом.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Что мы будем использовать?&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;Библиотеку &lt;strong&gt;&lt;em&gt;python-telegram-bot &lt;/em&gt;&lt;/strong&gt;(&lt;a href=&quot;https://github.com/python-telegram-bot/python-telegram-bot&quot; target=&quot;_blank&quot;&gt;ссылка на GitHub репозиторий&lt;/a&gt;) с помощью которой мы сможем использовать Telegram Bot API&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Visual Studio Code(VS Code)&lt;/strong&gt; в качестве текстового редактора, где мы будем писать код&lt;/li&gt;
    &lt;li&gt;Для хостинга сервис - &lt;a href=&quot;http://heroku.com&quot; target=&quot;_blank&quot;&gt;heroku.com&lt;/a&gt;. Вам нужно будет создать там учётную запись&lt;/li&gt;
    &lt;li&gt;Интерпретатор Python, который вы можете скачать &lt;a href=&quot;https://www.python.org/&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Аккаунт в &lt;a href=&quot;http://telegram.org&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;, для того, чтобы создать бота и тестировать его&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;ОЧЕНЬ ВАЖНО! В этом туториале я использую операционную систему Windows, поэтому некоторые моменты могут отличаться, в зависимости от вашей ОС.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Что будет делать бот?&lt;/h2&gt;
  &lt;p&gt;Бот, которого мы будем писать будет помогать пользователям с изучением академических слов из теста SAT. Он будет иметь две функции:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Отправлять случайные слова из списка из 262 академических слов&lt;/li&gt;
    &lt;li&gt;Отправлять вопросы и варианты ответа для того, чтобы пользователь смог проверить своё знание академических слов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Этот бот будет полезен подписчикам моего телеграм канала &lt;a href=&quot;http://t.me/satprepare&quot; target=&quot;_blank&quot;&gt;@satprepare&lt;/a&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Этап 1. Подготовка к написанию бота&lt;/h2&gt;
  &lt;p&gt;Для начала нам необходимо создать директорию(папку) с нашим проектом. В моём случае она называется &lt;em&gt;SATVocabularyBot &lt;/em&gt;и находится на рабочем столе. Поэтому её расположение следующее: &lt;strong&gt;C:\Users\HP\Desktop\SATVocabularyBot&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Далее заходим в эту папку в &lt;strong&gt;Visual Studio Code&lt;/strong&gt; через File - &lt;strong&gt;Open Folder&lt;/strong&gt;. После этого давайте сразу создадим &lt;strong&gt;Python &lt;/strong&gt;файл с расширением &lt;strong&gt;.py&lt;/strong&gt; в нашем проекте и назовём его &lt;strong&gt;main.py&lt;/strong&gt;. Он у меня уже есть, но выглядеть это будет примерно так:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/84/84d1c9f9-7637-4d8a-bb55-46052989685e.png&quot; width=&quot;968&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;На этом же скриншоте под окном вы можете увидеть открытый терминал. Вам нужно тоже его открыть через &lt;strong&gt;View - Terminal&lt;/strong&gt;. Далее, через этот терминал вам необходимо установить библиотеку &lt;strong&gt;&lt;em&gt;python-telegram-bot&lt;/em&gt;&lt;/strong&gt;. Сделать это можно написав:&lt;/p&gt;
  &lt;pre&gt;pip install python-telegram-bot
&lt;/pre&gt;
  &lt;p&gt;Это будет выглядеть так:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/86/864dba50-a55e-4c0a-b8c4-fb44f7dcd86e.png&quot; width=&quot;1142&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;И заметьте, что я использую тот &lt;strong&gt;интерпретатор Python&lt;/strong&gt;, который установил сам, а не тот который предлагает VS Code. Это помогло мне избежать кучу ошибок при установке библиотеки.&lt;/p&gt;
  &lt;p&gt;Лучше использовать Python версии 3.7.0 и выше!&lt;/p&gt;
  &lt;p&gt;После того, как вы нажмёте &lt;strong&gt;Enter&lt;/strong&gt;, у вас установится библиотека и мы сможем начать писать код.&lt;/p&gt;
  &lt;p&gt;Но, как писать бота, которого у нас нет?&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Этап 2. Создание бота&lt;/h2&gt;
  &lt;p&gt;Теперь нам необходимо создать самого бота в Telegram. Поэтому заходим в Telegram и открываем переписку с &amp;quot;ботом для создания ботов&amp;quot; - &lt;a href=&quot;http://t.me/BotFather&quot; target=&quot;_blank&quot;&gt;@BotFather&lt;/a&gt;.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/03/03c248b0-0d40-4c3c-b9ed-f7589deccfb1.png&quot; width=&quot;928&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;На скриншоте я скрыл от вас TOKEN бота, так как имея доступ к нему можно делать с ботом всё, что угодно. Поэтому и вы никому не показывайте токен своего бота, пока что просто скопируйте его.&lt;/p&gt;
  &lt;p&gt;Теперь у нас есть бот и можно начать его программировать. Кстати, в этом туториале я не буду показывать, как поставить аватарку или приветственный текст для вашего бота, так как вы можете сделать это сами с помощью команды Edit Bot у &lt;a href=&quot;http://t.me/BotFather&quot; target=&quot;_blank&quot;&gt;@BotFather&lt;/a&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Этап 3. Написание бота&lt;/h2&gt;
  &lt;p&gt;На этом этапе мы уже начнём писать самого бота, то есть его функционал.&lt;/p&gt;
  &lt;p&gt;В файле &lt;strong&gt;main.py&lt;/strong&gt; пишем следующее:&lt;/p&gt;
  &lt;pre&gt;import logging
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, RegexHandler

logging.basicConfig(format=&amp;#x27;%(asctime)s - %(name)s - %(levelname)s - %(message)s&amp;#x27;, level=logging.INFO)
logger = logging.getLogger(__name__)

def main():
    updater = Updater(token=&amp;#x27;Токен вашего бота&amp;#x27;)

    dispatcher = updater.dispatcher

    conv_handler = ConversationHandler(
        entry_points = [CommandHandler(&amp;#x27;start&amp;#x27;, start)],

        states = {
            ACTION: [RegexHandler(&amp;#x27;^(Learn new words|Check yourself)$&amp;#x27;, action)],
            ANSWER: [MessageHandler(Filters.text, answer_check)]
        },

        fallbacks=[CommandHandler(&amp;#x27;cancel&amp;#x27;, cancel)]
    )

    dispatcher.add_handler(conv_handler)

    dispatcher.add_error_handler(error)
    
    updater.start_polling()
    updater.idle()

if __name__ == &amp;#x27;__main__&amp;#x27;:
    main()
&lt;/pre&gt;
  &lt;p&gt;Давайте разберёмся с тем, что это значит.&lt;/p&gt;
  &lt;p&gt;В самом начале мы импортируем различные библиотеки:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;logging &lt;/strong&gt;- это библиотека для логирования, с помощью которой мы создадим логгер и сможем выявлять ошибки в коде нашего бота.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;telegram и telegram.ext&lt;/strong&gt; - библиотека для работы с ботом Telegram, которую мы установили в первом этапе нашего туториала.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Далее, мы создаём логгер, который будет выводить ошибки в терминале.&lt;/p&gt;
  &lt;p&gt;После этого мы создаём метод &lt;strong&gt;main&lt;/strong&gt;, который будет всё время вызываться первым благодаря этим строчкам кода, которые мы записали в конце предыдущего блока кода:&lt;/p&gt;
  &lt;pre&gt;if __name__ == &amp;#x27;__main__&amp;#x27;:
    main()
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Коротко об объектах и обработчиках&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;В самом же методе &lt;strong&gt;main &lt;/strong&gt;мы создаём объекты:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;updater &lt;/strong&gt;- с его помощью мы соединимся нашим ботом в телеграме, поэтому в одинарные кавычки вам нужно скопировать и вставить токен вашего бота.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;dispatcher &lt;/strong&gt;- все обновления будут идти через него, то есть он будет отвечать за обновления в непосредственно самом Telegram, текстовые команды и обработчики событий(handlers).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;conv_handler &lt;/strong&gt;- является объектом Conversation Handler, который является сложным обработчиком событий. Он включает в себя 4 разных коллекций обработчиков событий: список &lt;em&gt;entry_points&lt;/em&gt;, словарь &lt;em&gt;states&lt;/em&gt;, список &lt;em&gt;fallbacks &lt;/em&gt;и список &lt;em&gt;timed_out_behavior&lt;/em&gt;. В нашем боте мы будем использовать только первые три.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Если говорить подробнее о коллекциях обработчиков, то можно сказать, что &lt;strong&gt;&lt;em&gt;entry_points &lt;/em&gt;&lt;/strong&gt;используется для того, чтобы начать переписку с ботом. Поэтому мы вносим в неё CommandHandler - обработчик команд на команду &amp;#x27;&lt;em&gt;start&lt;/em&gt;&amp;#x27;. Таким образом, когда пользователь напишет &amp;#x27;&lt;em&gt;/start&lt;/em&gt;&amp;#x27; боту, у нас вызовется &lt;strong&gt;метод start&lt;/strong&gt;, который мы напишем чуть позже.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;States &lt;/em&gt;&lt;/strong&gt;может содержать несколько обработчиков событий, которые отвечают за различные состояния переписки. Например, в нашем случае мы имеем два состояния: &lt;strong&gt;ACTION &lt;/strong&gt;и &lt;strong&gt;ANSWER&lt;/strong&gt;. Первое отвечает за то, какое действие выберет пользователь, а второе за то, какой ответ напишет пользователь при выполнении теста. &lt;strong&gt;RegexHandler &lt;/strong&gt;в первом состоянии обрабатывает строки &amp;#x27;Learn new words&amp;#x27; или &amp;#x27;Check yourself&amp;#x27; и далее передаёт один из них в метод &lt;strong&gt;action&lt;/strong&gt;. &lt;strong&gt;MessageHandler &lt;/strong&gt;во втором состоянии обрабатывает любой текст, поэтому мы написали &lt;strong&gt;Filters.text&lt;/strong&gt;, но он также может обрабатывать и другие типы сообщений. В конце статьи я дам ссылку на документацию, где всё это есть.&lt;/p&gt;
  &lt;p&gt;Поэтому за пределами метода &lt;strong&gt;main&lt;/strong&gt;(можно после создания логгера)пишем следующие строки кода:&lt;/p&gt;
  &lt;pre&gt;ACTION, ANSWER = range(2)
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Fallbacks &lt;/em&gt;&lt;/strong&gt;используется для того, чтобы выйти из текущего состояния, поэтому при нажатии на &amp;#x27;/&lt;em&gt;cancel&lt;/em&gt;&amp;#x27; пользователь сможет выйти на предыдущее состояние.&lt;/p&gt;
  &lt;p&gt;Далее, через эти строки мы добавляем обработчик событий &lt;strong&gt;conv_handler &lt;/strong&gt;и &lt;strong&gt;error_handler&lt;/strong&gt;, отвечающий за ошибки в dispatcher:&lt;/p&gt;
  &lt;pre&gt;dispatcher.add_handler(conv_handler)
dispatcher.add_error_handler(error)
&lt;/pre&gt;
  &lt;p&gt;Следующие строки кода начинают принимать обновления с нашего Telegram бота:&lt;/p&gt;
  &lt;pre&gt;updater.start_polling()
updater.idle() #незн зачем это
&lt;/pre&gt;
  &lt;p&gt;Но я не совсем уверен в последнем (просто увидел, как это используется в примерах в официальном репозитории библиотеки)&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Polling и Webhooks&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Небольшое отступление от темы:&lt;/p&gt;
  &lt;blockquote&gt;Наш бот использует &lt;strong&gt;polling&lt;/strong&gt;, то есть периодически отправляет запросы на сервера Telegram. Можно использовать &lt;strong&gt;webhook&lt;/strong&gt;-и, чтобы бот отправлял запросы на определённый url, но опыта работы с ними у меня еще нет, да и используются они только для крупных проектов, которые используются огромным количеством пользователей и там нужна производительность.&lt;/blockquote&gt;
  &lt;p&gt;Продолжаем писать нашего бота...&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Метод start&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;В первую очередь напишем метод (функцию) &lt;strong&gt;start&lt;/strong&gt;, который, как я и говорил будет вызываться командой &amp;#x27;&lt;em&gt;/start&lt;/em&gt;&amp;#x27;:&lt;/p&gt;
  &lt;pre&gt;def start(bot, update):
    bot.send_chat_action(chat_id=update.message.chat_id, action = telegram.ChatAction.TYPING)
    time.sleep(1)
    custom_keyboard = [[&amp;#x27;Learn new words&amp;#x27;], [&amp;#x27;Check yourself&amp;#x27;]]
    reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard, one_time_keyboard=False)
    bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;What do you want to do?&amp;quot;, reply_markup=reply_markup)
    return ACTION
&lt;/pre&gt;
  &lt;p&gt;Здесь мы используем time, поэтому не забудьте импортировать библиотеку time в самом начале:&lt;/p&gt;
  &lt;pre&gt;import time
&lt;/pre&gt;
  &lt;p&gt;А еще это:&lt;/p&gt;
  &lt;pre&gt;from telegram import ChatAction
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;bot.send_chat_action&lt;/strong&gt; - предназначен для того, чтобы бот показывал действие, как здесь:&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8c/8c96ea4e-1ef6-4388-8983-d06069eb1f69.png&quot; width=&quot;187&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;time.sleep(1)&lt;/strong&gt; - для того, чтобы он делал это на протяжении 1 секунды. Без этого вы не увидите этой надписи на скриншоте.&lt;/p&gt;
  &lt;p&gt;Далее, мы создаём кастомную клавиатуру (&lt;strong&gt;custom_keyboard&lt;/strong&gt;), состоящую из двух кнопок на выбор.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;reply_markup &lt;/strong&gt;- это разметка, которая будет отправляться в ответ на сообщение пользователя. В неё мы добавляем нашу кастомную клавиатуру.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;one_time_keyboard = False&lt;/strong&gt; - означает то, что клавиатура не исчезнет после того, как пользователь отправит сообщение.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;bot.send_message&lt;/strong&gt; - для того, чтобы бот отправил соответствующее сообщение пользователю в чат. В нашем случае принимает параметры (может принимать больше):&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;chat_id &lt;/strong&gt;- уникальный идентификатор чата в формате @username&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;text &lt;/strong&gt;- определённый текст в одинарных кавычках&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;reply_markup &lt;/strong&gt;- разметка, которую должен отправить бот, то есть клавиатуру&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Последняя строка в методе отправляет состояние &lt;strong&gt;ACTION&lt;/strong&gt;, которое далее перехватывает &lt;strong&gt;RegexHandler&lt;/strong&gt;, о котором говорилось раньше.&lt;/p&gt;
  &lt;p&gt;Кстати, не забудьте добавить этот метод в код, так как возможно без него у вас не будет работать &lt;strong&gt;bot.send_action &lt;/strong&gt;(взял этот код в &lt;strong&gt;Wiki Pages&lt;/strong&gt; репозитория, поэтому понятия не имею, что он делает):&lt;/p&gt;
  &lt;pre&gt;def send_action(action):
    def decorator(func):
        @wraps(func)
        def command_func(*args, **kwargs):
            bot, update = args
            bot.send_chat_action(chat_id=update.effective_message.chat_id, action=action)
            return func(bot, update, **kwargs)
        return command_func
    
    return decorator
&lt;/pre&gt;
  &lt;p&gt;Поэтому нужно еще импортировать следующее:&lt;/p&gt;
  &lt;pre&gt;from functools import wraps
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Файл dictionaries.py&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Перед тем, как начать писать метод &lt;strong&gt;action &lt;/strong&gt;необходимо создать 3 списка, которые будут источником информации для бота. Нужно создать список слов, описаний слов и типов слов, то есть &lt;strong&gt;words&lt;/strong&gt;, &lt;strong&gt;description &lt;/strong&gt;и &lt;strong&gt;type&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Я решил занести эти списки в новый файл dictionaries.py, чтобы эти данные не мешали в нашем главном файле. По скриншоту ниже вы поймёте почему😂:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f8/f805aee5-403f-48b3-866e-334bd75c2ec5.png&quot; width=&quot;1569&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Говнокод? Возможно. Просто мне лень париться насчёт различных баз данных для хранения всей информации.&lt;/p&gt;
  &lt;p&gt;Не забудьте написать это, чтобы мы смогли пользоваться этими списками в файле &lt;strong&gt;main.py&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre&gt;import dictionaries

words = dictionaries.words
type = dictionaries.type
description = dictionaries.description
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Методы action и learn&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Следующий шаг - это написание метода &lt;strong&gt;action&lt;/strong&gt;, который вызывается RegexHandler-ом. Вот как он будет выглядеть:&lt;/p&gt;
  &lt;pre&gt;def action(bot, update):
    if(update.message.text == &amp;#x27;Learn new words&amp;#x27;):
        learn(bot, update)
    elif(update.message.text == &amp;#x27;Check yourself&amp;#x27;):
        num = generate_correct_answer()
        global correct_word 
        correct_word = num
        correct_num = random.randint(1, 4)
        first_incorrect = words[random.randint(1, len(words) - 1)]
        second_incorrect = words[random.randint(1, len(words) - 1)]
        third_incorrect = words[random.randint(1, len(words) - 1)]
        if(correct_num == 1):
            custom_keyboard=[[words[correct_word]], [first_incorrect], 
            [second_incorrect], [third_incorrect]]
        elif(correct_num == 2):
            custom_keyboard=[[first_incorrect], [words[correct_word]], 
            [second_incorrect], [third_incorrect]]
        elif(correct_num == 3):
            custom_keyboard=[[first_incorrect], [second_incorrect], 
            [words[correct_word]], [third_incorrect]]
        elif(correct_num == 4):
            custom_keyboard=[[first_incorrect], [second_incorrect], 
            [third_incorrect], [words[correct_word]]]
        reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard, one_time_keyboard=False)
        bot.send_message(chat_id=update.message.chat_id, text=description[correct_word], reply_markup=reply_markup)
        return ANSWER
&lt;/pre&gt;
  &lt;p&gt;При первом условии вызывается метод &lt;strong&gt;learn&lt;/strong&gt;, который будет отправлять случайные слова из списка:&lt;/p&gt;
  &lt;pre&gt;def learn(bot, update):
    num = random.randint(1, len(words) - 1)
    bot.send_chat_action(chat_id=update.message.chat_id , action = telegram.ChatAction.TYPING)
    time.sleep(1)
    bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;*&amp;quot;+ words[num]+&amp;quot;* - &amp;quot;+description[num]+&amp;quot;\n&amp;quot;+&amp;quot;\n_&amp;quot;+type[num]+&amp;quot;_&amp;quot;, parse_mode=telegram.ParseMode.MARKDOWN)
    bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;What is next?&amp;quot;)
&lt;/pre&gt;
  &lt;p&gt;Здесь всё понятно - создаётся рандомное число и бот отправляет всю информацию из списка по индексу этого числа о нём в виде одного сообщения.&lt;/p&gt;
  &lt;p&gt;Рандом? Нужно импортировать следующее:&lt;/p&gt;
  &lt;pre&gt;import random
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;parse_mode &lt;/strong&gt;- нужен для того, чтобы бот превратил нужные слова в кавычках в &lt;strong&gt;bold &lt;/strong&gt;или &lt;em&gt;italic&lt;/em&gt;. Для этого используется &lt;strong&gt;Markdown mode&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Возвращаемся к методу &lt;strong&gt;action&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Здесь также создаётся случайное число через метод &lt;strong&gt;generate_correct_answer&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre&gt;def generate_correct_answer():
    num = random.randint(1, len(words) - 1)
    return num
&lt;/pre&gt;
  &lt;p&gt;Также в этом методе будет использоваться глобальная переменная &lt;strong&gt;correct_word&lt;/strong&gt;, поэтому добавьте её вне всех методов:&lt;/p&gt;
  &lt;pre&gt;correct_word = 0
&lt;/pre&gt;
  &lt;p&gt;Для доступа к ней вне метода &lt;strong&gt;action &lt;/strong&gt;я написал метод &lt;strong&gt;get_correct_word&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre&gt;def get_correct_word():
    return correct_word
&lt;/pre&gt;
  &lt;p&gt;Далее в методе &lt;strong&gt;action &lt;/strong&gt;мы создаём три неправильных случайных ответа и распределяем все ответы тоже в случайном порядке. Думаю здесь не нужно объяснений - всё и так предельно ясно.&lt;/p&gt;
  &lt;p&gt;Ну и в конце метода возвращается состояние ANSWER, которое перехватывается &lt;strong&gt;MessageHandler&lt;/strong&gt;-ом, после чего вызывается метод &lt;strong&gt;answer_check&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Метод answer_check&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Этот метод будет отвечать за то, чтобы проверять ответы введённые пользователем. Он выглядит так:&lt;/p&gt;
  &lt;pre&gt;def answer_check(bot, update):
    correct_word = get_correct_word()
    custom_keyboard = [[&amp;#x27;Learn new words&amp;#x27;], [&amp;#x27;Check yourself&amp;#x27;]]
    reply_markup = telegram.ReplyKeyboardMarkup(custom_keyboard, one_time_keyboard=False)
    if(update.message.text == words[correct_word]):
        bot.send_chat_action(chat_id=update.message.chat_id , action = telegram.ChatAction.TYPING)
        bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;*Correct!*&amp;quot;, parse_mode=telegram.ParseMode.MARKDOWN)
        bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;What do you want to do?&amp;quot;, reply_markup=reply_markup)
        return ACTION
    else:
        bot.send_chat_action(chat_id=update.message.chat_id , action = telegram.ChatAction.TYPING)
        bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;*Incorrect!*&amp;quot; + &amp;quot; Correct answer is: &amp;quot; + words[correct_word], parse_mode=telegram.ParseMode.MARKDOWN)
        bot.send_message(chat_id=update.message.chat_id, text=&amp;quot;What do you want to do?&amp;quot;, reply_markup=reply_markup)
        return ACTION
&lt;/pre&gt;
  &lt;p&gt;Здесь есть два условия: если ответ правильный и если нет. В соответствии с этим будут отображаться соответствующие сообщения от бота.&lt;/p&gt;
  &lt;p&gt;В конце оба условия возвращают состояние &lt;strong&gt;ACTION&lt;/strong&gt;, чтобы продолжить диалог с пользователем.&lt;/p&gt;
  &lt;p&gt;Еще есть два метода &lt;strong&gt;cancel &lt;/strong&gt;и &lt;strong&gt;error&lt;/strong&gt;, которые вызываются из метода &lt;strong&gt;main &lt;/strong&gt;и играют незначительную часть нашего кода (комментировать их не буду):&lt;/p&gt;
  &lt;pre&gt;def cancel(bot, update):
    return ConversationHandler.END

def error(bot, update, error):
    logger.warning(&amp;#x27;Update &amp;quot;%s&amp;quot; caused error &amp;quot;%s&amp;quot;&amp;#x27;, update, error)
&lt;/pre&gt;
  &lt;p&gt;Итак, мы написали нашего бота но он работает только тогда, когда мы нажимаем на кнопку &lt;strong&gt;run&lt;/strong&gt;. Но как сделать так, чтобы он работал постоянно?&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Часть 4. Хостинг бота&lt;/h2&gt;
  &lt;p&gt;Надеюсь вы уже создали аккаунт в Heroku. Всё, что вам требуется сейчас сделать это войти в свой аккаунт и увидеть этот экран:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4d/4d4c4695-5379-483d-a21a-67241f4eda88.png&quot; width=&quot;1646&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Не обращайте внимание на мои проекты, вместо них у вас ничего не будет.&lt;/p&gt;
  &lt;p&gt;Далее, вам необходимо скачать &lt;strong&gt;Heroku Command Line Interface (CLI)&lt;/strong&gt; по &lt;a href=&quot;https://devcenter.heroku.com/articles/getting-started-with-python#set-up&quot; target=&quot;_blank&quot;&gt;этой ссылке&lt;/a&gt; и &lt;strong&gt;Git &lt;/strong&gt;по &lt;a href=&quot;https://git-scm.com/book/en/v2/Getting-Started-Installing-Git&quot; target=&quot;_blank&quot;&gt;этой ссылке&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;После того, как вы &lt;strong&gt;всё установили&lt;/strong&gt;, перейдите в терминал в &lt;strong&gt;VS Code&lt;/strong&gt;. Напишите туда следующее:&lt;/p&gt;
  &lt;pre&gt;heroku login
&lt;/pre&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/58/5830041b-07f2-4180-9de3-3fd90385e79a.png&quot; width=&quot;877&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Нажмите на любую кнопку (кроме q) и вас перекинет в браузер, где вам нужно нажать на кнопку &lt;strong&gt;Log in&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/68/68169630-6a8e-4acb-98f0-18efea6a3af1.png&quot; width=&quot;1004&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Далее можно вернуться обратно в &lt;strong&gt;VS Code&lt;/strong&gt;. Перед тем, как загрузить нашего бота на Heroku, нам следует добавить еще два файла: &lt;strong&gt;requirements.txt&lt;/strong&gt; и &lt;strong&gt;Procfile&lt;/strong&gt;. Заметьте, что у &lt;strong&gt;Procfile &lt;/strong&gt;нет никакого расширения.&lt;/p&gt;
  &lt;p&gt;В &lt;strong&gt;Procfile &lt;/strong&gt;напишем эту строку:&lt;/p&gt;
  &lt;pre&gt;worker: python main.py $PORT
&lt;/pre&gt;
  &lt;p&gt;Это означает, что тип нашего &lt;strong&gt;dyno &lt;/strong&gt;(так называется что-то на подобии сервера в Heroku) - worker будет работать с файлом &lt;strong&gt;main.py&lt;/strong&gt;. Он будет работать всегда и без передышки. &lt;strong&gt;Web dyno&lt;/strong&gt; будет иногда выключаться, но нам этого не надо.&lt;/p&gt;
  &lt;p&gt;В файл &lt;strong&gt;requirements.txt&lt;/strong&gt; пишет эти строки:&lt;/p&gt;
  &lt;pre&gt;appdirs==1.4.3
certifi==2018.1.18
Cython==0.23
Django==1.10.6
docutils==0.13.1
packaging==16.8
pipenv==11.8.0
psutil==5.0.1
pyowm==2.8.0
Pygments==2.2.0
pyparsing==2.2.0
pyTelegramBotAPI==3.6.1
python-telegram-bot==7.0.1
requests==2.13.0
six==1.10.0
virtualenv==15.1.0
virtualenv-clone==0.3.0
&lt;/pre&gt;
  &lt;p&gt;Это различные требования для работы нашего бота на &lt;strong&gt;Heroku&lt;/strong&gt;. Возможно некоторые из них вовсе не нужны, попробуйте проверить :D.&lt;/p&gt;
  &lt;p&gt;Теперь у нас всё готово для загрузки бота на Heroku!&lt;/p&gt;
  &lt;p&gt;Возвращаемся в терминал, где мы залогинились на Heroku, помните? Пишем туда:&lt;/p&gt;
  &lt;pre&gt;heroku create
&lt;/pre&gt;
  &lt;p&gt;После этого у нас создаётся проект на Heroku. Зайдите на сайт и посмотрите его имя. Например, у меня создался проект и он называется &lt;em&gt;agile-refuge-53805&lt;/em&gt;.&lt;/p&gt;
  &lt;p&gt;Далее, в терминале следует написать:&lt;/p&gt;
  &lt;pre&gt;git add .
&lt;/pre&gt;
  &lt;p&gt;Потом делаете свой первый коммит:&lt;/p&gt;
  &lt;pre&gt;git commit -am &amp;quot;make it better&amp;quot;
&lt;/pre&gt;
  &lt;p&gt;И затем делаете деплой своего кода на Heroku:&lt;/p&gt;
  &lt;pre&gt;git push heroku master
&lt;/pre&gt;
  &lt;p&gt;Вам нужно будет подождать немного (обычно от 1 до 3 минут) и потом написать следующее в терминал, чтобы запустить вашего &lt;strong&gt;worker dyno&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre&gt;heroku ps:scale worker=1
&lt;/pre&gt;
  &lt;p&gt;Готово! Проверьте своего бота - теперь он должен работать постоянно.&lt;/p&gt;
  &lt;p&gt;Кстати, Heroku не полностью бесплатный сервис, поэтому иногда они будут присылать вам сообщения о том, что ваши dyno перестанут работать надо заплатить. Я обычно игнорю такие сообщения, а боты работают как ни в чем не бывало :)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Я надеюсь вам понравился мой туториал и вы написали своего бота в Telegram! Если вам понравилась статья, то не поленитесь поставить лайк или написать мне &amp;quot;Спасибо!&amp;quot;. Это будет мотивировать меня писать для вас статьи!&lt;/p&gt;
  &lt;p&gt;Если вы немного запутались, то вот &lt;a href=&quot;https://github.com/abekek/sat_vocabulary_bot&quot; target=&quot;_blank&quot;&gt;GitHub репозиторий&lt;/a&gt; на этого бота.&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://media.readthedocs.org/pdf/python-telegram-bot/latest/python-telegram-bot.pdf&quot; target=&quot;_blank&quot;&gt;Ссылка на официальную документацию&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://github.com/abekek/iogkf-members-database&quot; target=&quot;_blank&quot;&gt;Мой GitHub&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пиши &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>cozy_codespace:BkKJ4zO07</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/BkKJ4zO07?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>Приложение на C# + связка с MySQL базой данных</title><published>2018-11-25T14:47:48.831Z</published><updated>2018-11-25T14:47:48.831Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/be/be2211d2-a60c-4879-978b-9c23a1c82004.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://teletype.in/files/d8/d8168e2d-d01f-4059-916a-ed2f12f09b0b.png&quot;&gt;Привет всем кодерам! В этом мини-туториале мы с вами с нуля напишем десктопное приложение на С#, которое будет работать с базой данных. Это задание было дано учебной программой 11 класса НИШ ФМН г.Алматы.</summary><content type="html">
  &lt;p&gt;Привет всем кодерам! В этом мини-туториале мы с вами с нуля напишем десктопное приложение на С#, которое будет работать с базой данных. Это задание было дано учебной программой 11 класса НИШ ФМН г.Алматы.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Что мы будем для этого использовать?&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Среда программирования&lt;/strong&gt;: Visual Studio 2017 (версия не имеет никакого значения)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Языки&lt;/strong&gt;: C# - для клиентской части приложения, MySQL - для работы с данными в базе данных нашего приложения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Что будет выполнять приложение?&lt;/h2&gt;
  &lt;p&gt;Наше приложение будет добавлять, изменять, обновлять, удалять и запрашивать данные из базы данных каратистов. &amp;quot;А почему каратистов?&amp;quot; - спросите вы. Так потому что это самая родная для меня тема, вот и будем рассматривать данный пример.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Создание проекта&lt;/h2&gt;
  &lt;p&gt;После того, как вы скачали Visual Studio себе на компьютер, вам следует создать проект.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Как это сделать?&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;Создать проект -&amp;gt; Visual C# -&amp;gt; Приложение Windows Forms -&amp;gt; &lt;em&gt;*Выбираем название для проекта и его расположение*&lt;/em&gt; -&amp;gt; OK&lt;/p&gt;
  &lt;p&gt;Теперь у вас готов проект и можно приступать к работе!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Создание форм (Часть 1)&lt;/h2&gt;
  &lt;p&gt;Теперь нам нужно создать графический интерфейс приложения через формы. Добавлять новые формы легко. Просто нажимаете правой кнопкой мыши на свой проект и выбираете &amp;quot;Добавить&amp;quot;, как на скриншоте ниже:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/d8/d8168e2d-d01f-4059-916a-ed2f12f09b0b.png&quot; width=&quot;1158&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Далее следует поработать над дизайном наших форм. Не будем сильно изощряться и сделаем максимально минималистичный дизайн:&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;Главное меню&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/23/23f73555-883f-48bb-a609-9d07e45e6e86.png&quot; width=&quot;595&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Меню выбора&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a1/a1a8e70b-88b8-4ef3-9f4b-55dc3cc01517.png&quot; width=&quot;580&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Меню выбора для редактирования&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a1/a1510557-fedf-440b-bd09-10c64d167a32.png&quot; width=&quot;579&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;strong&gt;Форма для добавления нового пользователя&lt;/strong&gt;&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/20/20cf25f3-3ea9-47c9-b468-5251ec57cab3.png&quot; width=&quot;581&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Так-с. Дальше пока что мы не пойдём, так как для начала нам нужно понять как всё будет работать. У нас есть форма для добавления каратиста, и нам еще нужны формы для создания запросов, для просмотра базы данных и для редактирования её. Но где сама база данных?&lt;/p&gt;
  &lt;p&gt;Её нет. Поэтому нам нужно немедленно её создать!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Создание базы данных&lt;/h2&gt;
  &lt;p&gt;Переходим во вкладку &amp;quot;Средства&amp;quot; и выбираем &amp;quot;Подключиться к базе данных&amp;quot;. Далее открывается окно &amp;quot;Добавить подключение&amp;quot;, где в поле &amp;quot;Источник данных&amp;quot; мы выбираем &amp;quot;&lt;strong&gt;Файл базы данных Microsoft SQL Server (SqlClient)&lt;/strong&gt;&amp;quot;. Даём любое название файлу базы данных, в нашем случае - &amp;quot;IOGKF_members&amp;quot;. Далее нажимаем кнопку &amp;quot;ОК&amp;quot; и в левой стороне экрана видим, как у нас добавилась новая база данных.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a9/a9fad739-7ff4-4d57-8b64-aa2a4c5792d0.png&quot; width=&quot;320&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Раскрываем директорию с нашей базой данных и видим самую первую папку &amp;quot;Таблицы&amp;quot; - она нас и интересует. Жмём по ней правой кнопкой мыши и нажимаем &amp;quot;Добавить новую таблицу&amp;quot;.&lt;/p&gt;
  &lt;p&gt;Можно создать таблицу двумя путями: 1) Конструктором 2) Через SQL код&lt;/p&gt;
  &lt;p&gt;Если вам лень делать её самим, то скопируйте следующий SQL код и вставьте его в поле с кодом у таблицы:&lt;/p&gt;
  &lt;pre&gt;CREATE TABLE [dbo].[Members] (
    [member_id]  INT          NOT NULL,
    [last_name]  VARCHAR (20) NULL,
    [first_name] VARCHAR (20) NULL,
    [age]        INT          NULL,
    [rank]       VARCHAR (3)  NULL,
    [rank_value] INT          NULL,
    [sensei]     VARCHAR (20) NULL,
    [dojo]       VARCHAR (20) NULL,
    PRIMARY KEY CLUSTERED ([member_id] ASC)
);
&lt;/pre&gt;
  &lt;p&gt;&lt;strong&gt;Коротко о типах данных в SQL&lt;/strong&gt;&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;varchar &lt;/strong&gt;- тот же самый String, то есть строка (в скобках пишем её максимальную длину)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;int &lt;/strong&gt;- целые числа&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;binary &lt;/strong&gt;- тот же самый boolean, то есть True or False, только в SQL - это 1 и 0 соответственно&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;И еще...&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;null &lt;/strong&gt;- указываем может ли переменная быть пустой, то есть не содержать информации&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;primary key&lt;/strong&gt; - первичный ключ, в данном случае это member_id. Таким образом, все значения member_id уникальны&lt;/p&gt;
  &lt;p&gt;После того как вы создали таблицу, нужно её сохранить. Нажмите ctrl + s или просто закройте файл с таблицей после чего у вас появится сообщение о сохранении таблицы.&lt;/p&gt;
  &lt;p&gt;Ок, теперь у нас есть база данных и таблица, где будет храниться информация о каратистах.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Создание форм (Часть 2) + код&lt;/h2&gt;
  &lt;p&gt;Давайте напишем программный код &lt;strong&gt;для добавления каратистов&lt;/strong&gt; в нашу базу данных. В моём проекте эта форма называется Form5 (у неё надпись &amp;quot;Add User&amp;quot; в предыдущих скриншотах). В классе этой формы пишем следующее:&lt;/p&gt;
  &lt;pre&gt;public string conString = &amp;quot;Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30&amp;quot;;
&lt;/pre&gt;
  &lt;p&gt;Здесь мы создали строковую переменную &lt;em&gt;conString &lt;/em&gt;и присвоили ей значение строки подключения базы данных. Чтобы посмотреть вашу строку подключения нажмите правой кнопкой мыши по базе данных и выберите &amp;quot;Свойства&amp;quot;:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/6f/6f7237ca-1172-4e2d-a5cb-b68f5a8744d8.png&quot; width=&quot;380&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь два раза нажимаем на кнопку &amp;quot;Add&amp;quot; в конструкторе нашей формы и таким образом открываем код, который будет выполняться при её нажатии. Вот код метода, который выполняется при нажатии:&lt;/p&gt;
  &lt;pre&gt;private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(conString);

            con.Open();

            if(con.State == System.Data.ConnectionState.Open)
            {
                string q = &amp;quot;insert into Members(member_id, last_name, first_name,&amp;quot; +
                    &amp;quot; age, rank, rank_value, sensei, dojo)&amp;quot; +
                    &amp;quot; values(&amp;#x27;&amp;quot; + textBox1.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + textBox2.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + textBox3.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + textBox4.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + comboBox2.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + comboBox1.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + comboBox3.Text.ToString() + &amp;quot;&amp;#x27;,&amp;#x27;&amp;quot; + textBox8.Text.ToString() + &amp;quot;&amp;#x27;) &amp;quot;;
                SqlCommand cmd = new SqlCommand(q, con);
                cmd.ExecuteNonQuery();
                MessageBox.Show(&amp;quot;Connection was successful!&amp;quot;);
            }

            con.Close();
        }

&lt;/pre&gt;
  &lt;p&gt;Мы создаём объект &lt;em&gt;con &lt;/em&gt;типа SqlConnection и если наша база данных подключена к приложению у нас будет выполняться код находящийся под блоком &lt;em&gt;if&lt;/em&gt;. Там у нас сохранена SQL команда в строке &lt;em&gt;q&lt;/em&gt;, которая позже передаётся в объект cmd типа &lt;em&gt;SqlCommand&lt;/em&gt;, который позже выполняет функцию &lt;em&gt;ExecuteNonQuery&lt;/em&gt;, которая выполняет данный SQL запрос. После при успешном выполнении в приложении выведется сообщение об успешном добавлении каратиста. Всё достаточно просто!&lt;/p&gt;
  &lt;p&gt;Кстати, как работают кнопки навигации в приложении, то есть для перехода между формами?&lt;/p&gt;
  &lt;p&gt;Вот держите пример кода, по этому шаблону они все и работают:&lt;/p&gt;
  &lt;pre&gt;private void button3_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            Form3 form3= new Form3();
            form3.ShowDialog();
        }

&lt;/pre&gt;
  &lt;p&gt;Далее давайте напишем код для &lt;strong&gt;формы с обычным просмотром базы данных&lt;/strong&gt;. Допустим, что мы уже заполнили базу данных и она должна выглядить так при работе приложения:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/49/49e2067b-4465-4345-9b2a-46accd2f04cc.png&quot; width=&quot;582&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Чтобы ��рийти к такому результату нам нужно добавить в нашу форму DataGridView, объект, который будет отображать таблицу. Сделать это очень просто, на скриншоте это видно:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/74/74189535-ed47-4412-8c25-b01211a8168d.png&quot; width=&quot;907&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В классе этой формы пишем следующее:&lt;/p&gt;
  &lt;pre&gt;SqlConnection con = new SqlConnection(&amp;quot;Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30&amp;quot;);
SqlCommand cmd;
SqlDataAdapter adapt;

&lt;/pre&gt;
  &lt;p&gt;Что-то наподобии этой строчки у вас должно появиться автоматически в Load методе класса вашей формы:&lt;/p&gt;
  &lt;pre&gt;this.membersTableAdapter.Fill(this.iOGKF_membersDataSet.Members);
&lt;/pre&gt;
  &lt;p&gt;Она заполняет DataGridView данными из таблицы. Теперь в этот же метод Load добавляем эти строчки кода. С помощью них база данных будет постоянно обновляться внешне:&lt;/p&gt;
  &lt;pre&gt;con.Open();
DataTable dt = new DataTable();
adapt = new SqlDataAdapter(&amp;quot;select * from Members&amp;quot;, con);
adapt.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();
&lt;/pre&gt;
  &lt;p&gt;Готово!&lt;/p&gt;
  &lt;p&gt;А как сделать так, чтобы каратисты &lt;strong&gt;показывались по определённым критериям&lt;/strong&gt;? Здесь нам нужно делать уже SQL запрос, но о них информация будет чуть позже на канале. Создаём новую форму, добавляем DataGridView и несколько текстовых полей. Кто шарит в SQL, тот поймёт в чем смысл этой формы:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/4e/4e361366-93ed-4cf6-af57-15ed967a4a68.png&quot; width=&quot;590&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Пишем код в метод, который будет выполняться при нажатии на кнопку &amp;quot;Show&amp;quot;:&lt;/p&gt;
  &lt;pre&gt;private void button1_Click(object sender, EventArgs e)
        {
            string SqlText;

            SqlText = &amp;quot;SELECT &amp;quot; + textBox1.Text.ToString() + &amp;quot; FROM Members WHERE &amp;quot; + textBox2.Text.ToString() + &amp;quot; ORDER BY &amp;quot; + textBox3.Text.ToString();

            SqlDataAdapter da = new SqlDataAdapter(SqlText, conString);
            DataSet ds = new DataSet();
            da.Fill(ds, &amp;quot;[Members]&amp;quot;);

            dataGridView1.DataSource = ds.Tables[&amp;quot;[Members]&amp;quot;].DefaultView;
        }

&lt;/pre&gt;
  &lt;p&gt;В принципе, алгоритм здесь тот же самый, но мы уже создаем отдельный DataSet - коллекцию неупорядоченных данных, которые позже будут отображаться в DataGridView. Сам же DataSet был заполнен теми данными, которые получились от SQL запроса.&lt;/p&gt;
  &lt;p&gt;Форма готова!&lt;/p&gt;
  &lt;p&gt;Напоследок осталось одно из самых сложных - сделать &lt;strong&gt;форму с редактированием базы данных&lt;/strong&gt;. Вот, как она выглядит:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/42/42cf8c42-c699-437a-a499-95b28b9c1647.png&quot; width=&quot;594&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как всегда пишем эти строчки кода в класс формы:&lt;/p&gt;
  &lt;pre&gt;public string conString = &amp;quot;Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30&amp;quot;;
SqlConnection con = new SqlConnection(&amp;quot;Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30&amp;quot;);
SqlCommand cmd;
SqlDataAdapter adapt;
&lt;/pre&gt;
  &lt;p&gt;А это, как я раньше писал, для постоянного внешнего обновления базы данных в DataGridView:&lt;/p&gt;
  &lt;pre&gt;private void Form7_Load(object sender, EventArgs e)
        {
            this.membersTableAdapter.Fill(this.iOGKF_membersDataSet.Members);
            con.Open();
            DataTable dt = new DataTable();
            adapt = new SqlDataAdapter(&amp;quot;select * from Members&amp;quot;, con);
            adapt.Fill(dt);
            dataGridView1.DataSource = dt;
            con.Close();
        }
&lt;/pre&gt;
  &lt;p&gt;Теперь мы начнём писать код для кнопок.&lt;/p&gt;
  &lt;p&gt;Код &lt;strong&gt;для добавления каратистов&lt;/strong&gt; из таблицы:&lt;/p&gt;
  &lt;pre&gt;private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox2.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox3.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox4.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox5.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox6.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox7.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox8.Text != &amp;quot;&amp;quot;)
            {
                cmd = new SqlCommand(&amp;quot;insert into Members(member_id,last_name,first_name,age,rank,rank_value,sensei,dojo) values(@member_id,@last_name,@first_name,@age,@rank,@rank_value,@sensei,@dojo)&amp;quot;, con);
                con.Open();
                cmd.Parameters.AddWithValue(&amp;quot;@member_id&amp;quot;, textBox1.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@last_name&amp;quot;, textBox2.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@first_name&amp;quot;, textBox3.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@age&amp;quot;, textBox4.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@rank&amp;quot;, textBox5.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@rank_value&amp;quot;, textBox6.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@sensei&amp;quot;, textBox7.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@dojo&amp;quot;, textBox8.Text);
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show(&amp;quot;Record Inserted Successfully&amp;quot;);
                DisplayData();
                ClearData();
            }
            else
            {
                MessageBox.Show(&amp;quot;Please Provide Details!&amp;quot;);
            }
        }
&lt;/pre&gt;
  &lt;p&gt;Код &lt;strong&gt;для редактирования информации&lt;/strong&gt; о каратистах:&lt;/p&gt;
  &lt;pre&gt;private void button4_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox2.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox3.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox4.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox5.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox6.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox7.Text != &amp;quot;&amp;quot; &amp;amp;&amp;amp; textBox8.Text != &amp;quot;&amp;quot;)
            {
                cmd = new SqlCommand(&amp;quot;update Members set member_id=@member_id,last_name=@last_name,first_name=@first_name,age=@age,rank=@rank,rank_value=@rank_value,sensei=@sensei,dojo=@dojo where member_id=@member_id&amp;quot;, con);
                con.Open();
                cmd.Parameters.AddWithValue(&amp;quot;@member_id&amp;quot;, textBox1.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@last_name&amp;quot;, textBox2.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@first_name&amp;quot;, textBox3.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@age&amp;quot;, textBox4.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@rank&amp;quot;, textBox5.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@rank_value&amp;quot;, textBox6.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@sensei&amp;quot;, textBox7.Text);
                cmd.Parameters.AddWithValue(&amp;quot;@dojo&amp;quot;, textBox8.Text);
                cmd.ExecuteNonQuery();
                MessageBox.Show(&amp;quot;Record Updated Successfully&amp;quot;);
                con.Close();
                DisplayData();
                ClearData();
            }
            else
            {
                MessageBox.Show(&amp;quot;Please Select Record to Update&amp;quot;);
            }
        }
&lt;/pre&gt;
  &lt;p&gt;Код &lt;strong&gt;для удаления каратистов&lt;/strong&gt; из базы данных:&lt;/p&gt;
  &lt;pre&gt;private void button5_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != null)
            {
                cmd = new SqlCommand(&amp;quot;delete Members where member_id=@member_id&amp;quot;, con);
                con.Open();
                cmd.Parameters.AddWithValue(&amp;quot;@member_id&amp;quot;, textBox1.Text);
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show(&amp;quot;Record Deleted Successfully!&amp;quot;);
                DisplayData();
                ClearData();
            }
            else
            {
                MessageBox.Show(&amp;quot;Please Select Record to Delete&amp;quot;);
            }
        }
&lt;/pre&gt;
  &lt;p&gt;Весь код выше работает по алгоритму, который я объяснял выше: идёт соединение с базой данных, выполняется команда, добавляются параметры в эту команду из текстовых полей и далее выводится сообщение.&lt;/p&gt;
  &lt;p&gt;Как вы заметили везде вызываются 2 метода - DisplayData и ClearData. Вот код для них:&lt;/p&gt;
  &lt;pre&gt;private void DisplayData()
        {
            con.Open();
            DataTable dt = new DataTable();
            adapt = new SqlDataAdapter(&amp;quot;select * from Members&amp;quot;, con);
            adapt.Fill(dt);
            dataGridView1.DataSource = dt;
            con.Close();
        }

private void ClearData()
        {
            textBox1.Text = &amp;quot;&amp;quot;;
            textBox2.Text = &amp;quot;&amp;quot;;
            textBox3.Text = &amp;quot;&amp;quot;;
            textBox4.Text = &amp;quot;&amp;quot;;
            textBox5.Text = &amp;quot;&amp;quot;;
            textBox6.Text = &amp;quot;&amp;quot;;
            textBox7.Text = &amp;quot;&amp;quot;;
            textBox8.Text = &amp;quot;&amp;quot;;
        }
&lt;/pre&gt;
  &lt;p&gt;Также надо написать код для метода, который будет вызываться при нажатии на header в DataGridView и будет заполнять текстовые поля. Header - эта та область DataGridView, при нажатии на которую будет выделяться вся информация о каратисте, соответственно эта информация будет добавляться в соответствующие текстовые поля, для удобного редактирования. Выглядит это так:&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9f/9f8b583b-b689-4475-ae79-f83847f0dd14.png&quot; width=&quot;580&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Но прежде чем добавить этот метод, нам необходимо создать обработчик нажатий (Event Handler). Добавляем его в конструктор нашей формы:&lt;/p&gt;
  &lt;pre&gt;public Form7()
        {
            InitializeComponent();
            dataGridView1.RowHeaderMouseClick += new DataGridViewCellMouseEventHandler(OnRowHeaderMouseClick);
        }
&lt;/pre&gt;
  &lt;p&gt;А вот теперь добавляем метод:&lt;/p&gt;
  &lt;pre&gt;private void OnRowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
            textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
            textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
            textBox4.Text = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
            textBox5.Text = dataGridView1.Rows[e.RowIndex].Cells[4].Value.ToString();
            textBox6.Text = dataGridView1.Rows[e.RowIndex].Cells[5].Value.ToString();
            textBox7.Text = dataGridView1.Rows[e.RowIndex].Cells[6].Value.ToString();
            textBox8.Text = dataGridView1.Rows[e.RowIndex].Cells[7].Value.ToString();
        }

&lt;/pre&gt;
  &lt;p&gt;Вот и всё! У нас почти готовая программа, тебе надо лишь чуть доработать её и добавить мелкие детали!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Если что, я добавил этот проект к себе в GitHub, поэтому весь код можно посмотреть именно там. Только осторожно, там очень много файлов в которых можно легко запутаться. Желаю тебе удачи! :D&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://github.com/abekek/iogkf-members-database&quot; target=&quot;_blank&quot;&gt;Мой GitHub&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пиши &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>cozy_codespace:HJks8XHTX</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/HJks8XHTX?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>Джефф Безос - история успеха</title><published>2018-11-11T03:52:58.791Z</published><updated>2018-11-11T03:52:58.791Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/1b/1b233f33-8853-475b-bf96-c66af7a55b99.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/ad681201-6e27-4f66-85f6-05567880c9e5/Untitled.png?AWSAccessKeyId=ASIAT73L2G45JNA3NJ7C&amp;Expires=1541994358&amp;Signature=tBZCIGxmj4pgwgysOxwwVB4Shqk%3D&amp;x-amz-security-token=FQoGZXIvYXdzEKD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDOK1zzetJkWKFCKfqiK3Awl0RyijBdoLcXmT4ledtVZMl14R1fjiv93ZnONenQi%2BXZDpaZTEaXhh8166YAIEhwQX0IbKOamQioMg%2Fr5INhiW%2FvIhJDedB3xUrcOHWV4eggonHaBOU6XB61hXvnJ3GTCkWwJfcwxW9zTjQF79xcU%2FbhY6kWorekSN5l%2F0Jx5gHKiYHY9N7yXjwoJsDvXF%2BIENMRbjo1p3a69vCRZ68NinJS0Oq5p1JBmRRFUM7nPWHMV8VBvkiv4QoB1yoaBcW6AKd4KLtrrKBbm2ZlE6q%2BEVvLNawMQDCrbhFHKsikGrQi9qeF28kxSsGbKza6fvI%2Fw5Pk9wrpfW12AqLLtMyTPE1P70%2B9K5MsmTR4xYFqFSGNmf%2F2slKk4zXRjDG93dPRuqLHh1e7kAN6rKPLCNheWCh2nMbm4MP3hcT8L8CTLDJkmZTyBkRdwf04Qu0ufv1VpSjNjYeSa3b5x6K3VDXu%2BPhgmCqIrlOKsGM6HPUovN406Rfe8EWV0W0zOmwScWelObzp%2FSbb1KYFRg8ytIjzar8kEij6o3QD8KdkALsUfWRyLuK7%2FOP22VGSYD%2FQEzQuEOfFr3OhAozcSd3wU%3D&quot;&gt;Вчера он продавал свои книги в своем офисе-гараже, а сегодня он по праву может отдохнуть на своем ранчо с видом на космодром. История об основателе одной из самых крупных империй в интернете и о том, кто является живым примером того, к чему может привести преданность своему делу, стабильный труд и постоянная тяга к знаниям.</summary><content type="html">
  &lt;p&gt;Вчера он продавал свои книги в своем офисе-гараже, а сегодня он по праву может отдохнуть на своем ранчо с видом на космодром. История об основателе одной из самых крупных империй в интернете и о том, кто является живым примером того, к чему может привести преданность своему делу, стабильный труд и постоянная тяга к знаниям.&lt;/p&gt;
  &lt;p&gt;Дамы и господа, позвольте рассказать вам историю о Джеффе Безосе, который является основателем Amazon, создателем аэрокосмической компании Blue Origin, владельцем газеты &amp;quot;The Washington Post&amp;quot;, обладателем самого крупного капитала в мире, и просто человеком, который не побоялся воплотить свои идеи в реальность и внедрить их в нашу современную жизнь.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/ad681201-6e27-4f66-85f6-05567880c9e5/Untitled.png?AWSAccessKeyId=ASIAT73L2G45JNA3NJ7C&amp;Expires=1541994358&amp;Signature=tBZCIGxmj4pgwgysOxwwVB4Shqk%3D&amp;x-amz-security-token=FQoGZXIvYXdzEKD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDOK1zzetJkWKFCKfqiK3Awl0RyijBdoLcXmT4ledtVZMl14R1fjiv93ZnONenQi%2BXZDpaZTEaXhh8166YAIEhwQX0IbKOamQioMg%2Fr5INhiW%2FvIhJDedB3xUrcOHWV4eggonHaBOU6XB61hXvnJ3GTCkWwJfcwxW9zTjQF79xcU%2FbhY6kWorekSN5l%2F0Jx5gHKiYHY9N7yXjwoJsDvXF%2BIENMRbjo1p3a69vCRZ68NinJS0Oq5p1JBmRRFUM7nPWHMV8VBvkiv4QoB1yoaBcW6AKd4KLtrrKBbm2ZlE6q%2BEVvLNawMQDCrbhFHKsikGrQi9qeF28kxSsGbKza6fvI%2Fw5Pk9wrpfW12AqLLtMyTPE1P70%2B9K5MsmTR4xYFqFSGNmf%2F2slKk4zXRjDG93dPRuqLHh1e7kAN6rKPLCNheWCh2nMbm4MP3hcT8L8CTLDJkmZTyBkRdwf04Qu0ufv1VpSjNjYeSa3b5x6K3VDXu%2BPhgmCqIrlOKsGM6HPUovN406Rfe8EWV0W0zOmwScWelObzp%2FSbb1KYFRg8ytIjzar8kEij6o3QD8KdkALsUfWRyLuK7%2FOP22VGSYD%2FQEzQuEOfFr3OhAozcSd3wU%3D&quot; width=&quot;1080&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;Джефф родился 12 января 1964 года в Альбукерке, штат Нью-Мексико. Его детство не было столь благополучным и хорошим - биологический отец Джеффа отказался от воспитания сына и покинул ребенка вместе с матерью, когда той было всего 17 лет. С тех пор, они больше не виделись. Однако через 4 года, мать Джеффа познакомилась с Мигелем Безосом, молодым эмигрантом из Кубы, который бежал из своего дома в 15 лет и чью фамилию Джефф носит по сей день. Мигель воспитал Джеффа как родного сына, работал в банке и стал частью семейного счастья будущего миллиардера.&lt;/p&gt;
  &lt;p&gt;С самого детства, Безос отличался соей дотошностью по отношению к познанию мира вокруг него и это положительно сказалось на его учебе как в школе - где он стал лучшим учеником, так и в университете - он учился в престижном заведении Принстона на факультете электронных измерительных приборов, параллельно занимаясь изучением компьютерной поддержки и логикой программирования, понимая, что эта сфера имела огромный потенциал в будущем.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/6228fb30-391e-4e38-a21f-56d8ce63b897/Untitled.png?AWSAccessKeyId=ASIAT73L2G45GP2W56JK&amp;Expires=1541994422&amp;Signature=vFMVq6lKigKGlb0kZYbi3Gf%2BipY%3D&amp;x-amz-security-token=FQoGZXIvYXdzEKD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDMySnZdKmgONaoWMPSK3A%2B5nLSdLhkQB%2Fkn%2BHTP3W3dmQ3yl4%2BNnSqpWuNkMzODEyFaeO1XERQnOBIeWOMAyGnbkWtCCfnqQT2NNHmnHqEDRMIOPORhfSlbmee5UISOjQkp6qRk3bfpYDSHDWooifcp%2Bne1MTOXiSIzw4ZeBVedRM9yPUM2IJ0L4JKWk5JqSLHbFklBuRwKJdH9WiZtqFEvsO2xHaXxp7qQ1j5oaUdjfkwMczvtM2pwS78wA551b30Jw6hZ6f3FwMzPPwg9lyb2zD8JNf5XR6ijLv84Vac6tVsqRa9AjF%2Brj3eNFhAJML34FajV0ssSiw92go8snS2eGKtFjJpvunTapB2dROZfLI6Jkf%2F9vbv42u8OmfdnBLRhrnC5X4ShNcsVaZ9RuKKYBEHCcHY5UBYPLXB4onUw9iiBOlg60qeRQrvhgqut316X5fj6CJinog87aljFX2VgVttki8vDphNBuEeR4OZkkO%2BoXTX0lMV%2FNSDKjBk3vQn%2F%2B%2F6aZCvsNkHPR5kyDZZDzFAmJdLCV3GLEUTHHavZm9K%2BC2P9Zku6prBZR0k%2BedTZmv62ptgxatAAPtsuQhz2WbdNzeiwoyb6d3wU%3D&quot; width=&quot;620&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p&gt;После обучения, Джефф Безос поработал на Уолл-Стрит в хедж-фонде D.E.Shaw, а также в компании &amp;quot;Bankers Trust&amp;quot;, в которой дослужился до поста вице-президента.&lt;/p&gt;
  &lt;p&gt;Поняв, что он готов к большему, он уволился с последнего места работы и решил начать свой собственный бизнес. Как он признался позже студентам Принстона, он не пожалел бы если бы затея с книжным магазином ни к чему не привела. Напротив, он бы страдал от того, что не пошел на подобное рискованное дело в своей жизни.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Компания, которая была названа в честь одноименной реки с самого начала находилась в гараже Джеффа. Пусть начало и было довольно скромным, но к 1999 году проект разросся настолько, что его цена на бирже оценивалась в $6 млрд. Кроме того, его фирме предрекали крах по причине того, что ее продукция продавалась по цене ниже чем у конкурентов. Но ко всеобщему удивлению (за исключением самого Джеффа), компания стала разрастаться еще шире, так как дешевая цена товара в сопутствии с широким спектром выбора здорово подняли ее рейтинг на рынке продукции.&lt;/p&gt;
  &lt;p&gt;В 2000 году Безос создал аэрокосмическую компанию Blue Origin. Дело в том, что Джефф очень долгое время мечтал о предоставлении возможности простым людям путешествовать в космос. Мечты в итоге сбываются.&lt;/p&gt;
  &lt;p&gt;В 2013 году бизнесмен купил газету &amp;quot;The Washington Post&amp;quot;, со стороны которой он подвергается регулярной критике, но и не только от нее, а также, от действующего Президента США, Дональда Трампа. В ответ на колкости Президента, Безос пообещал найти для него пассажирское место в одной из ракет Blue Origin, сопроводив &amp;quot;проект&amp;quot; хэштегом #SendDonaldtospace, хотя впрочем, этого, возможно, никогда не будет.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;В достижении своих целей, Джефф очень многим обязан своей жене Маккензи, на которой он уже женат 24 года. Маккензи часто вдохновляет Джеффа своей изобретательностью и поддержкой в трудные дни.&lt;/p&gt;
  &lt;p&gt;— Мне нужна была женщина, которая смогла бы вытащить меня из разряда второсортных людей, дать мне идею, помочь в её реализации, — объясняет Джефф. — С Маккензи мне хватило буквально пары фраз, чтобы понять — она изобретательна, и это именно то, что я искал. Без вариантов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;На данный момент, Безос занимается благотворительностью и продолжает работать на собственных проектах. Джефф очень щедр в делении опытом и поэтому он выпустил несколько книг, в которых рассказывает о ключевых идеях и принципах для достижения подобного успеха в жизни. Его изречения часто цитируются во многих социальных сетях для того, чтобы вдохновить других людей на действия во имя реализации своих идей.&lt;/p&gt;
  &lt;p&gt;Джефф Безос стал первым человеком, который достиг состояния в $100 млрд. И неудивительно, ведь для человека, который очень усерден в поиске знаний и готов идти на &amp;quot;все или ничего&amp;quot;, но в то же время уделяет должное внимание и другим аспектам жизни к коим относятся семья и личное счастье, а также коммуникация с людьми, нет никаких преград для достижения своих целей в этой полной возможностей жизни.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Надеемся, что статья была полезной для вас!&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пишите &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>cozy_codespace:BkyVcsVpm</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/BkyVcsVpm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>University of Waterloo</title><published>2018-11-10T20:43:56.162Z</published><updated>2018-11-10T20:43:56.162Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/10/101ae8a3-d2e2-438b-88a4-d6ed401ab4d5.png"></media:thumbnail><category term="universities" label="Universities"></category><summary type="html">&lt;img src=&quot;https://uwaterloo.ca/math/sites/ca.math/files/uploads/images/campus-aerial-east-side.jpg&quot;&gt;Университет Ватерлоо - является одним из самых лучших учебных заведений, как в Канаде, так и в мире. Это далеко не самый простой университет, несмотря на то, что по World University Rankings 2019 он находится между 201 - 250 местом в мире.</summary><content type="html">
  &lt;p&gt;Университет Ватерлоо - является одним из самых лучших учебных заведений, как в Канаде, так и в мире. Это далеко не самый простой университет, несмотря на то, что по World University Rankings 2019 он находится между 201 - 250 местом в мире.&lt;/p&gt;
  &lt;p&gt;Что же его делает таким особенным? Давайте взглянем на статистику:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;#1 исследовательский университет в Канаде (Research Infosource)&lt;/li&gt;
    &lt;li&gt;#2 университет по трудоустройству (2017 QS Employability Rankings)&lt;/li&gt;
    &lt;li&gt;Топ 25 лучших стартап экосистем в мире (Startup Compass 2015)&lt;/li&gt;
    &lt;li&gt;Было создано 1845 стартапов за последние 5 лет (&lt;a href=&quot;http://velocity.uwaterloo.ca/&quot; target=&quot;_blank&quot;&gt;Подробнее о стартап инкубаторе Velocity&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;300+ клубов и кружков&lt;/li&gt;
    &lt;li&gt;33 спортивных команд университетской лиги&lt;/li&gt;
    &lt;li&gt;31,000 студентов бакалавриата: 46% - женского пола, 16% - международных студентов&lt;/li&gt;
    &lt;li&gt;1,000 акров и 100+ зданий на территории кампуса университета&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://uwaterloo.ca/math/sites/ca.math/files/uploads/images/campus-aerial-east-side.jpg&quot; width=&quot;3000&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Однако самой важной особенностью этого - является наличие co-op программ, которые позволяют работать во время семестров на местные IT компании Канады.&lt;/p&gt;
  &lt;blockquote&gt;#1 in the world for partnership with employers (QS 2017 Graduate Employability Rankings)&lt;/blockquote&gt;
  &lt;p&gt;Таким образом, у вас есть 5 лет бакалавриата за которые у вас будет 4 - 6 семестров работы.&lt;/p&gt;
  &lt;blockquote&gt;$45,000 - $85,000 - это средний заработок студентов за 5 лет обучения в университете&lt;/blockquote&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/34/34e0e611-2f66-4a1f-aa38-a3539f496212.png&quot; width=&quot;819&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Почитать подробнее о co-op можно &lt;a href=&quot;https://uwaterloo.ca/future-students/co-op&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Получается у вас, будучи студентом UWaterloo есть возможность оплатить свою учебу, но не полностью.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://oneclassblog.com/wp-content/uploads/2018/05/University-of-Waterloo-Stratford-Campus.jpg&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Что по деньгам?&lt;/h2&gt;
  &lt;p&gt;Cредняя цена за 1 год обучения - $28,000 - $30,000 для международных студентов без учета расходов. Расходы:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Проживание - от $5,500 до $7,400&lt;/li&gt;
    &lt;li&gt;Питание - от $4,400 до $5,200&lt;/li&gt;
    &lt;li&gt;Личные расходы - в среднем $3,000 ($375/месяц)&lt;/li&gt;
    &lt;li&gt;Учебные материалы - $2,000&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;В итоге выходит примерно $45,000 в год. Согласен, многовато. Для этого и придуманы стипендии.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;$1,000 получают студенты находящиеся в 85-89.9% поступивших (admission average) - &lt;strong&gt;Merit Scholarship&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;$2,000 студенты с 90-94.9% - &lt;strong&gt;President&amp;#x27;s Scholarship&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;$5,000+ студенты с 95%+ admission average - &lt;strong&gt;President&amp;#x27;s Scholarship of Distinction&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;$10,000 - студентам на основе их академических достижений и олимпиад - &lt;strong&gt;International Student Entrance Scholarship&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Как поступить?&lt;/h2&gt;
  &lt;p&gt;В нашем случае мы рассматриваем поступления на факультеты математики (Data Science, Computer Science) и инженерии (Software Engineering). Кстати, в будущем мы разберём их разницу.&lt;/p&gt;
  &lt;p&gt;Для них всех общие языковые требования: IELTS - 6.5, TOEFL iBT - 90.&lt;/p&gt;
  &lt;p&gt;Если рассматривать British System, то есть для НИШ (Назарбаев Интеллектуальные Школы), то картина следующая:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Computer Science&lt;/strong&gt; or &lt;strong&gt;Data Science&lt;/strong&gt;: A-level Mathematics min A. Two other academic A-level courses, min A each. English at either the GCSE, AS or A-level.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Software Engineering&lt;/strong&gt;: A-level Mathematics and A-level Physics, min A each. One additional A-level, min B. Chemistry (GCSE-level required, A-level recommended), min B. GCSE-level English, min B. As and A*s recommended for competitive programs.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Короче говоря, нужно учиться на одни пятерки. Про SAT ничего не сказано, значит и не нужно.&lt;/p&gt;
  &lt;p&gt;Конечно, они смотрят не только на ваши академические успехи, но и различные extracurriculars, которые выделят вас на фоне других аппликантов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Ну и напоследок хочу поделиться с вами каналом одного чувака, который закончил University of Waterloo. Его канал - &lt;a href=&quot;https://www.youtube.com/channel/UCV0qA-eDDICsRR9rPcnG7tw&quot; target=&quot;_blank&quot;&gt;Joma Tech&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;Если не нашли того, что искали, то вот держите ссылку на официальный сайт University of Waterloo: &lt;a href=&quot;https://uwaterloo.ca/&quot; target=&quot;_blank&quot;&gt;uwaterloo.ca&lt;/a&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Надеемся, что статья была полезной для вас!&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пишите &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>cozy_codespace:SyxRMG9VTm</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/SyxRMG9VTm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>Как работает Интернет?</title><published>2018-11-10T17:26:17.591Z</published><updated>2018-11-10T17:26:17.591Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/56/5612e5d8-9660-4bac-b4a0-be3229156cf0.png"></media:thumbnail><category term="computer-science" label="Computer Science"></category><summary type="html">&lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/35aed974-7fb7-446d-ba8b-2314fc9953c9/Untitled.png?AWSAccessKeyId=ASIAT73L2G45HEJVXX7L&amp;Expires=1541956633&amp;Signature=oT%2FlbEDshmNK0CNgUMiUFadQ%2FwA%3D&amp;x-amz-security-token=FQoGZXIvYXdzEJX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDPB3DO5PrweHRL8TTSK3A6HmZL81yTJEs%2BPs%2BRG5O5QladGVFGGZPIs5PKxLe2RCMORw4do%2BvSbVifr8BhavTnuUFsbdXpdTsnEzMovIxb3Gtv2LAKZ3xfUiuKdQ7cgBTtmPQ%2BYds4qlZvP9%2FxKrdg0KmYfUT1NgIpr%2B1BflJ1KKAfe4CJDGlLoYxmPIIRgzvQl2SbeSfJLzoEt%2F2%2Fe32ffwIbELz7JmCKqVKocv6C7GsyQ74aBqrlRLPcNHAlaXrSfMbdkD7StwtZ7DSvICXiUgp37wUu1%2FOThXhqreNv2P1bi3r6uZdU30w1bkvo5JDMqJ77hgo4jmOJ8E4kMSzNSYr1ZC3czE%2B3yVi4ry0cwEp1UQjHehwqT7INREB35ZRONe%2FKZcS8jaz%2BBKQRwiiEJRBo04eLb7Ji2BIHo2CPtH83%2B%2BSwmMFQpnACT%2B%2FdL0kkIr5U%2FO4RGG49VnfFPzWoEiFp9vMTt5JTAIa8mQsl9N%2FxvNwExvbLfcPojwoiUOSr9K2DxNHkpNGzzhfYFfzDePB6uqTc5Ha4PZzJNAfmQ%2Ff8i3GrvrJkaAAwj5pcKxmU%2FSY7bRoBBKo9xUjdBi71R%2B796%2FYEQosPma3wU%3D&quot;&gt;Сегодня, никто из нас с вами не может представить жизнь без интернета - он используется везде и очень сильно облегчает нашу жизнь. Быстрое развитие технологий позволило людям внедрить его в большой спектр гаджетов.</summary><content type="html">
  &lt;p&gt;Сегодня, никто из нас с вами не может представить жизнь без интернета - он используется везде и очень сильно облегчает нашу жизнь. Быстрое развитие технологий позволило людям внедрить его в большой спектр гаджетов.&lt;/p&gt;
  &lt;p&gt;Доступ к интернету есть даже у холодильников. Оттуда вы можете заказать из любого места всё то, что ваша душа пожелает - и все это благодаря существованию Всемирной сети.&lt;/p&gt;
  &lt;p&gt;Возникает вопрос: как мы достигли этого и с чего это всё начиналось?&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Есть очень интересная история, которая всё объяснит.&lt;/p&gt;
  &lt;p&gt;70-ые годы: противостояние двух мировых супердержав, конкуренция везде и во всем. В 1957 году СССР уже успели запустить спутник, пока американцы кусали локти и думали над тем, как обеспечить для себя защиту в качестве связи в случае чего-то опасного, как например, ядерная тревога.&lt;/p&gt;
  &lt;p&gt;Поначалу, они не знали, что может помочь этому, им нужно было как то соединить, существовавшие тогда 4 компьютера между собой, чтобы обеспечить хоть какую то скорость связи. Использовать другие средства связи не было вариантом. США - большая страна, поэтому, что бы ты не использовал - телефонную связь или голубиную почту - ничего не смогло бы стать хорошим решением для того чтобы своевременно доставить необходимую в принципиальном соперничестве информацию.&lt;/p&gt;
  &lt;p&gt;И тогда, ребята из Агентства перспективных исследований Министерства обороны США или сокращенно, ARPA задумались, можно ли создать сеть на основе уже существующих в каждом доме обычного гражданина телефонных линий - и они не прогадали.&lt;/p&gt;
  &lt;p&gt;В 1969 году, они создали тестовую версию праотца интернета - ARPANET, которая соединила между собой 4 компьютера на разных концах США. Кроме того, были созданы протоколы - TCP/IP, но об этом чуть позже.&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/35aed974-7fb7-446d-ba8b-2314fc9953c9/Untitled.png?AWSAccessKeyId=ASIAT73L2G45HEJVXX7L&amp;Expires=1541956633&amp;Signature=oT%2FlbEDshmNK0CNgUMiUFadQ%2FwA%3D&amp;x-amz-security-token=FQoGZXIvYXdzEJX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDPB3DO5PrweHRL8TTSK3A6HmZL81yTJEs%2BPs%2BRG5O5QladGVFGGZPIs5PKxLe2RCMORw4do%2BvSbVifr8BhavTnuUFsbdXpdTsnEzMovIxb3Gtv2LAKZ3xfUiuKdQ7cgBTtmPQ%2BYds4qlZvP9%2FxKrdg0KmYfUT1NgIpr%2B1BflJ1KKAfe4CJDGlLoYxmPIIRgzvQl2SbeSfJLzoEt%2F2%2Fe32ffwIbELz7JmCKqVKocv6C7GsyQ74aBqrlRLPcNHAlaXrSfMbdkD7StwtZ7DSvICXiUgp37wUu1%2FOThXhqreNv2P1bi3r6uZdU30w1bkvo5JDMqJ77hgo4jmOJ8E4kMSzNSYr1ZC3czE%2B3yVi4ry0cwEp1UQjHehwqT7INREB35ZRONe%2FKZcS8jaz%2BBKQRwiiEJRBo04eLb7Ji2BIHo2CPtH83%2B%2BSwmMFQpnACT%2B%2FdL0kkIr5U%2FO4RGG49VnfFPzWoEiFp9vMTt5JTAIa8mQsl9N%2FxvNwExvbLfcPojwoiUOSr9K2DxNHkpNGzzhfYFfzDePB6uqTc5Ha4PZzJNAfmQ%2Ff8i3GrvrJkaAAwj5pcKxmU%2FSY7bRoBBKo9xUjdBi71R%2B796%2FYEQosPma3wU%3D&quot; width=&quot;250&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Итак, компьютеры продолжали появляться и в связи с этим начали появляться разные &amp;quot;костыли&amp;quot;, с которыми предстояло справиться уже не только ребятам из Америки, но и тем, кто вообще был причастен ко всему этому.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Первая проблема заключалась в том, что компьютеров становилось все больше и больше, и соединить каждый из них между собой было очень трудно для человека. Представьте себе, если кто-то забудет подключить два компьютера между собой - просто из-за своей невнимательности. Тогда возникло бы много других непоняток в передаче информации между другими хостами (хосты - на языке сетей означает &amp;quot;компьютер&amp;quot;).&lt;/p&gt;
  &lt;p&gt;В совокупности с первой проблемой была и другая - телефонные линии и чередование в их использовании, и это можно объяснить на другом примере. Скажем так, не всем было удобно использовать телефонные линии для двух целей одновременно. Если кто-то использовал их для соединения компьютеров, то в это же время никто не мог поговорить друг с другом через телефоны, потому что сети были заняты ими, и в обратном случае все было аналогично.&lt;/p&gt;
  &lt;p&gt;Последнее, что оказывало проблему на ученых - это безопасность и защита тогдашней сети. Если бы мы могли путешествовать во времени, то можно сказать, что любой из вас, кто обладает хоть какими то знаниями по слабостям в защите сетей и кто бы хотел перенестись в те времена, смог бы просто законектиться и украсть информацию международного уровня и развязать уже уж точно настоящую войну.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Как же мы все таки смогли решить эти три проблемы?&lt;/p&gt;
  &lt;p&gt;Для того, чтобы решить первую проблему было решено создать систему, которая состоит из провайдеров, маршрутизаторов и интернет-серверов.&lt;/p&gt;
  &lt;p&gt;Наверняка, вы слышали о таком понятии как &amp;quot;Локальная сеть&amp;quot;, в частности, когда вы например подключались к WiFi и видели разные сообщения от системы компьютера в зависимости от результата подключения. Таким образом, локальная сеть - это система, которая состоит из подключенных между собой компьютеров в ограниченной территории.&lt;/p&gt;
  &lt;p&gt;Лет 10 назад, многие специально соединяли между собой свои компьютеры кабелями для того чтобы вместе поиграть в Counter-Strike или другую Олд-скульную игру. Принципы не изменились, и если раньше мы играли в CS и подключались с помощью проводов, то сейчас мы играем в Доту или в Танки, но уже через беспроводную сеть WiFi.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Кстати, а что если мы хотим устроить совместный матч с другом находясь в разных городах страны?&lt;/p&gt;
  &lt;p&gt;Тогда на помощь приходят маршрутизаторы - специальные устройства, которые соединяют локальные сети между собой или являются посредниками для других маршрутизаторов. Вы помните фильм &amp;quot;Елки&amp;quot;? Самую первую часть и теорию о шести рукопожатиях?&lt;/p&gt;
  &lt;p&gt;В сетях все работает точно так же, и если в фильме было чудом донести до Президента сообщение от обычного ребенка, то в Интернете это стало настолько обычным делом, что многие просто не знают и не задумываются об этом.&lt;/p&gt;
  &lt;p&gt;Вернемся к маршрутизаторам. Маршрутизаторы в сети представляют собой разные уровни рукопожатий. Ребенок из сюжета фильма не знал, как передать сообщение Президенту, но он знал людей, которые в свою очередь знали других людей, которые знают как добраться к Президенту. Маршрутизаторы точно так же, не знают лично каждый компьютер, но знают маршрутизаторы, которые знают этот же компьютер, которому нужна информация.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Теперь увеличим масштаб еще раз.&lt;/p&gt;
  &lt;p&gt;Что если вы хотите устроить матч находясь на разных континентах?&lt;/p&gt;
  &lt;p&gt;Кстати, для того чтобы решить проблему с телефонными линиями и компьютерными сетями, мы стали прокладывать отдельные кабели, которые уже предназначались только для компьютеров и их соединения. Зачем об этом было сказано в сейчас поймете.&lt;/p&gt;
  &lt;p&gt;Итак, разные континенты, матч в Доте: как это реализуется?&lt;/p&gt;
  &lt;p&gt;Здесь всплывает еще одно понятие - &amp;quot;Интернет-провайдеры&amp;quot;. Их тоже много и вы тоже о них слышали? Казахтелеком, Ростелеком, звучит довольно знакомо. Провайдеры - это еще более старший уровень в устройствах сети. Они как раз таки служат для того, чтобы соединять между собой континенты.&lt;/p&gt;
  &lt;p&gt;Сетевые кабели, о которых было упомянуто выше служат специальными путями, через которые передается сигнал от провайдера к провайдеру, поэтому, они присутствуют везде, даже в морях и океанах. На фотографии, вы можете увидеть процесс прокладывания кабеля, и если вы однажды будете загорать на пляже на Багамских островах и увидите, как подобная группа выходит из воды с очень длинным проводом, который уходит в воду, то не удивляйтесь, потому что благодаря их работе, вы можете играть в онлайн игры. Таким образом, интернет является в прямом смысле сетью и ниже вы можете увидеть межконтинентальную карту интернет-кабелей мира.&lt;/p&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/6b0cab79-188a-4ab9-acec-8d274e23b6f1/Untitled.png?AWSAccessKeyId=ASIAT73L2G45BQ7KN2LV&amp;Expires=1541956583&amp;Signature=fskc7InNVy7TlgutPKC17MtrGe8%3D&amp;x-amz-security-token=FQoGZXIvYXdzEJb%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDITYifF2vWYewBiYlCK3A9qNXfqqIavx8EznySjzgGlPuu7bwTxCt5fW302HjT4TfzEVxftYkkHMD8pTqFpzeouVTchyhkkX80I9V8HIMfdOLuX5yEt2YWSGWangTozxwRkYtQYT03%2BNTQZucd85DL5NyW8pEtTHJsIVLCR3KRAD%2F6JGiL7DJ%2Bk1C7Trf7Tv5M86od4ajLQB7o1BKDu4hvEg41E8Lcw72nU%2FAnxdxY0HPbhm%2BVy0%2FEkfarZzVOTtopWwgvzkdfatq%2BcsUj8kPpBuha1NtIIta2zAyTTlWHE7UW50ajS577ROGdYWFb8UxsdBk8qpffOEIcGYSaDPnd9S5cpqIDDM2CbOMApdinBqp%2BgDvdO7MgvTtO1CatQGpBjSlTdptVJof5%2FmRsevLD4A5lRBNcnbR9sqW2xhJHwEm2BNdNKROmLLAXS6XB9GUCIkAGYdhl02ZcSuGJYs4d34Mdp1vcGEe0BbQvKwGfVklbSKrFRCHLZCMSG0dAhLFEz0zn3umetbhrBaVrpQjb07RF8qTZHIRu6r3Wo8lzVSPdjrzJ4A3RMRMoO4lzodR0nlv8TzZFUjjEHAmt4YXIMVWtkIB0Qo%2FZKb3wU%3D&quot; width=&quot;2196&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/0e22dc48-bf34-4f23-b15d-1728de595f57/Untitled.png?AWSAccessKeyId=ASIAT73L2G45PPZPQT7R&amp;Expires=1541957052&amp;Signature=ZJ80uXcLA%2F8RcbNBc2avvi%2FijkM%3D&amp;x-amz-security-token=FQoGZXIvYXdzEJX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDPrvQoDc%2BBWyXJEWviK3A1%2BVchdUhD4kwzjaBf3hlsz5NlZnWsy2CCbCDmBokrxffT6i9a%2Fy39otCFvkAQfKJBaP5hoHw8DJ4AGfaKCaQKfYRhSsNJPznf4NoX7ZV5muoygImMpVTK3nzlN2mzmpE%2FbCG%2FbBzaTPBK2ch5gLdqmtU7G%2BuK7jgiusbdyv85cWoEktS3vNjprtoclJGVF8nPSEicXlBE5DDzac%2FRiyhH7ciYcKL3mtKO4i1dPE3Tym337dTNNLYrWFbXktRYSFY%2Fgqv%2FyPGinWAdhHI98NELZ1C%2F0zbqNr16g7%2Fs71Dr616Kuqt89v9axNvVdhjtX3ZuMC5IVof2091SVZ4WD2jYnofKSnZoc3vrowkdhGYVDOd9j%2B1nkUwV3RITGXbowTONAQVH6sUeL0aIl6rmiTxmkjP%2FNjroyol8bYKiDxQ6y%2BzbcO5OeBC%2BWK2%2FWfbM2oTB6%2FnngDqhKflSkFrUVWt9EJ50tLrMo9hze48CwQ9AQH7n7qHDu1tq9kfjWx%2BylnXjxSqw%2BVRowf6DjGz5M1MaWm799tksFPqFdLs53Tia1Lvun7MDrgJ1RljSXLJXfHam%2FgGgMyldsotv%2Ba3wU%3D&quot; width=&quot;1062&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;С данными проблемами мы разобрались, но как же обеспечивается безопасность в сети? Это обеспечивают специальные протоколы, которых существует очень много, но основными из них являются TCP/IP и UDP.&lt;/p&gt;
  &lt;p&gt;На самом деле, если вам когда-либо угрожали в социальных сетях &amp;quot;вычислением вашего адреса по айпи&amp;quot; это в какой-то степени не являлось пустыми словами. IP-адреса - адреса, которые присваиваются каждому компьютеру по его выходу в Глобальную сеть, они состоят из четырех разных чисел, диапазоном от 0 до 255 и разделенных между собой точками, пример - 192.65.23.4. В таком случае, первые два числа возможно обозначат страну и город вашего проживания, но из-за того, что &amp;quot;айпи&amp;quot; динамически меняются между пользователями сети, потенциальный злоумышленник попадет не на ваше место проживание, а на место проживания вашего соседа.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Протоколы - это способ общения между компьютерами в интернете. Это похоже на общение людей.&lt;/p&gt;
  &lt;p&gt;Один говорит другому, &amp;quot;Привет, как дела?&amp;quot;, а другой человек это слышит и отвечает &amp;quot;Хорошо, как у тебя?&amp;quot;. Именно таким образом и осуществляется действие протокола TCP. Вы запрашиваете необходимую для вас информацию у сервера, сервер отдает эту информацию и затем, ваш компьютер отдает отчет о переданных пакетах информации. Если не все пакеты данных были переданы, то сервер повторно отправляет их вашему компьютеру. Подходящий для этого пример - это то, когда вы открываете определенный веб-сайт и у вас не отображаются некоторые картинки. Тогда вы перезагружаете страницу и картинки появляются должным образом.&lt;/p&gt;
  &lt;p&gt;Другое дело - UDP протокол. Его вообще не заботит, передались ли вам ваши пакеты или нет. Но если они не передались, то каков от него смысл? А смысл в том, что он осуществляется тогда, когда вам нужна скорость соединения. Пример - видеоразговор в Skype. Если сеть имеет не достаточно хорошее соединение, то картинка вашего друга на экране будет иногда зависать, а после того, как она заработает, картинка вашего друга будет уже совсем другой и то же самое работает в онлайн играх. К сожалению, многие из нас проигрывали из-за того, что наше интернет-соединение было недостаточно хорошим и персонаж соперника, который находился в одном месте, мог резко оказаться в другом, невыгодном для вас месте и кикнуть вашего героя из игры.&lt;/p&gt;
  &lt;p&gt;Интернет может показаться довольно сложной структурой, но если вы сможете разобраться и понять основные понятия, то откроете для себя совсем другой мир информации.&lt;/p&gt;
  &lt;p&gt;Надеемся, что вам понравилась данная статья!&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пишите &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>cozy_codespace:SJF1FL4aX</id><link rel="alternate" type="text/html" href="https://teletype.in/@cozy_codespace/SJF1FL4aX?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cozy_codespace"></link><title>На каком языке мне начать программировать?</title><published>2018-11-10T15:24:56.567Z</published><updated>2018-11-10T16:46:50.084Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/93/932ee50e-78ec-4403-8e6a-c0759bec0d0e.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">Со времени создания самого первого программируемого компьютера, было создано более 8000 языков программирования (ЯП). Каждый год опытные программисты создают всё больше и больше ЯП; некоторые из них становятся очень популярными, а другими пользуются лишь единицы.</summary><content type="html">
  &lt;p&gt;Со времени создания самого первого программируемого компьютера, было создано более 8000 языков программирования (ЯП). Каждый год опытные программисты создают всё больше и больше ЯП; некоторые из них становятся очень популярными, а другими пользуются лишь единицы.&lt;/p&gt;
  &lt;p&gt;Вот и возникает вопрос: &amp;quot;&lt;strong&gt;С какого языка программирования начать&lt;/strong&gt;, ведь их так много?&amp;quot;.&lt;/p&gt;
  &lt;p&gt;Ответ на этот вопрос зависит именно от вашего выбора, а точнее от того, в какой сфере программирования вы хотите развиваться.&lt;/p&gt;
  &lt;p&gt;В этой статьи мы не будем классифицировать языки программирования (низкого и высокого уровня, процедурные и функциональные и т.д.) и писать в подробностях о каждом языке. Об этом мы будем говорить в следующих статьях. В этой же статье, мы разберем основные направления в программирования и самые популярные для них ЯП.&lt;/p&gt;
  &lt;p&gt;Наш список состоит из таких направлений, как:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Разработка мобильных приложений&lt;/li&gt;
    &lt;li&gt;Разработка веб-приложений&lt;/li&gt;
    &lt;li&gt;Разработка игр&lt;/li&gt;
    &lt;li&gt;Разработка десктопных приложений&lt;/li&gt;
    &lt;li&gt;Наука&lt;/li&gt;
    &lt;li&gt;Спортивное программирование&lt;/li&gt;
    &lt;li&gt;Системное программирование&lt;/li&gt;
    &lt;li&gt;Програмирование баз данных&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Давайте обо всём по порядку.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Разработка мобильных приложений&lt;/h2&gt;
  &lt;p&gt;Здесь, в первую очередь надо определиться с платформой под которую вы будете писать приложения - Android, iOS, Windows или сразу под первые два перечисленные.&lt;/p&gt;
  &lt;p&gt;Под Android наиболее популярным языком программирования является &lt;strong&gt;Java&lt;/strong&gt;. На нем, используя среду разработки Android Studio и язык разметки XML можно написать полноценное приложение с функционалом. Кстати говоря, язык программирования &lt;strong&gt;Kotlin &lt;/strong&gt;становится популярным для разработки под эту платформу, но он еще не скоро станет популярным среди разработчиков. Еще один вариант, это использование языка &lt;strong&gt;Python &lt;/strong&gt;и библиотеки Kivi.&lt;/p&gt;
  &lt;p&gt;Под iOS приложения раньше писали на языке &lt;strong&gt;Objective-C&lt;/strong&gt;, но он уже устарел и все &amp;quot;программисты-яблочники&amp;quot; пишут на &lt;strong&gt;Swift &lt;/strong&gt;в среде разработки Xcode, которая является продуктом Apple и распространяется только на их компьютеры. Поэтому исключительно под iOS вы сможете писать, имея компьютер Apple.&lt;/p&gt;
  &lt;p&gt;Однако не всё так печально. Если вы хотите писать под обе платформы, то можете смело использовать язык &lt;strong&gt;Javascript &lt;/strong&gt;(не путать с Java!), используя библиотеку React Native. Язык программирования &lt;strong&gt;Dart &lt;/strong&gt;и библиотека Flutter, разработанные Google дадут вам те же возможности. Кстати, еще есть вариант изучить язык &lt;strong&gt;C#&lt;/strong&gt;, используя фреймворк Xamarin, тогда вы сможете писать кроссплатформенные приложения не только под iOS и Android, но и под Windows Phone.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Разработка веб-приложений&lt;/h2&gt;
  &lt;p&gt;К веб-приложениям в основном относят веб-сайты, разработка которых делится на &lt;strong&gt;frontend &lt;/strong&gt;и &lt;strong&gt;backend&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Frontend - это разработка пользовательского интерфейса или user interface (UI). Здесь вам помогут языки - &lt;strong&gt;Javascript&lt;/strong&gt;, язык гипертекстовой разметки &lt;strong&gt;HTML &lt;/strong&gt;и формальный язык описания внешнего вида документа &lt;strong&gt;CSS&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Backend - это написание серверных скриптов, то есть вся ваша невидимая часть приложения. Здесь используем - &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;Ruby&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Разработка игр&lt;/h2&gt;
  &lt;p&gt;Это гигантская и очень сложная сфера в программировании. Для программирования 3D игр необходимо уметь программировать на &lt;strong&gt;C++&lt;/strong&gt; для использования игрового движка Unreal Engine или же &lt;strong&gt;C#&lt;/strong&gt; для игрового движка Unity. Иногда потребуется и написание своего движка на C++.&lt;/p&gt;
  &lt;p&gt;Сейчас одним из вариантов написании 2D игры является использование движка Corona на языке &lt;strong&gt;Lua &lt;/strong&gt;для написания под мобильные платформы и десктоп. Однако с помощью него вы не сможете написать крутую 3D игру.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Разработка десктопных приложений&lt;/h2&gt;
  &lt;p&gt;Для этого направления выбор ЯП очень широкий. Можно использовать &lt;strong&gt;Java&lt;/strong&gt;, используя JavaFX или Swing. Можно использовать &lt;strong&gt;C#&lt;/strong&gt; и писать в среде Visual Studio, а можно и на &lt;strong&gt;C++&lt;/strong&gt; и &lt;strong&gt;Python &lt;/strong&gt;при помощи библиотек Qt. Уверен, что сейчас для этого существует очень много языков.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2&gt;Наука&lt;/h2&gt;
  &lt;p&gt;Эта область подразумевает собой работу с Искусственным Интеллектом (ИИ), машинным обучением, глубоким обучением и анализом данных, типа Big Data. Здесь очень широко используется &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;С++&lt;/strong&gt;, язык программирования &lt;strong&gt;R &lt;/strong&gt;для статической обработки данных и &lt;strong&gt;SQL &lt;/strong&gt;для работы с базами данных. Эта область программирования становится очень популярной с каждым годом и является самой востребованной на сегодняшний день.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p&gt;Оставшиеся 3 области программирования рассмотрим вкратце:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;спортивное программирование - любой язык, но в основном используют &lt;strong&gt;C++&lt;/strong&gt; и &lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;системное программирование - &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;C++&lt;/strong&gt; и &lt;strong&gt;низкоуровневые языки &lt;/strong&gt;программирования&lt;/li&gt;
    &lt;li&gt;программирование баз данных - &lt;strong&gt;SQL &lt;/strong&gt;(SQL Server, SQLite, MySQL, PostgreSQL)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;p&gt;Мы разобрали с вами основные области программирования. И что в итоге? Если вы всё еще не определились с интересной вам областью, то испробуйте все. Лично мы считаем, что идеальным языком для изучения для вас будет &lt;strong&gt;Python&lt;/strong&gt;, так как он широко используется почти во всех сферах.&lt;/p&gt;
  &lt;p&gt;Надеемся, что вам понравилась данная статья!&lt;/p&gt;
  &lt;p&gt;Есть вопросы? Пишите &lt;a href=&quot;http://t.me/coders_assistant_bot&quot; target=&quot;_blank&quot;&gt;@coders_assistant_bot&lt;/a&gt;.&lt;/p&gt;

</content></entry></feed>