Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
Channel created
​​#java
Почему же Java вместе с JVM могут соревноваться с новоиспеченными языками программирования через 25 лет релиза?

Благодаря умению JVM жонглировать потоками? на ней делают новые языки программирования, к примеру Kotlin. JVM настолько хороша, что ее можно рассматривать как отдельную ОС. Что? - Спросит меня агрессивный любитель низкоуровневого программирования. А я отвечу: Android был значительно основан на Java. Кроме того, существуют ОС, которые в классическом понимании, полностью основаны на базе JVM.

Что делает JVM похожим на ОС? Управление памятью, управление потоками, развитый ввод / вывод, обобщенная философия объектов. Благодаря этим возможностям она позволяет создавать многозадачные и комплексные системы. Это я еще не упоминал механизм байт-кода, который крутит Java код на любом процессоре.

Конечно, JVM не идеальна. Программы на С++ куда быстрее выполняются да и ООП систему, на которой вся Java держится, часто критикуют.

Одинаково Java и JVM остаются одними из лучших инструментов в программировании.
​​Fortran живой. И всегда будет.

Если вы не знаете, что это за язык, то вы вполне нормальный разработчик, или студент, который никогда не имел дел с физическими расчетами, документацией прошлого тысячелетия и расчетом волновой функции линейного гармонического квантового осциллятора в состоянии с квантовым числом, чтобы оно не значило😅

Безусловно, Junior Frontend Developer никогда не писал на Fortran и в этом он точно не нуждается. Это игрушка для физиков и инженеров. Хотя, хороший инструмент будет полезен в умелых руках.

Особенностей в Fortan - четыре. Чрезвычайно огромная библиотека, которую до сих пор не перевели на С. Древний legacy code, еще с 50-х годов. Невероятная точность в расчетах. Быстродействие, которое, в некоторых случаях, обгоняет С.

Комплексные числа, вся вкуснятина с графиками, которая есть в Matlab. Удобная обработка массивов, которая позволяет умножать их на скаляр, перемножать интуитивным способом, использовать математические функции. Можно взять экспоненту из массива. Обнулять все отрицательные элементы массива в одну строку. Мечты студента, который пишет свои лабораторные на C-подобных языках.

Не надо беспокоиться о выделении памяти, компилятор оптимизирует все сам.

С помощью Fortran до сих пор тестируют суперкомпьютеры.

Если вам нужен качественный инструмент в сложных расчетах, это определенно Fortran.
#java
Почему класс String объявлен final в Java?

Очень полезно иметь строки реализованы как независимые объекты.

Если строка не была окончательной, вы могли бы создать подкласс и иметь две строки, которые выглядят одинаково, когда "рассматриваются как строки", но на самом деле они разные.

Также неизменные данные очень полезны для обеспечения потокобезопасности.
​​#python
Правые методы в Python

Еще одна особенность классов в Python-правые магические методы. Они начинаются префикса r, например: radd, rsub
Эти методы вызываются для правого операнда, когда метод левого операнда не переопределен.

Если мы просуммируем a + b, то Python попытается сделать a.add(b), если метод add не переопределен, то вызовется метод b.radd(a), если radd не переопределен, то выбросится ошибка.
​​#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
Деструкторы в Java.

На самом деле в Java нет деструкторов. Они там не нужны, ведь всю грязную работу делает Garbage Collection.

Нет необходимости очищать память вручную, но что делать, если нам нужен метод, который сообщает разработчикам об удалении экземпляра класса из памяти? Существует унаследованный метод finalize, который вызывается сборщиком мусора. Таким образом, для классов, которые надо привести в порядок, появляется метод close и используется finalize.

Когда приложение завершает работу, JVM останавливается, не дожидаясь завершения ожидающих завершения объектов, поэтому практически нет никаких гарантий, что ваши финализаторы когда-либо будут запущены.
#java
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. Наслаждайтесь.
Какой из них допускает дублирование элементов?
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.
Что выведется на экран?
Anonymous Quiz
14%
[1,1,2,3]
8%
[1,2,2,3]
24%
[1,2,3]
54%
[1,1,3,2]
#java
Set - это такой же способ хранения данных, как массив или список. Но особенность множества в том, что оно может хранить только уникальные значения. Можете быть спокойны - дублироваться в множествах ничего не будет.

Есть три основные виды множеств - HashSet, LinkedHashSet и TreeSet.


Чем отличаются HashSet, LinkedHashSet и TreeSet

HashSet
хранит элементы в произвольном порядке, но зато быстро ищет. Подходит, если порядок Вам не важен, но важна скорость. Более того, для оптимизации поиска, 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
Какой интерфейс нужно реализовать для сортировки по множеству критериев?
Anonymous Quiz
51%
Comparable
37%
Comparator
7%
Serializable
5%
SortMap
#web
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

При написании тестов порой надо подменить какие-то методы. Вот тут с импортами из модуля начинается цирк. К моменту, когда накладывается патч, ссылка на объект уже имеется в тех местах, где он импортирован, и патчить нужно не место, где объект объявлен, а все места, где был сделан импорт. Несложно, но немного запарно, и есть шанс что-то поломать при рефакторинге.

Этот момент – достаточно частый источник недоумения.