#java
Преобразование типов в Java.
Вы не можете поместить большое значение в маленькую "чашку".
Честно говоря, это можно сделать, но тогда кое-что потеряется. Произойдет своего рода переполнение. Компилятор попытается предотвратить такую ситуацию, если увидит, что в вашем коде есть какая-то сущность не вмещается в контейнер (переменную/чашку), который вы используете.
Например, вы не можете "залить" значение типа int в контейнер размера byte, как показано ниже.
int x = 24;
byte b = x;
// Не сработает!
Вы просите, почему это не сработает? Значение x равно 24, значит, оно полностью совместимо с типом byte. Да, логично, но компилятора волнует только тот факт, что вы пытаетесь поместить большую сущность в маленькую, из-за чего может произойти переполнение, а то есть, потеря ваших данных. Не надейтесь что компилятор будет знать значение переменной x, даже если вы прямо указали его в своем коде.
Для этого вы указываете компилятору, что хотите привести x(int) к byte, то есть, сделать из большой чашки, маленькую.
int x = 20;
byte b = (byte) x;
(byte) x - из большой чашки делаем маленькую.
// Сработает
И теперь наоборот, если у нас есть большая чашка, маленькую чашку в большую мы положим без проблем.
byte b = 121;
int x = b;
// Сработает
Преобразование типов в Java.
Вы не можете поместить большое значение в маленькую "чашку".
Честно говоря, это можно сделать, но тогда кое-что потеряется. Произойдет своего рода переполнение. Компилятор попытается предотвратить такую ситуацию, если увидит, что в вашем коде есть какая-то сущность не вмещается в контейнер (переменную/чашку), который вы используете.
Например, вы не можете "залить" значение типа int в контейнер размера byte, как показано ниже.
int x = 24;
byte b = x;
// Не сработает!
Вы просите, почему это не сработает? Значение x равно 24, значит, оно полностью совместимо с типом byte. Да, логично, но компилятора волнует только тот факт, что вы пытаетесь поместить большую сущность в маленькую, из-за чего может произойти переполнение, а то есть, потеря ваших данных. Не надейтесь что компилятор будет знать значение переменной x, даже если вы прямо указали его в своем коде.
Для этого вы указываете компилятору, что хотите привести x(int) к byte, то есть, сделать из большой чашки, маленькую.
int x = 20;
byte b = (byte) x;
(byte) x - из большой чашки делаем маленькую.
// Сработает
И теперь наоборот, если у нас есть большая чашка, маленькую чашку в большую мы положим без проблем.
byte b = 121;
int x = b;
// Сработает
#java
Деструкторы в Java.
На самом деле в Java нет деструкторов. Они там не нужны, ведь всю грязную работу делает Garbage Collection.
Нет необходимости очищать память вручную, но что делать, если нам нужен метод, который сообщает разработчикам об удалении экземпляра класса из памяти? Существует унаследованный метод finalize, который вызывается сборщиком мусора. Таким образом, для классов, которые надо привести в порядок, появляется метод close и используется finalize.
Когда приложение завершает работу, JVM останавливается, не дожидаясь завершения ожидающих завершения объектов, поэтому практически нет никаких гарантий, что ваши финализаторы когда-либо будут запущены.
Деструкторы в Java.
На самом деле в Java нет деструкторов. Они там не нужны, ведь всю грязную работу делает Garbage Collection.
Нет необходимости очищать память вручную, но что делать, если нам нужен метод, который сообщает разработчикам об удалении экземпляра класса из памяти? Существует унаследованный метод finalize, который вызывается сборщиком мусора. Таким образом, для классов, которые надо привести в порядок, появляется метод close и используется finalize.
Когда приложение завершает работу, JVM останавливается, не дожидаясь завершения ожидающих завершения объектов, поэтому практически нет никаких гарантий, что ваши финализаторы когда-либо будут запущены.
Из каких переменных может состоять класс?
Anonymous Quiz
21%
A - Переменные класса, переменные экземпляра
52%
B - Переменные класса, локальные переменные, переменные экземпляра
17%
C - Переменные класса
10%
D - Переменные класса, локальные переменыне
#java
ArrayList
Массив ArrayList представляет собой структуру данных, которая динамически расширяется под нужное количество элементов.
Списочный массив подобен эластичной резинке, обычный же массив, как канат: его длина фиксированная.
ArrayList<Object> array = new ArrayList<Object>();
Основные методы:
ArrayList
Массив ArrayList представляет собой структуру данных, которая динамически расширяется под нужное количество элементов.
Списочный массив подобен эластичной резинке, обычный же массив, как канат: его длина фиксированная.
ArrayList<Object> array = new ArrayList<Object>();
Основные методы:
add(Object o)
- используется для добавления элементов в Array List. Если ArrayList уже содержит элементы и методу не передается начальный индекс, то новые добавляются после последнего элемента.remove(Object o)
- удаляет определенный элемент из массива.size()
- возвращает количество элементов в массиве Array List.contains(Object o)
- этот метод вернет значение true, если массив содержит указанный элемент.get(int index)
- используется для получения элемента указанного индекса в списке.set(int index, Object o)
- обновляет(заменяет) элемент указанного индекса указанным элементом.indefOf(Object o)
- используется для определения индекса конкретного элемента в списке.trimToSize()
- cокращает емкость списочного массива до его текущего размера (При создании списочного массива, вы можете изначально задать размер, к примеру, 100 элементов, но если вы и близко не используете его полноценный размер, вы сокращаете его вместительность до количества элементов, находящихся в списке. Это нужно для уменьшения расхода памяти).#front_end
Web Assembly и что это?
Есть старая проблема, которую довольно давно пробуют решить веб-разработчики. И проблема эта - как быстро выполнять код в браузере?
Wasm - это, если очень просто, виртуальная машина, которая позволяет выполнять в браузере код языка высокого уровня. По принципу работы она похожа на JVM. То есть да, благодаря этой технологии можно написать Front end и на Python, и на Java. За ваши вкусы осуждать не буду.
Wasm запускается и загружается из JS. Может вызвать только JS. Это скорее не автономная среда, а API, зависимый от JS.
Сейчас поддерживается основными браузерами: Chrome, Firefox, Safari, MS Edge. Internet Explorer обошли стороной.
Основной плюс Wasm - это, безусловно, производительность. В основном Wasm в несколько раз быстрее JS, но для каждого отдельного случая нужно делать сравнения, ведь это свежая технология.
Теперь вы можете написать Front End на языке Brainfuck. Наслаждайтесь.
Web Assembly и что это?
Есть старая проблема, которую довольно давно пробуют решить веб-разработчики. И проблема эта - как быстро выполнять код в браузере?
Wasm - это, если очень просто, виртуальная машина, которая позволяет выполнять в браузере код языка высокого уровня. По принципу работы она похожа на JVM. То есть да, благодаря этой технологии можно написать Front end и на Python, и на Java. За ваши вкусы осуждать не буду.
Wasm запускается и загружается из JS. Может вызвать только JS. Это скорее не автономная среда, а API, зависимый от JS.
Сейчас поддерживается основными браузерами: Chrome, Firefox, Safari, MS Edge. Internet Explorer обошли стороной.
Основной плюс Wasm - это, безусловно, производительность. В основном Wasm в несколько раз быстрее JS, но для каждого отдельного случая нужно делать сравнения, ведь это свежая технология.
Теперь вы можете написать Front End на языке Brainfuck. Наслаждайтесь.
Какой из них допускает дублирование элементов?
Anonymous Quiz
63%
List
19%
Set
10%
Все
8%
Ни один из вышеперечисленных
#python
Почему в Python нет операторов ++ и -- ?
Если вы действительно хотите знать причину, то придется читать древние, как документации COBOL, форумы Python разработчиков.
Как пишут благородные питонисты: "Простые инкременты и декременты не так нужны, как в других языках. Вы не очень часто пишете такие вещи, как for(int i = 0; i < 10; ++i) в Python; вместо этого вы делаете такие вещи, как for i in range(0, 10) ". То есть нет необходимости прописывать итерацию в циклах.
Есть ли такая необходимость добавить унарные операторы инкрементации и декрементации? Помните, что это целых четыре оператора (два инкремента и два декремента), каждый из которых должен иметь собственную перегрузку класса, которая тормозит VM.
Эти операторы просто избыточны и ненужны в пайтон, когда можно использовать += и -=.
Keep it simple.
Почему в Python нет операторов ++ и -- ?
Если вы действительно хотите знать причину, то придется читать древние, как документации COBOL, форумы Python разработчиков.
Как пишут благородные питонисты: "Простые инкременты и декременты не так нужны, как в других языках. Вы не очень часто пишете такие вещи, как for(int i = 0; i < 10; ++i) в Python; вместо этого вы делаете такие вещи, как for i in range(0, 10) ". То есть нет необходимости прописывать итерацию в циклах.
Есть ли такая необходимость добавить унарные операторы инкрементации и декрементации? Помните, что это целых четыре оператора (два инкремента и два декремента), каждый из которых должен иметь собственную перегрузку класса, которая тормозит VM.
Эти операторы просто избыточны и ненужны в пайтон, когда можно использовать += и -=.
Keep it simple.
#java
Есть три основные виды множеств -
HashSet хранит элементы в произвольном порядке, но зато быстро ищет. Подходит, если порядок Вам не важен, но важна скорость. Более того, для оптимизации поиска, HashSet будет хранить элементы так, как ему удобно.
LinkedHashSet будет хранить элементы в порядке добавления, но зато работает медленнее.
TreeSet хранит элементы отсортированными.
Set -
это такой же способ хранения данных, как массив или список. Но особенность множества в том, что оно может хранить только уникальные значения. Можете быть спокойны - дублироваться в множествах ничего не будет.Есть три основные виды множеств -
HashSet, LinkedHashSet и TreeSet.
Чем отличаются HashSet, LinkedHashSet и TreeSetHashSet хранит элементы в произвольном порядке, но зато быстро ищет. Подходит, если порядок Вам не важен, но важна скорость. Более того, для оптимизации поиска, HashSet будет хранить элементы так, как ему удобно.
LinkedHashSet будет хранить элементы в порядке добавления, но зато работает медленнее.
TreeSet хранит элементы отсортированными.
#cybersecurity
Clubhouse, или open data storage?
Я нашел бота, который без особого труда позволяет записывать разговоры. Вот краткий обзор статьи habr, автора бота.
Сам алгоритм: "Быстро вырисовалась базовая схема. Получаем от пользователя ссылку на активную комнату или на событие в будущем. Если это активная комната, то дергаем ручку /join_channel, получаем оттуда токен и название комнаты. Сразу же выходим из комнаты, и передаем полученные данные специальному демону, который делает простейшую вещь: если это новая комната, то он стартует отдельный бинарник, который, собственно, делает непосредственно всю работу по записи аудиопотока и записывает chat_id телеграммной беседы, чтобы обрадовать счастливого слушателя, когда всё будет готово. Если же это уже известная комната, которая уже записывается, то, разумеется, новый поток не запускается, но слушатель дописывается в список тех, кто решил записать эту беседу раньше.
Если же это событие в будущем (event в терминах Clubhouse), то начинается веселье. С некоторой периодичностью, которая увеличивается со временем, мы начинаем дергать ручку /get_event. Мы извлекаем оттуда ориентировочное время старта беседы (потому что оно может меняться со временем) и, если беседа уже началась, идентификатор комнаты. Как только это происходит, бот информирует всех заинтересованных о том, что беседа началась и далее автоматически происходит процедура из предыдущего абзаца. Бывают случаи, когда событие так и не начинается. В этом случае бот убивает событие в очереди демона и отправляет грустное сообщение интересантам."
Полная стаття на habr- https://habr.com/ru/post/543764/
Реп - https://github.com/stypr/clubhouse-py
Clubhouse, или open data storage?
Я нашел бота, который без особого труда позволяет записывать разговоры. Вот краткий обзор статьи habr, автора бота.
Сам алгоритм: "Быстро вырисовалась базовая схема. Получаем от пользователя ссылку на активную комнату или на событие в будущем. Если это активная комната, то дергаем ручку /join_channel, получаем оттуда токен и название комнаты. Сразу же выходим из комнаты, и передаем полученные данные специальному демону, который делает простейшую вещь: если это новая комната, то он стартует отдельный бинарник, который, собственно, делает непосредственно всю работу по записи аудиопотока и записывает chat_id телеграммной беседы, чтобы обрадовать счастливого слушателя, когда всё будет готово. Если же это уже известная комната, которая уже записывается, то, разумеется, новый поток не запускается, но слушатель дописывается в список тех, кто решил записать эту беседу раньше.
Если же это событие в будущем (event в терминах Clubhouse), то начинается веселье. С некоторой периодичностью, которая увеличивается со временем, мы начинаем дергать ручку /get_event. Мы извлекаем оттуда ориентировочное время старта беседы (потому что оно может меняться со временем) и, если беседа уже началась, идентификатор комнаты. Как только это происходит, бот информирует всех заинтересованных о том, что беседа началась и далее автоматически происходит процедура из предыдущего абзаца. Бывают случаи, когда событие так и не начинается. В этом случае бот убивает событие в очереди демона и отправляет грустное сообщение интересантам."
Полная стаття на habr- https://habr.com/ru/post/543764/
Реп - https://github.com/stypr/clubhouse-py
Хабр
ClubHouseRec_bot — расцвет и падение или как записать беседу бесплатно и без смс
ВступлениеПервые дни Клабхауса в России были чудесными - люди, с которыми большинство из нас вряд ли когда-то сможет побеседовать вживую, рассказывают дико интер...
Какой интерфейс нужно реализовать для сортировки по множеству критериев?
Anonymous Quiz
51%
Comparable
37%
Comparator
7%
Serializable
5%
SortMap
#web
HTTP — это протокол, позволяющий получать различные ресурсы, например HTML-документы.
Протокол HTTP лежит в основе обмена данными в Интернете. HTTP является протоколом клиент-серверного взаимодействия, что означает инициирование запросов к серверу самим получателем, обычно веб-браузером (web-browser).
Полученный итоговый документ будет (может) состоять из различных поддокументов являющихся частью итогового документа: например, из отдельно полученного текста, описания структуры документа, изображений, видео-файлов, скриптов и многого другого.
Каждый запрос (англ. request) отправляется серверу, который обрабатывает его и возвращает ответ (англ. response). Между этими запросами и ответами как правило существуют многочисленные посредники, называемые прокси, которые выполняют различные операции и работают как шлюзы или кэш, например.
HTTP — это протокол, позволяющий получать различные ресурсы, например HTML-документы.
Протокол HTTP лежит в основе обмена данными в Интернете. HTTP является протоколом клиент-серверного взаимодействия, что означает инициирование запросов к серверу самим получателем, обычно веб-браузером (web-browser).
Полученный итоговый документ будет (может) состоять из различных поддокументов являющихся частью итогового документа: например, из отдельно полученного текста, описания структуры документа, изображений, видео-файлов, скриптов и многого другого.
Каждый запрос (англ. request) отправляется серверу, который обрабатывает его и возвращает ответ (англ. response). Между этими запросами и ответами как правило существуют многочисленные посредники, называемые прокси, которые выполняют различные операции и работают как шлюзы или кэш, например.
Что гарантирует безопасность типов в коллекции?
Anonymous Quiz
67%
Generics
13%
Abstract classes
13%
Interfaces
8%
Collection
#python
Что лучше, import или from import?
Обратимся к первоисточникам, а именно-к PEP8. Когда импортируете класс из модуля, будет нормально сделать это так:
from myclass import MyClass
from foo.bar.yourclass import YourClass
Если это вызывает локальный конфликт Имен, то можно сделать это явно:
import myclass
import foo.bar.yourclass
Для того, чтобы понять, как надо импортировать каждую библиотеку нужно читать документацию к каждому модулю, ведь автор сам решает, какой import нужно использовать.
Flask импортируется:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!
Pytest импортируется:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
При написании тестов порой надо подменить какие-то методы. Вот тут с импортами из модуля начинается цирк. К моменту, когда накладывается патч, ссылка на объект уже имеется в тех местах, где он импортирован, и патчить нужно не место, где объект объявлен, а все места, где был сделан импорт. Несложно, но немного запарно, и есть шанс что-то поломать при рефакторинге.
Этот момент – достаточно частый источник недоумения.
Что лучше, import или from import?
Обратимся к первоисточникам, а именно-к PEP8. Когда импортируете класс из модуля, будет нормально сделать это так:
from myclass import MyClass
from foo.bar.yourclass import YourClass
Если это вызывает локальный конфликт Имен, то можно сделать это явно:
import myclass
import foo.bar.yourclass
Для того, чтобы понять, как надо импортировать каждую библиотеку нужно читать документацию к каждому модулю, ведь автор сам решает, какой import нужно использовать.
Flask импортируется:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!
Pytest импортируется:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
При написании тестов порой надо подменить какие-то методы. Вот тут с импортами из модуля начинается цирк. К моменту, когда накладывается патч, ссылка на объект уже имеется в тех местах, где он импортирован, и патчить нужно не место, где объект объявлен, а все места, где был сделан импорт. Несложно, но немного запарно, и есть шанс что-то поломать при рефакторинге.
Этот момент – достаточно частый источник недоумения.
Что позволяет удалять элементы из коллекции?
Anonymous Quiz
12%
Enumeration
10%
Serializable
44%
Iterator
34%
метод removeObj()
#definition
Reverse Engineering (ревёрсинг, обратная разработка) — это процесс «заимствования», восстановления исходников из конечного продукта инженерной и/или научной деятельности с интуитивным конструированием внутренней механики по принципу «а какие процессы должны вызвать такое внешнее поведение этого продукта?». Ориентируясь на нюх, так сказать. Иногда приводит к написанию собственного дока. Много их, ибо ваистену
Примером RE является создание базы данных из готовых сущностей в Spring.
Reverse Engineering (ревёрсинг, обратная разработка) — это процесс «заимствования», восстановления исходников из конечного продукта инженерной и/или научной деятельности с интуитивным конструированием внутренней механики по принципу «а какие процессы должны вызвать такое внешнее поведение этого продукта?». Ориентируясь на нюх, так сказать. Иногда приводит к написанию собственного дока. Много их, ибо ваистену
Примером RE является создание базы данных из готовых сущностей в Spring.
Что из этого синхронизировано и не допускает нулевых элементов?
Anonymous Quiz
33%
Vector
28%
CopyOnWriteArraySet
11%
CopyOnWriteArrayList
28%
ConcurrentSkipListSet
#web
HTTPS vs HTTP
HTTPS не является отдельным протоколом передачи данных, а представляет собой расширение протокола HTTP но со встроенным шифровальщиком. Добавочная буква «S» в аббревиатуре означает «Secure», то есть «безопасный».
HTTPS это закрытый протокол имеющий надстройку шифрования и использующий по умолчанию порт 433, тогда как HTTP – открытый протокол который использует порт 80
Данные передаваемые по протоколу HTTPS всегда больше по объёму чем те самые данные на HTTP поэтому их передача в обе стороны занимает чуть больше времени
HTTPS использует SSL-сертификаты для шифрования информации
Как это происходит?
Если на сайте есть SSL-сертификат, между браузером клиента и сайтом устанавливается защищённое соединение. В этом случае браузер сначала преобразует номер карты в случайный набор символов и только потом отправляет его на сервер.
Расшифровать сообщение получится только специальным ключом, который хранится на сервере.
HTTPS vs HTTP
HTTPS не является отдельным протоколом передачи данных, а представляет собой расширение протокола HTTP но со встроенным шифровальщиком. Добавочная буква «S» в аббревиатуре означает «Secure», то есть «безопасный».
HTTPS это закрытый протокол имеющий надстройку шифрования и использующий по умолчанию порт 433, тогда как HTTP – открытый протокол который использует порт 80
Данные передаваемые по протоколу HTTPS всегда больше по объёму чем те самые данные на HTTP поэтому их передача в обе стороны занимает чуть больше времени
HTTPS использует SSL-сертификаты для шифрования информации
Как это происходит?
Если на сайте есть SSL-сертификат, между браузером клиента и сайтом устанавливается защищённое соединение. В этом случае браузер сначала преобразует номер карты в случайный набор символов и только потом отправляет его на сервер.
Расшифровать сообщение получится только специальным ключом, который хранится на сервере.