Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
#news

Автономный мягкий робот впервые погрузился в Марианскую впадину

Автономный мягкий робот, прообразом которого является рыба Pseudoliparis swirei, выдержал невероятное давление глубин Марианской впадины.

Бездна Челленджера – глубочайшая из глубин Мирового океана. Она уходит примерно на 10990 метров ниже уровня моря. В этом месте огромный слой воды оказывает на морское дно колоссальное давление, более чем в тысячу раз превышающие показатели атмосферного давления на уровне моря, что соответствует приблизительно 108,6 МПа. Это сравнимо с давлением веса целого слона, который балансирует на кончике Вашего большого пальца.

https://www.youtube.com/watch?v=gkuL4AYlExE
#backEnd #NodeJS

Релиз Node.js 16

20 апреля состоялся релиз новой 16 версии Node.js. Среди основных изменений обновление движка JavaScript V8 до версии 9.0, встроенные бинарники (двоичные файлы) для Apple Silicon и несколько API, но обо всем по порядку.

Из основных изменений движка можно назвать поддержку индексов соответствия в регулярных выражениях (regexp match indices), а также улучшение (повышение скорости) доступа к свойству «super».

Идексы соответствия позволяют разработчикам получать массив подмассивов, содержащих начальные и конечные позиции (индексы) групп захвата (capture groups) в регулярном выражении при наличии совпадения (или нескольких совпадений). Данный массив доступен через свойство «indices» объекта с совпадениями. Обратите внимание, что регулярное выражение, используемое для поиска совпадений, должно иметь флаг «/d».

const re = /(a)(b)/d // Регулярное выражение. Обратите внимание на наличие флага /d

const m = re.exec('ab') // Объект с совпадениями

console.log(m.indices[0]) // Первый подмассив — это полное совпадение

// [0, 2]

console.log(m.indices[1]) // Второй подмассив — первая группа захвата

// [0, 1]

console.log(m.indices[2]) // Третий подмассив — вторая группа захвата

// [1, 2]

Доступ к свойству «super» был улучшен за счет использования системы встроенного кэша и оптимизации генерации кода в «TurboFan» (TurboFan — это компилятор, за интепретацию кода в V8 отвечает Ignition). Как утверждают разработчики V8, скорость доступа к super стала почти такой же, как скорость доступа к обычному свойству.

Timers Promises API предоставляет альтернативный набор таймеров, возвращающих объект «Promise», что избавляет от необходимости использования util.promisify().

import { setTimeout } from 'timers/promises'

async function run() {

const greet = await setTimeout(3000, 'Hi!')

console.log(greet) // Hi!

}

run()

Timers Promises API был представлен в Node.js 15 в качестве экспериментальной возможности. Теперь он приобрел статус стабильного интерфейса.
#news #science #space

NASA выбрало SpaceX для полета на Луну, и это ключевой момент в истории космонавтики

Через несколько лет астронавты NASA собираются вернуться на Луну. И условия возвращения куда более комфортабельны, чем те, что были у первопроходцев. Все потому, что возвращаться они будут на Starship, длина которого от хвоста до носа составляет 50 метров. А вот Базз Олдрин с Нилом Армстронгом довольствовались всего 7 метрами. Им было не просто тесно, а очень тесно, что можно видеть на фотографиях того времени.

Отличает эту экспедицию еще и то, что она будет реализована силами частной компании — SpaceX.

Частная компания — и только она — ответственна за проектирование, тестирование и реализацию двух полетов на Луну. Один из них, пилотируемый, должен состояться уже в 2024 году.

Конечно, все это далеко не бесплатно: SpaceX получила $2,89 млрд на реализацию проекта. Это огромные средства, но потрачены они во благо — компания Илона Маска сможет значительно ускорить процесс подготовки полета. Частная компания более свободна в своих действиях, чем государственное агентство, а Маск известен тем, что, хотя и с задержкой, но успешно реализует большинство намеченных планов.
#math #longRead

Как выглядит самое красивое математическое уравнение?

Давайте вспомним о тождестве Эйлера — по праву самом красивом уравнении, важное место в котором занимает число e, но не только оно. Представьте на секунду, что вы почти ничего не знаете о математике, только начинаете открывать её бесконечную красоту — и наслаждайтесь.

Все мы знаем о числе π — магическом отношении длины окружности к её диаметру. Число π можно приближённо представить в виде дроби 22/7. Особенность числа π состоит в том, что в его десятичной записи знаки после запятой никогда не заканчиваются. Его приближённое значение — 3,141592653589793238… Вот почему π называют иррациональным числом — его нельзя записать в виде конечного числа цифр после запятой. А вот другое интересное иррациональное число — e. Число e — это "число Эйлера" (от Euler). Вот первые несколько цифр числа e: 2,7182818284590…

Поговорим теперь о другом интересном математическом объекте. Он называется просто: i. Разберёмся, что это такое.

Если умножить 2 на 2, получится 4. То есть 2 в квадрате равняется 4. Квадрат положительного числа — это положительное число. Но, если возвести в квадрат –2, также получится 4, то есть положительное число. Другими словами, ни один квадрат действительного числа не может быть отрицательным числом. Вот тут-то и возникает понятие мнимого числа.

Число √-1 записывается буквой i. i означает мнимую (imaginary) единицу. То есть запись √-5 можно заменить записью √5 i. Отсюда следует, что i² = -1. Число i формирует множество комплексных чисел, то есть комбинаций действительных и мнимых чисел. Например, запись 8 + i√5 является комплексным числом. Для визуализации комплексных чисел используется плоскость мнимых чисел.

Изучать свойства комплексных чисел математики начали примерно с середины XVIII века. Однажды Эйлер развлекался с женой Тейлора... ох, простите... с рядом Тейлора.

https://numl.org/Hxd

Этому сумасброду просто стало интересно, как будет вести себя ряд Тейлора, если подставить в него число i (а что, вполне нормальная мысль для любого сумасброда).

Одни члены ряда, содержащие i, сводятся в одну группу, а другие, не содержащие мнимую часть, то есть без числа i, — в другую. Получаются два ряда Тейлора: один — для косинуса, другой — для синуса.

Мы получили знаменитую формулу Эйлера. Различные значения x и e^(ix) можно отразить на комплексной плоскости.

Это комплексное число, которое может быть представлено на комплексной плоскости. Если продолжить наносить на график точки e^(ix) для разных значений x, получится окружность.

https://numl.org/Hxe

Если нужно узнать радиус r в любой точке (например, в точке 5 + 7i), рассчитывается значение x и берётся действительная часть re^(ix).

Объединив три самых необыкновенных математических символа, получаем магическое уравнение:
#network

New IP — следующий этап развития Интернета или ужесточение контроля над пользователями

В
марте 2021 года Китай опубликовал свой 14-й пятилетний план экономического развития, включая намеченные следующие шаги в области технологий. В проекте чётко говорится, что Китай и его сетевой гигант Huawei готовятся к тому, чтобы их видение Интернета стало глобальным.

Планы Huawei в отношении 6G и выше делают озабоченность США по поводу 5G ничтожной: Huawei предлагает фундаментальный редизайн Интернета, которое называется «New IP», призванный обеспечить «внутреннюю безопасность» в сети. Внутренняя безопасность означает, что отдельные лица должны зарегистрироваться для использования Интернета, а органы власти могут в любой момент отключить доступ к Интернету отдельного пользователя. Короче говоря, Huawei стремится интегрировать китайские режимы «социального кредита», слежки и цензуры в архитектуру Интернета. А по замыслу разработчиков новый протокол выведет интернет на новый уровень и позволит быстрее развивать существующие телекоммуникационные сервисы и внедрять новые, в том числе технологию голографического присутствия.

В New IP реализован специальный алгоритм «отключения» (killswitch), позволяющий блокировать все данные, поступающие из сети на определенный адрес или с него в сеть. Делать это можно будет в любой момент времени, и это означает, что регуляторы интернета смогут не только моментально отключать неугодные ресурсы, но и блокировать доступ к интернету конкретных людей, в буквальном смысле вычисляя их по IP-адресу. Переход на New IP также может потребовать авторизации и аутентификации как новых интернет-адресов, так и людей, связанных с ними. Другими словами, New IP подразумевает полное отсутствие анонимности и приватности в интернете и напоминает глобальную версию «Великого китайского файервола», блокирующего жителям КНР доступ ко многим международным ресурсам.

New IP имеет три ключевые особенности:

Изменяемая длина IP-адреса для беспрепятственной поддержки межсетевого взаимодействия;
Семантическое определение IP-адреса для идентификации физических и виртуальных объектов;
Определяемый пользователем IP-заголовок, позволяющий конечным пользователям указывать настраиваемые функции, выполняемые с пакетами данных.

https://www.huawei.com/us/industry-insights/innovation/new-ip
#principles
Внедрение зависимостей (Dependency injection, DI)

Внедрение зависимостей — это стиль настройки объекта, при котором поля объекта задаются внешней сущностью. Другими словами, объекты настраиваются внешними объектами. DI — это альтернатива самонастройке объектов.

Эта концепция состоит в том, чтобы перенести ответственность за создание экземпляра объекта из тела метода за пределы класса и передать уже созданный экземпляр объекта обратно.

Звучит это все довольно абстрактно, так что вот пример:

Представьте себе очень простую зависимость между двумя классами: класс «Автомобиль» (Car) зависит от класса «Двигатель» (CarEngine).

Однако, мы знаем, что это стоит программировать с помощью интерфейса: (№1)

Но, чтобы изолировать класс Car, недостаточно ввести интерфейс Engine. В коде класса Car также должно быть невозможным создание нового экземпляра класса CarEngine: (№2)

Теперь с помощью этого дизайна можно создавать экземпляры класса Car: (№3)
#backEnd

Личный сервер shadowsocks за 10 минут без затрат

shadowsocks
- это шифрованный сетевой туннель, клиентская часть которого предоставляет доступ приложениям к сети как SOCKS-прокси, запущенный на этом же устройстве. В некотором смысле его можно использовать как VPN, потому что клиенты поддерживают прозрачное перенаправление трафика приложений в туннель

В этом руководстве используется замечательный проект готового приложения для Heroku, которое реализует всё необходимое автоматически.

Ссылка на GitHub проекта. https://github.com/aditya-shri/VPN

Шаг 1. Регистрация в сервисе Heroku
Для этого нужно зайти на сайт Heroku, нажать Sign up и заполнить требуемые сведения. Для регистрации нужна только электронная почта.

Шаг 2. Начало развёртывания
Нажмите на эту ссылку.
https://dashboard.heroku.com/new?template=https%3A%2F%2Fgithub.com%2Faditya-shri%2FVPN%2Ftree%2Fmain

Шаг 3. Конфигурирование
В появившейся форме заполните все поля как показано на скриншоте:

В качестве значений "App Name" и AppName впишите какое-то уникальное имя приложения, одинаковое в обоих полях. Это имя станет частью доменного имени appname.herokuapp.com, по которому станет доступен сервис.

Вместо PASSWORD задайте свой пароль. Можно задать подлиннее и понадёжнее - Вам, скорее всего, не придётся вводить его вручную.

Кроме того, желательно поменять пути QR и путь обработчика прокси V2_Path на какое-нибудь трудноугадываемое значение.

Шаг 4
Заполнив форму, нажмите Deploy app.

После завершения сборки и запуска QR-код с конфигурацией для мобильных устройств будет доступен по адресу

https://APPNAME.herokuapp.com/qr/vpn.png

а строка с конфигурацией в виде URL будет доступна по адресу

https://APPNAME.herokuapp.com/qr/

где APPNAME - выбранное Вами имя приложения. Если Вы меняли путь к QR-коду, то ссылка изменится в соответственно. Во второй ссылке косая черта на конце обязательна.

Всё, можно пользоваться!
#java
Интерфейс Comparable ♨️

Небольшое вступление. Мы создали класс ArrayList в котором хранятся объекты класса String - имена ваших коллег. Вы захотели отсортировать вашу коллекцию, написав Collections.sort(ваш ArrayList с именами), хорошо. Оно их действительно отсортирует, но как?

String реализует интерфейс Comparable (сравнимый, который поддается сравнению). В этом методе описывается как именно объекты должны сравниваться друг с другом. Поскольку это строка, объекты класса String сравниваются лексикографически, если не ошибаюсь, то есть по алфавиту.

Другое дело, мы создали наш собственный клас, к примеру, Person (человек), и хотим как то их сравнивать, но как? Если мы создадим список наших объектов, и захотим их отсортировать у нас будет ошибка, так как метод sort не будет знать как именно это делать. Для этого и существует интерфейс Comparable.

(№1) Мы создали класс Person, у него есть поле height, за которым будет производится сравнивание. Имплементируем метод compareTo(), он возвращает целое число. Единица, если текущий объект больше за другой, 0 если объекты равны, -1 если текущий объект меньше.

То есть этим методом мы показываем как именно и за каким "свойством" будут сравнивается объекты "нашего" типа.

(№2) Тестируем сортировку объектов нашего класса.
#java
Разница между equals() и compareTo()

Метод equals() проверяет объекты на равенство, то есть возвращает просто логическое значение - true/false.

compareTo() сравнивает объекты, и возвращает 0 если объекты равны, 1(или другое положительное число) если объект больше другого объекта, -1(или другое отрицательное число) - объект меньше другого объекта.

♨️ При реализации интерфейсного метода Comparable compareTo, мы решаем как именно наши объекты будут сравниваться с друг с другом.
♨️В свою очередь, equals просто говорит нам, равны ли 2 объекта.
#python

6 хитростей Python, о которых никто не рассказывает новичкам

1. Выбор случайного элемента из последовательности элементов

import random as r
my_list = [1, 2, 3, "go"]
print(r.choice(my_list))


2. Распаковка элементов с помощью *

my_list = [1, 2, 3, 5, 7]

print(*my_list) # 1 2 3 5 7


3. Использование set для оптимизации различных операций

def eliminate_duplicates(lst):
"""
Возвращает отсортированный список, не содержащий дубликатов
"""
new_list = list(set(lst))

new_list.sort()

return new_list

list1 = [25, 12, 11, 4, 12, 12, 25]

print(eliminate_duplicates(list1))


4. Просмотр атрибутов и методов класса в интерпретаторе Python

string = "A string"

print(dir(string))


5. Операции со срезами

lst = ["Fun", "is", "Programming"]

lst = lst[::-1]

print(lst) # ['Programming', 'is', 'Fun']

# Инвертирование строки

string = "Dog running on the park"

string = string[::-1]

print(string) # krap eht no gninnur goD


6. Вызов отладчика 10-символьной командой

Функцией breakpoint() можно пользоваться в Python 3.6+. Она инициирует запуск сессии pdb.set_trace().


n_odds = 0

for i in range(1, 14, 2):
# Проверка значения i в каждой итерации
breakpoint()
# Если это условие выполняется - значит, нас что-то не устраивает
if i % 2 == 0:
n_odds += 1

print(n_odds)
#java

Что такое атомарность в Java?

Как можно определить атомарность?

Атомарность операции чаще всего принято обозначать через ее признак неделимости: операция может либо примениться полностью, либо не примениться вообще. Хорошим примером будет запись значений в массив:

При использовании метода nonAtomic существует вероятность того, что какой-то поток обратится к array[0] в тот момент, когда array[0] не проинициализирован, и получит неожиданное значение. При использовании probablyAtomic (при том условии, что массив сначала заполняется, а уже потом присваивается. Такого быть не должно: array всегда содержит либо null, либо проинициализированный массив, но в array[0] не может содержаться что-то, кроме 1. Эта операция неделима, и она не может примениться наполовину, как это было с nonAtomic - только либо полностью, либо никак, и весь остальной код может спокойно ожидать, что в array будет либо null, либо значения, не прибегая к дополнительным проверкам.

Кроме того, под атомарностью операции зачастую подразумевают видимость ее результата всем участникам системы, к которой это относится (в данном случае - потокам); это логично, но, на мой взгляд, не является обязательным признаком атомарности.

Почему это важно?

Атомарность зачастую проистекает из бизнес-требований приложений: банковские транзакции должны применяться целиком, билеты на концерты заказываться сразу в том количестве, в котором были указаны, и т.д.
#Spring #backEnd #java
Spring: @Component против @Bean

@Component и @Bean делают две совершенно разные вещи, и их не следует путать.

@Component (а также @Service и @Repository ) используются для автоматического обнаружения и автоматической настройки бобов с помощью сканирования classpath. Существует неявное отображение one-to-one между аннотированным классом и Бобом (то есть один боб на класс). Управление проводкой при таком подходе довольно ограничено, поскольку оно носит чисто декларативный характер.

@Bean используется для явного объявления одного компонента, а не позволяет Spring делать это автоматически, как описано выше. Он отделяет объявление Боба от определения класса.
Что будет результатом выполнения программы?
Anonymous Quiz
57%
Код скомпилируется успешно
43%
Exception (java: incompatible types)