<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Cozy Codespace</title><generator>teletype.in</generator><description><![CDATA[Cozy Codespace]]></description><image><url>https://teletype.in/files/79/79f24345-f4b8-42ec-a99f-aa681120bf58.png</url><title>Cozy Codespace</title><link>https://teletype.in/@cozy_codespace</link></image><link>https://teletype.in/@cozy_codespace?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/cozy_codespace?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/cozy_codespace?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 06 Apr 2026 06:36:23 GMT</pubDate><lastBuildDate>Mon, 06 Apr 2026 06:36:23 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/Hk70-Ntl4</guid><link>https://teletype.in/@cozy_codespace/Hk70-Ntl4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/Hk70-Ntl4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>Пишем Telegram бота на Python + хостинг на Heroku</title><pubDate>Sat, 22 Dec 2018 14:11:08 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/57/57370a0d-9449-4601-9538-8ba858460289.png"></media:content><category>Programming</category><description><![CDATA[<img src="https://teletype.in/files/84/84d1c9f9-7637-4d8a-bb55-46052989685e.png"></img>Статья от автора канала @cozy_codespace]]></description><content:encoded><![CDATA[
  <p>Статья от автора канала <a href="http://t.me/cozy_codespace" target="_blank">@cozy_codespace</a></p>
  <p>Приветствую вас, программисты! Сегодня я расскажу вам о том, как написать бота в Telegram с нуля и запустить его на бесплатной платформе по хостингу Heroku.</p>
  <p>На просторах интернета похожих статей я не видел, поэтому, то, что вы прочитаете в этой статье будет являться уникальным контентом.</p>
  <hr />
  <h2>Что мы будем использовать?</h2>
  <ul>
    <li>Библиотеку <strong><em>python-telegram-bot </em></strong>(<a href="https://github.com/python-telegram-bot/python-telegram-bot" target="_blank">ссылка на GitHub репозиторий</a>) с помощью которой мы сможем использовать Telegram Bot API</li>
    <li><strong>Visual Studio Code(VS Code)</strong> в качестве текстового редактора, где мы будем писать код</li>
    <li>Для хостинга сервис - <a href="http://heroku.com" target="_blank">heroku.com</a>. Вам нужно будет создать там учётную запись</li>
    <li>Интерпретатор Python, который вы можете скачать <a href="https://www.python.org/" target="_blank">здесь</a></li>
    <li>Аккаунт в <a href="http://telegram.org" target="_blank">Telegram</a>, для того, чтобы создать бота и тестировать его</li>
  </ul>
  <p>ОЧЕНЬ ВАЖНО! В этом туториале я использую операционную систему Windows, поэтому некоторые моменты могут отличаться, в зависимости от вашей ОС.</p>
  <hr />
  <h2>Что будет делать бот?</h2>
  <p>Бот, которого мы будем писать будет помогать пользователям с изучением академических слов из теста SAT. Он будет иметь две функции:</p>
  <ul>
    <li>Отправлять случайные слова из списка из 262 академических слов</li>
    <li>Отправлять вопросы и варианты ответа для того, чтобы пользователь смог проверить своё знание академических слов</li>
  </ul>
  <p>Этот бот будет полезен подписчикам моего телеграм канала <a href="http://t.me/satprepare" target="_blank">@satprepare</a>.</p>
  <hr />
  <h2>Этап 1. Подготовка к написанию бота</h2>
  <p>Для начала нам необходимо создать директорию(папку) с нашим проектом. В моём случае она называется <em>SATVocabularyBot </em>и находится на рабочем столе. Поэтому её расположение следующее: <strong>C:\Users\HP\Desktop\SATVocabularyBot</strong></p>
  <p>Далее заходим в эту папку в <strong>Visual Studio Code</strong> через File - <strong>Open Folder</strong>. После этого давайте сразу создадим <strong>Python </strong>файл с расширением <strong>.py</strong> в нашем проекте и назовём его <strong>main.py</strong>. Он у меня уже есть, но выглядеть это будет примерно так:</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/84/84d1c9f9-7637-4d8a-bb55-46052989685e.png" width="968" />
  </figure>
  <p>На этом же скриншоте под окном вы можете увидеть открытый терминал. Вам нужно тоже его открыть через <strong>View - Terminal</strong>. Далее, через этот терминал вам необходимо установить библиотеку <strong><em>python-telegram-bot</em></strong>. Сделать это можно написав:</p>
  <pre>pip install python-telegram-bot
</pre>
  <p>Это будет выглядеть так:</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/86/864dba50-a55e-4c0a-b8c4-fb44f7dcd86e.png" width="1142" />
  </figure>
  <p>И заметьте, что я использую тот <strong>интерпретатор Python</strong>, который установил сам, а не тот который предлагает VS Code. Это помогло мне избежать кучу ошибок при установке библиотеки.</p>
  <p>Лучше использовать Python версии 3.7.0 и выше!</p>
  <p>После того, как вы нажмёте <strong>Enter</strong>, у вас установится библиотека и мы сможем начать писать код.</p>
  <p>Но, как писать бота, которого у нас нет?</p>
  <hr />
  <h2>Этап 2. Создание бота</h2>
  <p>Теперь нам необходимо создать самого бота в Telegram. Поэтому заходим в Telegram и открываем переписку с &quot;ботом для создания ботов&quot; - <a href="http://t.me/BotFather" target="_blank">@BotFather</a>.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/03/03c248b0-0d40-4c3c-b9ed-f7589deccfb1.png" width="928" />
  </figure>
  <p>На скриншоте я скрыл от вас TOKEN бота, так как имея доступ к нему можно делать с ботом всё, что угодно. Поэтому и вы никому не показывайте токен своего бота, пока что просто скопируйте его.</p>
  <p>Теперь у нас есть бот и можно начать его программировать. Кстати, в этом туториале я не буду показывать, как поставить аватарку или приветственный текст для вашего бота, так как вы можете сделать это сами с помощью команды Edit Bot у <a href="http://t.me/BotFather" target="_blank">@BotFather</a>.</p>
  <hr />
  <h2>Этап 3. Написание бота</h2>
  <p>На этом этапе мы уже начнём писать самого бота, то есть его функционал.</p>
  <p>В файле <strong>main.py</strong> пишем следующее:</p>
  <pre>import logging
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, RegexHandler

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

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

    dispatcher = updater.dispatcher

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

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

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

    dispatcher.add_handler(conv_handler)

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

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/BkKJ4zO07</guid><link>https://teletype.in/@cozy_codespace/BkKJ4zO07?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/BkKJ4zO07?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>Приложение на C# + связка с MySQL базой данных</title><pubDate>Sun, 25 Nov 2018 14:47:48 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/be/be2211d2-a60c-4879-978b-9c23a1c82004.png"></media:content><category>Programming</category><description><![CDATA[<img src="https://teletype.in/files/d8/d8168e2d-d01f-4059-916a-ed2f12f09b0b.png"></img>Привет всем кодерам! В этом мини-туториале мы с вами с нуля напишем десктопное приложение на С#, которое будет работать с базой данных. Это задание было дано учебной программой 11 класса НИШ ФМН г.Алматы.]]></description><content:encoded><![CDATA[
  <p>Привет всем кодерам! В этом мини-туториале мы с вами с нуля напишем десктопное приложение на С#, которое будет работать с базой данных. Это задание было дано учебной программой 11 класса НИШ ФМН г.Алматы.</p>
  <hr />
  <h2>Что мы будем для этого использовать?</h2>
  <ul>
    <li><strong>Среда программирования</strong>: Visual Studio 2017 (версия не имеет никакого значения)</li>
    <li><strong>Языки</strong>: C# - для клиентской части приложения, MySQL - для работы с данными в базе данных нашего приложения</li>
  </ul>
  <hr />
  <h2>Что будет выполнять приложение?</h2>
  <p>Наше приложение будет добавлять, изменять, обновлять, удалять и запрашивать данные из базы данных каратистов. &quot;А почему каратистов?&quot; - спросите вы. Так потому что это самая родная для меня тема, вот и будем рассматривать данный пример.</p>
  <hr />
  <h2>Создание проекта</h2>
  <p>После того, как вы скачали Visual Studio себе на компьютер, вам следует создать проект.</p>
  <p><strong>Как это сделать?</strong></p>
  <p>Создать проект -&gt; Visual C# -&gt; Приложение Windows Forms -&gt; <em>*Выбираем название для проекта и его расположение*</em> -&gt; OK</p>
  <p>Теперь у вас готов проект и можно приступать к работе!</p>
  <hr />
  <h2>Создание форм (Часть 1)</h2>
  <p>Теперь нам нужно создать графический интерфейс приложения через формы. Добавлять новые формы легко. Просто нажимаете правой кнопкой мыши на свой проект и выбираете &quot;Добавить&quot;, как на скриншоте ниже:</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/d8/d8168e2d-d01f-4059-916a-ed2f12f09b0b.png" width="1158" />
  </figure>
  <p>Далее следует поработать над дизайном наших форм. Не будем сильно изощряться и сделаем максимально минималистичный дизайн:</p>
  <p><strong>Главное меню</strong></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/23/23f73555-883f-48bb-a609-9d07e45e6e86.png" width="595" />
  </figure>
  <p><strong>Меню выбора</strong></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/a1/a1a8e70b-88b8-4ef3-9f4b-55dc3cc01517.png" width="580" />
  </figure>
  <p><strong>Меню выбора для редактирования</strong></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/a1/a1510557-fedf-440b-bd09-10c64d167a32.png" width="579" />
  </figure>
  <p><strong>Форма для добавления нового пользователя</strong></p>
  <figure class="m_column">
    <img src="https://teletype.in/files/20/20cf25f3-3ea9-47c9-b468-5251ec57cab3.png" width="581" />
  </figure>
  <p>Так-с. Дальше пока что мы не пойдём, так как для начала нам нужно понять как всё будет работать. У нас есть форма для добавления каратиста, и нам еще нужны формы для создания запросов, для просмотра базы данных и для редактирования её. Но где сама база данных?</p>
  <p>Её нет. Поэтому нам нужно немедленно её создать!</p>
  <hr />
  <h2>Создание базы данных</h2>
  <p>Переходим во вкладку &quot;Средства&quot; и выбираем &quot;Подключиться к базе данных&quot;. Далее открывается окно &quot;Добавить подключение&quot;, где в поле &quot;Источник данных&quot; мы выбираем &quot;<strong>Файл базы данных Microsoft SQL Server (SqlClient)</strong>&quot;. Даём любое название файлу базы данных, в нашем случае - &quot;IOGKF_members&quot;. Далее нажимаем кнопку &quot;ОК&quot; и в левой стороне экрана видим, как у нас добавилась новая база данных.</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/a9/a9fad739-7ff4-4d57-8b64-aa2a4c5792d0.png" width="320" />
  </figure>
  <p>Раскрываем директорию с нашей базой данных и видим самую первую папку &quot;Таблицы&quot; - она нас и интересует. Жмём по ней правой кнопкой мыши и нажимаем &quot;Добавить новую таблицу&quot;.</p>
  <p>Можно создать таблицу двумя путями: 1) Конструктором 2) Через SQL код</p>
  <p>Если вам лень делать её самим, то скопируйте следующий SQL код и вставьте его в поле с кодом у таблицы:</p>
  <pre>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)
);
</pre>
  <p><strong>Коротко о типах данных в SQL</strong></p>
  <ul>
    <li><strong>varchar </strong>- тот же самый String, то есть строка (в скобках пишем её максимальную длину)</li>
    <li><strong>int </strong>- целые числа</li>
    <li><strong>binary </strong>- тот же самый boolean, то есть True or False, только в SQL - это 1 и 0 соответственно</li>
  </ul>
  <p>И еще...</p>
  <p><strong>null </strong>- указываем может ли переменная быть пустой, то есть не содержать информации</p>
  <p><strong>primary key</strong> - первичный ключ, в данном случае это member_id. Таким образом, все значения member_id уникальны</p>
  <p>После того как вы создали таблицу, нужно её сохранить. Нажмите ctrl + s или просто закройте файл с таблицей после чего у вас появится сообщение о сохранении таблицы.</p>
  <p>Ок, теперь у нас есть база данных и таблица, где будет храниться информация о каратистах.</p>
  <hr />
  <h2>Создание форм (Часть 2) + код</h2>
  <p>Давайте напишем программный код <strong>для добавления каратистов</strong> в нашу базу данных. В моём проекте эта форма называется Form5 (у неё надпись &quot;Add User&quot; в предыдущих скриншотах). В классе этой формы пишем следующее:</p>
  <pre>public string conString = &quot;Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\Users\\HP\\Desktop\\IOGKF\\IOGKF\\IOGKF_members.mdf;Integrated Security=True;Connect Timeout=30&quot;;
</pre>
  <p>Здесь мы создали строковую переменную <em>conString </em>и присвоили ей значение строки подключения базы данных. Чтобы посмотреть вашу строку подключения нажмите правой кнопкой мыши по базе данных и выберите &quot;Свойства&quot;:</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/6f/6f7237ca-1172-4e2d-a5cb-b68f5a8744d8.png" width="380" />
  </figure>
  <p>Теперь два раза нажимаем на кнопку &quot;Add&quot; в конструкторе нашей формы и таким образом открываем код, который будет выполняться при её нажатии. Вот код метода, который выполняется при нажатии:</p>
  <pre>private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(conString);

            con.Open();

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

            con.Close();
        }

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

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

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

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

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

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

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

private void ClearData()
        {
            textBox1.Text = &quot;&quot;;
            textBox2.Text = &quot;&quot;;
            textBox3.Text = &quot;&quot;;
            textBox4.Text = &quot;&quot;;
            textBox5.Text = &quot;&quot;;
            textBox6.Text = &quot;&quot;;
            textBox7.Text = &quot;&quot;;
            textBox8.Text = &quot;&quot;;
        }
</pre>
  <p>Также надо написать код для метода, который будет вызываться при нажатии на header в DataGridView и будет заполнять текстовые поля. Header - эта та область DataGridView, при нажатии на которую будет выделяться вся информация о каратисте, соответственно эта информация будет добавляться в соответствующие текстовые поля, для удобного редактирования. Выглядит это так:</p>
  <figure class="m_column">
    <img src="https://teletype.in/files/9f/9f8b583b-b689-4475-ae79-f83847f0dd14.png" width="580" />
  </figure>
  <p>Но прежде чем добавить этот метод, нам необходимо создать обработчик нажатий (Event Handler). Добавляем его в конструктор нашей формы:</p>
  <pre>public Form7()
        {
            InitializeComponent();
            dataGridView1.RowHeaderMouseClick += new DataGridViewCellMouseEventHandler(OnRowHeaderMouseClick);
        }
</pre>
  <p>А вот теперь добавляем метод:</p>
  <pre>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();
        }

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/HJks8XHTX</guid><link>https://teletype.in/@cozy_codespace/HJks8XHTX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/HJks8XHTX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>Джефф Безос - история успеха</title><pubDate>Sun, 11 Nov 2018 03:52:58 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/1b/1b233f33-8853-475b-bf96-c66af7a55b99.png"></media:content><description><![CDATA[<img src="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"></img>Вчера он продавал свои книги в своем офисе-гараже, а сегодня он по праву может отдохнуть на своем ранчо с видом на космодром. История об основателе одной из самых крупных империй в интернете и о том, кто является живым примером того, к чему может привести преданность своему делу, стабильный труд и постоянная тяга к знаниям.]]></description><content:encoded><![CDATA[
  <p>Вчера он продавал свои книги в своем офисе-гараже, а сегодня он по праву может отдохнуть на своем ранчо с видом на космодром. История об основателе одной из самых крупных империй в интернете и о том, кто является живым примером того, к чему может привести преданность своему делу, стабильный труд и постоянная тяга к знаниям.</p>
  <p>Дамы и господа, позвольте рассказать вам историю о Джеффе Безосе, который является основателем Amazon, создателем аэрокосмической компании Blue Origin, владельцем газеты &quot;The Washington Post&quot;, обладателем самого крупного капитала в мире, и просто человеком, который не побоялся воплотить свои идеи в реальность и внедрить их в нашу современную жизнь.</p>
  <figure class="m_column">
    <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/ad681201-6e27-4f66-85f6-05567880c9e5/Untitled.png?AWSAccessKeyId=ASIAT73L2G45JNA3NJ7C&Expires=1541994358&Signature=tBZCIGxmj4pgwgysOxwwVB4Shqk%3D&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" width="1080" />
  </figure>
  <hr />
  <p>Джефф родился 12 января 1964 года в Альбукерке, штат Нью-Мексико. Его детство не было столь благополучным и хорошим - биологический отец Джеффа отказался от воспитания сына и покинул ребенка вместе с матерью, когда той было всего 17 лет. С тех пор, они больше не виделись. Однако через 4 года, мать Джеффа познакомилась с Мигелем Безосом, молодым эмигрантом из Кубы, который бежал из своего дома в 15 лет и чью фамилию Джефф носит по сей день. Мигель воспитал Джеффа как родного сына, работал в банке и стал частью семейного счастья будущего миллиардера.</p>
  <p>С самого детства, Безос отличался соей дотошностью по отношению к познанию мира вокруг него и это положительно сказалось на его учебе как в школе - где он стал лучшим учеником, так и в университете - он учился в престижном заведении Принстона на факультете электронных измерительных приборов, параллельно занимаясь изучением компьютерной поддержки и логикой программирования, понимая, что эта сфера имела огромный потенциал в будущем.</p>
  <figure class="m_column">
    <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/6228fb30-391e-4e38-a21f-56d8ce63b897/Untitled.png?AWSAccessKeyId=ASIAT73L2G45GP2W56JK&Expires=1541994422&Signature=vFMVq6lKigKGlb0kZYbi3Gf%2BipY%3D&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" width="620" />
  </figure>
  <hr />
  <p>После обучения, Джефф Безос поработал на Уолл-Стрит в хедж-фонде D.E.Shaw, а также в компании &quot;Bankers Trust&quot;, в которой дослужился до поста вице-президента.</p>
  <p>Поняв, что он готов к большему, он уволился с последнего места работы и решил начать свой собственный бизнес. Как он признался позже студентам Принстона, он не пожалел бы если бы затея с книжным магазином ни к чему не привела. Напротив, он бы страдал от того, что не пошел на подобное рискованное дело в своей жизни.</p>
  <hr />
  <p>Компания, которая была названа в честь одноименной реки с самого начала находилась в гараже Джеффа. Пусть начало и было довольно скромным, но к 1999 году проект разросся настолько, что его цена на бирже оценивалась в $6 млрд. Кроме того, его фирме предрекали крах по причине того, что ее продукция продавалась по цене ниже чем у конкурентов. Но ко всеобщему удивлению (за исключением самого Джеффа), компания стала разрастаться еще шире, так как дешевая цена товара в сопутствии с широким спектром выбора здорово подняли ее рейтинг на рынке продукции.</p>
  <p>В 2000 году Безос создал аэрокосмическую компанию Blue Origin. Дело в том, что Джефф очень долгое время мечтал о предоставлении возможности простым людям путешествовать в космос. Мечты в итоге сбываются.</p>
  <p>В 2013 году бизнесмен купил газету &quot;The Washington Post&quot;, со стороны которой он подвергается регулярной критике, но и не только от нее, а также, от действующего Президента США, Дональда Трампа. В ответ на колкости Президента, Безос пообещал найти для него пассажирское место в одной из ракет Blue Origin, сопроводив &quot;проект&quot; хэштегом #SendDonaldtospace, хотя впрочем, этого, возможно, никогда не будет.</p>
  <hr />
  <p>В достижении своих целей, Джефф очень многим обязан своей жене Маккензи, на которой он уже женат 24 года. Маккензи часто вдохновляет Джеффа своей изобретательностью и поддержкой в трудные дни.</p>
  <p>— Мне нужна была женщина, которая смогла бы вытащить меня из разряда второсортных людей, дать мне идею, помочь в её реализации, — объясняет Джефф. — С Маккензи мне хватило буквально пары фраз, чтобы понять — она изобретательна, и это именно то, что я искал. Без вариантов.</p>
  <hr />
  <p>На данный момент, Безос занимается благотворительностью и продолжает работать на собственных проектах. Джефф очень щедр в делении опытом и поэтому он выпустил несколько книг, в которых рассказывает о ключевых идеях и принципах для достижения подобного успеха в жизни. Его изречения часто цитируются во многих социальных сетях для того, чтобы вдохновить других людей на действия во имя реализации своих идей.</p>
  <p>Джефф Безос стал первым человеком, который достиг состояния в $100 млрд. И неудивительно, ведь для человека, который очень усерден в поиске знаний и готов идти на &quot;все или ничего&quot;, но в то же время уделяет должное внимание и другим аспектам жизни к коим относятся семья и личное счастье, а также коммуникация с людьми, нет никаких преград для достижения своих целей в этой полной возможностей жизни.</p>
  <hr />
  <p>Надеемся, что статья была полезной для вас!</p>
  <p>Есть вопросы? Пишите <a href="http://t.me/coders_assistant_bot" target="_blank">@coders_assistant_bot</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/BkyVcsVpm</guid><link>https://teletype.in/@cozy_codespace/BkyVcsVpm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/BkyVcsVpm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>University of Waterloo</title><pubDate>Sat, 10 Nov 2018 20:43:56 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/10/101ae8a3-d2e2-438b-88a4-d6ed401ab4d5.png"></media:content><category>Universities</category><description><![CDATA[<img src="https://uwaterloo.ca/math/sites/ca.math/files/uploads/images/campus-aerial-east-side.jpg"></img>Университет Ватерлоо - является одним из самых лучших учебных заведений, как в Канаде, так и в мире. Это далеко не самый простой университет, несмотря на то, что по World University Rankings 2019 он находится между 201 - 250 местом в мире.]]></description><content:encoded><![CDATA[
  <p>Университет Ватерлоо - является одним из самых лучших учебных заведений, как в Канаде, так и в мире. Это далеко не самый простой университет, несмотря на то, что по World University Rankings 2019 он находится между 201 - 250 местом в мире.</p>
  <p>Что же его делает таким особенным? Давайте взглянем на статистику:</p>
  <ul>
    <li>#1 исследовательский университет в Канаде (Research Infosource)</li>
    <li>#2 университет по трудоустройству (2017 QS Employability Rankings)</li>
    <li>Топ 25 лучших стартап экосистем в мире (Startup Compass 2015)</li>
    <li>Было создано 1845 стартапов за последние 5 лет (<a href="http://velocity.uwaterloo.ca/" target="_blank">Подробнее о стартап инкубаторе Velocity</a>)</li>
    <li>300+ клубов и кружков</li>
    <li>33 спортивных команд университетской лиги</li>
    <li>31,000 студентов бакалавриата: 46% - женского пола, 16% - международных студентов</li>
    <li>1,000 акров и 100+ зданий на территории кампуса университета</li>
  </ul>
  <figure class="m_column">
    <img src="https://uwaterloo.ca/math/sites/ca.math/files/uploads/images/campus-aerial-east-side.jpg" width="3000" />
  </figure>
  <p>Однако самой важной особенностью этого - является наличие co-op программ, которые позволяют работать во время семестров на местные IT компании Канады.</p>
  <blockquote>#1 in the world for partnership with employers (QS 2017 Graduate Employability Rankings)</blockquote>
  <p>Таким образом, у вас есть 5 лет бакалавриата за которые у вас будет 4 - 6 семестров работы.</p>
  <blockquote>$45,000 - $85,000 - это средний заработок студентов за 5 лет обучения в университете</blockquote>
  <figure class="m_column">
    <img src="https://teletype.in/files/34/34e0e611-2f66-4a1f-aa38-a3539f496212.png" width="819" />
  </figure>
  <p>Почитать подробнее о co-op можно <a href="https://uwaterloo.ca/future-students/co-op" target="_blank">здесь</a></p>
  <p>Получается у вас, будучи студентом UWaterloo есть возможность оплатить свою учебу, но не полностью.</p>
  <figure class="m_column">
    <img src="https://oneclassblog.com/wp-content/uploads/2018/05/University-of-Waterloo-Stratford-Campus.jpg" width="1200" />
  </figure>
  <hr />
  <h2>Что по деньгам?</h2>
  <p>Cредняя цена за 1 год обучения - $28,000 - $30,000 для международных студентов без учета расходов. Расходы:</p>
  <ul>
    <li>Проживание - от $5,500 до $7,400</li>
    <li>Питание - от $4,400 до $5,200</li>
    <li>Личные расходы - в среднем $3,000 ($375/месяц)</li>
    <li>Учебные материалы - $2,000</li>
  </ul>
  <p>В итоге выходит примерно $45,000 в год. Согласен, многовато. Для этого и придуманы стипендии.</p>
  <ul>
    <li>$1,000 получают студенты находящиеся в 85-89.9% поступивших (admission average) - <strong>Merit Scholarship</strong></li>
    <li>$2,000 студенты с 90-94.9% - <strong>President&#x27;s Scholarship</strong></li>
    <li>$5,000+ студенты с 95%+ admission average - <strong>President&#x27;s Scholarship of Distinction</strong></li>
    <li>$10,000 - студентам на основе их академических достижений и олимпиад - <strong>International Student Entrance Scholarship</strong></li>
  </ul>
  <hr />
  <h2>Как поступить?</h2>
  <p>В нашем случае мы рассматриваем поступления на факультеты математики (Data Science, Computer Science) и инженерии (Software Engineering). Кстати, в будущем мы разберём их разницу.</p>
  <p>Для них всех общие языковые требования: IELTS - 6.5, TOEFL iBT - 90.</p>
  <p>Если рассматривать British System, то есть для НИШ (Назарбаев Интеллектуальные Школы), то картина следующая:</p>
  <ul>
    <li><strong>Computer Science</strong> or <strong>Data Science</strong>: A-level Mathematics min A. Two other academic A-level courses, min A each. English at either the GCSE, AS or A-level.</li>
    <li><strong>Software Engineering</strong>: 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.</li>
  </ul>
  <p>Короче говоря, нужно учиться на одни пятерки. Про SAT ничего не сказано, значит и не нужно.</p>
  <p>Конечно, они смотрят не только на ваши академические успехи, но и различные extracurriculars, которые выделят вас на фоне других аппликантов.</p>
  <hr />
  <p>Ну и напоследок хочу поделиться с вами каналом одного чувака, который закончил University of Waterloo. Его канал - <a href="https://www.youtube.com/channel/UCV0qA-eDDICsRR9rPcnG7tw" target="_blank">Joma Tech</a>.</p>
  <p>Если не нашли того, что искали, то вот держите ссылку на официальный сайт University of Waterloo: <a href="https://uwaterloo.ca/" target="_blank">uwaterloo.ca</a></p>
  <hr />
  <p>Надеемся, что статья была полезной для вас!</p>
  <p>Есть вопросы? Пишите <a href="http://t.me/coders_assistant_bot" target="_blank">@coders_assistant_bot</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/SyxRMG9VTm</guid><link>https://teletype.in/@cozy_codespace/SyxRMG9VTm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/SyxRMG9VTm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>Как работает Интернет?</title><pubDate>Sat, 10 Nov 2018 17:26:17 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/56/5612e5d8-9660-4bac-b4a0-be3229156cf0.png"></media:content><category>Computer Science</category><description><![CDATA[<img src="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"></img>Сегодня, никто из нас с вами не может представить жизнь без интернета - он используется везде и очень сильно облегчает нашу жизнь. Быстрое развитие технологий позволило людям внедрить его в большой спектр гаджетов.]]></description><content:encoded><![CDATA[
  <p>Сегодня, никто из нас с вами не может представить жизнь без интернета - он используется везде и очень сильно облегчает нашу жизнь. Быстрое развитие технологий позволило людям внедрить его в большой спектр гаджетов.</p>
  <p>Доступ к интернету есть даже у холодильников. Оттуда вы можете заказать из любого места всё то, что ваша душа пожелает - и все это благодаря существованию Всемирной сети.</p>
  <p>Возникает вопрос: как мы достигли этого и с чего это всё начиналось?</p>
  <hr />
  <p>Есть очень интересная история, которая всё объяснит.</p>
  <p>70-ые годы: противостояние двух мировых супердержав, конкуренция везде и во всем. В 1957 году СССР уже успели запустить спутник, пока американцы кусали локти и думали над тем, как обеспечить для себя защиту в качестве связи в случае чего-то опасного, как например, ядерная тревога.</p>
  <p>Поначалу, они не знали, что может помочь этому, им нужно было как то соединить, существовавшие тогда 4 компьютера между собой, чтобы обеспечить хоть какую то скорость связи. Использовать другие средства связи не было вариантом. США - большая страна, поэтому, что бы ты не использовал - телефонную связь или голубиную почту - ничего не смогло бы стать хорошим решением для того чтобы своевременно доставить необходимую в принципиальном соперничестве информацию.</p>
  <p>И тогда, ребята из Агентства перспективных исследований Министерства обороны США или сокращенно, ARPA задумались, можно ли создать сеть на основе уже существующих в каждом доме обычного гражданина телефонных линий - и они не прогадали.</p>
  <p>В 1969 году, они создали тестовую версию праотца интернета - ARPANET, которая соединила между собой 4 компьютера на разных концах США. Кроме того, были созданы протоколы - TCP/IP, но об этом чуть позже.</p>
  <figure class="m_custom">
    <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/35aed974-7fb7-446d-ba8b-2314fc9953c9/Untitled.png?AWSAccessKeyId=ASIAT73L2G45HEJVXX7L&Expires=1541956633&Signature=oT%2FlbEDshmNK0CNgUMiUFadQ%2FwA%3D&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" width="250" />
  </figure>
  <p>Итак, компьютеры продолжали появляться и в связи с этим начали появляться разные &quot;костыли&quot;, с которыми предстояло справиться уже не только ребятам из Америки, но и тем, кто вообще был причастен ко всему этому.</p>
  <hr />
  <p>Первая проблема заключалась в том, что компьютеров становилось все больше и больше, и соединить каждый из них между собой было очень трудно для человека. Представьте себе, если кто-то забудет подключить два компьютера между собой - просто из-за своей невнимательности. Тогда возникло бы много других непоняток в передаче информации между другими хостами (хосты - на языке сетей означает &quot;компьютер&quot;).</p>
  <p>В совокупности с первой проблемой была и другая - телефонные линии и чередование в их использовании, и это можно объяснить на другом примере. Скажем так, не всем было удобно использовать телефонные линии для двух целей одновременно. Если кто-то использовал их для соединения компьютеров, то в это же время никто не мог поговорить друг с другом через телефоны, потому что сети были заняты ими, и в обратном случае все было аналогично.</p>
  <p>Последнее, что оказывало проблему на ученых - это безопасность и защита тогдашней сети. Если бы мы могли путешествовать во времени, то можно сказать, что любой из вас, кто обладает хоть какими то знаниями по слабостям в защите сетей и кто бы хотел перенестись в те времена, смог бы просто законектиться и украсть информацию международного уровня и развязать уже уж точно настоящую войну.</p>
  <hr />
  <p>Как же мы все таки смогли решить эти три проблемы?</p>
  <p>Для того, чтобы решить первую проблему было решено создать систему, которая состоит из провайдеров, маршрутизаторов и интернет-серверов.</p>
  <p>Наверняка, вы слышали о таком понятии как &quot;Локальная сеть&quot;, в частности, когда вы например подключались к WiFi и видели разные сообщения от системы компьютера в зависимости от результата подключения. Таким образом, локальная сеть - это система, которая состоит из подключенных между собой компьютеров в ограниченной территории.</p>
  <p>Лет 10 назад, многие специально соединяли между собой свои компьютеры кабелями для того чтобы вместе поиграть в Counter-Strike или другую Олд-скульную игру. Принципы не изменились, и если раньше мы играли в CS и подключались с помощью проводов, то сейчас мы играем в Доту или в Танки, но уже через беспроводную сеть WiFi.</p>
  <hr />
  <p>Кстати, а что если мы хотим устроить совместный матч с другом находясь в разных городах страны?</p>
  <p>Тогда на помощь приходят маршрутизаторы - специальные устройства, которые соединяют локальные сети между собой или являются посредниками для других маршрутизаторов. Вы помните фильм &quot;Елки&quot;? Самую первую часть и теорию о шести рукопожатиях?</p>
  <p>В сетях все работает точно так же, и если в фильме было чудом донести до Президента сообщение от обычного ребенка, то в Интернете это стало настолько обычным делом, что многие просто не знают и не задумываются об этом.</p>
  <p>Вернемся к маршрутизаторам. Маршрутизаторы в сети представляют собой разные уровни рукопожатий. Ребенок из сюжета фильма не знал, как передать сообщение Президенту, но он знал людей, которые в свою очередь знали других людей, которые знают как добраться к Президенту. Маршрутизаторы точно так же, не знают лично каждый компьютер, но знают маршрутизаторы, которые знают этот же компьютер, которому нужна информация.</p>
  <hr />
  <p>Теперь увеличим масштаб еще раз.</p>
  <p>Что если вы хотите устроить матч находясь на разных континентах?</p>
  <p>Кстати, для того чтобы решить проблему с телефонными линиями и компьютерными сетями, мы стали прокладывать отдельные кабели, которые уже предназначались только для компьютеров и их соединения. Зачем об этом было сказано в сейчас поймете.</p>
  <p>Итак, разные континенты, матч в Доте: как это реализуется?</p>
  <p>Здесь всплывает еще одно понятие - &quot;Интернет-провайдеры&quot;. Их тоже много и вы тоже о них слышали? Казахтелеком, Ростелеком, звучит довольно знакомо. Провайдеры - это еще более старший уровень в устройствах сети. Они как раз таки служат для того, чтобы соединять между собой континенты.</p>
  <p>Сетевые кабели, о которых было упомянуто выше служат специальными путями, через которые передается сигнал от провайдера к провайдеру, поэтому, они присутствуют везде, даже в морях и океанах. На фотографии, вы можете увидеть процесс прокладывания кабеля, и если вы однажды будете загорать на пляже на Багамских островах и увидите, как подобная группа выходит из воды с очень длинным проводом, который уходит в воду, то не удивляйтесь, потому что благодаря их работе, вы можете играть в онлайн игры. Таким образом, интернет является в прямом смысле сетью и ниже вы можете увидеть межконтинентальную карту интернет-кабелей мира.</p>
  <figure class="m_column">
    <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/6b0cab79-188a-4ab9-acec-8d274e23b6f1/Untitled.png?AWSAccessKeyId=ASIAT73L2G45BQ7KN2LV&Expires=1541956583&Signature=fskc7InNVy7TlgutPKC17MtrGe8%3D&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" width="2196" />
  </figure>
  <figure class="m_column">
    <img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/0e22dc48-bf34-4f23-b15d-1728de595f57/Untitled.png?AWSAccessKeyId=ASIAT73L2G45PPZPQT7R&Expires=1541957052&Signature=ZJ80uXcLA%2F8RcbNBc2avvi%2FijkM%3D&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" width="1062" />
  </figure>
  <p>С данными проблемами мы разобрались, но как же обеспечивается безопасность в сети? Это обеспечивают специальные протоколы, которых существует очень много, но основными из них являются TCP/IP и UDP.</p>
  <p>На самом деле, если вам когда-либо угрожали в социальных сетях &quot;вычислением вашего адреса по айпи&quot; это в какой-то степени не являлось пустыми словами. IP-адреса - адреса, которые присваиваются каждому компьютеру по его выходу в Глобальную сеть, они состоят из четырех разных чисел, диапазоном от 0 до 255 и разделенных между собой точками, пример - 192.65.23.4. В таком случае, первые два числа возможно обозначат страну и город вашего проживания, но из-за того, что &quot;айпи&quot; динамически меняются между пользователями сети, потенциальный злоумышленник попадет не на ваше место проживание, а на место проживания вашего соседа.</p>
  <hr />
  <p>Протоколы - это способ общения между компьютерами в интернете. Это похоже на общение людей.</p>
  <p>Один говорит другому, &quot;Привет, как дела?&quot;, а другой человек это слышит и отвечает &quot;Хорошо, как у тебя?&quot;. Именно таким образом и осуществляется действие протокола TCP. Вы запрашиваете необходимую для вас информацию у сервера, сервер отдает эту информацию и затем, ваш компьютер отдает отчет о переданных пакетах информации. Если не все пакеты данных были переданы, то сервер повторно отправляет их вашему компьютеру. Подходящий для этого пример - это то, когда вы открываете определенный веб-сайт и у вас не отображаются некоторые картинки. Тогда вы перезагружаете страницу и картинки появляются должным образом.</p>
  <p>Другое дело - UDP протокол. Его вообще не заботит, передались ли вам ваши пакеты или нет. Но если они не передались, то каков от него смысл? А смысл в том, что он осуществляется тогда, когда вам нужна скорость соединения. Пример - видеоразговор в Skype. Если сеть имеет не достаточно хорошее соединение, то картинка вашего друга на экране будет иногда зависать, а после того, как она заработает, картинка вашего друга будет уже совсем другой и то же самое работает в онлайн играх. К сожалению, многие из нас проигрывали из-за того, что наше интернет-соединение было недостаточно хорошим и персонаж соперника, который находился в одном месте, мог резко оказаться в другом, невыгодном для вас месте и кикнуть вашего героя из игры.</p>
  <p>Интернет может показаться довольно сложной структурой, но если вы сможете разобраться и понять основные понятия, то откроете для себя совсем другой мир информации.</p>
  <p>Надеемся, что вам понравилась данная статья!</p>
  <p>Есть вопросы? Пишите <a href="http://t.me/coders_assistant_bot" target="_blank">@coders_assistant_bot</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@cozy_codespace/SJF1FL4aX</guid><link>https://teletype.in/@cozy_codespace/SJF1FL4aX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace</link><comments>https://teletype.in/@cozy_codespace/SJF1FL4aX?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=cozy_codespace#comments</comments><dc:creator>cozy_codespace</dc:creator><title>На каком языке мне начать программировать?</title><pubDate>Sat, 10 Nov 2018 15:24:56 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/93/932ee50e-78ec-4403-8e6a-c0759bec0d0e.png"></media:content><category>Programming</category><description><![CDATA[Со времени создания самого первого программируемого компьютера, было создано более 8000 языков программирования (ЯП). Каждый год опытные программисты создают всё больше и больше ЯП; некоторые из них становятся очень популярными, а другими пользуются лишь единицы.]]></description><content:encoded><![CDATA[
  <p>Со времени создания самого первого программируемого компьютера, было создано более 8000 языков программирования (ЯП). Каждый год опытные программисты создают всё больше и больше ЯП; некоторые из них становятся очень популярными, а другими пользуются лишь единицы.</p>
  <p>Вот и возникает вопрос: &quot;<strong>С какого языка программирования начать</strong>, ведь их так много?&quot;.</p>
  <p>Ответ на этот вопрос зависит именно от вашего выбора, а точнее от того, в какой сфере программирования вы хотите развиваться.</p>
  <p>В этой статьи мы не будем классифицировать языки программирования (низкого и высокого уровня, процедурные и функциональные и т.д.) и писать в подробностях о каждом языке. Об этом мы будем говорить в следующих статьях. В этой же статье, мы разберем основные направления в программирования и самые популярные для них ЯП.</p>
  <p>Наш список состоит из таких направлений, как:</p>
  <ul>
    <li>Разработка мобильных приложений</li>
    <li>Разработка веб-приложений</li>
    <li>Разработка игр</li>
    <li>Разработка десктопных приложений</li>
    <li>Наука</li>
    <li>Спортивное программирование</li>
    <li>Системное программирование</li>
    <li>Програмирование баз данных</li>
  </ul>
  <p>Давайте обо всём по порядку.</p>
  <hr />
  <h2>Разработка мобильных приложений</h2>
  <p>Здесь, в первую очередь надо определиться с платформой под которую вы будете писать приложения - Android, iOS, Windows или сразу под первые два перечисленные.</p>
  <p>Под Android наиболее популярным языком программирования является <strong>Java</strong>. На нем, используя среду разработки Android Studio и язык разметки XML можно написать полноценное приложение с функционалом. Кстати говоря, язык программирования <strong>Kotlin </strong>становится популярным для разработки под эту платформу, но он еще не скоро станет популярным среди разработчиков. Еще один вариант, это использование языка <strong>Python </strong>и библиотеки Kivi.</p>
  <p>Под iOS приложения раньше писали на языке <strong>Objective-C</strong>, но он уже устарел и все &quot;программисты-яблочники&quot; пишут на <strong>Swift </strong>в среде разработки Xcode, которая является продуктом Apple и распространяется только на их компьютеры. Поэтому исключительно под iOS вы сможете писать, имея компьютер Apple.</p>
  <p>Однако не всё так печально. Если вы хотите писать под обе платформы, то можете смело использовать язык <strong>Javascript </strong>(не путать с Java!), используя библиотеку React Native. Язык программирования <strong>Dart </strong>и библиотека Flutter, разработанные Google дадут вам те же возможности. Кстати, еще есть вариант изучить язык <strong>C#</strong>, используя фреймворк Xamarin, тогда вы сможете писать кроссплатформенные приложения не только под iOS и Android, но и под Windows Phone.</p>
  <hr />
  <h2>Разработка веб-приложений</h2>
  <p>К веб-приложениям в основном относят веб-сайты, разработка которых делится на <strong>frontend </strong>и <strong>backend</strong>.</p>
  <p>Frontend - это разработка пользовательского интерфейса или user interface (UI). Здесь вам помогут языки - <strong>Javascript</strong>, язык гипертекстовой разметки <strong>HTML </strong>и формальный язык описания внешнего вида документа <strong>CSS</strong>.</p>
  <p>Backend - это написание серверных скриптов, то есть вся ваша невидимая часть приложения. Здесь используем - <strong>PHP</strong>, <strong>Python</strong>, <strong>Ruby</strong>.</p>
  <hr />
  <h2>Разработка игр</h2>
  <p>Это гигантская и очень сложная сфера в программировании. Для программирования 3D игр необходимо уметь программировать на <strong>C++</strong> для использования игрового движка Unreal Engine или же <strong>C#</strong> для игрового движка Unity. Иногда потребуется и написание своего движка на C++.</p>
  <p>Сейчас одним из вариантов написании 2D игры является использование движка Corona на языке <strong>Lua </strong>для написания под мобильные платформы и десктоп. Однако с помощью него вы не сможете написать крутую 3D игру.</p>
  <hr />
  <h2>Разработка десктопных приложений</h2>
  <p>Для этого направления выбор ЯП очень широкий. Можно использовать <strong>Java</strong>, используя JavaFX или Swing. Можно использовать <strong>C#</strong> и писать в среде Visual Studio, а можно и на <strong>C++</strong> и <strong>Python </strong>при помощи библиотек Qt. Уверен, что сейчас для этого существует очень много языков.</p>
  <hr />
  <h2>Наука</h2>
  <p>Эта область подразумевает собой работу с Искусственным Интеллектом (ИИ), машинным обучением, глубоким обучением и анализом данных, типа Big Data. Здесь очень широко используется <strong>Python</strong>, <strong>С++</strong>, язык программирования <strong>R </strong>для статической обработки данных и <strong>SQL </strong>для работы с базами данных. Эта область программирования становится очень популярной с каждым годом и является самой востребованной на сегодняшний день.</p>
  <hr />
  <p>Оставшиеся 3 области программирования рассмотрим вкратце:</p>
  <ul>
    <li>спортивное программирование - любой язык, но в основном используют <strong>C++</strong> и <strong>Python</strong></li>
    <li>системное программирование - <strong>C</strong>, <strong>C++</strong> и <strong>низкоуровневые языки </strong>программирования</li>
    <li>программирование баз данных - <strong>SQL </strong>(SQL Server, SQLite, MySQL, PostgreSQL)</li>
  </ul>
  <hr />
  <p>Мы разобрали с вами основные области программирования. И что в итоге? Если вы всё еще не определились с интересной вам областью, то испробуйте все. Лично мы считаем, что идеальным языком для изучения для вас будет <strong>Python</strong>, так как он широко используется почти во всех сферах.</p>
  <p>Надеемся, что вам понравилась данная статья!</p>
  <p>Есть вопросы? Пишите <a href="http://t.me/coders_assistant_bot" target="_blank">@coders_assistant_bot</a>.</p>

]]></content:encoded></item></channel></rss>