ch
Feedback
Дневник разработчицы

Дневник разработчицы

前往频道在 Telegram

Откровенные истории о проектах, работе, учебе и открытиях в мире программирования. Присоединяйтесь и вдохновляйтесь вместе со мной!

显示更多
341
订阅者
+124 小时
+27
+430
帖子存档
Очередная тру-стори про AWS. Помните, я писала, что ограничила доступ к бд? Привет счета за внутрисетевой перегон данных, так как база данных и инстансы находятся в одном регионе, но в разных зонах. Сижу, разбираюсь как это исправить.

Я дошла до последнего раздела и осознала, что он практический на нативном JS. Возможно, я к нему вернусь, но позже. Всю теорию я закончила, а это значит, пора возвращаться к своему проекту и начать пилить интерфейс. Как и обещала, прикладываю свой конспект по этому курсу. Сразу скажу, что js я конспектировала гораздо менее тщательно, чем Python. Ну, и напомню, что самому писать такой конспект гораздо полезнее, чем пользоваться чужим. Фух. 🤪💪 Надо будет еще потом AWS добить.

Верни мне... верни мне... верни мне мой друг, и снова верни мне...
const WithRestoService = () => (Wrapped) => {
    return (props) => {
        return (
            <RestoServiceContext.Consumer>
                {
                    (RestoService) => {
                        return <Wrapped {...props} RestoService={RestoService}/>
                    }
                }
            </RestoServiceContext.Consumer>
        )
    };
};


Навеяло https://youtu.be/4TsqlT0rfJI Компонент высшего порядка. HOC - один из паттернов JS. Если что - текущий пример из курса) PS. Я все еще не могу добить курс по JS, я уже отложила AWS и фигачу только JS. Осталось 16 лекций.

Python vs JS. Сделать первую букву заглавной. Python - все просто, функция str.capitalize(), плюс еще есть str.title(), которая делает все первые буквы в словах заглавными. https://pythonz.net/references/named/str.capitalize/ JS. Не, я так не умею, я могу только str.toUpperCase(). Делай сама... Ну ок:
str[0].toUpperCase() + str.slice(1)
Блин, js, ну ты же язык для создания интерфейсов... Почему? ¯\(°_o)/¯

Python VS JS. Функция reduce. В Python https://pythonz.net/references/named/reduce/ В JS https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce Смысл функции в том, что она последовательно пройдет по всем элементам массива и на каждой итерации будет выполнять заданное действие с текущим элементом и результатом с предыдущей итерации. Питонисты не рекомендуют пользоваться этим методом, так как читабельность кода - наше все. И я за, лучше уж цикл написать, так проще и понятнее. Но JS - гангстер, он не боится грязи. Я применила эту функцию для поиска максимального id из списка со словарями.
const data = [
    {id: 1, label: 'Going to learn React'},
    {id: 2, label: 'That is so good'},
    {id: 3, label: 'I need a break...'},
    {id: 4, label: "That's good"}
]

const max_id = data.reduce((max, current) => current.id > (max.id ? max.id : 0)? current.id : max.id)
Как будет это выглядеть в Python:
data = [
    {"id": 1, "label": 'Going to learn React'},
    {"id": 2, "label": 'That is so good'},
    {"id": 3, "label": 'I need a break...'},
    {"id": 4, "label": "That's good"}
]
max_id = 0
for item in data:
    if item['id'] > max_id:
        max_id = item['id']

или короче, но менее читабельно вот так:
max_id = max([item['id'] for item in data])
На самом деле если присмотреться к коду JS, то можно увидеть, что я в функцию передаю другую неназванную функцию, сократив написание в виде стрелочной функции () => {}, убираю тело, условия возврата записываю в виде тернарного оператора (правда ? если да : иначе), в котором пишу еще одно условие в виде тернарного оператора, чтобы обойти ситуацию, когда в первой итерации у меня ничего нет в переменной max (подставляю 0).
max.id ? max.id : 0

Так вот, я грущу от JS из-за таких конструкций. Если для того, чтобы объяснить что делает 1 строчка кода, нужно рассказывать 5 минут, то это нечитаемая строчка кода. Иногда от лектора курса JS слышу: "Давайте запишем это красиво", и дальше он сокращает код, делая из 5 строчек одну, но менее читабельную. Так вот, такое "красиво" не значит хорошо или умно. Вот придерживаться code style - это красиво. В остальном, чем проще, тем понятнее.

Когда я училась в школе, у меня не было дома интернета, компьютер был еще с Windows 95, 1.5 ГБ памяти у жесткого диска, а еще я пользовалась дискетами. О программистах я думала как о совсем непонятных людях и грезила журналистикой. Писала статьи и таскала их на дискетах в местную редакцию. Я жила в маленьком провинциальном городе. История моей учебы довольно раздолбайская. Изначально я поступила на очку на специальность по дорожным машинам, бросила, так как не понимала зачем оно мне. Потом филфак, журналистика - заочка, вечерка. Короче, я так ничего и не окончила. А потом в 22 года я случайно попала в IT как менеджер. И так до 31 года я руководила - фрилансерами, проектами, командами, отделами. Всему уже училась в процессе. Книжки, курсы, статьи, коллеги. Я немного жалею, что не знала и не понимала еще в школе, что такое программирование и как я могу в нем реализоваться. Я искренне восторгаюсь программистами, кто начал еще в детстве постигать это ремесло. Однако, сейчас у меня есть все возможности, чтобы изучать программирование и при этом осознавать каждый свой шаг, так как есть большой опыт управления проектами. Я не просто пишу код, я понимаю зачем он нужен и что на самом деле я от него хочу. А также у меня есть офигенное рабочее место. Хоть это и материальное, но как же классно, иметь удобный стол, стул, монитор, хороший пк для работы. Но все это мелочи по сравнению с кайфом от невероятного потока новой информации, возможностей и результатов реализации своих идей. Когда я делаю то, что задумала, и оно получается.

https://www.youtube.com/watch?v=EiKK04Ht8QI&ab_channel=JomaTech М - мотивация. У этого же товарища есть забавные видео - программирование в стиле аниме. П - прокрастинация)

Не могу не поделиться базовыми принципами ООП
Не могу не поделиться базовыми принципами ООП

Ребята с табами, я с вами, но вот какой оказался конфуз)

Вот так кодишь себе тихонечко и даже не догадываешься, что используешь пробелы, а не табы, пока вдруг не пойдешь настраивать
Вот так кодишь себе тихонечко и даже не догадываешься, что используешь пробелы, а не табы, пока вдруг не пойдешь настраивать eslint. Никогда бы не подумала, что это вообще имеет хоть какое-либо значение, кроме холиваров. Если что, для python есть PEP https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces Pycharm сам все делает по-красоте, вам даже думать не надо. Он просто по умолчанию ставит пробелы. Я свято верила, что использую табы, пока не начала тыкать в код и не обнаружила, что на самом деле там пробелы. Осталось решить вопрос с js, сколько пробелов ставить? 2 или 4?) https://learn.javascript.ru/coding-style#otstupy 2 выглядит лаконичнее, учитывая многослойность кода на js. Зато 4 пробела читабельнее, на мой взгляд. Оставлю 4. Пока искала ответы на свои вопросы, нашла статью на хабре https://habr.com/ru/company/mailru/blog/331696/ Зато я сегодня узнала о том, где находятся настройки code style в ide. Для Pycharm также можно скормить конфиг eslint, если очень надо.

Табы или пробелы?

Мой дашборд с разбивкой по дням.
Мой дашборд с разбивкой по дням.

Пришел очередной отчет из wakatime. Забавно, что больше 70% приходится на браузер. И это не только во время прохождения курса
Пришел очередной отчет из wakatime. Забавно, что больше 70% приходится на браузер. И это не только во время прохождения курса, но и при реализации проектов примерно такая же доля. Не потому что прокрастинация и вот это все, а потому что чтение документации, поиск решений и тд и тп приходится именно на долю браузера. Если что, я не разбиралась как там точно проводятся замеры, но плагин wakatime у меня стоит в Pycharm и в браузере, а также подключен github. К слову, если не подключать плагин к браузеру, то всю активность будет считать как программирование. Статистика будет нечестная, зато красивая)

После JS в скрипте на python пыталась на каждой строчке ; ставить и тело функции чуть не внесла в {}. Прохожу AJAX. Перелопатила кучу всего, чтобы придумать с помощью какой приблуды запустить свой js, в итоге оказалось, что того как запускает шаблоны pycharm вполне достаточно, чтобы отправлять post-запросы. Лектор предлагал openserver и еще что-то подобное, мне не понравилось. Дальше лектор кладет в папочку php-скрипт, чтобы обрабатывать запросы, но у меня то Pycharm, я не могу его осквернять. Полезла запускать flask. Конечно, я не через template на flask запустила html (хотя что мне мешало). Короче, ошибка, не тот домен. corsы-фигорсы (защита от кросдоменных запросов), стаковерфлоу, библиотека flask_cors, чтобы добавить разрешение для запросов с другого порта localhost. Это я еще почти молчу, что сначала я пыталась фласк поднять в докере, но что-то пошло не так, поэтому психанула и запустила просто в venv прямо в винде. Ненуачо. Тяжела и неказиста жизнь простого программиста. Полдня в топку на то, чтобы просто выпендриться и сделать по-своему условную инфру для прохождения курса, еще и довольно криво. Зато, блин, опыт. Но все равно чет в докере не вышло запустить. Странно. Очень странно. Тем временем в лекциях по AWS (да я их не бросила) vpc (сети, подсети). Понравилось выражение лектора - "Приступим, помолясь". Это, блин, слоган для работы с инфрой, особенно на AWS. Когда буду настраивать деплой на новую платформу, тоже буду приступать, помолясь, поставлю рядом шаманский бубен и заряженную воду, вдруг поможет. Нет, AWS хорош, но СЛИШКОМ СЛОЖНА! Мой прогресс: js 54/124; aws 31/88. Кажется, до конца недели не успею.

Еще хочу поделиться. Не знала как отправлять файлы с помощью Python. Так как я не хотела заморачиваться со скачиванием файла или подключением s3 для сохранения, решила воспользоваться методом отправки файла в telegram api для ботов (sendDocument). Вот, пришлось разобраться как крепить файлы к post запросу. Получилась такая функция:
def send_file(self):
    url = f"https://api.telegram.org/bot{settings.TOKEN}/sendDocument"
    caption = "описание файла"
    data = {"chat_id": chat_id, "caption": caption}
    with open(self.file_name, "rb") as file:
        files = {"document": file}
        response = requests.post(url, data, files=files)
        add_log(self.name, response.text)
    return response
Как-то так.

Чувствую себя кул-хацкером) Подключилась к Instance по ssh, нашла там название запущенного докер контейнера, выполнила на контейнере exec, запустив django shell, а потом запустила скриптик, который мне выгрузил нужную статистику. Вроде мелочь, но путь тернистый. До этого я только sql-запросы к продовой базе тыкала. Команды:
docker container ls
чтобы получить список контейнеров
docker exec --interactive CONTAINER_ID django-admin shell
Ну, а дальше в интерактивном режиме импорт и запуск нужного скрипта. Кстати, раньше я не понимала нафига вообще нужен этот shell, зачем все так упорото все прогоняют через shell. Теперь это мой чуть ли не основной инструмент для проверки своих идей в процессе написания кода. Почти каждую функцию проверяю в shell. Ну, или если не джанга, то аналогично запуск python в консоли отличный вариант для тестирования скриптов.

Новый классный функционал от aws. Теперь EB работает с docker-compose. Вот только почему-то работа с обычным dockerfile встала. Твою мойву... Опять 25... Пришлось откатываться на предыдущую версию. Т_Т я не хочу снова страдать, но по ходу придется разбираться. В логах выглядит вот так:
2020/10/07 11:57:14.114919 [INFO] pull docker image if update is not false in Dockerrun.aws.json
2020/10/07 11:57:14.114946 [INFO] Running command /bin/sh -c docker pull python:3.8
2020/10/07 11:57:30.855165 [INFO] Starting...
2020/10/07 11:57:30.855211 [INFO] Starting EBPlatform-PlatformEngine
2020/10/07 11:57:30.855228 [INFO] reading event message file
2020/10/07 11:57:30.855325 [INFO] no eb envtier info file found, skip loading env tier info.
2020/10/07 11:57:30.855398 [INFO] Engine received EB command cfn-hup-exec
Дорогая, я не смог тебе достать образ питона. Все, чао-какао.

Паутина разрастается. Закончу - закину сюда
Паутина разрастается. Закончу - закину сюда

Я узнал, что у меня... Я продолжаю свое чередование AWS и JS. Про AWS. Банальная такая штука, но нифига неочевидная. Инстансы в AWS разделены на семейства. С ходу ведь так и не знаешь, в чем же суть этих семейств, какие-то буковки-циферки. Да, понятно, что там написано CPU и RAM, по ним и ориентировалась. Думала, что чем выше циферки, тем круче и дороже. Но оказывается, что цифра после буквы семейства означает версию типа инстанса, чем она больше, тем новее оборудование, да и тем круче, конечно, НО! и тем дешевле инстанс Оо. То есть банально, переключим с t2 на современные t3 я буду платить меньше. Жаль только elastic beanstalk не поддерживает новые дешевые a1 и даже t4g. https://aws.amazon.com/ru/ec2/instance-types/ тут можно почитать про разные типы. Также есть нюансы резервирования инстансов. И если резервировать на год или на 3, то цена становится еще ниже. Надо еще попробовать поиграть со спотами, которые вообще очень-очень дешевые, но AWS их может отбирать, когда кто-то делает резерв. Тут интересно потыкать eb, так как он позволяет заводить Instances именно на спотах. Про JS. Странное. В JS много странного. 1. NodeList не Array. Почему? Потому: myArray --> Array.prototype --> Object.prototype --> null myNodeList --> NodeList.prototype --> Object.prototype --> null https://developer.mozilla.org/ru/docs/Web/API/NodeList А я всего лишь хотела метод indexOf() для NodeList. Блин, где логика? 2. +'Infinity' это число Infinity (бесконечность), а +'infinity' это NaN (not a number). Вот такие дела. Вроде все логично, но почему так больно? 40 лекция по js из 124. 18 лекция по aws из 88. Поехала дальше. Интересно, смогу ли я закончить до конца недели?