• Как делается backend на Java?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Выбирайте PHP. Месяца не хватит даже на изучение материала.
    Ответ написан
    5 комментариев
  • Open source проекты?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    В любом open source проекте есть задачи для новичка. Для многих банальное исправление опечаток стало первым шагом. Но лучше всего выбирать тот проект, которым сами пользуетесь и который хорошо знаете.
    Ответ написан
    Комментировать
  • Как использовать Azure, AWS и VPS.ua без кредитной карты?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Современные законы США, ЕС и РФ требуют от хостера идентифицировать клиентов. На Западе это обычно делают с помощью контрольного списания с кредитной карты. Поэтому вы ничего не сможете с этим сделать.
    Ответ написан
    4 комментария
  • Как сделать маловесящую игру?

    Zoominger
    @Zoominger Куратор тега Веб-разработка
    System Integrator
    JavaScript? Чтоб не нагружал? Никак.

    Если серьёзно, то стараться писать лаконичный код, поменьше ненужных переменных, оптимизировать функции. Тут можно на целую книгу расписать.
    Ответ написан
    1 комментарий
  • Что будет с первичным ключом если создать таблицу без указания PRIMARY KEY?

    Melkij
    @Melkij
    PostgreSQL DBA
    Но первичный ключ является обязательным для каждой таблицы

    С точки зрения реляционной теории и нормальных форм в частности.

    С точки зрения SQL - не обязателен. Таблица может не объявлять первичный либо даже какой-то уникальный ключ. Дальше - детали реализации.

    В PostgreSQL никакой даже суррогатный первичный ключ в этом случае создаваться не будет. Адресация строк в PostgreSQL выполняется по TID (tuple ID) - физическому адресу строки в датафайле (и потому TID уникален в таблице), в том числе при поиске по первичному ключу. Но TID - не индекс, никак не связан с хранимыми данными и не накладывает каких-либо ограничений на данные.
    Ответ написан
    3 комментария
  • Как скрыть метод класса Java?

    @Alexey2222
    В крайнем случае вы можете сделать его просто пустым. Т.е., с пустым телом.
    Ответ написан
    2 комментария
  • Как динамически менять значение TextBox, если Binding идет через Dictionary?

    FoggyFinder
    @FoggyFinder
    Чтобы сообщить представлению (View) об изменении значения конкретного свойства из VM нужно передать его название в виде параметра:

    OnPropertyChanged(nameof(TextBoxes));

    Непосредственно в самих свойствах вы можете увидеть что идет вызов без передачи параметров:

    OnPropertyChanged();

    Дело в том, что в типичной реализации имя свойства извлекается при помощи атрибута CallerMemberName:

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
    // ...
    }


    Это не обязательно делать в set. У свойства может не быть открытого сеттера или не быть сеттера вообще. Или если свойство зависит от двух других - например, для автоматического отображения суммы значений, которые должен вводить пользователь.

    В вашем случае с TextBoxes вы не используете сеттер - его можно даже совсем убрать.
    Ответ написан
    2 комментария
  • Как сделать программу для заполнения данных в Word?

    FoggyFinder
    @FoggyFinder
    Не ясно почему были убрана метка "Программирование" из вопроса. Получается ответ в некотором роде будет оффтопом.

    Теперь по существу:

    Не знаю если такая возможность в Word, но если есть, то лучше (быстрее) будет воспользоваться именно ей.

    Но если нужна именно программа, то я бы начал с составления ТЗ (технического задания), в котором было бы подробное описание требуемого функционала.

    Пока описание в вопросе довольно расплывчатое, но вот набросок который на скорую руку написал за пару часов на языке программирования F#:

    Примечание: Возможно F# не самый лучший выбор для данной задачи, но так как для своих персональных программ использую его, то и код привожу на нем.

    1. Определяются основные объекты (Студент, Преподаватель, Абитуриент) для которых в виде свойств перечисляются характеристики для заполнения:

    module Model
    
    type Student = {
        Name : string
        Surname : string
        LastName : string
        Phone : string
        Faculty : string
    }


    Отдельно, для удобства, представляем наши записи в виде размеченного объединения:

    [<RequireQualifiedAccess>]
    type AccountType = 
        | Student of Student
        | Enrollee of Enrollee
        | Teacher of Teacher


    Создаем модуль Defaults в котором будут находится значения по умолчанию для объектов (будет нужно для отображения):

    [<RequireQualifiedAccess>]
    module Defaults = 
        let student:Student = {
            Name = ""
            Surname = ""
            LastName = ""
            Phone = ""
            Faculty = ""
        }


    Следующий шаг - создание или редактирование / заполнение готового Word или Pdf шаблона данными.

    Есть несколько вариантов (библиотек) для работы и с тем и с другим форматом. Для Pdf есть очень известная библиотека:

    iTextSharp

    Есть и другие, как например,

    SharpLayout

    Документация в которой оставляет желать лучшего, но по крайней мере понятно что у нее нет проблем с отображением символов кириллицы.

    Простейший вывод в виде таблицы может выглядеть так:

    [<RequireQualifiedAccess>]
    module PdfReport
    
    open Model
    open PdfSharp.Drawing
    open SharpLayout
    
    let private defaultSettings = 
        PageSettings(
            TopMargin=Util.Cm(1.2),
            BottomMargin=Util.Cm(1.0),
            LeftMargin=Util.Cm(2.0),
            RightMargin=Util.Cm(1.0))
    
    let private createReportForTeacher teacher = 
        let document = Document()
        let section = document.Add(Section(defaultSettings))
        
        let font = 
            Font("Times New Roman", 10.0, XFontStyle.Regular, XPdfFontOptions.UnicodeDefault)
            |> Option
        
        section.Add(Paragraph().Add("Информация об преподователе", font.Value).Alignment(HorizontalAlign.Center.AsOption().ToNullable())) |> ignore
    
        let table = section.AddTable().Font font
        
        let c1 = table.AddColumn(Util.Px(600.0))
        let c2 = table.AddColumn(Util.Px(600.0))
        
        let r1 = table.AddRow()
        let r2 = table.AddRow()
        let r3 = table.AddRow()
        let r4 = table.AddRow()    
        let r5 = table.AddRow()
    
        r1.[c1].Add(Paragraph().Add("Имя:")) |> ignore
        r1.[c2].Add(Paragraph().Add(teacher.Name)) |> ignore
    
        r2.[c1].Add(Paragraph().Add("Фамилия:")) |> ignore
        r2.[c2].Add(Paragraph().Add(teacher.LastName)) |> ignore
    
        r3.[c1].Add(Paragraph().Add("Отчество:")) |> ignore
        r3.[c2].Add(Paragraph().Add(teacher.Surname)) |> ignore
    
        r4.[c1].Add(Paragraph().Add("Телефон:")) |> ignore
        r4.[c2].Add(Paragraph().Add(teacher.Phone)) |> ignore
    
        r5.[c1].Add(Paragraph().Add("Факультет:")) |> ignore
        r5.[c2].Add(Paragraph().Add(teacher.Faculty)) |> ignore
    
        document


    Теперь что касается отображения, мне удобнее использовать WPF, ссылка на руководство и библиотеку
    Gjallarhorn.Bindable.

    Для каждого типа создаем свой UserControl который будет отвечать за ввод данных.

    Каждое отображение определим в виде навигационного состояния:

    [<RequireQualifiedAccess>]
    type NavMessages = 
        | Student
        | Teacher
        | Enrollee


    работу с каждым типом вынесем в отдельные дочерние компоненты (StudentComponent, ...). Для каждого свойства можно определить собственное правило проверки корректности.

    let appComp =
        Component.create<AppModel, NavMessages, Messages> [
            <@ ctx.Model.Student @> |> Bind.comp (fun m -> m.Student) studentComp fst
            <@ ctx.Model.Enrollee @> |> Bind.comp (fun m -> m.Enrollee) enrolleeComp fst
            <@ ctx.Model.Teacher @> |> Bind.comp (fun m -> m.Teacher) teacherComp fst
                            
            <@ ctx.Model.Menu @> |> Bind.comp (fun m -> m.Menu) menuComponent fst
        
            <@ ctx.SendReport @> |> Bind.cmd
        ]


    Команда SendReport будет отвечать за созданием отчета и отправку его на почту. Кнопка будет активна только в том случае, если все поля заполнены без ошибок.

    Остается определить функцию обновления модели приложения:

    let upd (nav : Dispatcher<NavMessages>) message model = 
        match message with
        | Messages.SendReport ->
            let v, m = 
                match model.Menu.Current with
                | NavMessages.Enrollee -> 
                    AccountType.Enrollee model.Enrollee, { model with Enrollee = Defaults.enrollee }
                | NavMessages.Student -> 
                    AccountType.Student model.Student, { model with Student = Defaults.student }
                | NavMessages.Teacher -> 
                    AccountType.Teacher model.Teacher, { model with Teacher = Defaults.teacher }
            v
            |> PdfReport.createReport
            |> PdfReport.saveReport "test.pdf"
            |> PdfReport.sendReport
            m
        | Messages.SetCurrent current ->
            current |> nav.Dispatch
            { model with Menu = { model.Menu with Current = current }}
        | Messages.UpdateEnrollee msg ->
            { model with Enrollee = EnrolleeComponent.update model.Enrollee msg }
        | Messages.UpdateStudent msg ->
            { model with Student = StudentComponent.update model.Student msg }
        | Messages.UpdateTeacher msg ->
            { model with Teacher = TeacherComponent.update model.Teacher msg }
    
    open Gjallarhorn.Bindable.Framework
    
    let applicationCore nav =
        let navigation = Dispatcher<NavMessages>()
        Framework.application init (upd navigation) appComp nav
        |> Framework.withNavigation navigation


    Для работы с почтой вам нужно будет указать данные с которых вы хотите отправлять письмо. Как это сделать написано тут.

    Теперь, чтобы добавить новый тип нужно будет сделать следующее:

    1. Определить запись для нового объекта, описывающую его свойства.
    2. Создать функцию генерирующую отчет для этого типа.
    3. Создать компонент.
    4. Создать пользовательский элемент управления для отображения.
    5. Добавить его в общую модель программы.

    В итоге получилось следующее:

    5c7ece7614321212016044.gif

    Как только отчет был отправлен, запись сбрасывается до значения по умолчанию.
    Для демонстрации что формы могут быть произвольными выводил сообщение с короткой информацией данные о ком заполняются в текущий момент.

    В данном примере был записан такой pdf:

    5c7eceaae88cf238140201.jpeg

    Весь код не приводил, так как он довольно объемный, если такой вариант интересует, то могу выложить на гитхаб.

    Только учтите, что набросок можно сделать за пару часов, а довести до ума будет занимать намного больше времени.
    Ответ написан
    4 комментария
  • Что такое замыкание?

    abyrkov
    @abyrkov
    JavaScripter
    Замыкание это крайне простая вещь, если ее рассматривать лексические области видимости как объекты.
    Например:
    // Текущая область видимости - window
    var a = 'window';
    function something() {
      // Текущая область видимости inner1
      var b = 'inner1';
      return function() {
        // Область inner2
        return b; // Это замыкание
        // b нет в inner2, берется b из inner1
    }
    var closure = something(); // Функция с замнкнутой переменной называется тоже замыканием
    closure() // => inner1, область осталась той же
    Ответ написан
    2 комментария
  • Как установить JDBC драйвер для postgres?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Прописывать в СР - прямо путь до файла, например. Безо всяких параметров.
    Ответ написан
    2 комментария
  • Java как наконец запустить Hibernate?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PostgreSQL
    Седой и строгий
    Просто используйте аннотации.
    Ответ написан
    Комментировать
  • Объясните что такое полиморфизм простыми словами ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Да ладно, парни. Ну хватит уже, к чему такие сложности? Берём и читаем. Вообще совсем не обязательно читать про архитектуру и абстракции именно по своему языку, хотя javascript в этом плане родился уродом.

    Ок. Полиморфизм ни в коем случае нельзя рассматривать отдельно от других фундаментальных понятий - абстракция, инкапсуляция и наследование. Объект и подобные прилагаются из аксиом (хотя это-то тоже аксиомы).

    Собственно, представим себе рядом стакан, кружку, чайник, кофемашину, велосипед и скейт. Что между ними всеми общего? Ну как минимум то, что они есть. То есть это - объекты, которые были созданы. Но как они были созданы? Скорее всего на заводе производителя по чертежам. Ок, чертежём назовём конструктор. Ну а класс? А что это такое? А его нет в нашей вселенной - эта сущность есть абстракция, что живёт лишь в наших мыслях. В реальном мире её нет и никогда не будет, такова уж физика - ей по барабану, что птицы и млекопитающие имеют дальних родственников - она лишь обеспечивает возможность естесственного отбора. А уж родственников друг другу находим мы, люди.

    С объектами и классами разобрались, а что же там с нашими стаканами и велосипедами. Мы уже поняли, что всё это объект, то есть грубо можно все объекты наследовать от какого-нибудь суперпредка, суперкласса, что и реализовано в некоторых языках. Но что другого общего между скейтом и стаканом, например? Конечно, можно углубляться и считать, что они все из молекул, и они все из твёрдых веществ. Однако это всё бред и СПГС, так что ответ прост - да ничего. То есть это совершенно разные объекты с совершенно разным функционалом. Более того - естесственно компьютерные модели и иерархии будут сильно отличатся от физик и химий. И это нормально, вопрос об адекватностях моделей ставиться лишь когда модель неадекватна, а до тех пор пилить можно что угодно, лишь бы работало.

    Вот. У нас есть супер-предок Object, от которого дефолтно наследуются все объекты. Допустим, то что объекты состоят из атомов и есть то, что наследуют все объекты. Но все дополнения и правки - полиморфизм. Так, из атомов мы слепили колёса и приделали на доску - ок, это скейт. На него можно встать и катиться, а сильно извернувшись и полетать в трёх метрах над землёй, прямо таки излучая своё яркое эго. В то время как стакан - это мы слепили из атомов плотную ёмкость, из которой вода не выливается под действием силы тяжести. И прямое применение стакана - налив воды опрокинуть его над ртом, чтобы вода вытекла прямо в желудок. Так делают настоящие пацаны, не заботясь об икоте или страхе утонуть, так что вот - полиморфизм.

    Однако что с остальным? У нас ещё абстракция, инкапсуляция и наследование. Ок, начнём с наследования, так оно наиболее близко. Вот что у нас общего между стаканом и кружкой? Ну в оба можно налить воду, но у кружки есть ручка чтобы держаться. То есть можно придумать некий общий класс - ёмкость. Однако что это за класс? Можно например за этот класс взять стакан, тогда все ёмкости по дефолту стаканы, а всё остальное - видоизменённые стаканы. Но кому-то больше нравяться кувшины, например некоторые чики насят их на голове, считая что это удобно. Ну и пусть носят, но как-то же решить надо, что главнее и идеальнее. Так вот - недостяжимый идеал и есть главный - это называется абстрактный класс. То есть ёмкость, что невозможно создать, для которого нет полного чертежа. А все чертежи, что дополнили до полного - есть наследованные классы от класса ёмкость.

    Тут мы подошли к абстракции. Вот такое иерархическое наследование приводит нас к, возможно главной, идее ООП. Вот мы взяли и выделили всё, куда можно налить воду в отдельный класс, нарисовали общий чертёж, но специально не доделали его, оставив зазор для будущих творцов, и назвали чертёж - ёмкость. Тысячи лет изобретатили всех миров создают свои ёмкости, одна лучше другой. Для разных людей - по разному, конечно. Но каждый раз группировать молекулы стекла определённым образом - непростая задача. Поэтому ремесленники пошли на хитрость, они создали тайный совет ремесленников мира и решили делиться друг с другом своими наработками. То есть создавать мелкие чертежи и объявлять классом, например, извлистой ручки в форме ленты Мёбиуса, например. Возможно такая ручка удобно только инопланетным существам, но чертёж создан и к нему можно ссылаться при создании своего чертежа. Таким образом мы абстрагируемся от низкоуровневой задачи "формирования ёмкостей посредством перемещения молекул" к "конструированию ёмкости посредством совмещения деталей, элементов". Это и есть абстракция.

    Но мы подошли к последнему пункту - инкапсуляция. Она неразрывна с абстракцией, и по сути благодаря ей она и работает. Инкапсуляция - это своеборазный клей (или синяя изолента), которым склеивают разные чертежи в один. То есть совмещение деталей для создания своей - это и есть инкапсуляция. Причём при совмещении мы можем не описывать детали этого совмещения (то есть члены класса могут быть приватными), таким образом помогая абстрагироваться тем, кто этот чертёж использует. Вот посмотрим на чайник - что это такое? Это стакан (или кружка) к которому снизу (а может внутри по середине?) приклеен нагревательный элемент. Пустив по нему ток, согласно инкапсулированному в нагревательный элемент закону Ома, будет выделяться тепло и нагреваться вода. А кофемашина? Это куда более сложное устройство, с множеством насосов, ёмкостей, шлюзов, измельчителей и чайников. И всё склееное клеем. А может синей изолентой. Это снова инкапсуляция.

    Таким образом, абстракция невозможна без инкапсуляции и наследовании, как невозможен полиморфизм без, собственно, наследования. Ну а полиморфизм невозможен ещё и без инкапсуляции, которая банально бесполезна без наследования и полиморфизма. Вот такие тут треугольники с пирогами. Жаль только про пирог наврали. И про день рожденье.
    Ответ написан
    3 комментария
  • Как это лучше реализовать?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Нет, строка должна хранить текст. А для списка фиксированных значений есть Enum
    Ответ написан
    Комментировать
  • Как это лучше реализовать?

    Beshere
    @Beshere
    Разработчик
    Комментировать
  • [Неактуально] Что не так в моем java-коде?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    ведь переменная не может так просто перебраться из одного метода в другой без return и параметров.

    Ваша переменная - static она одна для всего класса. Вы же сами ее создали "чтобы постоянно не создавать одну и туже переменную"
    Ответ написан
    2 комментария
  • Можно ли создать в java переменные которые будут доступны между всеми классами?

    @davidnum95
    static variable
    Ответ написан
    Комментировать
  • Как запретить открытие ссылок во встроенном браузере в android приложениях Instagram, FB, VK?

    zamboga
    @zamboga
    Бизнес-аналитика, фин. моделирование, дашборды
    Настройки телефона - приложения - найти штатный браузер - в его свойствах удалить настройки по умолчанию.

    Второй вариант, в настройках самого приложения отключить открытие ссылок в самом приложении.
    Например, отключить встроенный браузер ВК: Настройки - Основные - Встроенный браузер.
    Ответ написан
    Комментировать
  • Как отличить отвал южного моста от отказа винчестера?

    sotvm
    @sotvm
    Умный поймёт, а дураку и так всё равно.
    заменой на заведомо исправный(винт) , либо винт с ноута подключать к другой машине,
    или одно из двух ㋛ 50x50
    но 1вариант предпочтительней
    винт из ноута вытаскивается без особого геморроя.
    Ответ написан
    Комментировать
  • Лучший браузер под мак для разработчика?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Мне кажется все юзают хром, кроме тех несчастных кто живет на IE
    Ответ написан
    5 комментариев
  • Как с пом. отладки протестить отдельный кусок кода в IntelliJ IDEA?

    @mipan
    Собственно, если есть инстанс класса, содержащий метод, то в режиме дебага можно запустить Evaluate Expression (Alt+F8) и уже там вызвать метод, и посмотреть результат.
    Ответ написан
    Комментировать