#java
Регулярные выражения
В Java регулярные выражения представляют собой особую последовательность символов, позволяющую вам сопоставить или выявить другие строки либо их набор, опираясь на специализированный синтаксис в качестве шаблона. Они могут быть использованы для поиска, редактирования либо манипулирования текстом и данными.
Пакет java.util.regex исходно состоит из следующих трех классов:
Регулярные выражения
В Java регулярные выражения представляют собой особую последовательность символов, позволяющую вам сопоставить или выявить другие строки либо их набор, опираясь на специализированный синтаксис в качестве шаблона. Они могут быть использованы для поиска, редактирования либо манипулирования текстом и данными.
Пакет java.util.regex исходно состоит из следующих трех классов:
⟡
Pattern Class – объект класса Pattern представляет скомпилированное представление регулярного выражения. В классе Pattern публичный конструктор не предусмотрен. Для создания шаблона, вам сперва необходимо вызвать один из представленных публичных статичных методов compile(), который далее произведет возврат объекта класса Pattern. Регулярное выражение в данных методах принимается как первый аргумент.⟡
Matcher Class – объект класса Matcher представляет механизм, который интерпретирует шаблон, а также производит операции сопоставления с вводимой строкой. Аналогично классу Pattern, Matcher не содержит публичных конструкторов. Объект класса Matcher может быть получен путем вызова метода matcher() на объекте класса Pattern.⟡
PatternSyntaxException – объект класса PatternSyntaxException представляет непроверяемое исключение, которое обозначает синтаксическую ошибку в шаблоне регулярного выражения.#science
Знакомьтесь, первая вертушка на Марсе
Впервые в истории хитрый вертолёт покорит небеса другой планеты. Чтобы убедиться, что марсолёт готов к дебюту на Красной планете, инженеры NASA в Пасадене, в Калифорнии, разработали прототипы «Изобретательности» (название марсолета).
Всё почти готово к шоу. Когда таинственный внеземной вертолёт отделится от марсохода, чтобы провести серию в 5 тестовых полётов длительностью от 30 до 90 секунд, у него будет 30 марсианских суток, а каждые марсианские сутки состоят из 24 часов, 39 минут и 35 секунд. Хореография почти всех самых амбициозных прыжков марсолёта будет поставлена самой «Изобретательностью», а их высота будет варьироваться от высоты одноэтажного дома до 1000 футов.
Знакомьтесь, первая вертушка на Марсе
Впервые в истории хитрый вертолёт покорит небеса другой планеты. Чтобы убедиться, что марсолёт готов к дебюту на Красной планете, инженеры NASA в Пасадене, в Калифорнии, разработали прототипы «Изобретательности» (название марсолета).
Всё почти готово к шоу. Когда таинственный внеземной вертолёт отделится от марсохода, чтобы провести серию в 5 тестовых полётов длительностью от 30 до 90 секунд, у него будет 30 марсианских суток, а каждые марсианские сутки состоят из 24 часов, 39 минут и 35 секунд. Хореография почти всех самых амбициозных прыжков марсолёта будет поставлена самой «Изобретательностью», а их высота будет варьироваться от высоты одноэтажного дома до 1000 футов.
#science #hardware
Google Earth Engine (GEE) как общедоступный суперкомпьютер
Earth Engine — это многопетабайтный каталог данных, интегрированный с высокопроизводительным кластером серверов для параллельных вычислений. Доступ к системе и управление осуществляется через интерфейс прикладного программирования (API). Пользователь создаёт сценарии обработки данных в интерактивной среде разработки на JavaScript API, которая называтеся редактором кода (Code Editor) и обеспечивает оперативное создание прототипов и визуализацию результатов «на лету». То же самое можно выполнять и через Python API в локальной среде на своём компьютере или через облачные блокноты Google Colab. В каждом из вариантов основные вычисления выполняются на серверах Google.
Earth Engine — платформа уникальная, поскольку расширяет возможности не только учёных, занимающихся дистанционным зондированием Земли, но и более широкой аудитории, которой не хватает технических возможностей для использования традиционных инструментов обработки больших данных. До появления Earth Engine анализом больших геоданных могли заниматься лишь узкопрофильные специалисты с доступом к высокопроизводительным вычислительным ресурсам.
По личному опыту можем сказать, что даже в англоязычной профессиональной среде про Earth Engine знают пока немногие, а в России и СНГ платформу используют единицы.
https://earthengine.google.com/
Google Earth Engine (GEE) как общедоступный суперкомпьютер
Earth Engine — это многопетабайтный каталог данных, интегрированный с высокопроизводительным кластером серверов для параллельных вычислений. Доступ к системе и управление осуществляется через интерфейс прикладного программирования (API). Пользователь создаёт сценарии обработки данных в интерактивной среде разработки на JavaScript API, которая называтеся редактором кода (Code Editor) и обеспечивает оперативное создание прототипов и визуализацию результатов «на лету». То же самое можно выполнять и через Python API в локальной среде на своём компьютере или через облачные блокноты Google Colab. В каждом из вариантов основные вычисления выполняются на серверах Google.
Earth Engine — платформа уникальная, поскольку расширяет возможности не только учёных, занимающихся дистанционным зондированием Земли, но и более широкой аудитории, которой не хватает технических возможностей для использования традиционных инструментов обработки больших данных. До появления Earth Engine анализом больших геоданных могли заниматься лишь узкопрофильные специалисты с доступом к высокопроизводительным вычислительным ресурсам.
По личному опыту можем сказать, что даже в англоязычной профессиональной среде про Earth Engine знают пока немногие, а в России и СНГ платформу используют единицы.
https://earthengine.google.com/
Google
Google Earth Engine
Google Earth Engine combines a multi-petabyte catalog of satellite imagery and geospatial datasets with planetary-scale analysis capabilities and makes it available for scientists, researchers, and developers to detect changes, map trends, and quantify differences…
#java #interview
Зачем нужно ключевое слово assert?
Этот оператор ничего не возвращает, а принимает проверяемое утверждение типа
В Java до версии 4 слово
Включается флагом
Assertion-ы используются в основном для дополнительной проверки инвариантов состояния объекта и для подстраховки в коде, который не должен никогда вызываться. Выброшенный
Дополнительно у оператора
Зачем нужно ключевое слово assert?
assert
– не то же самое, что методы вроде assertTrue()
из тестовых библиотек. Это зарезервированное ключевое слово, унарный оператор. Этот оператор ничего не возвращает, а принимает проверяемое утверждение типа
boolean
. Если значение оказывается false
, проверка утверждения считается проваленной и выбрасывается AssertionError
. Это похоже на сокращенную запись пары if
и throw
, с фиксированным типом исключения.В Java до версии 4 слово
assert
не было ключевым. Поэтому для обратной совместимости механизм проверки утверждений выключен по умолчанию – логика программы никогда не должна полагаться на assert
!Включается флагом
-ea
или -enableassertions
команды java
. Можно указывать конкретные классы и пакеты в которых включить. Есть противоположный флаг -da
(-disableassertions
), эти флаги можно использовать в комбинации.Assertion-ы используются в основном для дополнительной проверки инвариантов состояния объекта и для подстраховки в коде, который не должен никогда вызываться. Выброшенный
AssertionError
обычно означает ошибку программиста.Дополнительно у оператора
assert
есть синтаксис передачи параметра detailMessage
в конструктор AssertionError
:assert 2*2==5 : "two times two is not five!";
#techniques
Раскладка Дворака
Клавиату́ра Дво́рака — раскладка клавиатуры, запатентованная профессором Вашингтонского университета Августом Двораком и Вильямом Дилли в 1936 для набора английских символов как альтернатива раскладке QWERTY.
Самая распространенная раскладка для английского языка QWERTY - наследие времен пишущих машинок. Она была создана для первой популярной серийной машинки Remington 1, фактически, став самым первым стандартом.
Создатели QWERTY были вынуждены отталкиваться от технических ограничений конструкции первых машинок, пожертвовав темпом печати. На современной клавиатуре эти ограничения не имеют никакого смысла. Тут мы и приходим к раскладке Дворака, которая была спроектирована из соображений эргономики.
Дворак - не единственная альтернатива QWERTY для английского языка, но в ИТ-среде ее активно популяризуют, вероятно, благодаря существованию так называемого Дворака для программистов, адаптированного для набора кода.
Раскладка Дворака
Клавиату́ра Дво́рака — раскладка клавиатуры, запатентованная профессором Вашингтонского университета Августом Двораком и Вильямом Дилли в 1936 для набора английских символов как альтернатива раскладке QWERTY.
Самая распространенная раскладка для английского языка QWERTY - наследие времен пишущих машинок. Она была создана для первой популярной серийной машинки Remington 1, фактически, став самым первым стандартом.
Создатели QWERTY были вынуждены отталкиваться от технических ограничений конструкции первых машинок, пожертвовав темпом печати. На современной клавиатуре эти ограничения не имеют никакого смысла. Тут мы и приходим к раскладке Дворака, которая была спроектирована из соображений эргономики.
Дворак - не единственная альтернатива QWERTY для английского языка, но в ИТ-среде ее активно популяризуют, вероятно, благодаря существованию так называемого Дворака для программистов, адаптированного для набора кода.
#java
Records в Java
Одной из наибольших претензий к Java является то, что для того, чтобы класс мог стать полезным, необходимо написать большое количество избыточного кода. Очень часто вам необходимо дописывать следующее:
* toString()
* hashCode() и equals()
* Геттеры
* Публичные конструкторы
Начиная с версии Java 16 в язык была добавлена новая функциональность - Records (на русском нередко называют "записями"). Records представляют классы, которые предназначены для создания контейнеров неизменяемых данных. Кроме того, records позволяют упростить разработку, сократив объем кода.
Records в Java
Одной из наибольших претензий к Java является то, что для того, чтобы класс мог стать полезным, необходимо написать большое количество избыточного кода. Очень часто вам необходимо дописывать следующее:
* toString()
* hashCode() и equals()
* Геттеры
* Публичные конструкторы
Начиная с версии Java 16 в язык была добавлена новая функциональность - Records (на русском нередко называют "записями"). Records представляют классы, которые предназначены для создания контейнеров неизменяемых данных. Кроме того, records позволяют упростить разработку, сократив объем кода.
public record Cat(String name, int numberOfLives, String color) { }Чтобы лучше это проиллюстрировать, давайте посмотрим на декомпилированную версию нашей записи:
public final class Cat extends java.lang.Record {Реализация equals() считает две записи равными, если они имеют одинаковый тип и имеют одинаковые значения. Реализация toString() печатает нашу запись следующим образом:
private final java.lang.String name;
private final int numberOfLives;
private final java.lang.String color;
public Cat(java.lang.String name, int numberOfLives, java.lang.String color) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.lang.String name() { /* compiled code */ }
public int numberOfLives() { /* compiled code */ }
public java.lang.String color() { /* compiled code */ }
}
Cat[name=Fluffy, numberOfLives=9, color=White]
#java
Интерфейсы (OOP)
У нас у всех есть компьютер. Часто ли вы меняли видеокарту, процессор, оперативку? Впрочем, это неважно, важно то, что вы можете это сделать.
К примеру, вместо старого процессора поставить новый. Но как, как мы узнаем что мы можем это сделать? В этом нам помогают интерфейсы. Они определяют сможет ли тот или иной объект быть частью чего то.
Мать, не моя, а та, которая с сокетом, у нее есть определенный интерфейс, по котором она понимает, нужный ли проц сейчас подключен. Сокету плевать как там внутри он реализован, главное, чтобы был нужный интерфейс и хоть какая-то реализация. То есть, один процессор может быть хуже, другой лучше. Но у них есть что-то общее, и это - интерфейс.
Если бы не было интерфейса, а процессор был бы напрямую интегрирован в материнку, мы бы просто не смогли бы его поменять.
Теперь, для наглядности, немного кода:
(Мы описали интерфейс. Создали процессоры интерфейс который они реализуют. Потом, применяли композицию, в классе Computer, в качестве атрибута у нас объект реализующий интерфейс ISocket (процессор). Самое главное, что теперь, мы можем поменять процессор, i5, i7, какой хочешь, главное чтобы подходил интерфейс. Если бы его не было, наш пк был бы привязан только к какой-то определенной модели).
Интерфейсы (OOP)
У нас у всех есть компьютер. Часто ли вы меняли видеокарту, процессор, оперативку? Впрочем, это неважно, важно то, что вы можете это сделать.
К примеру, вместо старого процессора поставить новый. Но как, как мы узнаем что мы можем это сделать? В этом нам помогают интерфейсы. Они определяют сможет ли тот или иной объект быть частью чего то.
Мать, не моя, а та, которая с сокетом, у нее есть определенный интерфейс, по котором она понимает, нужный ли проц сейчас подключен. Сокету плевать как там внутри он реализован, главное, чтобы был нужный интерфейс и хоть какая-то реализация. То есть, один процессор может быть хуже, другой лучше. Но у них есть что-то общее, и это - интерфейс.
Если бы не было интерфейса, а процессор был бы напрямую интегрирован в материнку, мы бы просто не смогли бы его поменять.
Теперь, для наглядности, немного кода:
(Мы описали интерфейс. Создали процессоры интерфейс который они реализуют. Потом, применяли композицию, в классе Computer, в качестве атрибута у нас объект реализующий интерфейс ISocket (процессор). Самое главное, что теперь, мы можем поменять процессор, i5, i7, какой хочешь, главное чтобы подходил интерфейс. Если бы его не было, наш пк был бы привязан только к какой-то определенной модели).
#java
Префиксное дерево
Префиксное (нагруженное) дерево — это разновидность дерева поиска. Оно хранит данные в метках, каждая из которых представляет собой узел на дереве. Такие структуры часто используют, чтобы хранить слова и выполнять быстрый поиск по ним — например, для функции автозаполнения.
Каждый узел в языковом префиксном дереве содержит одну букву слова. Чтобы составить слово, нужно следовать по ветвям дерева, проходя по одной букве за раз. Дерево начинает ветвиться, когда порядок букв отличается от других имеющихся в нем слов или когда слово заканчивается. Каждый узел содержит букву (данные) и булево значение, которое указывает, является ли он последним в слове.
Посмотрите на иллюстрацию и попробуйте составить слова. Всегда начинайте с корневого узла вверху и спускайтесь вниз. Это дерево содержит следующие слова: ball, bat, doll, do, dork, dorm, send, sense.
Префиксное дерево
Префиксное (нагруженное) дерево — это разновидность дерева поиска. Оно хранит данные в метках, каждая из которых представляет собой узел на дереве. Такие структуры часто используют, чтобы хранить слова и выполнять быстрый поиск по ним — например, для функции автозаполнения.
Каждый узел в языковом префиксном дереве содержит одну букву слова. Чтобы составить слово, нужно следовать по ветвям дерева, проходя по одной букве за раз. Дерево начинает ветвиться, когда порядок букв отличается от других имеющихся в нем слов или когда слово заканчивается. Каждый узел содержит букву (данные) и булево значение, которое указывает, является ли он последним в слове.
Посмотрите на иллюстрацию и попробуйте составить слова. Всегда начинайте с корневого узла вверху и спускайтесь вниз. Это дерево содержит следующие слова: ball, bat, doll, do, dork, dorm, send, sense.
#java
Для чего нужны статические блоки?
Статические блоки выполняются до выполнения конструктора, с помощью них инициализируют статические поля к примеру.
Например:
Для чего нужны статические блоки?
Статические блоки выполняются до выполнения конструктора, с помощью них инициализируют статические поля к примеру.
static final int i:Еще один нюанс, блок статической инициализации может создаваться сам при компиляции программы.
static {
i = 10;
}
Например:
public static int MAX = 100;Будет создан код:
public static int MAX;
static {
MAX = 10;
}
#java
Для чего нужен метод
(картинка)
Как мы видим, i-е место вставки объекта вычисляется при помощи хэша. А для вычисления нам нужна хорошая хэш функция, чтобы давала равномерное распределение и поменьше коллизий.
Для чего нужен метод
hashcode()
?⟡
В классе Object, который является родительским классом для объектов java, определен метод hashCode(), позволяющий получить уникальный целый номер для данного объекта. Когда объект сохраняют в коллекции типа HashSet, то данный номер позволяет быстро определить его местонахождение в коллекции и извлечь. Функция hashCode() объекта Object возвращает целое число int, размер которого равен 4-м байтам и значение которого располагается в диапазоне от -2 147 483 648 до 2 147 483 647.⟡
Вычисление хэш-функции лежит в основе таких известных классов, как HashMap, HashSet, Hashtable. Именно за счет хэша мы можем вставлять и получать данные за O(1), то есть за время пропорциональное вычислению хэш-функции.⟡
Например, рассмотрим вставку элементов в HashMap.(картинка)
Как мы видим, i-е место вставки объекта вычисляется при помощи хэша. А для вычисления нам нужна хорошая хэш функция, чтобы давала равномерное распределение и поменьше коллизий.
⟡
То есть ответ на вопрос заключается в том, что существуют коллекции(HashMap, HashSet), которые используют хэш код, как основу при работе с объектами. А если хэш для равных объектов будет разным, то в HashMap будут два равных значения, что является ошибкой. Поэтому необходимо соответствующим образом переопределить метод hashCode().#java
Семафоры
Семафоры представляют еще одно средство синхронизации для доступа к ресурсу. В Java семафоры представлены классом Semaphore, который располагается в пакете java.util.concurrent.
Для управления доступом к ресурсу семафор использует счетчик, представляющий количество разрешений. Если значение счетчика больше нуля, то поток получает доступ к ресурсу, при этом счетчик уменьшается на единицу. После окончания работы с ресурсом поток освобождает семафор, и счетчик увеличивается на единицу. Если же счетчик равен нулю, то поток блокируется и ждет, пока не получит разрешение от семафора.
Семафоры отлично подходят для решения задач, где надо ограничивать доступ.
Семафор указывает сколько потоков могут параллельно выполняться.
Семафоры
Семафоры представляют еще одно средство синхронизации для доступа к ресурсу. В Java семафоры представлены классом Semaphore, который располагается в пакете java.util.concurrent.
Для управления доступом к ресурсу семафор использует счетчик, представляющий количество разрешений. Если значение счетчика больше нуля, то поток получает доступ к ресурсу, при этом счетчик уменьшается на единицу. После окончания работы с ресурсом поток освобождает семафор, и счетчик увеличивается на единицу. Если же счетчик равен нулю, то поток блокируется и ждет, пока не получит разрешение от семафора.
Семафоры отлично подходят для решения задач, где надо ограничивать доступ.
Семафор указывает сколько потоков могут параллельно выполняться.
#algorithms
Двоичная куча
Двоичная куча — ещё одна древовидная структура данных. В ней у каждого узла не более двух потомков. Также она является совершенным деревом: это значит, что в ней полностью заняты данными все уровни, а последний заполнен слева направо.
Двоичная куча может быть минимальной или максимальной. В максимальной куче ключ любого узла всегда больше ключей его потомков или равен им. В минимальной куче всё устроено наоборот: ключ любого узла меньше ключей его потомков или равен им.
Порядок уровней в двоичной куче важен, в отличие от порядка узлов на одном и том же уровне. На иллюстрации видно, что в минимальной куче на третьем уровне значения идут не по порядку: 10, 6 и 12.
Двоичная куча
Двоичная куча — ещё одна древовидная структура данных. В ней у каждого узла не более двух потомков. Также она является совершенным деревом: это значит, что в ней полностью заняты данными все уровни, а последний заполнен слева направо.
Двоичная куча может быть минимальной или максимальной. В максимальной куче ключ любого узла всегда больше ключей его потомков или равен им. В минимальной куче всё устроено наоборот: ключ любого узла меньше ключей его потомков или равен им.
Порядок уровней в двоичной куче важен, в отличие от порядка узлов на одном и том же уровне. На иллюстрации видно, что в минимальной куче на третьем уровне значения идут не по порядку: 10, 6 и 12.
#java
Интерфейс Comparable
Интерфейс Comparable
⟡
Comparable обеспечивает единую последовательность сортировки. Другими словами, мы можем отсортировать коллекцию на основе одного элемента, такого как идентификатор, имя и цена.⟡
Comparable влияет на исходный класс, т.е. модифицируется фактический класс.⟡
Comparable предоставляет метод compareTo() для сортировки элементов.⟡
Мы можем отсортировать элементы списка типа Comparable методом Collections.sort(List).#java
Интерфейс Comparator
Интерфейс Comparator
⟡
Comparator предоставляет несколько последовательностей сортировки. Другими словами, мы можем отсортировать коллекцию по нескольким элементам, таким как идентификатор, имя, цена и т. д.⟡
Comparator не влияет на исходный класс, т.е. фактический класс не изменяется.⟡
Comparator предоставляет метод compare() для сортировки элементов.⟡
Мы можем отсортировать элементы списка типа Comparator методом Collections.sort(List, Comparator).#history #longRead
Unicode: как человечество пришло к международному стандарту кодирования символов
Еще в 18 веке существовала потребность в быстрой передаче информации на большие расстояния, для чего использовались так называемые телеграфные коды. Информация кодировалась с помощью оптических, электронных и других средств.
В течение сотен лет, прошедших с момента изобретения первого телеграфного кода, не было никаких реальных попыток международной стандартизации таких схем кодирования. Даже первые десятилетия эры телетайпов и домашних компьютеров мало что изменили. Несмотря на то, что EBCDIC (8-битная кодировка символов IBM, продемонстрированная на перфокарте в заглавной иллюстрации) и ASCII немного улучшили ситуацию, способа кодировать растущую коллекцию символов без значительных затрат памяти все еще не было.
Развитие Юникода началось в конце 1980-х годов, когда рост обмена цифровой информацией во всем мире сделал потребность в единой системе кодирования более насущной.
Удивительно, что всего в 16 битах Unicode удалось охватить не только все западные системы письма, но и многие китайские иероглифы и множество специальных символов, используемых, например, в математике. С 16 битами, допускающими до 65 536 кодовых точек, Unicode 1.0 легко вмещал 7 129 символов. Но к моменту появления Unicode 3.1 в 2001 году он содержал не менее 94 140 символов.
Сейчас, в своей 13 версии, Unicode содержит в общей сложности 143 859 символов, не считая управляющих. Изначально Unicode предполагалось использовать только для кодирования систем записи, которые применяются в настоящее время. Но к релизу Unicode 2.0 в 1996 году стало понятно, что эту цель следует переосмыслить, чтобы кодировать даже редкие и исторические символы. Чтобы достичь этого без обязательной 32-битной кодировки каждого символа, Unicode изменился: он позволил не только кодировать символы напрямую, но и использовать их компоненты, или графемы.
Концепция в чем-то похожа на векторные изображения, где не указывается каждый пиксель, а вместо этого описываются элементы, составляющие рисунок. В результате кодировка Unicode Transformation Format 8 (UTF-8) поддерживает 231 кодовую точку, при этом для большинства символов в текущем наборе символов Unicode обычно требуется один-два байта.
Unicode: как человечество пришло к международному стандарту кодирования символов
Еще в 18 веке существовала потребность в быстрой передаче информации на большие расстояния, для чего использовались так называемые телеграфные коды. Информация кодировалась с помощью оптических, электронных и других средств.
В течение сотен лет, прошедших с момента изобретения первого телеграфного кода, не было никаких реальных попыток международной стандартизации таких схем кодирования. Даже первые десятилетия эры телетайпов и домашних компьютеров мало что изменили. Несмотря на то, что EBCDIC (8-битная кодировка символов IBM, продемонстрированная на перфокарте в заглавной иллюстрации) и ASCII немного улучшили ситуацию, способа кодировать растущую коллекцию символов без значительных затрат памяти все еще не было.
Развитие Юникода началось в конце 1980-х годов, когда рост обмена цифровой информацией во всем мире сделал потребность в единой системе кодирования более насущной.
Удивительно, что всего в 16 битах Unicode удалось охватить не только все западные системы письма, но и многие китайские иероглифы и множество специальных символов, используемых, например, в математике. С 16 битами, допускающими до 65 536 кодовых точек, Unicode 1.0 легко вмещал 7 129 символов. Но к моменту появления Unicode 3.1 в 2001 году он содержал не менее 94 140 символов.
Сейчас, в своей 13 версии, Unicode содержит в общей сложности 143 859 символов, не считая управляющих. Изначально Unicode предполагалось использовать только для кодирования систем записи, которые применяются в настоящее время. Но к релизу Unicode 2.0 в 1996 году стало понятно, что эту цель следует переосмыслить, чтобы кодировать даже редкие и исторические символы. Чтобы достичь этого без обязательной 32-битной кодировки каждого символа, Unicode изменился: он позволил не только кодировать символы напрямую, но и использовать их компоненты, или графемы.
Концепция в чем-то похожа на векторные изображения, где не указывается каждый пиксель, а вместо этого описываются элементы, составляющие рисунок. В результате кодировка Unicode Transformation Format 8 (UTF-8) поддерживает 231 кодовую точку, при этом для большинства символов в текущем наборе символов Unicode обычно требуется один-два байта.
#definition
JFR – это механизм легковесного профилирования Java-приложения. Он позволяет записывать и в последствии анализировать огромное количество метрик и событий, происходящих внутри JVM, что значительно облегчает анализ проблем. Более того, при определённых настройках его накладные расходы настолько малы, что многие (включая Oracle) рекомендуют держать его постоянно включённым везде, в том числе прод, чтобы в случае возникновения проблем сразу иметь полную картину происходившего с приложением. Просто мечта любого SRE!
Раньше этот механизм был доступен только в коммерческих версиях Java от корпорации Oracle версии 8 и более ранних. В какой-то момент его реимплементировали с нуля в OpenJDK 12, затем бекпортировали в OpenJDK 11, которая является LTS-версией. Однако вот OpenJDK 8 оставалась за бортом этого праздника жизни. Вплоть до выхода апдейта 8u272, в который наконец-то тоже бекпортировали JFR. Теперь все (за редким исключением) пользователи OpenJDK могут начинать использовать эту функциональность.
Активировать JFR можно несколькими путями. Один из них – задать соответствующие параметры при запуске Java-приложения. Для этого необходимо использовать два параметра:
Или:
JFR – это механизм легковесного профилирования Java-приложения. Он позволяет записывать и в последствии анализировать огромное количество метрик и событий, происходящих внутри JVM, что значительно облегчает анализ проблем. Более того, при определённых настройках его накладные расходы настолько малы, что многие (включая Oracle) рекомендуют держать его постоянно включённым везде, в том числе прод, чтобы в случае возникновения проблем сразу иметь полную картину происходившего с приложением. Просто мечта любого SRE!
Раньше этот механизм был доступен только в коммерческих версиях Java от корпорации Oracle версии 8 и более ранних. В какой-то момент его реимплементировали с нуля в OpenJDK 12, затем бекпортировали в OpenJDK 11, которая является LTS-версией. Однако вот OpenJDK 8 оставалась за бортом этого праздника жизни. Вплоть до выхода апдейта 8u272, в который наконец-то тоже бекпортировали JFR. Теперь все (за редким исключением) пользователи OpenJDK могут начинать использовать эту функциональность.
Активировать JFR можно несколькими путями. Один из них – задать соответствующие параметры при запуске Java-приложения. Для этого необходимо использовать два параметра:
java -XX:StartFlightRecording=filename=/path/to/record/file.jfr
Или:
java -XX:StartFlightRecording:filename=/path/to/record/file.jfr
#general
Однобуквенные языки программирования. Часть І
*Если интересна вторая часть, то проявите активность
А
Язык программирования A+ является потомком APL, как и другие языки на этой странице, потому что сообщество APL любит однобуквенные имена. Артур Уитни (создатель многих диалектов APL) создал A, затем Морган Стенли расширил его до A+.
B
Язык программирования B является предшественником C и в наши дни больше не используется.
C
Нет необходимости представлять C. Мы также можем считать C++ и C #, поскольку разрешены небуквенные и нецифровые символы.
D
D — это улучшенный C++. Если у вас есть возможность выбирать языки, считайте это рекомендацией проверить D!
E
Язык программирования E — довольно уникальный язык. Он ориентирован на распределенное программирование, а также на обеспечение безопасности.
Существует также Amiga E, который часто называли просто E. Воутер ван Оортмерссен задумывал его как язык сценариев для игр и описывает его как «огромный успех, он стал одним из самых популярных языков программирования на amiga.» Он доступен как бесплатная программа.
F
F# относительно хорошо известен. По сути, O'Caml портировали на .NET.
Также существует F, который является подмножеством Fortran. Он должен быть проще в обучении, использовании и откладке, чем полный Fortran.
F* — это функциональный язык программирования типа ML, предназначенный для проверки программ. Основным текущим вариантом использования F* является создание проверенной и удобной замены всего стека HTTPS.
G
G-код также называется языком программирования G, поэтому он подходит. Язык программирования устройств с числовым программным управлением (ЧПУ). Похоже на ассемблеры.
Внутри LabView есть настоящий язык программирования G. Это язык графического потока данных.
H
H — текстовый язык со слабой типизацией. О нём известно не так много.
Есть еще один H, который не менее полезен. H не является продуктивным инструментом. Вы не можете создать ничего полезного с помощью H.
I
I — это язык, вдохновленный J, который хочет расширить фокус с массивов на большее количество структур данных.
J
J — еще один потомок APL и, вероятно, самый популярный. Например, в Rosetta Code J — один из наиболее популярных языков.
K
K — один из главных потомков APL Артура Уитни. Это коммерческий продукт, используемый в банках для финансирования и торговли.
L
L был языком, который дал синтаксис C для TCL.
L является братом E по HP Labs. L — это подмножество Common Lisp.
L — это теоретический язык в книге «Вычислимость, сложность и языки: основы теоретической информатики».
M
Язык M был изобретен Французским Управлением государственных финансов (DGFiP), эквивалентным IRS, для преобразования налогового кода в машиночитаемые инструкции. Это небольшой предметно-ориентированный язык, основанный на объявлениях переменных и арифметических операциях. Реверс-инжиниринг компилятора доступен здесь.
N
Из запейволленой публикации 1989 года:
Ожидая в ближайшем будущем широкого использования алгоритмов нейронных сетей, наша цель — получить полную среду разработки программного обеспечения для программирования и тестирования новых приложений. Мы намерены создать язык высокого уровня для спецификации нейронных сетей как часть такой среды.
Однобуквенные языки программирования. Часть І
*Если интересна вторая часть, то проявите активность
А
Язык программирования A+ является потомком APL, как и другие языки на этой странице, потому что сообщество APL любит однобуквенные имена. Артур Уитни (создатель многих диалектов APL) создал A, затем Морган Стенли расширил его до A+.
B
Язык программирования B является предшественником C и в наши дни больше не используется.
C
Нет необходимости представлять C. Мы также можем считать C++ и C #, поскольку разрешены небуквенные и нецифровые символы.
D
D — это улучшенный C++. Если у вас есть возможность выбирать языки, считайте это рекомендацией проверить D!
E
Язык программирования E — довольно уникальный язык. Он ориентирован на распределенное программирование, а также на обеспечение безопасности.
Существует также Amiga E, который часто называли просто E. Воутер ван Оортмерссен задумывал его как язык сценариев для игр и описывает его как «огромный успех, он стал одним из самых популярных языков программирования на amiga.» Он доступен как бесплатная программа.
F
F# относительно хорошо известен. По сути, O'Caml портировали на .NET.
Также существует F, который является подмножеством Fortran. Он должен быть проще в обучении, использовании и откладке, чем полный Fortran.
F* — это функциональный язык программирования типа ML, предназначенный для проверки программ. Основным текущим вариантом использования F* является создание проверенной и удобной замены всего стека HTTPS.
G
G-код также называется языком программирования G, поэтому он подходит. Язык программирования устройств с числовым программным управлением (ЧПУ). Похоже на ассемблеры.
Внутри LabView есть настоящий язык программирования G. Это язык графического потока данных.
H
H — текстовый язык со слабой типизацией. О нём известно не так много.
Есть еще один H, который не менее полезен. H не является продуктивным инструментом. Вы не можете создать ничего полезного с помощью H.
I
I — это язык, вдохновленный J, который хочет расширить фокус с массивов на большее количество структур данных.
J
J — еще один потомок APL и, вероятно, самый популярный. Например, в Rosetta Code J — один из наиболее популярных языков.
K
K — один из главных потомков APL Артура Уитни. Это коммерческий продукт, используемый в банках для финансирования и торговли.
L
L был языком, который дал синтаксис C для TCL.
L является братом E по HP Labs. L — это подмножество Common Lisp.
L — это теоретический язык в книге «Вычислимость, сложность и языки: основы теоретической информатики».
M
Язык M был изобретен Французским Управлением государственных финансов (DGFiP), эквивалентным IRS, для преобразования налогового кода в машиночитаемые инструкции. Это небольшой предметно-ориентированный язык, основанный на объявлениях переменных и арифметических операциях. Реверс-инжиниринг компилятора доступен здесь.
N
Из запейволленой публикации 1989 года:
Ожидая в ближайшем будущем широкого использования алгоритмов нейронных сетей, наша цель — получить полную среду разработки программного обеспечения для программирования и тестирования новых приложений. Мы намерены создать язык высокого уровня для спецификации нейронных сетей как часть такой среды.
Однобуквенные языки программирования. Часть ІІ
О
O — это стековый язык с однобуквенными командами. Например, «io» читает строку ввода (i), а затем выводит ее (o).
P
Язык программирования P предназначен для асинхронного программирования, управляемого событиями. Он использовался для реализации и проверки стека драйверов USB-устройств, поставляемого с Microsoft Windows 8 и Windows Phone.
P′′ — это примитивный формальный язык с 1964 года. Это был первый язык без GOTO, подтверждённо полный по Тьюрингу. Brainfuck — это P ′′ плюс IO.
P# — это интерпретатор Пролога для .NET.
Q
Q — это оболочка вокруг K и базы данных kdb+, чтобы сделать ее более читаемой.
Другой язык Q — это функциональный язык программирования, основанный на переписывании терминов. Его сменил Pure.
Существует также Q#, «предметно-ориентированный язык программирования, используемый для выражения квантовых алгоритмов. Он должен использоваться для написания подпрограмм, которые выполняются на дополнительном квантовом процессоре под управлением классической главной программы и компьютера».
R
R — хорошо известный язык статистического программирования. Он считается наравне с коммерческими инструментами, такими как SAS.
S
S — это язык статистического программирования, а R считается реализацией. Большая часть кода S работает в R.
Т
T — диалект Scheme или Lisp. Последний релиз был в 1984 году, так что его можно считать мертвым.
U
Язык программирования U — личный проект Роба Апкрафта. Он хотел простой C-подобный язык для написания собственной операционной системы.
V
В сводке за 1985 год упоминается язык программирования V.
W
W был создан Виктором Тотом в 2001 году для программирования двух старинных компьютеров от HP. Это очень простой язык, описываемый как C, без ключевых слов, типов и стандартной библиотеки.
X
X# — это язык программирования низкого уровня, где-то между сборкой x86 и C. Он разработан в рамках Cosmos, набора инструментов для операционной системы с открытым исходным кодом.
X++ — это язык программирования, используемый в одном из программных продуктов Microsoft для планирования ресурсов предприятия. Он является производным от C++ и добавляет сборщик мусора и синтаксис запросов SQL.
Y
https://dl.acm.org/doi/10.1145/954269.954278
Z
Z-нотация — это формальный язык спецификаций, стандартизированный как ISO/IEC13568:2002.
Другой Z — крошечный, строгий, нечистый, каррированный, частично прикладной язык программирования с довольно своеобразным синтаксисом.
О
O — это стековый язык с однобуквенными командами. Например, «io» читает строку ввода (i), а затем выводит ее (o).
P
Язык программирования P предназначен для асинхронного программирования, управляемого событиями. Он использовался для реализации и проверки стека драйверов USB-устройств, поставляемого с Microsoft Windows 8 и Windows Phone.
P′′ — это примитивный формальный язык с 1964 года. Это был первый язык без GOTO, подтверждённо полный по Тьюрингу. Brainfuck — это P ′′ плюс IO.
P# — это интерпретатор Пролога для .NET.
Q
Q — это оболочка вокруг K и базы данных kdb+, чтобы сделать ее более читаемой.
Другой язык Q — это функциональный язык программирования, основанный на переписывании терминов. Его сменил Pure.
Существует также Q#, «предметно-ориентированный язык программирования, используемый для выражения квантовых алгоритмов. Он должен использоваться для написания подпрограмм, которые выполняются на дополнительном квантовом процессоре под управлением классической главной программы и компьютера».
R
R — хорошо известный язык статистического программирования. Он считается наравне с коммерческими инструментами, такими как SAS.
S
S — это язык статистического программирования, а R считается реализацией. Большая часть кода S работает в R.
Т
T — диалект Scheme или Lisp. Последний релиз был в 1984 году, так что его можно считать мертвым.
U
Язык программирования U — личный проект Роба Апкрафта. Он хотел простой C-подобный язык для написания собственной операционной системы.
V
В сводке за 1985 год упоминается язык программирования V.
W
W был создан Виктором Тотом в 2001 году для программирования двух старинных компьютеров от HP. Это очень простой язык, описываемый как C, без ключевых слов, типов и стандартной библиотеки.
X
X# — это язык программирования низкого уровня, где-то между сборкой x86 и C. Он разработан в рамках Cosmos, набора инструментов для операционной системы с открытым исходным кодом.
X++ — это язык программирования, используемый в одном из программных продуктов Microsoft для планирования ресурсов предприятия. Он является производным от C++ и добавляет сборщик мусора и синтаксис запросов SQL.
Y
https://dl.acm.org/doi/10.1145/954269.954278
Z
Z-нотация — это формальный язык спецификаций, стандартизированный как ISO/IEC13568:2002.
Другой Z — крошечный, строгий, нечистый, каррированный, частично прикладной язык программирования с довольно своеобразным синтаксисом.
#java
Методы Stream API (
Методы Stream API (
1/n
)filterОтфильтровывает записи, возвращает только записи, соответствующие условию.
skipПозволяет пропустить N первых элементов.
distinctВозвращает стрим без дубликатов (для метода equals)
mapПреобразует каждый элемент стрима
limitПозволяет ограничить выборку определенным количеством первых элементов
sortedПозволяет сортировать значения либо в натуральном порядке, либо задавая Comparator
#java
Многопоточность (
Многопоточность — это свойство системы выполнять несколько вычислений одновременно, тем самым ускоряя процесс этого вычисления. Например, когда Вы играете в компьютерные игры, вы видите, что Ваш персонаж выполняет определенное действие, другие персонажи, анимация, звук. Это все отдельные потоки если говорить примитивно.
В языке Java есть стандартный класс, который реализует многопоточность: Thread, который имплементирует Runable интерфейс. Для того, чтобы реализовать многопоточность в своей программе нужно унаследовать свой класс от Thread или имплементировать интерфейс Runable.
В классе Thread есть метод run() и start(), которые созданы чтобы делать вычисления и запускать выполнение кода соответственно. То есть в методе run() мы пишем, что хотим выполнить, а когда вызываем метод start(), он автоматически запускает наш код в run.
Потоки имеют определенные состояния. Всего их 4:
Многопоточность (
1/n
)Многопоточность — это свойство системы выполнять несколько вычислений одновременно, тем самым ускоряя процесс этого вычисления. Например, когда Вы играете в компьютерные игры, вы видите, что Ваш персонаж выполняет определенное действие, другие персонажи, анимация, звук. Это все отдельные потоки если говорить примитивно.
В языке Java есть стандартный класс, который реализует многопоточность: Thread, который имплементирует Runable интерфейс. Для того, чтобы реализовать многопоточность в своей программе нужно унаследовать свой класс от Thread или имплементировать интерфейс Runable.
В классе Thread есть метод run() и start(), которые созданы чтобы делать вычисления и запускать выполнение кода соответственно. То есть в методе run() мы пишем, что хотим выполнить, а когда вызываем метод start(), он автоматически запускает наш код в run.
Потоки имеют определенные состояния. Всего их 4:
⟡
создание (когда мы написали new Thread();⟡
старт (thread1.start());⟡
выполнение (пока выполняется метод run());⟡
завершение (когда поток выполнил свою работу).