Выражу и я свою благодарность, но хочеться посоветовать создать для этого дела отдельный плейлист, дабы можно было его себе добавлять. Творческих успехов!)
Уважаемый выражаю огромную благодарность . Годность видео зашкаливает1!!!нравиться как вы выстраиваете свою логику .Это очень ценно когда ты обладаешь основами языка и желанием что то делать НО ТЫ НЕ ПОНИМАЕШЬ КАКИМ ОБРАЗОМ .лайк однозначно и подписка
Как жалко, что нету уроков... В этом видео, вы заложил мышление програмииста, т. Е. Как надо мыслить, не код тупо заучить, а именно мыслить в программировании. Очень хотелось бы увидеть от Вас, уроки по python!
"Урок 1" по умолчанию предполагает, что он начального уровня. А если ты имел в виду что-либо другое, то желательно внятно прописывать название. Продвинутый уровень и т.д. На Ютубе такой синтаксис. И в русском языке то же. И "попробовать нарисовать примитив" в начале урока - это то же делает его похожим на урок для новичков.
Я не пытался полностью объяснить как повторить то, что сделал. Я пытался объяснить, что любая задача делается поэтапно, важно начать хоть что-то делать и не зацикливаться на каких-то деталях. Т.е сделать хоть что-то похожее на то, что требуется, после чего переосмыслить и сделать конфетку
Ввела весь код в компилятор, показывает синтаксическую ошибку на except. Подсажите, пожалуйста, что надо сделать, чтобы программа работала? from PIL import Image import re scr_x = 800 scr_y=scr_x half_scr_x=int(scr_x/2) half_scr_y=int(scr_y/2) img = Image.new ('RGB',(scr_x+1,scr_y+1),'black') convas_pixels = img.load () color = (255,255,255) f = open ('face.obj', 'r') lines = f.read() for line in lines.split(' '): try: v,x,y,z = re.split ('\s+', line) except: continue if v == 'v': x = int ((float (x)+1)*half_scr_x) y= scr_y - int ((float (y) +1)*half_scr_y) canvas_pixels[x,y] = color img.show()
если форматирование здесь такое же как в редакторе, то позиция except имеет неправильные отступы, она должна быть на уровне try. И после except код съехал вправо
Очень здорово и полезно новичку смотрящему на пару шагов вперёд своего скила! Но конечно это совсем не новичковое видео как таковое! Не новичковое по причине неоднозначности используемого инструментария. Новичёк не способен выбрать библиотеку, подключить и импортировать её, не сможет исправить неработающий пример из интернета, даже дистрибутив питона поставить и обновить не сразу сможет. Дело в том что вокруг питона образовался чудовищный слабосовместимый зоопарк версий и всевозможного инструментария. В начале надо убить немало времени и нервов просто чтобы понять что тебе нужно, почему именно это, и какими механизмами всё это ставится, подключается, и обновляется. Пока я остановился на дистрибутиве питона miniconda, и среде разработки pyzo ide. Это очень просто поставить, и это функционально. Но пока оно не попалось мне под руку - намучался! Надеюсь помог какому нибудь новичку)
максимальная координата равна единице, дальше необходимо отмасштабировать. Если ширина экрана 800 пикселей, то необходимо умножить на 800, но нет, поскольку минимальная координата минус 1, поэтому нужно умножить на 400
@@_teplyakov18 идёшь по строке, проверяешь каждый символ: буква или нет? Если нет, то это конец слова, добавляем единицу к счётчику слов. И так до точки
@@UCPv8Jy9j если ты знаешь, что хочешь, много раз делал подобные вещи или есть специалист у которого можно проконсультироваться - конечно продумывай архитектуру
Ну, на каком-то языке мне все равно пришлось бы объяснить, что проще чем на пальцах. Код написан на питоне, какие-то фишки из него проскакивают - люди учатся, значит это урок - урок.
Я взял 3d obj у которого макс кординат около 800.Что то такое вообщем -1376.023398 747.466368. Как сильно измениться.Я возможно не самую легкую модель взял. Может размер scr_x = 800 увеличить ?
Автор, спасибо за труд. Задумака очень хорошая. ОООООчень мало толковых уроков в ютубе для новичков, и я подписался уже на первых секундах, когда ты обещал, что это для новичков... но твои уроки - ну нихрена не для новичков. Ты хороший специалист по программированию, и это чувствуется, и спасибо, что хочешь поделиться знаниями, но пойми, брат, преподавание - это так же ПРОФЕССИЯ. В ней свои ТЕХНОЛОГИИ... И освежение в памяти опытного программиста своих знаний и проговаривание этого вслух - это не есть правильная технология преподавания. И у всех программистов одна и та же ошибка - вы разговариваете со зрителем, как с программистом. А новичёк - он пока ещё НЕ програмист. Это же так логично. И удивляет что вы - великие логики все дружно этого не понимаете. Лично я, вполне смышлёный чувак ДВЕ НЕДЕЛИ не отрываюсь от компа и от книг - начинаю изучать Питон. И за две недели я случайно где-то в середине 4-х часового вебинара увидел как программист скопировал фрагмент кода из МЕЛа в Майке, и запустил его как скрипт... И наконец то смог что-то сам сделать. Неужели трудно с таких простых ПРАКТИЧЕСКИ ПОЛЕЗНЫХ вещей начать??? Ощущение, что вы нарочно сговорились так мутно объяснять основы. Ну и ещё не покидает ощущение, что вы понтуетесь знанием кучи умных слов. У меня есть педагогическое образование, и есть очень удачный опыт преподавания с реально открытыми ртами студентов. Если хочешь, прочти мой простой совет: Вспомни как ты первый раз сел за комп и начал изучать программирование, вспомни какие перед тобой вставали вопросы. Задай себе вопрос: "А если бы мне в первый день задвинули: ...при этом открыть файл в режиме открытия на чтение последовать считать стержиметодом рид... или ..при факторинге обратимся к официальной документации... ". И пойми что у всех нас (новичков) те же вопросы. И пролей на них свет БЕЗ ИСПОЛЬЗОВАНИЯ ВМЕСТО ПОНЯТНЫХ НОРМАЛЬНОМУ ЧЕЛОВЕКУ СЛОВ - П Р О Ф Е С С И О Н Ы Х ТЕРМИНОВ. У тебя будет миллион пописчиков и куча бабла только с Ютуба. И ещё, если бы тебе - новичку препод по программированию включил тихонько на паре свою любимую музыку (Зыкину, или Кобзона) тебе это не мешало бы сосредоточится? Прости за нерпрошеный совет. Удачи.
По моим наблюдениям, документации и уроков для начинающих наоборот довольно много (буквально вчера натыкался на уроки, где минут 5 рассказывали как в Питоне можно складывать, вычитать, умножать). А вот когда у человека уже есть какие-то начальные знания и ему нужно идти вперед - тут перед ним огромная пропасть, уроков что делать дальше нет, и единственный вариант - идти на работу джуном забесплатно набираться опыта
+++++++++++++++++++++++++, миллион плюсов тебе, абсолютно согласен. Для новичка в питоне есть тот же Лутц. Для новичка в IT - есть сайт Полякова. И вот ты знаешь все основы... но что дальше? Вообще не понятно. Ты можешь даже сделать свой мини-проект, но все равно не поймешь, что можно сначала сделать максимально упрощенный прототип, а потом уже сделать настоящий продукт, и это будет гораздо продуктивнее и правильнее в том числе для архитектуры программы. И таких вещей много, очень много.
Насчет терминов: а как вы собираетесь продолжать обучение, не зная терминологии? Это все равно что сказать "В ваших уроках по английскому слишком много английского, новички не понимают". Просто гуглите незнакомые слова, это очень полезно.
Спасибо нормальный человек сказал бы за совет. Мычи дальше. Представляю что ты за коды пишешь с такими способностями НА РОДНОМ ЯЗЫКЕ строить предложения и написать внятное название видео. Удачи.
Блин, искренне не понимаю людей который увидели приставку-"Урок 1". И начали возмущаться почему он не для начинающих. А так у меня только один мелкий вопрос. А где взять файл face.obj а то у меня на компухтере его чет нету. P.S извините за мой русский, язык для меня не родной.
Можно. Но формат obj-файла допускает необязательные параметры, а также числа могут быть разделены больше чем одним пробелом. Поэтому может получиться такое: "1 2 3".split(" ") ['1', '', '2', '', '3']
Стас Волик не знаю, как продемонстрировать, но я только что проверил в консоли - и там работает. Можешь проверить сам, всего одна строка) Питон 3.6, если что
Оперативно. Спасибо. Дело в том, что у меня отличается питон. Версия 3.6. Только консольная версия. Если есть возможность проконсультироваться, прошу дать мне знать: vk.com/tanaevigor
Эм, как бы а нафига рисовать 3д модель с помощью питона. Можно, но нафига?! Это же медленно. OpenGL DirectX Vulkan ? Эти вещи гуглятся за пять минут. Можно за день разобраться что и за чем применять, чтобы рисовать 3д графику, как человек, а не как изращенец, у которого тонна времени. Весь этот урок пишется на c++ и opengl и является базовой вещью в 3д графике. Ещё раз нафига забивать электронным микроскопом гвозди?
Это урок номер 1? Я так понимаю, в курсе есть уроки с отрицательными числами? Вообще видео годное.
Огонь! 🔥🔥🔥 35 лет, в Python полгода, первый язык, вообще никаких проблем с пониманием.
Выражу и я свою благодарность, но хочеться посоветовать создать для этого дела отдельный плейлист, дабы можно было его себе добавлять. Творческих успехов!)
Уважаемый выражаю огромную благодарность . Годность видео зашкаливает1!!!нравиться как вы выстраиваете свою логику .Это очень ценно когда ты обладаешь основами языка и желанием что то делать НО ТЫ НЕ ПОНИМАЕШЬ КАКИМ ОБРАЗОМ .лайк однозначно и подписка
Если вы уже знакомы с python, то эти уроки первые которые вы должны посмотреть!
Как жалко, что нету уроков... В этом видео, вы заложил мышление програмииста, т. Е. Как надо мыслить, не код тупо заучить, а именно мыслить в программировании. Очень хотелось бы увидеть от Вас, уроки по python!
К сожалению, времени совсем нет. По поводу мышления - в точку, именно так и задумывал
Очень крутое видео, спасибо! Не требует каких-то суперзнаний и очень затягивает.
Наконец что то понятное, спасибо, Стас!
отлично, именно с этого уровня мне нужно начинать
Хороший формат. Спасибо за труд. Подписался.
Спасибо за видео!!!
Прикольно, первая минута, Огонь заинтересованости!!!
Спасибо огромное и удачи!
Спасибо
Это видео точно не для начинающих!
Так, а где я сказал или написал, что для начинающих?
"Урок 1" по умолчанию предполагает, что он начального уровня. А если ты имел в виду что-либо другое, то желательно внятно прописывать название. Продвинутый уровень и т.д. На Ютубе такой синтаксис. И в русском языке то же.
И "попробовать нарисовать примитив" в начале урока - это то же делает его похожим на урок для новичков.
@@iMaxBegemot нам шпаргалок хотя бы надыбать, мы же не хотим оставаться на второй год.
@@ИгорьНурлиев-ж5г эт точно
@@AleksandrGrachov ага
Спасибо! Очень доходчиво постраение логики.
очень круто.! никакой информатики уровня 5 класса, про переменные!!!
В мое время объясняли, что информация это "0" и "1")))
Огромное спасибо Стас! Только после вашего объяснения у меня наконец выстроился весь пайплайн.
Планируете добить последние уроки по освещению?
Наконец годный контент
Привет от пикабу. Годно
👍👍👍
Как понять почему не работает на другом файле такого же формата ? ._.
Подскажите пожалуйста, что делать если есть (на мой взгляд) хорошая идея, а в моем городе нет компитентных програмистов!?
Так рассказывает, как будто мы тут все шарим!!! Я так могу тоже научить самолетом управлять.. А потом некролог почитаем посмеёмся
Все такие крутые, некто не спросил где модель взять)
В третьем уроке есть ссылка с кодом уроков и там же лежит модель: github.com/ef-end-y/PythonLessons
спасибо большое, а то замучался, скачал модель, скачал а в ней 2000000 полигонов даже распечатать не могу
@@iMaxBegemot а обязательно нужна уже готовая модель? Может, если посвятить учеников в тайны настоящего программиста, было бы здорово?
кайфонул аж))) музыка приятная, код интересный, воды нет... не достающее из гугла... Круто! как поставить насколько лайков(как сказали ниже)?!!!
А каким редактором вы пользуетесь?
pycharm
Не все понятно но способ подачи очень крутой с примерами как искать
Я не пытался полностью объяснить как повторить то, что сделал. Я пытался объяснить, что любая задача делается поэтапно, важно начать хоть что-то делать и не зацикливаться на каких-то деталях. Т.е сделать хоть что-то похожее на то, что требуется, после чего переосмыслить и сделать конфетку
@@iMaxBegemot забыл слово на латыни... это когда учитель не хочет, чтобы ученик превзошел учителя, и всячески этому препятствует.
Разве версия Пайтона не 2 на этом видио?
Ввела весь код в компилятор, показывает синтаксическую ошибку на except. Подсажите, пожалуйста, что надо сделать, чтобы программа работала?
from PIL import Image
import re
scr_x = 800
scr_y=scr_x
half_scr_x=int(scr_x/2)
half_scr_y=int(scr_y/2)
img = Image.new ('RGB',(scr_x+1,scr_y+1),'black')
convas_pixels = img.load ()
color = (255,255,255)
f = open ('face.obj', 'r')
lines = f.read()
for line in lines.split('
'):
try:
v,x,y,z = re.split ('\s+', line)
except:
continue
if v == 'v':
x = int ((float (x)+1)*half_scr_x)
y= scr_y - int ((float (y) +1)*half_scr_y)
canvas_pixels[x,y] = color
img.show()
если форматирование здесь такое же как в редакторе, то позиция except имеет неправильные отступы, она должна быть на уровне try. И после except код съехал вправо
Супер!
круто
спасибо
Очень здорово и полезно новичку смотрящему на пару шагов вперёд своего скила! Но конечно это совсем не новичковое видео как таковое! Не новичковое по причине неоднозначности используемого инструментария. Новичёк не способен выбрать библиотеку, подключить и импортировать её, не сможет исправить неработающий пример из интернета, даже дистрибутив питона поставить и обновить не сразу сможет. Дело в том что вокруг питона образовался чудовищный слабосовместимый зоопарк версий и всевозможного инструментария. В начале надо убить немало времени и нервов просто чтобы понять что тебе нужно, почему именно это, и какими механизмами всё это ставится, подключается, и обновляется. Пока я остановился на дистрибутиве питона miniconda, и среде разработки pyzo ide. Это очень просто поставить, и это функционально. Но пока оно не попалось мне под руку - намучался! Надеюсь помог какому нибудь новичку)
Еще раз, как выяснить максимальную координату 3д модели?
максимальная координата равна единице, дальше необходимо отмасштабировать. Если ширина экрана 800 пикселей, то необходимо умножить на 800, но нет, поскольку минимальная координата минус 1, поэтому нужно умножить на 400
у меня такая проблема после сохранения и открытия программы она закрывается
почему
а я сегодня сделал программу которая считает сколько слов в предложении.без учета пробелов) на питоне естесссна
Скажи пожалуйста как её написать?
@@_teplyakov18 идёшь по строке, проверяешь каждый символ: буква или нет? Если нет, то это конец слова, добавляем единицу к счётчику слов. И так до точки
Как несколько лайков поставить?))
Помните Сюбр? Я на нем это делал!
Может и сложно зато интересно.
Подскажите с проблемой, после запуска программы выдает No module named PIL
pip install Pillow
а есть исходники к этим урокам или я что-то упустил?
Только начиная с 3-го: github.com/ef-end-y/PythonLessons/blob/master/lesson3.py
Не совсем так что надо вначале спроектировать а потом делать? Учусу щас в техникусе, там считают по другому
Я так понял
@@UCPv8Jy9j если ты знаешь, что хочешь, много раз делал подобные вещи или есть специалист у которого можно проконсультироваться - конечно продумывай архитектуру
Мне понравилось, честно, только причем тут Python?
Ну, на каком-то языке мне все равно пришлось бы объяснить, что проще чем на пальцах. Код написан на питоне, какие-то фишки из него проскакивают - люди учатся, значит это урок - урок.
Вы случайно на хабре не писали уроки по копииOpenGL?
Нет, но я использовал его статью как пример
Я это понял, и когда хотел снова найти ваш урок я забыл что это видео и находил только ту статью для Си.
No module named 'PIL'
что делать ? Или это библиотека которую нужна установить ? 3.6
pip install Pillow
Спасибо разобрался =)))
Я взял 3d obj у которого макс кординат около 800.Что то такое вообщем -1376.023398 747.466368. Как сильно измениться.Я возможно не самую легкую модель взял. Может размер scr_x = 800 увеличить ?
@@kilsmedia подопри под себя подушку (перевод).
face.obj от куда взять ?
github.com/ef-end-y/PythonLessons/
@@iMaxBegemot Спасибо )
Что за музыка на заднем фоне играет?
Это я сыграл на гитаре. Там кусочки разных песен, например, Manowar - Defender, и просто мелодии мною придуманные
Охуенно. Именно так я и учусь, спасибо. Теперь знаю, что не один учусь без проектирования. Хотя дальше прототипа мне обычно лень писать.
Автор, спасибо за труд. Задумака очень хорошая. ОООООчень мало толковых уроков в ютубе для новичков, и я подписался уже на первых секундах, когда ты обещал, что это для новичков... но твои уроки - ну нихрена не для новичков. Ты хороший специалист по программированию, и это чувствуется, и спасибо, что хочешь поделиться знаниями, но пойми, брат, преподавание - это так же ПРОФЕССИЯ. В ней свои ТЕХНОЛОГИИ... И освежение в памяти опытного программиста своих знаний и проговаривание этого вслух - это не есть правильная технология преподавания.
И у всех программистов одна и та же ошибка - вы разговариваете со зрителем, как с программистом. А новичёк - он пока ещё НЕ програмист. Это же так логично. И удивляет что вы - великие логики все дружно этого не понимаете. Лично я, вполне смышлёный чувак ДВЕ НЕДЕЛИ не отрываюсь от компа и от книг - начинаю изучать Питон. И за две недели я случайно где-то в середине 4-х часового вебинара увидел как программист скопировал фрагмент кода из МЕЛа в Майке, и запустил его как скрипт... И наконец то смог что-то сам сделать. Неужели трудно с таких простых ПРАКТИЧЕСКИ ПОЛЕЗНЫХ вещей начать??? Ощущение, что вы нарочно сговорились так мутно объяснять основы. Ну и ещё не покидает ощущение, что вы понтуетесь знанием кучи умных слов.
У меня есть педагогическое образование, и есть очень удачный опыт преподавания с реально открытыми ртами студентов. Если хочешь, прочти мой простой совет:
Вспомни как ты первый раз сел за комп и начал изучать программирование, вспомни какие перед тобой вставали вопросы. Задай себе вопрос: "А если бы мне в первый день задвинули: ...при этом открыть файл в режиме открытия на чтение последовать считать стержиметодом рид... или ..при факторинге обратимся к официальной документации... ".
И пойми что у всех нас (новичков) те же вопросы. И пролей на них свет БЕЗ ИСПОЛЬЗОВАНИЯ ВМЕСТО ПОНЯТНЫХ НОРМАЛЬНОМУ ЧЕЛОВЕКУ СЛОВ - П Р О Ф Е С С И О Н Ы Х ТЕРМИНОВ. У тебя будет миллион пописчиков и куча бабла только с Ютуба.
И ещё, если бы тебе - новичку препод по программированию включил тихонько на паре свою любимую музыку (Зыкину, или Кобзона) тебе это не мешало бы сосредоточится?
Прости за нерпрошеный совет. Удачи.
По моим наблюдениям, документации и уроков для начинающих наоборот довольно много (буквально вчера натыкался на уроки, где минут 5 рассказывали как в Питоне можно складывать, вычитать, умножать). А вот когда у человека уже есть какие-то начальные знания и ему нужно идти вперед - тут перед ним огромная пропасть, уроков что делать дальше нет, и единственный вариант - идти на работу джуном забесплатно набираться опыта
+++++++++++++++++++++++++, миллион плюсов тебе, абсолютно согласен. Для новичка в питоне есть тот же Лутц. Для новичка в IT - есть сайт Полякова. И вот ты знаешь все основы... но что дальше? Вообще не понятно. Ты можешь даже сделать свой мини-проект, но все равно не поймешь, что можно сначала сделать максимально упрощенный прототип, а потом уже сделать настоящий продукт, и это будет гораздо продуктивнее и правильнее в том числе для архитектуры программы. И таких вещей много, очень много.
Насчет терминов: а как вы собираетесь продолжать обучение, не зная терминологии? Это все равно что сказать "В ваших уроках по английскому слишком много английского, новички не понимают". Просто гуглите незнакомые слова, это очень полезно.
Спасибо нормальный человек сказал бы за совет. Мычи дальше. Представляю что ты за коды пишешь с такими способностями НА РОДНОМ ЯЗЫКЕ строить предложения и написать внятное название видео. Удачи.
Можешь меня научить пайтону
Темный лес...
Блин, искренне не понимаю людей который увидели приставку-"Урок 1". И начали возмущаться почему он не для начинающих. А так у меня только один мелкий вопрос. А где взять файл face.obj а то у меня на компухтере его чет нету.
P.S извините за мой русский, язык для меня не родной.
github.com/ef-end-y/PythonLessons/ тут есть еще и коды уроков начиная с 3-го
ЕЩЕ!!!
Почему python2 ?
особой разницы нет. В тот момент у меня на работе были проекты на 2й версии, ее и взял. Версии, на самом деле не сильно отличаются
Нифига не понял, но очень интересно
А почему просто строку по пробелам не разбить с помощью s.split(" "). Зачем здесь регулярки?
Можно. Но формат obj-файла допускает необязательные параметры, а также числа могут быть разделены больше чем одним пробелом. Поэтому может получиться такое: "1 2 3".split(" ")
['1', '', '2', '', '3']
Насчет параметров не знаю, но даже разделенную несколькими пробелами строку можно разбить методом split() без аргумента.
ну так продемонстрируй на примере "1 2 3"
Стас Волик не знаю, как продемонстрировать, но я только что проверил в консоли - и там работает. Можешь проверить сам, всего одна строка) Питон 3.6, если что
А можно ли написать программу на Phyton без кода?
это все равно что сказать "можно ли занятся сексом без члена?", ты хоть думай, что пишешь
Бабы этим постоянно занимаются. ))
Ну ясно что нельзя!
Правильно я понял что это не для новичков?)
Не для чайников, для тех, кто немного знает питон
Обучаете ли вы пайтону с нуля удалённо? Я в Украине живу.
Не обучаю, к сожалению. Эти видео, можно сказать, хобби)
@@iMaxBegemot Действительно к сожалению... Планируются уроки более начального уровня?
и в конце концов, до освещения так и не дошли в последнем выпуске =(
видео снял давно, но текст посеял. Могу выложить без текста и дать ссылку
Ни чё себе! «Для начинающих»
Так, а где я сказал или написал, что для начинающих?
Привет,можешь создать игру?
Что за текстовик?
pycharm
Оперативно. Спасибо. Дело в том, что у меня отличается питон. Версия 3.6. Только консольная версия.
Если есть возможность проконсультироваться, прошу дать мне знать: vk.com/tanaevigor
В Украине VK заблокирован
Вариантов обхода много) tanaevigor00@mail.ru
СЛИШКОМ СЛОЖНО КАК ДЛЯ ПЕРВОГО УРОКА
хочешь скачать пайтон без проблем
G
А что имеется в виду, уроки или сама программа? Нельзя ли поконкретнее?
2:42 и у меня ошибка
у тебя скорее всего 3й питон, там надо скобки в print указывать: print(lines[0:100])
всё равно ошибка
это python 2
Да
Ниче не поняла 🤓
Я тысячный!
Шаг 1. Отучиться от поисковика "гугл" на территории СНГ. Шаг 2. Приучиться гуглить только в Яндексе. Яндекс объективно работает лучше.
Не пайтон а ПИТОН
Перед "а" нужно ставить запятую. Пока ты для взрослых видео смотришь, в школу не опоздал?
4:07 - 4:16 _нахуя так делать - зрение же портится
Террорист с маленькой писькой от чего?
Эм, как бы а нафига рисовать 3д модель с помощью питона. Можно, но нафига?! Это же медленно. OpenGL DirectX Vulkan ? Эти вещи гуглятся за пять минут. Можно за день разобраться что и за чем применять, чтобы рисовать 3д графику, как человек, а не как изращенец, у которого тонна времени. Весь этот урок пишется на c++ и opengl и является базовой вещью в 3д графике. Ещё раз нафига забивать электронным микроскопом гвозди?
Ты очень умный. Я перед тобой преклоняюсь