В чем проектировать структуру базы данных?
#service #database
Как известно, исправлять ошибки на этапе проектирование проще всего. Поэтому делайте дизайн структуры базы данных.
Вот подборка онлайн сервисов с удобной визуализацией и кодогенераций. Все они платные, но бесплатного тарифа хватает для фича дизайна.
➡️ SqlDBM – лучший функционал, активно развивается. Легко переключается режим просмотра.
➡️ drawsql.app – Очень простой и приятный интерфейс. Бесплатный план отлично подойдет для проекта до 15 таблиц.
➡️ dbdiagram.io – есть свой DSL, так называемый Database Markup Language. К сожалению, проект не развивается уже год.
Альтернативы, про которые не стоит забывать:
➡️ Дизайнить в SQL с последующей визуализацией в DataGrip или его аналоге.
➡️ Бумага и карандаш
#service #database
Как известно, исправлять ошибки на этапе проектирование проще всего. Поэтому делайте дизайн структуры базы данных.
Вот подборка онлайн сервисов с удобной визуализацией и кодогенераций. Все они платные, но бесплатного тарифа хватает для фича дизайна.
➡️ SqlDBM – лучший функционал, активно развивается. Легко переключается режим просмотра.
➡️ drawsql.app – Очень простой и приятный интерфейс. Бесплатный план отлично подойдет для проекта до 15 таблиц.
➡️ dbdiagram.io – есть свой DSL, так называемый Database Markup Language. К сожалению, проект не развивается уже год.
Альтернативы, про которые не стоит забывать:
➡️ Дизайнить в SQL с последующей визуализацией в DataGrip или его аналоге.
➡️ Бумага и карандаш
👍1
Как понять запущен ли Node.js внутри Docker?
#nodejs_api #docker
Docker контейнеры созданы, чтобы запускать только один процесс. У этого процесса id всегда 1. Рекомендуемый запуск #nodejs:
Тогда на уровне кода легко проверить
Кроме айди текущего процесса (process.pid), у нас есть айди родительского процесса – process.ppid. Для стартового процесса он равен 0.
Если вы запускаете через
Возможные варианты использования:
1️⃣ При локальной разработке использовать человекочитаемые логи, а внутри Docker в формате json:
Требует pino-pretty.
2️⃣ Переходить в debug режим по нажатию ctrl+T.
Это автоматизация для дебага запущенного процесса. Без нее сначала узнаем айди процесса через ctrl+T, а потом делаем
#nodejs_api #docker
Docker контейнеры созданы, чтобы запускать только один процесс. У этого процесса id всегда 1. Рекомендуемый запуск #nodejs:
ENTRYPOINT ["node", "src/index.js"]Тогда на уровне кода легко проверить
const isDocker = process.pid === 1Кроме айди текущего процесса (process.pid), у нас есть айди родительского процесса – process.ppid. Для стартового процесса он равен 0.
Если вы запускаете через
npm run ..., то npm будет иметь pid=1 и являться родительским процессом для Node.js. Так делать не следует. Возможные варианты использования:
1️⃣ При локальной разработке использовать человекочитаемые логи, а внутри Docker в формате json:
const pino = require('pino');const logger = pino({ prettyPrint: process.pid !== 1 });Требует pino-pretty.
2️⃣ Переходить в debug режим по нажатию ctrl+T.
if (process.pid !== 1) { process.on('SIGINFO', () => { require('inspector').open(); });}Это автоматизация для дебага запущенного процесса. Без нее сначала узнаем айди процесса через ctrl+T, а потом делаем
kill -SIGUSR1 <pid>Voice Chat #2, О тестирование, 20 Мая 21:00-22:00
#announcement #voice_chat
В этот четверг в гостях будет Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.
Обсудим такие вопросы:
❓ Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
❓ Какие инструменты и для чего использовать?
❓ Документация VS специкация. Кто и как должен ее вести?
❓ Виды проектов и особенности их тестирования, подготовка данных для автотестов?
#announcement #voice_chat
В этот четверг в гостях будет Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.
Обсудим такие вопросы:
❓ Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
❓ Какие инструменты и для чего использовать?
❓ Документация VS специкация. Кто и как должен ее вести?
❓ Виды проектов и особенности их тестирования, подготовка данных для автотестов?
Какая связь у UUID и MD5?
#architecture
Вчера был опубликован types/node@14.17.0. Теперь typenoscript проекты могут использовать crypto.randomUUID, который возвращает 4-ую версию uuid. Отличный повод поговорить, что общего у MD5 и UUID.
MD5 это хэш файла и используется для проверки, что файл не был поврежден в ходе загрузки. UUID это случайный идентификатор вида 63f04799-4bc1-4101-be08-263306e7b6ae.
UUID имеет длину 128 бит и столь низкий шанс повтора, что его можно считать уникальным. Хеш MD5 тоже имеет длину 128 бит, но и не гарантирует уникальности, а только имеет низкую вероятность коллизии. Из-за наличия коллизий его часто критикуют, ведь он подвержен birthday-атаке.
На одном из проектов, с хранением видео файлов использовали MD5 для нахождения дубликатов и случайный UUID как первичный ключ в БД. То есть использовались два 128-ми битных ключа. Один хранился как uuid, второй как строка. Использование MD5 как UUID позволил сохранить структура данных такой же, но убрать информационную избыточность.
Вот пример кода:
В завершение хочу сказать спасибо @Jek_Rock, за нахождение ошибок в первой версии рецепта.
#architecture
Вчера был опубликован types/node@14.17.0. Теперь typenoscript проекты могут использовать crypto.randomUUID, который возвращает 4-ую версию uuid. Отличный повод поговорить, что общего у MD5 и UUID.
MD5 это хэш файла и используется для проверки, что файл не был поврежден в ходе загрузки. UUID это случайный идентификатор вида 63f04799-4bc1-4101-be08-263306e7b6ae.
UUID имеет длину 128 бит и столь низкий шанс повтора, что его можно считать уникальным. Хеш MD5 тоже имеет длину 128 бит, но и не гарантирует уникальности, а только имеет низкую вероятность коллизии. Из-за наличия коллизий его часто критикуют, ведь он подвержен birthday-атаке.
На одном из проектов, с хранением видео файлов использовали MD5 для нахождения дубликатов и случайный UUID как первичный ключ в БД. То есть использовались два 128-ми битных ключа. Один хранился как uuid, второй как строка. Использование MD5 как UUID позволил сохранить структура данных такой же, но убрать информационную избыточность.
Вот пример кода:
export function md5_to_uuid(md5: string): string { if (typeof md5 !== 'string') throw Error('md5 should be string'); if (!/^[a-f0-9]{32}$/.test(md5)) throw Error('Wrong md5 format'); return `${md5.substring(0, 8)}-${md5.substring(8, 12)}-${md5.substring(12, 16)}-${md5.substring(16, 20)}-${md5.substring(20)}`;}export function uuid_to_md5(uuid: string): string { return uuid.replace(/-/g, '');}В завершение хочу сказать спасибо @Jek_Rock, за нахождение ошибок в первой версии рецепта.
Запуск GDG Cloud Kyiv
#announcement #cloud
В конце апреля я проводил Cloud Study Jam. Это был trail event. По его итогу открыли Google Developer Group Cloud Kyiv. Google помогает комьюнити доступом к различным ресурсам. У нас уже была Google Developer Group Kyiv, но там фокус не на Cloud.
Комьюнити создано, чтобы помочь инженерам в освоение Cloud Native подходов. Именно инженерам, без разделения на разработчиков и DevOps инженеров. Разработчикам нужно знать облачные инструменты, а DevOps инженерам особенности поддержки и разворачивания языков.
Ссылки на комьюнити:
🔗 Платформа: https://gdg.community.dev/gdg-cloud-kyiv/
🔗 Канал: https://news.1rj.ru/str/GDGCloudKyiv
🔗 Чат: https://news.1rj.ru/str/GDGCloudKyiv_chat
Первое мероприятие через неделю.
🎤 Cloud Study Jam: Build a Website on Google Cloud
📍 26 мая, 18:30-21:00
🔗 Регистрация
#announcement #cloud
В конце апреля я проводил Cloud Study Jam. Это был trail event. По его итогу открыли Google Developer Group Cloud Kyiv. Google помогает комьюнити доступом к различным ресурсам. У нас уже была Google Developer Group Kyiv, но там фокус не на Cloud.
Комьюнити создано, чтобы помочь инженерам в освоение Cloud Native подходов. Именно инженерам, без разделения на разработчиков и DevOps инженеров. Разработчикам нужно знать облачные инструменты, а DevOps инженерам особенности поддержки и разворачивания языков.
Ссылки на комьюнити:
🔗 Платформа: https://gdg.community.dev/gdg-cloud-kyiv/
🔗 Канал: https://news.1rj.ru/str/GDGCloudKyiv
🔗 Чат: https://news.1rj.ru/str/GDGCloudKyiv_chat
Первое мероприятие через неделю.
🎤 Cloud Study Jam: Build a Website on Google Cloud
📍 26 мая, 18:30-21:00
🔗 Регистрация
Google Developer Groups
Check out Google Developer Groups GDG Cloud Kyiv events, learn more or contact this organizer.
refactoring.guru
#code_pattern #typenoscript
В комментариях к код ревью считается хороший тоном оставлять ссылки на внешние ресурсы. Так коллега сможет быстрее понять, что ему рекомендуют. Помимо ссылок на документацию библиотек или #nodejs я оставляю ссылки на разделы refactoring.guru.
Там есть и паттерны проектирования, и советы по рефакторингу. Александр Швец сопровождает их хорошей визуализацией, переводами на разные языки и примерами кода, в том числе на TypeScript.
#code_pattern #typenoscript
В комментариях к код ревью считается хороший тоном оставлять ссылки на внешние ресурсы. Так коллега сможет быстрее понять, что ему рекомендуют. Помимо ссылок на документацию библиотек или #nodejs я оставляю ссылки на разделы refactoring.guru.
Там есть и паттерны проектирования, и советы по рефакторингу. Александр Швец сопровождает их хорошей визуализацией, переводами на разные языки и примерами кода, в том числе на TypeScript.
refactoring.guru
Refactoring and Design Patterns
Refactoring is a controllable process of improving code without creating new functionality. Design Patterns are typical solutions to the commonly occurring problems in software design.
Audio
Voice Chat #2, About testing
#voice_chat
Гость: Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.
Вопросы:
❓ Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
❓ Какие инструменты и для чего использовать?
❓ Документация VS специкация. Кто и как должен ее вести?
❓ Виды проектов и особенности их тестирования, подготовка данных для автотестов?
Ссылки, которые были озвучены:
🔗 Сервис для тестирования емейлов
🔗 Node.js митап
🔗 openapi-response-validator
🔗 GDG Cloud Kyiv
🔗 reqover для оценки coverage
🔗 Playlist "How test REST API" от Саши
🔗 playwright.dev модая либа для UI тестов
#voice_chat
Гость: Хотемской Александр, независимый SDET контрактор с 10 летним опытом в автоматизации тестирования.
Вопросы:
❓ Где граница обязаностей в работе разработчиков и тестировщиков? Кто отвечает за какие виды тестов?
❓ Какие инструменты и для чего использовать?
❓ Документация VS специкация. Кто и как должен ее вести?
❓ Виды проектов и особенности их тестирования, подготовка данных для автотестов?
Ссылки, которые были озвучены:
🔗 Сервис для тестирования емейлов
🔗 Node.js митап
🔗 openapi-response-validator
🔗 GDG Cloud Kyiv
🔗 reqover для оценки coverage
🔗 Playlist "How test REST API" от Саши
🔗 playwright.dev модая либа для UI тестов
Как работает Readonly в TypeScript?
#typenoscript
В чистом JavaScript нельзя запретить изменение объектов и массивов без использования библиотек или просадки производительности.
В TypeScript для этого существует:
➡️ ключевое слово
➡️
➡️
➡️
Данный синтаксис позволяет контролировать бизнес логику на этапе компиляции и не создает ухудшение перфоманса в run-time.
Однока следует помнить, что существует проблема: "Interface with readonly property is assignable to interface with mutable property" Пример:
Данная проблема известна уже 4 года и ее не планирую решать.
#typenoscript
В чистом JavaScript нельзя запретить изменение объектов и массивов без использования библиотек или просадки производительности.
В TypeScript для этого существует:
➡️ ключевое слово
readonly в классе, интерфейсе или типе, которое запрещает изменение указанного свойства.➡️
Readonly<Type> возвращает тип, у которого все свойства будут readonly➡️
ReadonlyArray<Type> определяет типа массива, у которого запрещено изменение элементов➡️
as const делает объект или массив неизменяемымДанный синтаксис позволяет контролировать бизнес логику на этапе компиляции и не создает ухудшение перфоманса в run-time.
Однока следует помнить, что существует проблема: "Interface with readonly property is assignable to interface with mutable property" Пример:
interface MutableValue<T> { value: T; }interface ImmutableValue<T> { readonly value: T; }let i: ImmutableValue<string> = { value: "hi" };i.value = "Excellent, I can't change it"; // compile-time errorlet m: MutableValue<string> = i;m.value = "Oh dear, I can change it";Данная проблема известна уже 4 года и ее не планирую решать.
Serverless by Stefan Judis
#worth_seeing
Популярный вопрос среди новичков: "Как отправлять контактную форму с лендинга?". В своем докладе Stefan Judis показывает ответ на этот вопрос. Он использует #nodejs не как сервер, а как функцию.
В докладе я первый раз услышал термин JAFM stack, то есть JAM + Functions. Рекомендую его посмотреть, особенно если вы не работали с serverless.
📕Slides
#worth_seeing
Популярный вопрос среди новичков: "Как отправлять контактную форму с лендинга?". В своем докладе Stefan Judis показывает ответ на этот вопрос. Он использует #nodejs не как сервер, а как функцию.
В докладе я первый раз услышал термин JAFM stack, то есть JAM + Functions. Рекомендую его посмотреть, особенно если вы не работали с serverless.
📕Slides
YouTube
Serverless for Front-end developers
Talk given by Stefan Judis at the JAMstack Berlin Meetup on June 24th, 2019.
https://www.meetup.com/JAMStack_berlin/events/262121014/
https://twitter.com/stefanjudis
A talk about Server-less Functions. Writing a function. Glue-driven development for Frontend…
https://www.meetup.com/JAMStack_berlin/events/262121014/
https://twitter.com/stefanjudis
A talk about Server-less Functions. Writing a function. Glue-driven development for Frontend…
Mo'Problems, Mo'Nads by Kyle Simpson
#worth_seeing
Кайл Симпсон – автор серии книг "You Don't Know JS". В сегодняшнем докладе он рассказывает о том, что такое монады. Кайл проводит аналогию монад и регулярных выражений. И то, и другое не является популярный при написание коммерческого кода. Такие приемы увеличивает когнитивную сложность кода, а ее следует упрощать. Поэтому Кайл неоднократно предупреждает, что монады могут быть плохим решением в некоторых случаях. Тем не менее знать о существование такого подхода стоит, хотя бы для общей эрудиции.
📕Slides
📕Functional Light JS
#worth_seeing
Кайл Симпсон – автор серии книг "You Don't Know JS". В сегодняшнем докладе он рассказывает о том, что такое монады. Кайл проводит аналогию монад и регулярных выражений. И то, и другое не является популярный при написание коммерческого кода. Такие приемы увеличивает когнитивную сложность кода, а ее следует упрощать. Поэтому Кайл неоднократно предупреждает, что монады могут быть плохим решением в некоторых случаях. Тем не менее знать о существование такого подхода стоит, хотя бы для общей эрудиции.
📕Slides
📕Functional Light JS
YouTube
Mo’Problems, Mo’Nads - Kyle Simpson - CityJS Conf 2020
Kyle Simpson is Director of Web Futures at Getify Solutions, where he envisions and evangelizes what's next for Open Web technologies, especially JS. He writes, speaks, teaches, and codes OSS.
_________________________________________________________________…
_________________________________________________________________…
#announcement
15 июня выступаю с докладом об TDD в #nodejs. Это будет совместный доклад с Львовской компанией Sombra.
Доклад начинается с обзора типичной пирамиды тестирования для Node.js проекта. На каждом уровне расскажу лучшие TDD практики и покажу какие npm пакеты использую.
Участие бесплатно, а регистрация уже доступна:
🔗 Facebook: https://fb.me/e/XPqCaXEr
🔗 Restration Form: https://us02web.zoom.us/meeting/register/tZYvcu6gqzIuG9WgFmZUja4lP-5wlsYraKhu
15 июня выступаю с докладом об TDD в #nodejs. Это будет совместный доклад с Львовской компанией Sombra.
Доклад начинается с обзора типичной пирамиды тестирования для Node.js проекта. На каждом уровне расскажу лучшие TDD практики и покажу какие npm пакеты использую.
Участие бесплатно, а регистрация уже доступна:
🔗 Facebook: https://fb.me/e/XPqCaXEr
🔗 Restration Form: https://us02web.zoom.us/meeting/register/tZYvcu6gqzIuG9WgFmZUja4lP-5wlsYraKhu
Как итерировать массив?
#code_pattern
Проводя интервью, я практикую live coding, то есть решение простых задач со скриншарингом экрана. Так сразу видно пишет ли кандидат код на современном JavaScript.
Итерировать массив можно 4-мя способами:
1️⃣ for
2️⃣ forEach
3️⃣ for in
4️⃣ for of
Упрощенный анализ показывают, что 1️⃣и 3️⃣ создают ненужную переменную, а 2️⃣– контекст ненужной функции. Поэтому при написание кода старайтесь использовать 4️⃣ for of.
Бенчмарки и глубокий анализ можно провести самостоятельно или нагуглить. Вместо этого я порекомендую добавить к себе в проект eslint правило disallow forEach. Это же можно сделать с помощью no-restricted-syntax и селектора
#code_pattern
Проводя интервью, я практикую live coding, то есть решение простых задач со скриншарингом экрана. Так сразу видно пишет ли кандидат код на современном JavaScript.
Итерировать массив можно 4-мя способами:
1️⃣ for
for (let i = 0; i < arr.length; ++i) { console.log(arr[i]);}2️⃣ forEach
arr.forEach((v, i) => console.log(v));3️⃣ for in
for (let i in arr) { console.log(arr[i]);}4️⃣ for of
for (const v of arr) { console.log(v);}Упрощенный анализ показывают, что 1️⃣и 3️⃣ создают ненужную переменную, а 2️⃣– контекст ненужной функции. Поэтому при написание кода старайтесь использовать 4️⃣ for of.
Бенчмарки и глубокий анализ можно провести самостоятельно или нагуглить. Вместо этого я порекомендую добавить к себе в проект eslint правило disallow forEach. Это же можно сделать с помощью no-restricted-syntax и селектора
CallExpression[callee.property.name="forEach"]😁4🤯2
Как успевать за развитием web-development?
#announcement #discount #chrome
В современном веб-строе нужно постоянно учиться. Как говорила Алиса: "Нужно бежать из-за всех сил, чтобы оставаться на месте". Технологии, фреймворки, подходы появляются быстрее, чем ты успеваешь читать Release Notes. По моему скромному мнению, "виноваты" в этом разработчики браузеров. Они выпускают апдейты слишком часто. Вдумайтесь, Google Chrome с 3-го квартала 2021 перейдет с 6-недельного релиз цикла на 4-х недельный.
Один из моих способов бежать чуть быстрее – использовать для повседневной работы Beta Google Chrome Channel. В этом release channel версия Chrome идет с опережением на месяц. Это ведь круто, когда ты отлавливаешь ошибки вызванные изменение в браузерах на месяц раньше, чем они будут у пользователей?
Еще в моем списки ускорялок – слушать доклада с конференций и учиться у лучших. Один из таких это Виталий Фридман. Я буду проходить его воркшоп для Front-End разработчиков, который стартует в эту среду. Присоединяйтесь! Детали:
➡️ 5 дней в первой половине дня по 2.5 часа
➡️ контента на 1500 слайдов
➡️ возможность как задать вопросы в живую, так и посмотреть в записи
🤑 Промокод: node_recipes на 15%
🔗 Подробности: http://bit.ly/Vitaly-Friedman-2021
#announcement #discount #chrome
В современном веб-строе нужно постоянно учиться. Как говорила Алиса: "Нужно бежать из-за всех сил, чтобы оставаться на месте". Технологии, фреймворки, подходы появляются быстрее, чем ты успеваешь читать Release Notes. По моему скромному мнению, "виноваты" в этом разработчики браузеров. Они выпускают апдейты слишком часто. Вдумайтесь, Google Chrome с 3-го квартала 2021 перейдет с 6-недельного релиз цикла на 4-х недельный.
Один из моих способов бежать чуть быстрее – использовать для повседневной работы Beta Google Chrome Channel. В этом release channel версия Chrome идет с опережением на месяц. Это ведь круто, когда ты отлавливаешь ошибки вызванные изменение в браузерах на месяц раньше, чем они будут у пользователей?
Еще в моем списки ускорялок – слушать доклада с конференций и учиться у лучших. Один из таких это Виталий Фридман. Я буду проходить его воркшоп для Front-End разработчиков, который стартует в эту среду. Присоединяйтесь! Детали:
➡️ 5 дней в первой половине дня по 2.5 часа
➡️ контента на 1500 слайдов
➡️ возможность как задать вопросы в живую, так и посмотреть в записи
🤑 Промокод: node_recipes на 15%
🔗 Подробности: http://bit.ly/Vitaly-Friedman-2021
Voice Chat #3, About GraphQL, 27 Мая 21:00-22:00 (GMT+3)
#announcement #voice_chat
Гость: Павел Черторогов, евангелист GraphQL. Хоть он и не любит слово евангелист ))) Работает архитектором информационных систем в казахстанской хостинговой компании ps.kz. Занимается построением консли для управления облачными услугами.
Вопросы:
❓ Что такое GraphQL? Где его стоит, а где не стоит применять?
❓ Каков идеальный тех стэк для GraphQL проекта в 2021?
❓ GraphQL паттерны – микросервисы, кодогенерация, федерация и т.д? Какие инструменты?
❓ Как тестировать GraphQL проект?
Ссылка для подключения: https://news.1rj.ru/str/node_recipes?voicechat
До встречи в эфире!
#announcement #voice_chat
Гость: Павел Черторогов, евангелист GraphQL. Хоть он и не любит слово евангелист ))) Работает архитектором информационных систем в казахстанской хостинговой компании ps.kz. Занимается построением консли для управления облачными услугами.
Вопросы:
❓ Что такое GraphQL? Где его стоит, а где не стоит применять?
❓ Каков идеальный тех стэк для GraphQL проекта в 2021?
❓ GraphQL паттерны – микросервисы, кодогенерация, федерация и т.д? Какие инструменты?
❓ Как тестировать GraphQL проект?
Ссылка для подключения: https://news.1rj.ru/str/node_recipes?voicechat
До встречи в эфире!
Как и зачем проверить, что код запущен под нужной версий Node.js?
#nodejs_api
Использование свежих фич #nodejs или новых синтаксических конструкция языка приводит к тому, что ваше приложение не сможет работать под старой версий. Примеры:
➡️ crypto.randomUUID – свежая фича для нативной генерации UUID 4
➡️ Различное поведения Date в зависимости от версии V8. Пример
Поэтому стоит проверять версию и выкидывать не обработанное исключение, если код запущен под неверной версией. Делать это необходимо в entry-point файле, с которого идет запуск всего приложения.
Пример проверки только мажорной версии:
Пример проверки всей версии:
Поле engines внутри package.json носит рекомендательный характер и не используется при запуске приложения ни через npm run noscripts, ни напрямую. При желание его можно использовать на уровне кода после
#nodejs_api
Использование свежих фич #nodejs или новых синтаксических конструкция языка приводит к тому, что ваше приложение не сможет работать под старой версий. Примеры:
➡️ crypto.randomUUID – свежая фича для нативной генерации UUID 4
➡️ Различное поведения Date в зависимости от версии V8. Пример
Поэтому стоит проверять версию и выкидывать не обработанное исключение, если код запущен под неверной версией. Делать это необходимо в entry-point файле, с которого идет запуск всего приложения.
Пример проверки только мажорной версии:
const nodeVersion = process.versions.node.split('.')[0];if (nodeVersion !== '14') throw new Error(`App requires node.js version 14`);Пример проверки всей версии:
const nodeVersion = process.versions.node;if (nodeVersion !== '14.17.0') throw new Error(`App requires node.js version 14.17.0`);Поле engines внутри package.json носит рекомендательный характер и не используется при запуске приложения ни через npm run noscripts, ни напрямую. При желание его можно использовать на уровне кода после
require('./package.json'). В комментариях, есть пример от Александра.Как автоматизировать работу с git?
#cli #git
У git есть малодокументированная возможность – external commands, то есть команды определенные пользователем. Упрощено говоря, git somename это алиас для команды git-somename.
Использовать можно так:
1️⃣ Смотрим зарегистрированные пути
2️⃣ Выбираем папку из 1️⃣, где мы будем создавать команду.
3️⃣ Делаем файл с нашей команда git-done и таким контентом:
4️⃣ Делаем файл исполняемым
Так мы создали команду
Обратите внимание на первую строчку #!/usr/bin/env bash, после #! (shebang) идет интепритатор. Для написания скрипта на #nodejs используется конструкция #!/usr/bin/env node
Можно установить один из готовых скриптов:
Так же для проектов с GitHub рекомендую посмотреть cli.github.com
#cli #git
У git есть малодокументированная возможность – external commands, то есть команды определенные пользователем. Упрощено говоря, git somename это алиас для команды git-somename.
Использовать можно так:
1️⃣ Смотрим зарегистрированные пути
echo $PATH.2️⃣ Выбираем папку из 1️⃣, где мы будем создавать команду.
3️⃣ Делаем файл с нашей команда git-done и таким контентом:
#!/usr/bin/env bashDEFAULT_BRANCH=masterCURRENT_BRANCH=$(git branch | grep \* | cut -d ' ' -f2)git checkout ${DEFAULT_BRANCH}git pullgit branch -D ${CURRENT_BRANCH}4️⃣ Делаем файл исполняемым
chmod +x git-doneТак мы создали команду
git done, которая удаляет активную ветку и переключает на master. У меня это команда еще передвигает текущую задачу в следующую колонку в Jira.Обратите внимание на первую строчку #!/usr/bin/env bash, после #! (shebang) идет интепритатор. Для написания скрипта на #nodejs используется конструкция #!/usr/bin/env node
Можно установить один из готовых скриптов:
npm install -g git-open. Он будет открывать текущую ветку в вашем репозитории. ПодробностиТак же для проектов с GitHub рекомендую посмотреть cli.github.com
Анонсы одной строкой
#announcement
➡️ Сегодня, через 20 минут: Google Cloud Jam в рамках комьюнити GDG Cloud Kyiv. https://news.1rj.ru/str/GDGCloudKyiv/4
➡️ Завтра: Voice Chat о GraphQL. https://news.1rj.ru/str/node_recipes/129
➡️ На следующей неделе: мой доклад по Nest.js в рамках FWDays. https://news.1rj.ru/str/fwdays/701
#announcement
➡️ Сегодня, через 20 минут: Google Cloud Jam в рамках комьюнити GDG Cloud Kyiv. https://news.1rj.ru/str/GDGCloudKyiv/4
➡️ Завтра: Voice Chat о GraphQL. https://news.1rj.ru/str/node_recipes/129
➡️ На следующей неделе: мой доклад по Nest.js в рамках FWDays. https://news.1rj.ru/str/fwdays/701
Telegram
GDG Cloud Kyiv
Через 2ч 15м будем начинать. Возможность подключиться появиться за 15 минут до начал. Вот видео как это сделать.
А вот инструкция по qwiki аккаунту:
1. Откройте в режиме инкогнито go.qwiklabs.com/cloud-study-jams-2020
2. Нажмите Enroll под Build a Website…
А вот инструкция по qwiki аккаунту:
1. Откройте в режиме инкогнито go.qwiklabs.com/cloud-study-jams-2020
2. Нажмите Enroll под Build a Website…
👍1
Что нового в TypeScript 4.3?
#typenoscript
Вчера вышла новая версия TypeScript 4.3.
Основной фокус релиза в работе с классами. Сюда входят:
➡️ новое ключевого слово
➡️ разделение типов для getter и setter (Separate Write Types on Properties)
➡️ Улучшена поддержка приватных ECMAScript
➡️
➡️ Type helper
Связанное с типами:
➡️ Always-Truthy Promise Checks, для случаев аналогичных eslint правилу
➡️ Template String Type Improvements, нужная вещь если у вас сложная бизнес логика в зависимости от строк.
➡️ Улучшено определение типа по контексту (Contextual Narrowing for Generics).
Улучшения процесса сборки:
➡️ Размер
➡️ Инкрементная сборка в первый раз теперь идет так же быстро как и обычная. Наконец-то можно выкинуть tsconfig.dev.json!
Улучшения IDE поддержки, работает за счет TypeScript’s language service. Важно для VS Code, не важно для JetBrains.
➡️ Import Statement Completions
➡️
➡️ Go-to-Definition on Non-JavaScript File Paths
#typenoscript
Вчера вышла новая версия TypeScript 4.3.
Основной фокус релиза в работе с классами. Сюда входят:
➡️ новое ключевого слово
override указывающее, что метод переопределен в ходе наследования. Выкидывает ошибку, если у родителя нет метода➡️ разделение типов для getter и setter (Separate Write Types on Properties)
➡️ Улучшена поддержка приватных ECMAScript
#private➡️
static Index Signatures➡️ Type helper
ConstructorParameters теперь работает и с абстрактными классамиСвязанное с типами:
➡️ Always-Truthy Promise Checks, для случаев аналогичных eslint правилу
require-await➡️ Template String Type Improvements, нужная вещь если у вас сложная бизнес логика в зависимости от строк.
➡️ Улучшено определение типа по контексту (Contextual Narrowing for Generics).
Улучшения процесса сборки:
➡️ Размер
.tsbuildinfo теперь меньше➡️ Инкрементная сборка в первый раз теперь идет так же быстро как и обычная. Наконец-то можно выкинуть tsconfig.dev.json!
Улучшения IDE поддержки, работает за счет TypeScript’s language service. Важно для VS Code, не важно для JetBrains.
➡️ Import Statement Completions
➡️
@link в js-doc➡️ Go-to-Definition on Non-JavaScript File Paths
Microsoft News
Announcing TypeScript 4.3
Today we’re excited to announce the availability of TypeScript 4.3! If you’re not yet familiar with TypeScript, it’s a language that builds on JavaScript by adding syntax for static types. Tools like the TypeScript compiler can just erase TypeScript syntax…
Audio
#voice_chat
Гость: Павел Черторогов, евангелист GraphQL. Хоть он и не любит слово евангелист ))) Работает архитектором информационных систем в казахстанской хостинговой компании ps.kz. Занимается построением консоли для управления облачными услугами.
Вопросы:
❓ Что такое GraphQL? Где его стоит, а где не стоит применять?
❓ Каков идеальный тех стэк для GraphQL проекта в 2021?
❓ GraphQL паттерны – микросервисы, кодогенерация, федерация и т.д? Какие инструменты?
❓ Как тестировать GraphQL проект?
Все свои выступления, презентации и статьи про GraphQL Паша публикует в своем github репозитории: https://github.com/nodkz/conf-talks
Подписывайтесь на Пашу в соцсетя:
🔗 https://twitter.com/nodkz
🔗 https://github.com/nodkz
Делитесь в комментариях ссылками и впечатлениями.
Гость: Павел Черторогов, евангелист GraphQL. Хоть он и не любит слово евангелист ))) Работает архитектором информационных систем в казахстанской хостинговой компании ps.kz. Занимается построением консоли для управления облачными услугами.
Вопросы:
❓ Что такое GraphQL? Где его стоит, а где не стоит применять?
❓ Каков идеальный тех стэк для GraphQL проекта в 2021?
❓ GraphQL паттерны – микросервисы, кодогенерация, федерация и т.д? Какие инструменты?
❓ Как тестировать GraphQL проект?
Все свои выступления, презентации и статьи про GraphQL Паша публикует в своем github репозитории: https://github.com/nodkz/conf-talks
Подписывайтесь на Пашу в соцсетя:
🔗 https://twitter.com/nodkz
🔗 https://github.com/nodkz
Делитесь в комментариях ссылками и впечатлениями.