Приветствую!
Каналу исполнилось 9 месяцев!
За это время:
- Вышло свыше 120 постов.
- На канал подписались 473 человек!
- На сайте примерно 80-100 ежедневных посещений.
- Стримы и другие активности.
Спасибо всем тем, кто читает наши посты. Тем, кто участвует в обсуждении. И тем, кто поддерживает нас.
Впереди много планов, которые по чуть-чуть да воплощаются.
Каналу исполнилось 9 месяцев!
За это время:
- Вышло свыше 120 постов.
- На канал подписались 473 человек!
- На сайте примерно 80-100 ежедневных посещений.
- Стримы и другие активности.
Спасибо всем тем, кто читает наши посты. Тем, кто участвует в обсуждении. И тем, кто поддерживает нас.
Впереди много планов, которые по чуть-чуть да воплощаются.
🔥13❤🔥2☃2❤2🆒1
Отправка поста с Django в AIOgram - обновление
Автор: Иван Ашихмин
В посте "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram" я рассказывал как отправлять текст поста в AIOgram, обрабатывать и публиковать в Telegram-канале.
Это была первая версия обработчика, которая работала, но была не совсем удобна в использовании.
После нескольких месяцев использования прошлой системы, появилась необходимость "апгрейда" для более удобной публикации постов с сайта в канале.
Обновление основано на файлах из поста: "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram".
Продолжение в посте на Boosty (платный контент)
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Telegram #AIOgram #Telegram_бот #AIOgram3 #бот #Boosty #автоматический_постинг
Автор: Иван Ашихмин
В посте "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram" я рассказывал как отправлять текст поста в AIOgram, обрабатывать и публиковать в Telegram-канале.
Это была первая версия обработчика, которая работала, но была не совсем удобна в использовании.
После нескольких месяцев использования прошлой системы, появилась необходимость "апгрейда" для более удобной публикации постов с сайта в канале.
Обновление основано на файлах из поста: "Django + AIOgram3 + Redis - Отправка поста с Django в AIOgram".
Продолжение в посте на Boosty (платный контент)
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Telegram #AIOgram #Telegram_бот #AIOgram3 #бот #Boosty #автоматический_постинг
🔥3👍1
Добрый вечер! Пятница наступила!
Время отключиться от повседневных забот, погрузиться в атмосферу кино и позволить себе почувствовать всю гамму эмоций, которые передают герои на экране. Устройтесь поудобнее и готовьтесь к погружению в мир кинематографа, который позволит вам окунуться в историю и пережить каждый момент вместе с героями.
Фильм: Путь домой
Год: 2010
1940 год, Сибирь. Самый страшный лагерь для политзаключенных. Небольшая группа осужденных смогла вырваться из этого страшного места. Теперь их ждёт долгий и трудный путь домой: выживание в пустыне, переход через горы, столкновение с дикими животными и встречи с незнакомыми людьми. Они идут домой из последних сил, надеясь на встречу со своими близкими.
https://www.sspoisk.ru/film/430638/
Приятного просмотра!
Время отключиться от повседневных забот, погрузиться в атмосферу кино и позволить себе почувствовать всю гамму эмоций, которые передают герои на экране. Устройтесь поудобнее и готовьтесь к погружению в мир кинематографа, который позволит вам окунуться в историю и пережить каждый момент вместе с героями.
Фильм: Путь домой
Год: 2010
1940 год, Сибирь. Самый страшный лагерь для политзаключенных. Небольшая группа осужденных смогла вырваться из этого страшного места. Теперь их ждёт долгий и трудный путь домой: выживание в пустыне, переход через горы, столкновение с дикими животными и встречи с незнакомыми людьми. Они идут домой из последних сил, надеясь на встречу со своими близкими.
https://www.sspoisk.ru/film/430638/
Приятного просмотра!
🔥4
Что выведет код с изображения ниже? №16
Anonymous Quiz
6%
['Желает', 'Знать', 'Охотник', 'Где', 'Сидит', 'Каждый', 'Фазан']
12%
['Каждый', 'Охотник', 'Знать', 'Сидит', 'Желает', 'Где', 'Фазан']
14%
['Каждый', 'Охотник', 'Желает', 'Знать', 'Где', 'Сидит', 'Фазан']
69%
['Где', 'Желает', 'Знать', 'Каждый', 'Охотник', 'Сидит', 'Фазан']
🔥5👍1🤓1
Вчера мы опубликовали задачу на знание основ работы словарей в Python. Задачу верно решило большее число ответивших, а именно 66%.
Код задачи:
Разбор задачи:
Задача состоит из двух шагов:
1. Создаём переменную
2. Выводим на печать отсортированный список значений словаря.
Что происходит в коде?
В переменной
Далее мы хотим его отсортировать, но не указываем по какому параметру, а только лишь передаём в "сортировщик" список (list) со значениями. Возможно, кого-то этот ход обманул: мы действительно просто сортируем список значений словаря, вне всякой зависимости от ключей, которые оказываются просто отброшенными.
В Python сортировка строк осуществляется побуквенно, т.е. строка символов преобразуется в список чисел, где каждый элемент – это число из unicode-таблицы символов. При этом строка из четырёх символов будет всегда считаться меньшей, чем строка из пяти, если четыре первые символа в обеих строках совпадают.
Например,
В нашем же примере слова просто отсортируются по алфавиту:
Где
Желает
Знать
Каждый
Охотник
Сидит
Фазан
Если же мы хотим получить "правильный" порядок, основанный на ключах, то можно воспользоваться сортировкой по ключу:
В примере выше в функцию
Код задачи:
dct = {
"10": "Желает",
"2": "Знать",
"1": "Охотник",
"22": "Где",
"3": "Сидит",
"0": "Каждый",
"30": "Фазан"
}
print(sorted(dct.values()))Разбор задачи:
Задача состоит из двух шагов:
1. Создаём переменную
dct, в которой прописываем словарь.2. Выводим на печать отсортированный список значений словаря.
Что происходит в коде?
В переменной
dct мы прописали словарь, в котором и ключи, и значения – строки. Далее мы хотим его отсортировать, но не указываем по какому параметру, а только лишь передаём в "сортировщик" список (list) со значениями. Возможно, кого-то этот ход обманул: мы действительно просто сортируем список значений словаря, вне всякой зависимости от ключей, которые оказываются просто отброшенными.
В Python сортировка строк осуществляется побуквенно, т.е. строка символов преобразуется в список чисел, где каждый элемент – это число из unicode-таблицы символов. При этом строка из четырёх символов будет всегда считаться меньшей, чем строка из пяти, если четыре первые символа в обеих строках совпадают.
Например,
"абвг" будет идти после "абв" или "Я" будет считаться меньше чем "а".В нашем же примере слова просто отсортируются по алфавиту:
Где
Желает
Знать
Каждый
Охотник
Сидит
Фазан
Если же мы хотим получить "правильный" порядок, основанный на ключах, то можно воспользоваться сортировкой по ключу:
print([v for _, v in sorted(dct.items())])
В примере выше в функцию
sorted() попадёт кортеж (ключ: значение), и сортировка будет по первому элементу – т.е. по ключу. Затем в цикле выводим значение на экран и получаем:['Каждый', 'Охотник', 'Желает', 'Знать', 'Где', 'Сидит', 'Фазан']
🔥6
Django 41. Комментарии к постам
Автор: Иван Ашихмин
В нашем проекте не хватает одного важного элемента – блока комментариев на странице поста. Давайте исправим это.
Что мы сделаем:
- Добавим на страницу поста отображение комментариев.
- Добавим возможность авторизованным пользователям оставлять комментарии.
- Также у автора комментария или администратора должна быть возможность удалить или отредактировать комментарий.
Модель комментария.
Для хранения комментариев нам нужна модель.
Откроем файл
Создадим класс
-
-
Автор: Иван Ашихмин
В нашем проекте не хватает одного важного элемента – блока комментариев на странице поста. Давайте исправим это.
Что мы сделаем:
- Добавим на страницу поста отображение комментариев.
- Добавим возможность авторизованным пользователям оставлять комментарии.
- Также у автора комментария или администратора должна быть возможность удалить или отредактировать комментарий.
Модель комментария.
Для хранения комментариев нам нужна модель.
Откроем файл
models.py в директории приложения blog.Создадим класс
CommentModel, унаследованный от models.Model, и пропишем четыре поля:-
user – Внешний ключ на модель пользователя.-
post – Внешний ключ на модель поста. Для доступа к модели комментария из объекта модели поста указываем аргумент related_name="comments".🔥1
-
-
Также пропишем внутренний класс
Код модели:
Регистрация в панели администратора.
Откроем файл
Создадим класс
Внутри класса поля можно прописать по желанию, например:
-
-
Дополнительно добавим столбец с названием поста при клике на которую будет открываться страница поста.
Для этого создадим метод
Внутри метода, используя функцию
Затем ниже вызываем метод
Не забываем прописать новое поле в
Код класса:
Форма добавления комментария.
Для того чтобы можно было добавлять новый комментарий, необходима форма модели.
Откроем файл
Форма будет весьма классическая:
- Определяем поле
- Прописываем класс
Код формы:
Представления.
Теперь займёмся представлениями. Нам для комментариев нужно три представления:
- Добавление комментария.
- Редактирование.
- Удаление.
Также необходимо изменить представление страницы поста для передачи в него формы комментария.
Представление страницы поста.
Откроем файл
Он тоже весьма стандартный. Внутри метода в контекст добавим новый ключ
Код метода:
comment – Текстовое поле для комментария.-
created_at – Поле с датой написания комментария.Также пропишем внутренний класс
Meta с названием модели и dunder-метод __str__ с текстовым представлением объекта модели.Код модели:
class CommentModel(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, verbose_name="Пользователь"
)
post = models.ForeignKey(
PostModel,
on_delete=models.CASCADE,
verbose_name="Пост",
related_name="comments",
)
comment = models.TextField(verbose_name="Комментарий")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "Комментарий"
verbose_name_plural = "Комментарии"
def __str__(self):
return f"Комментарий от {self.user} к посту {self.post}"
Регистрация в панели администратора.
Откроем файл
admin.py.Создадим класс
CommentAdmin, унаследованный от admin.ModelAdmin. Обернём его в декоратор @admin.register(), передав в качестве аргумента модель комментария.Внутри класса поля можно прописать по желанию, например:
-
list_display - отображаемые столбцы.-
list_filter - выбор по каким полям проводить фильтрацию.Дополнительно добавим столбец с названием поста при клике на которую будет открываться страница поста.
Для этого создадим метод
post_link, в аргументах он принимает self и объект модели obj.Внутри метода, используя функцию
mark_safe, возвращаем строку со ссылкой.Затем ниже вызываем метод
allow_tags и устанавливаем его в True. Это позволит выводить HTML на странице панели администратора.Не забываем прописать новое поле в
list_display.Код класса:
@admin.register(models.CommentModel)
class CommentAdmin(admin.ModelAdmin):
list_display = ("user", "post_link", "created_at", "comment")
list_filter = ("user", "post")
def post_link(self, obj):
return mark_safe(
f'<a href="{obj.post.get_absolute_url()}">{obj.post.title}</a>'
)
post_link.allow_tags = True
Форма добавления комментария.
Для того чтобы можно было добавлять новый комментарий, необходима форма модели.
Откроем файл
forms.py и создадим класс CommentForm, унаследованный от forms.ModelForm.Форма будет весьма классическая:
- Определяем поле
comment.- Прописываем класс
Meta, указав модель и всего одно поле - comment.Код формы:
class CommentForm(forms.ModelForm):
comment = forms.CharField(
widget=forms.Textarea(
attrs={
"class": "form-control",
"placeholder": "Введите текст комментария",
"rows": 5
}
),
)
class Meta:
model = CommentModel
fields = ("comment",)
Представления.
Теперь займёмся представлениями. Нам для комментариев нужно три представления:
- Добавление комментария.
- Редактирование.
- Удаление.
Также необходимо изменить представление страницы поста для передачи в него формы комментария.
Представление страницы поста.
Откроем файл
views.py. Найдём класс PostPageView и добавим метод get_context_data.Он тоже весьма стандартный. Внутри метода в контекст добавим новый ключ
comment_form, в который определим объект формы CommentForm.Код метода:
🔥1
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["comment_form"] = CommentForm()
return context
Базовое представление.
Нам понадобится три представления, и по сути они идентичны. Различия только в наследуемых классах, поэтому, чтобы избежать дублирования кода, создадим базовый класс
BaseCommentView.В классе пропишем поле
model, в котором определим класс модели комментария.И переопределим метод
get_success_url, принимающий только self.В нём мы вернём путь до страницы поста.
Код класса:
class BaseCommentView:
model = CommentModel
def get_success_url(self):
post = models.PostModel.objects.get(pk=self.object.post.pk)
return reverse(
"blog:post_page",
kwargs={"category_slug": post.category.slug, "slug": post.slug},
)
Представление добавления комментария.
Создадим класс
AddCommentView, унаследованный от BaseCommentView и CreateView, который будет отвечать за добавление комментария.В нём мы добавим поле
form_class, определив в нём класс формы.И переопределим метод
form_valid, принимающий self и объект формы form.Поскольку в модель класса требуется передавать пользователя и связанный с комментарием пост, а в форме мы не можем этого сделать, определим их тут.
Внутри метода определяем поля
user и post, затем вызываем super-метод для сохранения объекта.Код представления:
class AddCommentView(BaseCommentView, CreateView):
form_class = CommentForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.post = models.PostModel.objects.get(pk=self.kwargs.get("pk"))
return super().form_valid(form)
Представления редактирования и удаления комментария.
Создадим два класса:
-
EditCommentView, унаследованный от BaseCommentView и UpdateView.-
DeleteCommentView, унаследованный от BaseCommentView и DeleteView.В обоих классах пропишем поле
template_name, в котором пропишем шаблон для страницы редактирования и страницы удаления комментария.В классе
EditCommentView дополнительно пропишем поле form_class, как в классе добавления комментария.Код классов:
class EditCommentView(BaseCommentView, UpdateView):
form_class = CommentForm
template_name = "blog/comment_edit.html"
class DeleteCommentView(BaseCommentView, DeleteView):
template_name = "blog/comment_delete.html"
Маршруты представлений.
Для всех трёх представлений осталось создать маршруты. Для этого откроем файл
urls.py и в список urlpatterns добавим следующие строки:path("comment/add/<int:pk>/", views.AddCommentView.as_view(), name="add_comment"),
path(
"comment/edit/<int:pk>/", views.EditCommentView.as_view(), name="edit_comment"
),
path(
"comment/delete/<int:pk>/",
views.DeleteCommentView.as_view(),
name="delete_comment",
),
Шаблоны комментариев.
Начнём с основного шаблона вывода комментариев.
Шаблон добавления и вывода комментариев.
В директории с шаблонами создадим новый файл
comments.html.В нём пропишем шаблон для отображения комментариев:
🔥1
<div class="row">
<h2 class="mt-3 mb-3">Добавить комментарий:</h2>
{% if user.is_authenticated %}
<form method="post" enctype="multipart/form-data" action="{% url "blog:add_comment" pk=post.pk %}">
{% csrf_token %}
{{ comment_form.comment }}
<button class="btn btn-outline-warning mt-3" type="submit">Отправить</button>
</form>
{% else %}
<p><a href="{% url 'user_app:login' %}">Войдите</a> чтобы добавить комментарий.</p>
{% endif %}
</div>
<div class="row">
<h2 class="mt-3 mb-3">Комментарии пользователей:</h2>
{% if comments %}
{% for comment in comments %}
<p><a href="{% url 'user_app:user_profile' username=post.author %}">{{ comment.user }}</a>
| {{ comment.created_at }} | {% if comment.user user or user.is_superuser %}
<a href="{% url 'blog:edit_comment' comment.pk %}">Редактировать</a> |
<a href="{% url 'blog:delete_comment' comment.pk %}">Удалить</a>
{% endif %}</p>
<p>{{ comment.comment }}</p>
<hr>
{% endfor %}
{% else %}
<p>Нет комментариев</p>
{% endif %}
</div>
В первом блоке выводим форму для добавления комментария. Обратите внимание, что в форме передаём аргумент
action с маршрутом на представление добавления комментария.Во втором блоке в цикле выводим комментарии. Также проверяем, что автор комментария – это текущий пользователь или администратор, чтобы отобразить кнопки для редактирования и удаления комментария.
Далее откроем шаблон страницы поста и в удобное место подключим файл шаблона комментариев, передав в него объект поста и список комментариев:
{% include "blog/modules/comments.html" with post=post comments=post.comments.all%}
Шаблон редактирования комментария.
Создадим файл
comment_edit.html и пропишем следующий код:{% extends 'blog/base.html' %}
{% block title %}Редактирование комментария{% endblock %}
{% block content %}
<div class="form-section container mt-3">
<h2>Редактирование комментария</h2>
<form method="post">
{% csrf_token %}
<p>{{ form.comment }}</p>
<button class="btn btn-primary" type="submit">Обновить</button>
<a href="{% url 'blog:post_page' slug=object.post.slug category_slug=object.post.category.slug %}"
class="btn btn-secondary">Отмена</a>
</form>
</div>
{% endblock %}
Шаблон удаления комментария.
Создадим файл
comment_delete.html и пропишем следующий код:{% extends 'blog/base.html' %}
{% block title %}Удаление комментария{% endblock %}
{% block content %}
<div class="form-section container mt-3">
<h2>Удаление комментария</h2>
<p>Вы действительно хотите удалить этот комментарий?</p>
<pre>{{ object.comment }}</pre>
<form method="post">
{% csrf_token %}
<button class="btn btn-danger me-2" type="submit">Да, удалить</button>
<a href="{% url 'blog:post_page' slug=object.post.slug category_slug=object.post.category.slug %}"
class="btn btn-secondary">Отмена</a>
</form>
</div>
{% endblock %}
Заключение.
🔥3👍1
Добавить комментарии несложно. Куда сложнее будет далее за ними следить. Хоть у нас и есть "защита" в виде ограничения на зарегистрированных пользователей, спамеры "не дремлют", и, возможно, в будущем придётся добавлять защиту в виде капчи или что-то другое.
Файлы к посту, можно получить в боте по коду: 279348
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Модели #Представления #Формы #Комментарии
Файлы к посту, можно получить в боте по коду: 279348
Пост на сайте
Поддержать проект
#Python #Django #Гайды #Модели #Представления #Формы #Комментарии
🔥3
Forwarded from Заметки на салфетке
Всем привет!
За несколько дней произошло несколько событий.
Начнём с главного.
19-го января у моей группы в GB прошла итоговая аттестация (защита диплома). Нам обещали в течении месяца выслать диплом и номер его отслеживания... Видимо в GB месяц длится иначе, т.к. диплом я и мои одногруппники начали получать только с этой недели... Получив оповещение от Почты России о прибытии письма. 2.5 месяца на изготовление, отправки, но прикол не в этом! Теперь они предоставляют дипломы в виде двух листочков, без корочки. Ну да ладно, я уже на WB выбрал обложку)
И вот казалось бы, диплом, наконец-то эпопея длительностью в 1.5 года + 2.5 месяца ожидания диплома подошли к концу, надо радоваться... А радости то нет. И ощущения "дипломированного специалиста" тоже. Такие дела.
Второе "событие", опишу позже. там тоже есть приколы)
За несколько дней произошло несколько событий.
Начнём с главного.
19-го января у моей группы в GB прошла итоговая аттестация (защита диплома). Нам обещали в течении месяца выслать диплом и номер его отслеживания... Видимо в GB месяц длится иначе, т.к. диплом я и мои одногруппники начали получать только с этой недели... Получив оповещение от Почты России о прибытии письма. 2.5 месяца на изготовление, отправки, но прикол не в этом! Теперь они предоставляют дипломы в виде двух листочков, без корочки. Ну да ладно, я уже на WB выбрал обложку)
И вот казалось бы, диплом, наконец-то эпопея длительностью в 1.5 года + 2.5 месяца ожидания диплома подошли к концу, надо радоваться... А радости то нет. И ощущения "дипломированного специалиста" тоже. Такие дела.
Второе "событие", опишу позже. там тоже есть приколы)
🔥7👏2❤1
Добрый вечер, друзья!
Пятница - время для отдыха и развлечений. Подготовьте уютное место, закуски и напитки, чтобы создать атмосферу настоящего кинотеатра прямо у себя дома. Готовьтесь к запредельным приключениям и не забудьте приглушить свет - ведь именно в темноте ужасы кажутся еще более реальными. Наслаждайтесь вечером и пусть этот фильм подарит вам заряд адреналина на целую неделю!
Фильм: Зеркала
Год: 2008
Бывший нью-йоркский полицейский устраивается на работу ночным сторожем выгоревших руин крупного универмага. Обходя обугленные развалины, он начинает замечать что-то зловещее в декоративных зеркалах, украшающих стены: в огромных мерцающих стёклах отражается что-то жуткое.
https://www.sspoisk.ru/film/263447/
Приятного просмотра!
Пятница - время для отдыха и развлечений. Подготовьте уютное место, закуски и напитки, чтобы создать атмосферу настоящего кинотеатра прямо у себя дома. Готовьтесь к запредельным приключениям и не забудьте приглушить свет - ведь именно в темноте ужасы кажутся еще более реальными. Наслаждайтесь вечером и пусть этот фильм подарит вам заряд адреналина на целую неделю!
Фильм: Зеркала
Год: 2008
Бывший нью-йоркский полицейский устраивается на работу ночным сторожем выгоревших руин крупного универмага. Обходя обугленные развалины, он начинает замечать что-то зловещее в декоративных зеркалах, украшающих стены: в огромных мерцающих стёклах отражается что-то жуткое.
https://www.sspoisk.ru/film/263447/
Приятного просмотра!
🔥2😱1
Что выведет код с изображения ниже? №17
Anonymous Quiz
8%
True, True, True,
28%
True, True, False
20%
True, False, False
13%
False, False, True
33%
Ничего из перечисленного выше
Позавчера мы опубликовали задачу, основанную на сравнении элементов и списках. В викторине приняло участие не так много человек, а правильных ответов было всего 7.
Код задачи:
Разбор задачи:
Создаём три переменные:
-
-
-
Затем в функции
- Сравнение нулевого элемента в списках
- Проверку на то, что нулевой элемент в списке
- Сравнение нулевого элемента в списках
Где подвох?
В общем и целом задача подходит под разбор, написанный для 15-й задачи, с одним лишь исключением.
При создании переменных мы использовали умножение списка, и если при умножении на единицу список останется неизменным, то при умножении на ноль он просто "очистится".
Подвох именно в этом. После того, как мы умножили список
Код задачи:
lst = [1]
lst1 = lst * 0
lst2 = lst * 1
print(lst[0] == lst2[0], lst[0] is lst2[0], lst[0] == lst1[0])
Разбор задачи:
Создаём три переменные:
-
lst - список с одним элементом.-
lst1 - умноженный на ноль список lst.-
lst2 - умноженный на один список lst.Затем в функции
print() выводим три проверки:- Сравнение нулевого элемента в списках
lst и lst2.- Проверку на то, что нулевой элемент в списке
lst идентичен нулевому элементу из списка lst2.- Сравнение нулевого элемента в списках
lst и lst1.Где подвох?
В общем и целом задача подходит под разбор, написанный для 15-й задачи, с одним лишь исключением.
При создании переменных мы использовали умножение списка, и если при умножении на единицу список останется неизменным, то при умножении на ноль он просто "очистится".
Подвох именно в этом. После того, как мы умножили список
lst = [1] на ноль, мы получили пустой список []. Следовательно, все попытки получить какой-либо элемент списка будут вызывать исключение IndexError.🔥7
Рад снова приветствовать вас, друзья!
Пятница уже здесь, и это означает, что рабочая неделя подходит к концу. Давайте насладимся этим прекрасным вечером и проведём его за просмотром увлекательного фильма. Пусть эта пятница станет особенной и запомнится нам надолго!
Фильм: Кон-Тики
Год: 2012
Это известная история о том, как норвежский путешественник Тур Хейердал в 1947 году пересёк Тихий океан от Перу до Полинезии на бальсовом плоту. Таким способом он хотел доказать свою теорию о заселении Полинезии из Южной Америки, а не из Азии, как тогда считалось.
https://www.kinopoisk.ru/film/506432/
https://www.sspoisk.ru/film/506432/
Приятного просмотра и отдыха!
Пятница уже здесь, и это означает, что рабочая неделя подходит к концу. Давайте насладимся этим прекрасным вечером и проведём его за просмотром увлекательного фильма. Пусть эта пятница станет особенной и запомнится нам надолго!
Фильм: Кон-Тики
Год: 2012
Это известная история о том, как норвежский путешественник Тур Хейердал в 1947 году пересёк Тихий океан от Перу до Полинезии на бальсовом плоту. Таким способом он хотел доказать свою теорию о заселении Полинезии из Южной Америки, а не из Азии, как тогда считалось.
https://www.kinopoisk.ru/film/506432/
https://www.sspoisk.ru/film/506432/
Приятного просмотра и отдыха!
🔥4
Forwarded from Заметки на салфетке
Всем привет!
Уже в эту субботу, 20го апреля состоится финальное демо проектов на стажировке в LAD Academy.
Почти шесть месяцев ушло на разработку MVP проекта LAPA.
Приглашаю всех желающих на нашу презентацию.
Мероприятие пройдёт в Google Meet. Начало в 10:00 по МСК и до 17-ти часов.
Презентация проекта LAPA запланировано на 11:45-12:30.
Ссылка на мероприятие: https://meet.google.com/zhv-kmcb-ros
P.S. Пост про стажировку будет, как только разберусь с делами)
Уже в эту субботу, 20го апреля состоится финальное демо проектов на стажировке в LAD Academy.
Почти шесть месяцев ушло на разработку MVP проекта LAPA.
Приглашаю всех желающих на нашу презентацию.
Мероприятие пройдёт в Google Meet. Начало в 10:00 по МСК и до 17-ти часов.
Презентация проекта LAPA запланировано на 11:45-12:30.
Ссылка на мероприятие: https://meet.google.com/zhv-kmcb-ros
P.S. Пост про стажировку будет, как только разберусь с делами)
🔥3
Дорогие друзья,
С наступлением пятницы настает время, когда мы можем отдохнуть от забот и насладиться вечером в уюте своего дома. И что может быть лучше, чем уютно устроиться на диване с чашкой горячего чая или вкусным попкорном и наслаждаться просмотром любимого фильма?
Приготовьтесь окунуться в мир кино и погрузиться в историю, которая захватит вас с первых минут. Забудьте обо всех повседневных проблемах и наслаждайтесь вечером, полным эмоций, смеха и волнения.
Фильм: Апгрейд
Год: 2018
В недалеком будущем технологии контролируют все процессы жизни человечества. Когда технофоб Грей теряет в результате нападения банды отморозков жену, а сам оказывается парализованным, его единственной надеждой на отмщение становится новейшая научная разработка. Экспериментальный имплант «стем» не только ставит Грея на ноги, но наделяет его суперсовременным кибер-мозгом и сверхчеловеческими способностями.
https://www.sspoisk.ru/film/1009784/
Приятного просмотра и отличного вечера, друзья!
С наступлением пятницы настает время, когда мы можем отдохнуть от забот и насладиться вечером в уюте своего дома. И что может быть лучше, чем уютно устроиться на диване с чашкой горячего чая или вкусным попкорном и наслаждаться просмотром любимого фильма?
Приготовьтесь окунуться в мир кино и погрузиться в историю, которая захватит вас с первых минут. Забудьте обо всех повседневных проблемах и наслаждайтесь вечером, полным эмоций, смеха и волнения.
Фильм: Апгрейд
Год: 2018
В недалеком будущем технологии контролируют все процессы жизни человечества. Когда технофоб Грей теряет в результате нападения банды отморозков жену, а сам оказывается парализованным, его единственной надеждой на отмщение становится новейшая научная разработка. Экспериментальный имплант «стем» не только ставит Грея на ноги, но наделяет его суперсовременным кибер-мозгом и сверхчеловеческими способностями.
https://www.sspoisk.ru/film/1009784/
Приятного просмотра и отличного вечера, друзья!
🔥3
Что выведет код с изображения ниже?
Anonymous Quiz
15%
[64, 36, 16, 4, 0]
46%
[0, 16, 64]
28%
[4, 36]
10%
[36, 4]