Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
#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)
Что будет выведено в консоль?
Anonymous Quiz
6%
Johnson
55%
John Johnson
3%
Exception
27%
John
9%
@ISB426
#java
Немного о наследовании и ООП

Какие методы можно переопределять?
- Все методы, которые не являются static, final или private.

this - ссылка на текущий объект
super - не то же что и this. Это ключевое слово всего лишь уведомляет компилятору, что нужно вызвать из суперкласса.
keyword super означает обращение к объекту родительского класса.

С помощью keyword super можно обращаться как к методам, так и к переменным родительского класса.

Невозможно использование super в static методах и переменных.

Для того чтобы обратиться к элементам родительского класса с помощью super, эти элементы должны быть видны в дочернем классе.

При обращении к методу родительского класса, выражение super не обязательно должно быть первой строкой тела метода.

❗️ Конструктор - инициализатор, некий набор инструкций, который для вновь созданного объекта задает некоторое начальное состояние.
Ключевое слово new - вызывается конструктор, который инициализирует поля.
Конструктор не является членом класса, то есть он не наследуется, по этой причине, мы и используем ключевое слово super для его вызова из суперкласса.
К любому члену класса мы можем обратиться через "точку", к полям, к методом. К конструктору мы обратиться не сможем.

Возможно будет продолжение в сторону Reflection API. Кому интересно, накидайте лайков.