⏱ Разбираем подробно Java ThreadLocal
Java
Класс
Отличие тред-локальной переменной от обычной в том, что ThreadLocal хранит отдельную независимую копию значения для каждого ее использующего потока. Работа с такой переменной потокобезопасна.
Проще говоря, объект класса ThreadLocal хранит внутри не одно значение, а как бы хэш-таблицу поток➝значение, и при использовании обращается к значению для текущего потока.
Первый, самый очевидный вариант использования – данные, относящиеся непосредственно к треду, определенный пользователем «контекст потока». На скриншоте ниже пример такого использования: ThreadId.get() вернет порядковый номер текущего треда.
Другой случай, с которым локальная переменная потока может помочь – кэширование read-only данных в многопоточной среде без дорогостоящей синхронизации.
Помимо обычного
➡️ Читать дальше
@javatg
Java
ThreadLocal
используется для создания локальных переменных потока. Мы знаем, что все потоки объекта совместно используют его переменные, поэтому переменная не является потокобезопасной. Мы можем использовать синхронизацию для обеспечения потокобезопасности, но если мы хотим избежать синхронизации, мы можем использовать переменные ThreadLocal .Класс
ThreadLocal
представляет хранилище тред-локальных переменных. По способу использования он похож на обычную обертку над значением, с методами get(), set() и remove() для доступа к нему, и дополнительным фабричным методом ThreadLocal.withInitial(), устанавливающим значение по-умолчанию.Отличие тред-локальной переменной от обычной в том, что ThreadLocal хранит отдельную независимую копию значения для каждого ее использующего потока. Работа с такой переменной потокобезопасна.
Проще говоря, объект класса ThreadLocal хранит внутри не одно значение, а как бы хэш-таблицу поток➝значение, и при использовании обращается к значению для текущего потока.
Первый, самый очевидный вариант использования – данные, относящиеся непосредственно к треду, определенный пользователем «контекст потока». На скриншоте ниже пример такого использования: ThreadId.get() вернет порядковый номер текущего треда.
Другой случай, с которым локальная переменная потока может помочь – кэширование read-only данных в многопоточной среде без дорогостоящей синхронизации.
Помимо обычного
ThreadLocal
, в стандартной библиотеке присутствует его расширение InheritableThreadLocal. Этот класс «наследует» значение – изначально берет его для потока, являющегося родителем текущего.➡️ Читать дальше
@javatg
👍6
25 самых используемых регулярных выражений в Java
Список из 25 регулярных выражений в Java, без которых не обойтись ни новичку, ни профессиональному разработчику. С примерами.
➡️ Читать дальше
@javatg
Список из 25 регулярных выражений в Java, без которых не обойтись ни новичку, ни профессиональному разработчику. С примерами.
➡️ Читать дальше
@javatg
👍7
Media is too big
VIEW IN TELEGRAM
Ночь бэкендеров в Яндекс Банке
Собеседования — это долго, скучно, иногда мучительно и не всегда понятно. Как вообще можно понять за пару часов, хочешь ли ты работать где-то в ближайшие пару лет? Поэтому в Финтехе Яндекса придумали кое-что получше — препати для тех, кто хочет взять компанию на тест-драйв. Можно бесконечно смотреть отзывы на Хабр Карьере, но лучше один раз увидеть всё своими глазами.
Ребята организуют подобные встречи уже не в первый раз, и в октябре собирают бэкендеров — чтобы совместить приятное с полезным: лично познакомиться с командой и руководством, услышать о продуктах в разработке от первых лиц, прошвырнуться по офису, подышать яндексовым воздухом и вообще приятно провести пятничный вечер.
Кормить будут. Вкусно. Поить тоже — бар прямо в офисе. А в промежутках между разговорами о невыносимой лёгкости бэкенд-бытия можно будет порубиться в PS5 с коллегами по цеху, выведать все инсайды у продакт-оунера и просто почилить. Если ты не в Москве, собирай чемоданы — ребята не будут дразнить кутежом в зуме, а купят билет и организуют трансфер.
P.S.: дресс-кода нет, но есть задачка с кодом. Если ты действительно бэкендер, то решишь её без труда и приглос у тебя в кармане! Подробности 👉 тут.
Собеседования — это долго, скучно, иногда мучительно и не всегда понятно. Как вообще можно понять за пару часов, хочешь ли ты работать где-то в ближайшие пару лет? Поэтому в Финтехе Яндекса придумали кое-что получше — препати для тех, кто хочет взять компанию на тест-драйв. Можно бесконечно смотреть отзывы на Хабр Карьере, но лучше один раз увидеть всё своими глазами.
Ребята организуют подобные встречи уже не в первый раз, и в октябре собирают бэкендеров — чтобы совместить приятное с полезным: лично познакомиться с командой и руководством, услышать о продуктах в разработке от первых лиц, прошвырнуться по офису, подышать яндексовым воздухом и вообще приятно провести пятничный вечер.
Кормить будут. Вкусно. Поить тоже — бар прямо в офисе. А в промежутках между разговорами о невыносимой лёгкости бэкенд-бытия можно будет порубиться в PS5 с коллегами по цеху, выведать все инсайды у продакт-оунера и просто почилить. Если ты не в Москве, собирай чемоданы — ребята не будут дразнить кутежом в зуме, а купят билет и организуют трансфер.
P.S.: дресс-кода нет, но есть задачка с кодом. Если ты действительно бэкендер, то решишь её без труда и приглос у тебя в кармане! Подробности 👉 тут.
👍3🤬3❤1
Существует ли способ решения проблемы race condition?
Распространённые способы решения:
• Использование локальной копии — копирование разделяемой переменной в локальную переменную потока. Этот способ работает только тогда, когда переменная одна и копирование производится атомарно (за одну машинную команду), использование volatile.
• Синхронизация - операции над разделяемым ресурсом происходят в синхронизированном блоке (при использовании ключевого слова synchronized).
• Комбинирование методов - вышеперечисленные способы можно комбинировать, копируя «опасные» переменные в синхронизированном блоке. С одной стороны, это снимает ограничение на атомарность, с другой — позволяет избавиться от слишком больших синхронизированных блоков.
Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок — правильное проектирование многозадачной системы.
@javatg
Распространённые способы решения:
• Использование локальной копии — копирование разделяемой переменной в локальную переменную потока. Этот способ работает только тогда, когда переменная одна и копирование производится атомарно (за одну машинную команду), использование volatile.
• Синхронизация - операции над разделяемым ресурсом происходят в синхронизированном блоке (при использовании ключевого слова synchronized).
• Комбинирование методов - вышеперечисленные способы можно комбинировать, копируя «опасные» переменные в синхронизированном блоке. С одной стороны, это снимает ограничение на атомарность, с другой — позволяет избавиться от слишком больших синхронизированных блоков.
Очевидных способов выявления и исправления состояний гонки не существует. Лучший способ избавиться от гонок — правильное проектирование многозадачной системы.
@javatg
👍6
#Вопросы_с_собеседования
❓Напишите однопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException.
Вопрос с подвохом: ConcurrentModificationException к многопоточности никакого отношения не имеет. Возникает эта штука тогда, когда мы пытаемся модифицировать коллекцию во время итерирования по ней.
@javatg
❓Напишите однопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException.
Вопрос с подвохом: ConcurrentModificationException к многопоточности никакого отношения не имеет. Возникает эта штука тогда, когда мы пытаемся модифицировать коллекцию во время итерирования по ней.
@javatg
👍18🤔1
⚙️ Работа с Git: подробная инструкция для новичков
Сегодня поговорим о системе контроля версий, а именно о Git (читается как ГИТ, а не ДЖИТ, как могло бы показаться из грамматики английского языка).
Да-да, я знаю что есть еще и Mercurial, SVN… Но будем откровенны: их время уже ушло, и тратить ваше драгоценное время на них не собираюсь.
Чтобы вы понимали важность знания гита в наше время, скажу так: без знания/понимания этого вам делать в программировании нечего. Но прелесть в том, что для постоянной работы не нужно держать в голове все команды и возможности. Нужно знать набор команд, которые помогут понимать всё, что происходит.
➡️ Читать дальше
@javatg
Сегодня поговорим о системе контроля версий, а именно о Git (читается как ГИТ, а не ДЖИТ, как могло бы показаться из грамматики английского языка).
Да-да, я знаю что есть еще и Mercurial, SVN… Но будем откровенны: их время уже ушло, и тратить ваше драгоценное время на них не собираюсь.
Чтобы вы понимали важность знания гита в наше время, скажу так: без знания/понимания этого вам делать в программировании нечего. Но прелесть в том, что для постоянной работы не нужно держать в голове все команды и возможности. Нужно знать набор команд, которые помогут понимать всё, что происходит.
➡️ Читать дальше
@javatg
👍9
☕ Компилирование и исполнение Java-кода в Runtime
Сегодня я хотел бы поговорить про динамическое компилирование и исполнение Java-кода, подобно скриптовым языкам программирования. В этой статье вы найдете пошаговое руководство как скомпилировать Java в Bytecode и загрузить новые классы в ClassLoader на лету.
Зачем?
В разработке все чаще возникают типовые задачи, которые можно было бы закрыть простой генерацией кода. Например, сгенерировать DTO классы по имеющейся спецификации по стандартам OpenAPI или AsyncAPI. В целом, для генерации кода нет необходимости компилировать и выполнять код в runtime, ведь можно сгенерировать исходники классов, а собрать уже вместе с проектом. Однако при написании инструментов для генерации кода, было бы не плохо покрыть это тестами. А при проверке самый очевидный сценарий: сгенерировал-скомпилировал-загрузил-проверил-удалил. И вот тут-то и возникает задача генерации и проверки кода "на лету".
Также иногда возникают потребности выполнять какой-то код удаленно. Как правило это какие-то распределенные облачные вычисления. В этом случае можно отправлять исходный код на вычислительный узел, а там уже происходит динамическая сборка и выполнение.
➡️ Читать дальше
⚙️ Код
@javatg
Сегодня я хотел бы поговорить про динамическое компилирование и исполнение Java-кода, подобно скриптовым языкам программирования. В этой статье вы найдете пошаговое руководство как скомпилировать Java в Bytecode и загрузить новые классы в ClassLoader на лету.
Зачем?
В разработке все чаще возникают типовые задачи, которые можно было бы закрыть простой генерацией кода. Например, сгенерировать DTO классы по имеющейся спецификации по стандартам OpenAPI или AsyncAPI. В целом, для генерации кода нет необходимости компилировать и выполнять код в runtime, ведь можно сгенерировать исходники классов, а собрать уже вместе с проектом. Однако при написании инструментов для генерации кода, было бы не плохо покрыть это тестами. А при проверке самый очевидный сценарий: сгенерировал-скомпилировал-загрузил-проверил-удалил. И вот тут-то и возникает задача генерации и проверки кода "на лету".
Также иногда возникают потребности выполнять какой-то код удаленно. Как правило это какие-то распределенные облачные вычисления. В этом случае можно отправлять исходный код на вычислительный узел, а там уже происходит динамическая сборка и выполнение.
➡️ Читать дальше
⚙️ Код
@javatg
👍10
Вышла Java 19
Вышла общедоступная версия Java 19. В этот релиз попало более двух тысяч закрытых задач и 7 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.
Ссылки на скачивание:
Oracle JDK
OpenJDK
Вот список JEP'ов, которые попали в Java 19
Паттерн-матчинг для switch (Third Preview) (JEP 427)
Паттерн-матчинг для switch, который появился в Java 17 в режиме preview и остался на второе preview в Java 18, всё ещё остаётся в этом статусе. Это первый случай в Java, когда языковой конструкции не хватило двух релизов, чтобы стать стабильной: ранее все конструкции укладывались в два preview.
В этом релизе в паттерн-матчинг было внесено два главных изменения.
➡️ Читать дальше
@javatg
Вышла общедоступная версия Java 19. В этот релиз попало более двух тысяч закрытых задач и 7 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.
Ссылки на скачивание:
Oracle JDK
OpenJDK
Вот список JEP'ов, которые попали в Java 19
Паттерн-матчинг для switch (Third Preview) (JEP 427)
Паттерн-матчинг для switch, который появился в Java 17 в режиме preview и остался на второе preview в Java 18, всё ещё остаётся в этом статусе. Это первый случай в Java, когда языковой конструкции не хватило двух релизов, чтобы стать стабильной: ранее все конструкции укладывались в два preview.
В этом релизе в паттерн-матчинг было внесено два главных изменения.
➡️ Читать дальше
@javatg
👍11❤2🔥2🤔1
Forwarded from Data Science. SQL hub
Как хранить сеть дорог в БД для построения маршрута?
И так, формулировка задачи следующая: есть база данных, в ней хранится информация о дорогах, включая координаты, нужно реализовать построение маршрутов из начальной точки к конечной.
Построение маршрутов - задача распространенная, и, как для каждой распространённой задачи, для неё давно существуют реализации. Мне нравится GraphHopper. Да так нравится, что моя первая статья на Хабре была про то, как создать для него собственные правила построения графа дорог.
➡️ Читать дальше
@sqlhub
И так, формулировка задачи следующая: есть база данных, в ней хранится информация о дорогах, включая координаты, нужно реализовать построение маршрутов из начальной точки к конечной.
Построение маршрутов - задача распространенная, и, как для каждой распространённой задачи, для неё давно существуют реализации. Мне нравится GraphHopper. Да так нравится, что моя первая статья на Хабре была про то, как создать для него собственные правила построения графа дорог.
➡️ Читать дальше
@sqlhub
👍6❤1🔥1
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.
Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.
➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.
Подписывайтесь и качайте свои скиллы: @javatasks
Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.
➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.
Подписывайтесь и качайте свои скиллы: @javatasks
🔥5👍3🤩1
Cookie в java
Куки представляют простейший способо хранения данных приложения. Куки хранятся в браузере польвователя в виде пары ключ-значение: с каждым уникальным ключом сопоставлется определенное значение. По ключу мы можем получить сохраненное в куках значение. Приложение на сервере может устанавливать куки и отправлять в ответе пользователю, после чего куки сохраняются в браузере. Когда клиент отправляет запроск приложению, то в запросе также отправляются и те куки, которые установленны данным приложением.
➡️ Читать дальше
@javatg
Куки представляют простейший способо хранения данных приложения. Куки хранятся в браузере польвователя в виде пары ключ-значение: с каждым уникальным ключом сопоставлется определенное значение. По ключу мы можем получить сохраненное в куках значение. Приложение на сервере может устанавливать куки и отправлять в ответе пользователю, после чего куки сохраняются в браузере. Когда клиент отправляет запроск приложению, то в запросе также отправляются и те куки, которые установленны данным приложением.
➡️ Читать дальше
@javatg
👍9❤1🔥1
Какого размера должен быть пул потоков?
Настраивая размер пула потоков, важно избежать двух ошибок: слишком мало потоков (очередь на выполнение будет расти, потребляя много памяти) или слишком много потоков (замедление работы всей систему из-за частых переключений контекста).
Оптимальный размер пула потоков зависит от количества доступных процессоров и природы задач в рабочей очереди. На N-процессорной системе для рабочей очереди, которая будет выполнять исключительно задачи с ограничением по скорости вычислений, можно достигнуть максимального использования CPU с пулом потоков, в котором содержится N или N+1 поток. Для задач, которые могут ждать осуществления I/O (ввода - вывода) - например, задачи, считывающей HTTP-запрос из сокета – может понадобиться увеличение размера пула свыше количества доступных процессоров, потому, что не все потоки будут работать все время. Используя профилирование, можно оценить отношение времени ожидания (WT) ко времени обработки (ST) для типичного запроса. Если назвать это соотношение WT/ST, то для N-процессорной системе понадобится примерно N*(1 + WT/ST) потоков для полной загруженности процессоров.
Использование процессора – не единственный фактор, важный при настройке размера пула потоков. По мере возрастания пула потоков, можно столкнуться с ограничениями планировщика, доступной памяти, или других системных ресурсов, таких, как количество сокетов, дескрипторы открытого файла, или каналы связи базы данных.
ThreadPoolExecutor имеет очень понятный javadoc, поэтому нет смысла его перефразировать. Вместо этого, давайте попробуем сделать наш собственный:
@javatg
Настраивая размер пула потоков, важно избежать двух ошибок: слишком мало потоков (очередь на выполнение будет расти, потребляя много памяти) или слишком много потоков (замедление работы всей систему из-за частых переключений контекста).
Оптимальный размер пула потоков зависит от количества доступных процессоров и природы задач в рабочей очереди. На N-процессорной системе для рабочей очереди, которая будет выполнять исключительно задачи с ограничением по скорости вычислений, можно достигнуть максимального использования CPU с пулом потоков, в котором содержится N или N+1 поток. Для задач, которые могут ждать осуществления I/O (ввода - вывода) - например, задачи, считывающей HTTP-запрос из сокета – может понадобиться увеличение размера пула свыше количества доступных процессоров, потому, что не все потоки будут работать все время. Используя профилирование, можно оценить отношение времени ожидания (WT) ко времени обработки (ST) для типичного запроса. Если назвать это соотношение WT/ST, то для N-процессорной системе понадобится примерно N*(1 + WT/ST) потоков для полной загруженности процессоров.
Использование процессора – не единственный фактор, важный при настройке размера пула потоков. По мере возрастания пула потоков, можно столкнуться с ограничениями планировщика, доступной памяти, или других системных ресурсов, таких, как количество сокетов, дескрипторы открытого файла, или каналы связи базы данных.
ThreadPoolExecutor имеет очень понятный javadoc, поэтому нет смысла его перефразировать. Вместо этого, давайте попробуем сделать наш собственный:
public class ThreadPool implements Executor {
private final Queue<Runnable> workQueue = new ConcurrentLinkedQueue<>();
private volatile boolean isRunning = true;
public ThreadPool(int nThreads) {
for (int i = 0; i < nThreads; i++) {
new Thread(new TaskWorker()).start();
}
}
@Override
public void execute(Runnable command) {
if (isRunning) {
workQueue.offer(command);
}
}
public void shutdown() {
isRunning = false;
}
private final class TaskWorker implements Runnable {
@Override
public void run() {
while (isRunning) {
Runnable nextTask = workQueue.poll();
if (nextTask != null) {
nextTask.run();
}
}
}
}
}
@javatg
👍13🔥3❤1
English for Developers - канал для тех, кто хочет учить технический английский. От создатателей популярного ит-канала Data analysis.
1. техническая лексика
2. опросы на английском
3. шутки на английском
Подписывайтесь, проходите опросы, читайте полезные прогерские фразы на английском: english_forprogrammers.
1. техническая лексика
2. опросы на английском
3. шутки на английском
Подписывайтесь, проходите опросы, читайте полезные прогерские фразы на английском: english_forprogrammers.
👍7🔥1👏1
💻 Apache Struts
Apache Struts — фреймворк с открытым исходным кодом для создания Java EE веб-приложений. Struts был создан для того, чтобы чётко разделить модель (бизнес-логику), представление (HTML-страницы) и контроллер (отвечающий за передачу данных от модели к представлению и обратно).
⚙️ Github
🗒 Java Docs
@javatg
Apache Struts — фреймворк с открытым исходным кодом для создания Java EE веб-приложений. Struts был создан для того, чтобы чётко разделить модель (бизнес-логику), представление (HTML-страницы) и контроллер (отвечающий за передачу данных от модели к представлению и обратно).
⚙️ Github
🗒 Java Docs
@javatg
GitHub
GitHub - apache/struts: Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications
Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications - apache/struts
👍5❤1🔥1
Гайд для «джуна». Что нужно знать начинающему разработчику Java, чтобы получить работу
Рассказываем, что должен выучить Java-разработчик на junior-позиции. А ещё — где получить опыт и как проявить компетенции и скиллы.
https://tproger.ru/articles/gajd-dlja-dzhuna-chto-nuzhno-znat-nachinajushhemu-razrabotchiku-java-chtoby-poluchit-rabotu/
Рассказываем, что должен выучить Java-разработчик на junior-позиции. А ещё — где получить опыт и как проявить компетенции и скиллы.
https://tproger.ru/articles/gajd-dlja-dzhuna-chto-nuzhno-znat-nachinajushhemu-razrabotchiku-java-chtoby-poluchit-rabotu/
Tproger
Как выучить Java, чтобы получить работу / Tproger
Рассказываем, как выучить язык программирования Java и получить первый опыт, чтобы претендовать на позицию Junior-разработчика.
👍12🔥1
GitHub Actions и Vercel — быстрое развертывание проектов
Vercel — один из лучших хостингов благодаря своей простоте и адаптивности. Он позволяет максимально быстро размещать проекты и практически не требует настройки. Применение Vercel с GitHub для развертывания проектов делает разработку намного более увлекательной. Отправка нового обновления на GitHub позволяет автоматически развертывать код, оптимизируя процесс CI/CD.
Что такое GitHub Actions?
GitHub Actions — это платформа CI/CD для автоматизации рабочих процессов сборки, тестирования и развертывания. С помощью этих процессов вы можете создавать и тестировать пул-реквесты в личном репозитории или развертывать объединенные пул-реквесты в производственном репозитории.
GitHub Actions упрощает автоматизацию всех действий с ПО. В настоящее время эта платформа включает первоклассные технологии CI/CD, позволяющие настраивать ревью кода, управление ветками и сортировку issue.
Как GitHub Actions взаимодействует с Vercel
GitHub Actions автоматически развертывает проекты GitHub с помощью Vercel, предоставляя предварительные URL-адреса развертывания и автоматические обновления пользовательских доменов. Когда вы создаете новый проект Vercel на GitHub и обеспечиваете автоматическое развертывание в каждой ветке, Vercel отслеживает каждую отправку изменений в ветку и развертывает по умолчанию. Если Vercel уже работает с предыдущим коммитом, то текущий процесс отменяется для создания самого последнего коммита. Таким образом, всегда происходит развертывание самых актуальных изменений.
1 вариант для тестирования: модель Fork.
2 вариант для тестирования: tmate.
➡️ Читать дальше
⚙️ Vercel
@javatg
Vercel — один из лучших хостингов благодаря своей простоте и адаптивности. Он позволяет максимально быстро размещать проекты и практически не требует настройки. Применение Vercel с GitHub для развертывания проектов делает разработку намного более увлекательной. Отправка нового обновления на GitHub позволяет автоматически развертывать код, оптимизируя процесс CI/CD.
Что такое GitHub Actions?
GitHub Actions — это платформа CI/CD для автоматизации рабочих процессов сборки, тестирования и развертывания. С помощью этих процессов вы можете создавать и тестировать пул-реквесты в личном репозитории или развертывать объединенные пул-реквесты в производственном репозитории.
GitHub Actions упрощает автоматизацию всех действий с ПО. В настоящее время эта платформа включает первоклассные технологии CI/CD, позволяющие настраивать ревью кода, управление ветками и сортировку issue.
Как GitHub Actions взаимодействует с Vercel
GitHub Actions автоматически развертывает проекты GitHub с помощью Vercel, предоставляя предварительные URL-адреса развертывания и автоматические обновления пользовательских доменов. Когда вы создаете новый проект Vercel на GitHub и обеспечиваете автоматическое развертывание в каждой ветке, Vercel отслеживает каждую отправку изменений в ветку и развертывает по умолчанию. Если Vercel уже работает с предыдущим коммитом, то текущий процесс отменяется для создания самого последнего коммита. Таким образом, всегда происходит развертывание самых актуальных изменений.
1 вариант для тестирования: модель Fork.
2 вариант для тестирования: tmate.
➡️ Читать дальше
⚙️ Vercel
@javatg
👍8❤1🔥1
📁 Настраиваем Git для правильной работы с опенсорс-проектами
Как принять участие в разработке проекта с открытым исходным кодом и внести свой вклад, не наломав дров?
Краткое руководство, чтобы меньше разочаровываться и больше работать над улучшением рабочих процессов.
Форк-проект
После того как вы настроили свой профиль на GitHub, вам необходимо форкнуть проект, в который вы планируете внести свой вклад. Поскольку доступ на запись к проектам с открытым исходным кодом контролируется сопровождающим (сопровождающими), вы никогда не будете вносить прямые изменения в репозиторий проекта. Вместо этого, мы форкаем (или копируем) исходный код проекта в свой личный аккаунт, чтобы было куда вносить изменения, не затрагивая исходный репозиторий. Легче всего форкнуть проект через GitHub WebUI. Перейдя на страницу GitHub проекта, в который вы хотите внести свой вклад, найдите кнопку Fork в правом верхнем углу.
➡️ Читать дальше
@javatg
Как принять участие в разработке проекта с открытым исходным кодом и внести свой вклад, не наломав дров?
Краткое руководство, чтобы меньше разочаровываться и больше работать над улучшением рабочих процессов.
Форк-проект
После того как вы настроили свой профиль на GitHub, вам необходимо форкнуть проект, в который вы планируете внести свой вклад. Поскольку доступ на запись к проектам с открытым исходным кодом контролируется сопровождающим (сопровождающими), вы никогда не будете вносить прямые изменения в репозиторий проекта. Вместо этого, мы форкаем (или копируем) исходный код проекта в свой личный аккаунт, чтобы было куда вносить изменения, не затрагивая исходный репозиторий. Легче всего форкнуть проект через GitHub WebUI. Перейдя на страницу GitHub проекта, в который вы хотите внести свой вклад, найдите кнопку Fork в правом верхнем углу.
➡️ Читать дальше
@javatg
👍7❤1🔥1
✔️ HashMap в Java— что за карта такая?
Сегодня мы поговорим о еще одной структуре данных — Map. Ее официальное русское название — “ассоциативный массив”, но его используют нечасто. Более распространены варианты “словарь”, “карта”, или (чаще всего) — сленговый англицизм “мапа” 🙂 Внутри Map данные хранятся в формате “ключ”-”значение”, то есть по парам. И в качестве ключей, и в качестве значений могут выступать любые объекты — числа, строки или объекты других классов.
➡️ Читать дальше
@javatg
Сегодня мы поговорим о еще одной структуре данных — Map. Ее официальное русское название — “ассоциативный массив”, но его используют нечасто. Более распространены варианты “словарь”, “карта”, или (чаще всего) — сленговый англицизм “мапа” 🙂 Внутри Map данные хранятся в формате “ключ”-”значение”, то есть по парам. И в качестве ключей, и в качестве значений могут выступать любые объекты — числа, строки или объекты других классов.
➡️ Читать дальше
@javatg
👍7❤3🔥2