По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Дистрибутив FreePBX Distro имеет встроенный скрипт, который позволяет изменить текущую (используемую) версию Asterisk. Важно, что сделать это можно буквально за минуту, и без проблем вернуться на ранее используемую версию. При смене версии используется только одна команда, после ввода которой, мы остается следовать подсказкам меню. Команда следующая: [root@localhost ~]# asterisk-version-switch На следующем этапе, скрипт спросит на какую версию вы хотите переключиться: Pick the Asterisk Version you would like to change to. Press 1 and the Enter key for Asterisk 11 Press 2 and the Enter key for Asterisk 13 Press 3 and the Enter key for Asterisk 14 (Currently in beta) Press 9 and the Enter key to exit and not change your Asterisk Version Нажимаем 1 для переключения на 11 версию Asterisk Нажимаем 2 для переключения на 13 версию Asterisk Нажимаем 3 для переключения на 14 версию Asterisk (сейчас в Beta состоянии) Нажимаем 9 выхода из скрипта без изменений версии Далее начнется изменение конфигурации в соответствие с выбранной версией. По окончанию работы вы можете проверить текущую версию с помощью команды: [root@localhost ~]# asterisk -x "core show version" Asterisk 13.10.0 built by mockbuild @ jenkins2.schmoozecom.net on a i686 running Linux on 2016-07-27 01:24:12 UTC Если версия осталась прежней, дайте в консоль команду: [root@localhost ~]# fwconsole restart По окончанию перезагружаем конфигурацию и Asterisk: [root@localhost ~]# fwconsole reload
img
Уже прошло несколько лет с тех пор, как появился Kotlin, и он преуспевает. Так как Kotlin был создан в качестве замены Java, то его, как и следовало ожидать, во многом сравнивают именно с ним. Чтобы помочь вам выбрать один из двух языков, я сравню основные аспекты каждого из них.  Вот 8 пунктов, которые я рассмотрю в этой статье: Синтаксис Лямбда-выражения Обработка нулей Классы предметной области Глобальные переменные Параллелизм Функции расширения Сообщество Сравнение синтаксиса Давайте сначала проведем сравнение базового синтаксиса. Я думаю, что многие из вас, кто читает эту статью, возможно, уже знают кое-что о Java и/или Kotlin, но я все же приведу пример, чтобы мы могли явно их сравнить: Java public class HelloClass { public void FullName(String firstName, String lastName) {    String fullName = firstName + " " + lastName; System.out.println("My name is : " + fullName); }       public void Age() { int age = 21; System.out.println("My age is : " + age); } public static void main(String args[]) { HelloClass hello = new HelloClass(); hello.FullName("John","Doe");        hello.Age(); } } Kotlin class NameClass {    fun FullName(firstName: String, lastName:String) {        var fullName = "$firstName $lastName"        println("My Name is : $fullName")    } } fun Age() { var age : Int    age = 21    println("My age is: $age") } fun main(args: Array) {    NameClass().FullName("John","Doe")    Age() } Код не сильно отличается, если не считать небольших различий в синтаксисе методов и классов. Но реальное различие заключается в том, что Kotlin поддерживает вывод типов, где тип переменной не нужно объявлять. А еще там не нужны точки с запятой ( ; ). Также можно отметить, что Kotlin не сильно придерживается принципов ООП, в отличие от Java, где все содержится внутри класса. Посмотрите хотя бы на функции Age и main в примере – они не находятся внутри класса. Kotlin, как правило, имеет меньше строк кола, а вот Java придерживается традиционного подхода и, соответственно, является достаточно многословным.  Одно из преимуществ Kotlin перед Java – он может делать все, используя как традиционный ООП-подход, так и любой другой.  Лямбда-выражения Если мы заговорили о Java и Kotlin, то мы, конечно же, должны поговорить об их знаменитых лямбда-выражениях. У Kotlin есть встроенная поддержка лямбда-функций (и всегда была), а вот в Java она появилась только в Java 8.  Давайте посмотрим, как они выглядят. Java //syntaxes parameter -> expression (parameter1, parameter2) -> { code } //sample usage ArrayList numbers = new ArrayList(); numbers.add(5); numbers.add(9); numbers.forEach( (n) -> { System.out.println(n); } ); Kotlin //syntax { parameter1, parameter2 -> code } //sample usage max(strings, { a, b -> a.length < b.length }) В Java скобки не являются обязательными: если есть только один параметр, то они не нужны. Но в Kotlin скобки нужны всегда. Однако, в общем и целом, помимо синтаксиса, различий не так уж и много.  Как по мне, лямбда-функции используются только в качестве методов обратного вызова. Хоть они и имеют гораздо более широкий спектр применений, все же они не очень читабельны, в связи с чем их реже используют. Они, конечно, сократят объем вашего кода, но разобраться в нем потом будет достаточно сложно.  Это вопрос предпочтений, но мне кажется, что намного удобнее, когда скобки используются всегда, как в Kotlin, потому что так код становится более читабельным.  Обработка нулей В объектно-ориентированном языке значения нулевого типа всегда были проблемой. Когда вы пытаетесь использовать содержимое нулевого значения, выпадает исключение нулевого указателя (NPE - Null Pointer Exception). Поскольку NPE всегда были проблемой, то и у Java, и у Kotlin есть свой способ обработки нулевых объектов. Как они это делают, я покажу ниже.  Java Object object = objServ.getObject(); //traditional approach of null checking if(object!=null){    System.out.println(object.getValue()); } //Optional was introduced in Java 8 to further help with null values //Optional nullable will allow null object Optional objectOptional = Optional.ofNullable(objServ.getObject()); //Optional.of - throws NullPointerException if passed parameter is null Optional objectNotNull = Optional.of(anotherObj); if(objectOptional.isPresent()){    Object object = objectOptional.get();    System.out.println(object.getValue()); } System.out.println(objectNotNull.getValue()); Kotlin  //Kotlin uses null safety mechanism var a: String = "abc" // Regular initialization means non-null by default a = null // compilation error //allowing null only if it is set Nullable var b: String? = "abc" // can be set null b = null // ok print(b) Сколько себя помню, в Java использовалась обычная проверка нулей, которой свойственен человеческий фактор. Затем в Java 8 появились необязательные классы, которые создают возможность для более надежной проверки нулевых значений, особенно со стороны API/сервера.  А вот Kotlin, если переменная допускает возможность нулевого значения, позволяет использовать операторы безопасного вызова. Я еще не пользовался необязательным классом, но, мне кажется, что его механизм работы и назначение чем-то похожи на операторы безопасного вызова в Kotlin. Оба варианта помогают определить, какая переменная может быть нулевой, и убедиться, что была реализована корректная проверка.  Иногда в коде может быть много переменных, которые надо проверить, и их слишком много для того, чтобы проверить их все. Но если вы будете добавлять проверки везде, где нужно, это сделает нашу кодовую базу просто безобразной, а это, я думаю, никому не понравится, так ведь? На мой взгляд, использование необязательных классов Java ощущается более сложным из-за объема кода, который надо добавить. А вот в Kotlin можно просто добавить немного кода, который будет проверять нулевые значения за вас.  Класс предметной области Некоторые называют это классом-сущностью. Ниже я привел примеры того, как классы используются в качестве классов предметной области в каждом языке. Java public class Student {     private String name;     private Integer age;         // Default constructor public Student() { }     public void setName(String name) {         this.name = name;     }     public String getName() {         return name;     }         public void setAge(Integer age) {         this.age = age;     }     public Integer getAge() {         return age;     } } Kotlin //Kotlin data class data class Student(var name: String = "", var age: Int = 0) //Usage var student: Student = Student("John Doe", 21) В Java свойства объявляются как частные (private) в соответствии с технологией инкапсуляции. Когда вы пытаетесь получить доступ к этим свойствам, Java использует сеттеры и геттеры, а также методы isEqual или toString, когда это необходимо. В Kotlin классы данных вводятся для определенных целей классов предметной области. Классы данных обеспечивают прямой доступ к свойствам. Они также предоставляют несколько встроенных служебных методов, таких как equals(), toString() и copy(). Я считаю, что классы данных — одна из лучших вещей, которые предлагает Kotlin. Они стремятся уменьшить количество шаблонного кода, который требуется для обычных классов предметной области, и они хорошо справляются с этой задачей. Случайное фото… потому что вы уже на полпути! Глобальные переменные Иногда может возникнуть необходимость создать такую переменную, которая была бы доступна в вашей кодовой базе везде. Для этого существуют глобальные переменные. Kotlin и Java имеют свои способы решения этой проблемы.  Java public class SomeClass { public static int globalNumber = 10; } //can be called without initializing the class SomeClass.globalNumber; Kotlin class SomeClass {    companion object {        val globalNumber = 10    } } //called exactly the same like usual SomeClass.globalNumber Некоторые из вас, возможно, уже знакомы с ключевым словом static, которое используется в некоторых других языках, таких как C++. Оно инициализируется в начале выполнения программы, и Java использует его для создания глобальных переменных, так как оно не содержится в качестве объекта. Это значит, что к нему можно получить доступ откуда угодно без инициализации класса как объекта.  Kotlin использует здесь совершенно иной подход: он убирает ключевое слово static и заменяет его объектом-компаньоном, который очень похож на одноэлементный класс. Это позволяет реализовывать сложные функциональные средства, такие как расширения и интерфейсы. То, что в Kotlin отсутствует ключевое слово static, застало меня врасплох. Вы, конечно, можете возразить, что использование ключевого слова static не самый удачный подход из-за его природы и сложности его проверки, и что, конечно же, объект-компаньон в Kotlin может легко его заменить. Даже в таком случае использование static для глобальной переменной не должно быть слишком сложным. Если мы будем осторожны с глобальными переменными и не сделаем для себя привычкой создавать их постоянно, то у нас все будет в порядке. Объект-компаньон также может дать нам некоторую гибкость при взаимодействии и т.п., но как часто мы будем взаимодействовать с одноэлементными классами? Я думаю, что ключевые слова static помогают нам сохранять краткость и ясность в отношении глобальных переменных. Параллелизм В наши дни параллелизм является популярной темой для обсуждения. Иногда способность языка программирования выполнять несколько задач одновременно может стать решающим критерием при выборе языка.  Теперь давайте посмотрим, как эти два языка решают эту задачу. Java // Java code for thread creation by extending // the Thread class class MultithreadingDemo extends Thread {    public void run()    {        try        {            // Displaying the thread that is running            System.out.println ("Thread " +                  Thread.currentThread().getId() +                  " is running");        }        catch (Exception e)        {            // Throwing an exception            System.out.println ("Exception is caught");        }    } } // Main Class public class Multithread {    public static void main(String[] args)    {        int n = 8; // Number of threads        for (int i=0; i) {    var number = 1    var result = number.plusOne()    println("Result is: $result") } Они позволяют добавить в класс новую функцию, при этом она не будет распространяться на класс или не нужно будет использовать какие-то замысловатые шаблоны проектирования. Она даже позволяет вам добавить функцию к изменяемому классу Kotlin. Вы практически можете попрощаться с тем самым методом lib, который требует, чтобы вы передавали все внутри своих параметров. Сообщество И последнее, но оттого не менее важное: давайте поговорим о чем-то нетехнического характера. Во-первых, давайте посмотрим на результаты опроса, которые отображают наиболее часто используемые языки программирования в 2020 году.  Здесь можно видеть, что одним из наиболее часто используемых языков является Java. И несмотря на то, что Kotlin все еще набирает обороты, сообщество Java все же в несколько раз больше, чем сообщество Kotlin, и, скорее всего, в ближайшее время это не сильно изменится.  Тогда какое это имеет значение? На самом деле имеет, и большое. Так как у Java большое сообщество, то тем, кто работает с Java, гораздо легче найти ссылки или получить помощь, когда это необходимо, как в Интернете, так и в реальной жизни.  Многие компании все еще используют Java в качестве основы, и это может так и остаться в ближайшее время, даже с учетом того, что Kotlin совместим с Java. Обычно переход на новые технологии не происходит для какой-либо одной бизнес-цели, только если у компании нет для этого действительно серьезных оснований.  Подведем итог Для тех, кто решил просто прочитать краткое изложение, вот что мы обсудили: синтаксис: структуры не сильно отличаются, разве что в некоторых мелочах, но Kotlin более гибкий в некоторых моментах; лямбда-выражения: синтаксис практически одинаковый, но Kotlin использует фигурные скобки для того, чтобы код было удобнее читать; обработка нулей: для того, чтобы обработку нулевых значений, Java использует класс, а Kotlin – встроенные операторы безопасных вызовов; классы предметной области: Java использует классы с частными переменными и геттерами/сеттерами, а Kotlin обеспечивает их работу с помощью классов данных; глобальные переменные: Java использует ключевое слово static, а Kotlin – что-то на подобие подклассов; параллелизм: Java использует многопоточность, а Kotlin – сопрограммы (которые обычно более легковесные); функции расширения: это новая функция, введенная в Kotlin, которая позволяет легко добавлять функции в классы, при этом не расширяя их; сообщество: здесь Java по-прежнему лидирует, что помогает в его изучении и получении необходимой помощи. Есть множество других особенностей, которые мы могли бы сравнить. Но то, что мы здесь уже обсудили, я считаю, является основным и самым важным.  На сегодняшний день, я думаю, Kotlin стоит того, чтобы обратить на него внимание. С точки зрения разработки, это поможет избавиться от длинного шаблонного кода и сделать его понятным и коротким. Если вы уже программируете на Java, то изучение Kotlin должно легко вам даться, и вы можете с этим не спешить. 
img
Введение За счет ветвления в Git разработчики могут работать сразу над несколькими функциями или изменениями, не мешая друг другу и не меняя основную кодовую базу. Поскольку ветки – это неотъемлемая часть Git, были приняты некоторые соглашения о присвоении им имен, призванные поддерживать понятность и структурированность кодовой базы.  Особенно важно придерживаться методических рекомендаций по присвоению имен, когда вы работаете над проектом совместно с другими разработчиками. Это позволит избежать путаницы и обеспечит планомерность работы каждого. В этой статье мы расскажем о различных соглашениях о присвоении имен веткам Git и поделимся рекомендациями, как создать структурированный репозиторий. Типы веток в Git Ветки в Git можно разделить на два типа в зависимости от их продолжительности жизни и типа вносимых ими изменений: Постоянные ветки Временные ветки Такое разделение позволяет командам эффективнее управлять своими рабочими процессами в Git. Правильно выбранные имена гарантируют, что ветки с длительным жизненным циклом будут стабильными, а временные ветки будут использоваться для конкретных сиюминутных задач и не будут наводить беспорядок в репозитории. В следующих разделах мы подробнее описали эти типы веток. Постоянные ветки Постоянные ветки Git – это ветки с длительным жизненным циклом, которые являются надежным и структурированным способом организации текущей работы. Эти ветки доступны в репозитории на постоянной основе, а их имена довольно просты.  Вот некоторые постоянные ветки Git: Основная ветка (master/main) . Производственная ветка в репозитории Git, используемая по умолчанию, которая должна быть неизменно стабильной. Разработчики могут включать изменения в основную ветку только после рецензирования и тестирования кода. Все участники проекта обязаны поддерживать стабильность и актуальность основной ветки.  Ветка разработки (dev) . Главная ветка разработки, которая выступает в качестве центрального узла для разработчиков, где они могут интегрировать свои новые функции, исправлять какие-то ошибки и вносить любые другие изменения. Ее основная задача – быть тем местом, где разработчики могут вносить изменения, не реализовывая их непосредственно в основной ветке. Разработчики тестируют, рецензируют и только потом включают эти изменения в основную ветку. Ветка контроля качества (QA/test) . Эта ветка содержит весь код, готовый к проверке качества и автоматизированному тестированию. Тестирование качества – это необходимый этап перед добавлением каких-либо изменений в производственную среду, который позволяет поддерживать стабильность кодовой базы. Временные ветки Временные ветки – это одноразовые ветки с непродолжительным жизненным циклом. Эти ветки служат конкретным сиюминутным целям и чаще всего потом удаляются. Вот некоторые временные ветки Git: Bugfix-ветка . Эта ветка содержит код с ошибками, которые необходимо исправить как можно скорее. Это может быть отклоненный код из feature-веток, который необходимо исправить перед внедрением. Hotfix-ветка . Это ветка для внедрения временного решения в ошибочный код без соблюдения стандартной процедуры. Эта ветка используется только в экстренных случаях и когда необходимо быстро внести исправление. Разработчики включают hotfix-ветку непосредственно в производственную ветку, а затем уже в ветку разработки.   Feature-ветка . Эта ветка предназначена для добавления, изменения конфигурации и удаления функций. Эта ветка является частью ветки разработки. После того, как все изменения будут внесены, разработчики включают ее обратно в ветку разработки.  Experimental-ветка . Эта ветка выступает в качестве площадки для разработки новых функций или реализации каких-то своих идей, которые не являются частью релиза или спринта. Эта ветка предназначена для испытания новых вещей. WIP-ветка. Разработчики используют WIP-ветку (Work In Progress – незавершенные работы) для разработки или испытания новых функций. Эти ветки не обязательно должны являться частью обычного рабочего процесса разработки. Они создаются для отдельно взятого проекта и зачастую бывают неофициальными, безо всяких конкретных или стандартизированных правил.  Merging-ветка . Это временная ветка, которая используется для разрешения конфликтов слияния. Такие конфликты могут возникать при добавлении последней разработки и feature или hotfix-ветки в другую ветку. Эта ветка также полезна при объединении двух feature-ветвей, разработанных несколькими участниками. Этот процесс включает в себя слияние, проверку и одобрения окончательного варианта изменений. Этот далеко не полный список. Существует множество других неплохих форматов и соглашений о присвоении имен для временных ветвей какого-то конкретного проекта. На следующей диаграмме показан пример рабочего процесса в репозитории Git с несколькими постоянными и временными ветками: Соглашения о присвоении имен веткам Git Большая часть соглашений о присвоении имен веткам, как правило, определяются самим проектом или командой. Вы можете использовать те имена, которые вам больше всего подходят, но при условии, что вы будете придерживаться единого стиля на протяжении всего проекта.  Ниже представлены несколько основных соглашений о присвоении имен веткам Git, которые многие разработчики применяют при работе в системе контроля версий. Использование дефисов и слешей в качестве разделителей Одно из самых распространенных соглашений о присвоении имен – это использование слеша (/) или дефиса (-) в качестве разделителя в имени ветки. Эти символы облегчают чтение названия ветки за счет того, вам не нужно разделять слова в уме. Например, сравните следующие имена ветвей: featurenewuserregistrationworkflowwithemailverification и feature/new-user-registration-workflow-with-email-verification Данное имя ветки является описательным и содержит информацию о своей функции, в данном случае – добавить новый рабочий процесс регистрации пользователя с проверкой электронной почты. При этом гораздо проще разобрать для чего она нужна, когда в названии используются разделители – слеш и дефис. Помимо этого, старайтесь давать веткам более короткие имена. Чтобы улучшить приведенное выше имя, его можно сократить: feature/email-verification-workflow Итак, основными преимуществами использования разделителей в названии ветки являются: Улучшенная читаемость, препятствующая возникновению путаницы Более легкое управление, особенно при работе с большим количеством веток Разделяя слова дефисами и слешами и используя строчные буквы, вы можете обеспечить лучшую читаемость. Примечание : не используйте пробелы в именах ветвей, так как в таком случае будет создан «осиротевший» коммит, к которому будет невозможно получить доступ ни из одного коммита в репозитории. Также избегайте использования каких-либо других специальных символов, помимо дефисов и слешей, так как они могут вызвать проблемы в Git. Использование   цифр Если для создания трабл-тикетов и разработки новых функций вы используете Jira, то будет полезно добавить номер тикета к названию ветки. Номер тикета в названии ветки Git помогает отслеживать ход работы над этой веткой. Кроме того, номера тикетов Jira уникальны, так что вероятность, что две ветки будут иметь одинаковые имена, нулевая. Если вы пользуетесь внешней системой для отслеживания хода разработки, то вы можете указать в названии ветки внешний ID отслеживания. Но не используйте только цифры. Дайте все же ветке описательное имя, чтобы пояснить, в чем ее назначение. Например, следующее название ветки содержит ID отслеживания и описание: wip/8712-add-login-module Из названия мы можем понять, что это WIP-ветка. Далее следует ID отслеживания и описание ее назначения. Использование ключевых слов Чаще всего название ветки начинается с ключевого слова, которое определяет назначение ветки. Как правило, эти ключевые слова обозначают тип ветки, например, bugfix hotfix wip feature и т.д. Такое распределение по категориям помогает разработчикам, совместно работающим над проектом, понимать назначение той или иной ветки. Ключевые слова обычно отделяются от остальной части названия слешем (/). Например, в начале следующего имени ветки используется ключевое слово, показывающее ее назначение: bugfix/fix-login-error Задача ветки – исправление ошибки авторизации. Она создана именно для этой цели. Использование имени автора Еще одно соглашение – это использование имени автора в названии ветки Git. Таким образом, можно пояснить, кто из разработчиков работал над этой веткой, а также легко отслеживать, кто работает над той или иной функцией. Имя автора, как правило, пишется в самом начале. Например, johndoe/feature/add-user-profile Здесь имя ветки начинается с имени автора, за которым следует слеш, отделяющий его от типа ветки. Далее идет назначение ветки – добавить функцию создания профиля пользователя. Длина имени Старайтесь делать так, чтобы имена ветвей были описательными, но при этом максимально короткими и простыми, особенно если над проектом работают несколько человек. Разработчики должны иметь возможность, глядя на название ветки, быстро определить, для чего нужна она ветка. Например, для того, чтобы улучшить вот это имя: feature/user-authentication-system-with-two-factor-authentication Мы можем его укоротить до вот такого варианта: feature/2fa-auth Если имена веток будут слишком длинные, трудно будет отличить их друг от друга, особенно по мере увеличения сложности проекта и, соответственно, количества ветвей. Работать с короткими и простыми именами гораздо проще. Одновременное использование нескольких соглашений о присвоении имен Можно использовать сразу несколько соглашений о присвоении имен веткам Git. Но все-таки не стоит применять все эти правила к каждой ветке. Вместо этого постарайтесь скомбинировать их в привычной для себя манере и доступной форме, чтобы сохранить их читаемость.  Например, рассмотрим следующее имя ветки: feature/user-registration-system/bugfix/T-133-issue123 В этом имени используется несколько соглашений. Оно говорит нам о том, что это feature-ветка, где разрабатывается функция регистрации пользователей. При этом внутри нее есть еще одна ветка – bugfix-ветка с тикетом Jira под номером 133 для исправления ошибки 123. Несмотря на то, что название описательное, оно довольно длинное и с ним будет сложно работать. Впрочем, мы можем его укоротить до вот такого варианта: feature/T-133-bugfix Такой укороченный вариант имени по-прежнему дает нам необходимый контекст, но с ним будет гораздо проще работать, так как в нем используется меньше соглашений. По сути, ваша команда сама должна решить, сколько информации включать в имена и каких соглашений придерживаться. Таким образом, вы сможете гарантировать, что репозиторий будет оставаться структурированным и простым в управлении. Заключение Git – это отличный вариант для разработчиков, которые хотят совместно работать над одной кодовой базой. В этой статье мы перечислили соглашения, которые вы можете использовать для именования ветвей, а также методические рекомендации, следуя которым, вы сможете сохранить структуру и качество своей кодовой базы.  
22 октября
20:00
Бесплатный вебинар
Как стать Python - разработчиком?