2 заметки с тегом

программирование

Программирование и велосипед

Я не собираюсь писать об изобретении велосипеда, которым занимаются многие программисты. Да, каюсь, грешен, сам поступал также, наивно считая, что смогу написать некоторые вещи лучше, чем авторы библиотек. Несколько раз у меня это получалось, и я укрепился в своём заблуждении, что так и нужно поступать. На самом же деле это — ошибка.

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

Сегодня Кирилл сходил на первое занятие клуба программистов 1С. Я записал его на курсы по программированию на Java. С занятия он вышел весьма вдохновлённый, но чуточку расстроенный тем, что нужно делать домашку. Я его успокоил, что это на самом деле очень и очень весело — писать программы.

Дома мы установили русификацию на Eclipse. Оказалось, что материалы учебного курса устарели. В новой версии Eclipse — Oxygen — русификация устанавливается прямо из оболочки путём добавления репозитория проекта Babel и загрузки нужных пакетов.

Установив русификацию, мы стали изучать задание. Это оказалась простая программа с использованием swing, которая создавала одно окно с заголовком. Домашним заданием было написать программу, которая выводила бы не одно окно, а пять — четыре по углам и одно в центре.

Скопировать четыре раза блок кода, который выводит окно, поменять координаты левого верхнего угла было проще простого, но скучно. Поэтому мы принялись умничать — ввели в программу переменные со значениями отступов, ширины и высоты окна. А потом решили, что никак не обойтись без выяснения текущего разрешения экрана, чтобы окна выводились аккуратно на любом разрешении.

Вот что у нас получилось:

package test;
 
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Toolkit;
 
public class MySwing {
    public static void main(String[] args) {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int winHeight = 300, winWidth = 500;
        int leftMargin = 50, topMargin = 20;
        
        JFrame fourWin = new JFrame();
        fourWin.setTitle("fourCraft Это хорошо");
        fourWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fourWin.setBounds(leftMargin, topMargin, winWidth, winHeight);
        fourWin.setVisible(true);
        
        JFrame fourWin2 = new JFrame();
        fourWin2.setTitle("fourCraft Это хорошо");
        fourWin2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fourWin2.setBounds(screenSize.width - leftMargin - winWidth, topMargin, winWidth, winHeight);
        fourWin2.setVisible(true);
        
        JFrame fourWin3 = new JFrame();
        fourWin3.setTitle("fourCraft Это хорошо");
        fourWin3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fourWin3.setBounds(leftMargin, screenSize.height - topMargin - winHeight, winWidth, winHeight);
        fourWin3.setVisible(true);
        
        JFrame fourWin4 = new JFrame();
        fourWin4.setTitle("fourCraft Это хорошо");
        fourWin4.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fourWin4.setBounds(screenSize.width - leftMargin - winWidth, screenSize.height - topMargin - winHeight, winWidth, winHeight);
        fourWin4.setVisible(true);
        
        JFrame fourWin5 = new JFrame();
        fourWin5.setTitle("fourCraft Это хорошо");
        fourWin5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fourWin5.setBounds((screenSize.width / 2) - (winWidth / 2), (screenSize.height / 2) - (winHeight / 2), winWidth, winHeight);
        fourWin5.setVisible(true);
        
        JFrame[] jframes = new JFrame[10];
        
        for (int i=0; i<10; i++) {
            jframes[i] = new JFrame();
            jframes[i].setTitle("fourCraft Это хорошо");
            jframes[i].setBounds(leftMargin+10*i, topMargin+15*i, winHeight, 200);
            jframes[i].setVisible(true);            
        }              
    }
}

Не скажу, что это прямо шедевр — программа не сравнивает размеры диалогов с текущим разрешением экрана, но я решил, что для учебной программы достаточно того, что она красиво выводит окна на любом разрешении компа или ноута.

И ещё одну штуку добавили — чтобы кнопка закрытия любого из пяти окон закрывала всю программу. Иначе приходилось закрывать все выведенные окна.

Цикл в конце — просто баловство. Мне хотелось показать Кириллу, каким образом объявлять массивы и инициализировать значения переменных.

До этого я никогда не писал программы на Java и не работал в Eclipse. Оказалось, что современные IDE сильно шагнули вперёд по сравнению с оболочкой Delphi 7, на которой я писал что-то более-менее серьёзное в последний раз. Опыт с C# и C++ в Microsoft Visual Studio я не считаю.

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

Я думал, что раз давно ничего не писал, то вроде как и не смогу, будет сложно. Как я ошибался!Стоило только начать — и всё пошло как по маслу. А с учётом удобства среды разработки и кучи подсказок в гугле я не то что снова поверил в себя, а вообще даже не вижу причин сомневаться, что смогу написать практически любую программу, которую смогу себе придумать.

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

В общем, я уже не думаю, смогу ли писать программы, потому что точно знаю, что сделаю это без проблем. Нужно только задачки себе почаще придумывать.

2017   программирование

Для чего хорош язык программирования Go

Мне приходит рассылка Quora — это такой сайт, на котором люди задают вопросы и получают ответы. В отличие от otvet.mail.ru здесь задают реально интересные вопросы. Ну и ответы тоже на уровне.

Я пытаюсь снова вернуться к программированию после нескольких лет перерыва. JavaScript, Python, Java, а теперь ещё и Go. Поскольку при создании программы очень важно выбирать инструмент, соответствующий задаче, для меня было интересно прочитать, для чего наилучшим образом подходит Go и как это соотносится с тем, что я успел про него узнать. Итак, оригинальный текст и перевод.

What’s the Go language really good for?


The really good: Network and Web servers

Network applications live and die by concurrency, and Go’s native concurrency features — goroutines and channels, mainly — are well suited for such work. Consequently, many Go projects are for networking, distributed functions, or services: APIs, Web servers, minimal frameworks for Web applications, and the rest.

Go programmers like that the items they use most in such projects are either a part of the language, such as goroutines for threadlike behavior, or available in the standard library like Go’s http package. This «batteries included» philosophy hearkens back to Python, as do many of Go’s best attributes, such as speed of development and deployment.

The also really good: Stand-alone command-line apps or scripts

Due to Go’s consistent behavior across platforms, it’s easy to put out simple command-line apps that run most anywhere. It’s another echo of Go’s similarities to Python, and here Go has a few advantages.

For one, the executables created by Go are precisely that: Stand-alone executables, with no external dependencies unless you specify them. With Python, you must have a copy of the interpreter on the target machine or an interpreter of a particular revision of Python (in the case of some Python scripts).

Another advantage Go has here is speed. The resulting executables run far faster than vanilla Python, or for that matter most any other dynamically executed language, with the possible exception of JavaScript.

Finally, none of the above comes at the cost of being able to talk to the underlying system. Go programs can talk to external C libraries or make native system calls. Docker, for instance, works this way. It interfaces with low-level Linux functions, cgroups, and namespaces, to work its magic.

The not so good: Desktop or GUI-based apps

Here’s where the going gets a little grimmer. Right now, the culture of software around building rich GUIs for Go applications, such as those in desktop applications, is still scattered.

That said, various projects exist — there are bindings for the GTK and GTK3 frameworks, and another intended to provide platform-native UIs, although the latter relies on C bindings and is not written in pure Go. Windows users can try out walk, and some folks at Google are in the process of building a cross-platform GUI library.

Lacking right now is a sense of any of these being a clear winner or a safe long-term bet. Also, because Go is platform-independent by design, it’s unlikely any of these will become a part of the standard package set.

The less good: System-level programming

While Go can talk to native system functions, it’s not as good a fit for creating extremely low-level system components, like embedded systems design, kernels, or device drivers. Some of this is a by-product of the language’s intentions, since the runtime and the garbage collector for Go applications are dependent on the underlying OS. (Those interested in a cutting-edge language for that kind of work should look into Mozilla’s Rust.)

One project currently in the works that partially leverages Go for systems programming is Ethos, an OS intended to serve as a platform for highly secure software. The kernel is written in C, but the userspace applications will be written in Go — a smart way to render unto C what is C’s, and render unto Go what Go’s best at right now.

source : What’s the Go language really good for?

Если резюмировать в двух словах, то Go отлично подходит для сетевых программ и веб-серверов, поскольку содержит встроенные средства организации потоков и параллельного выполнения — гороутины и каналы. Он также прекрасен для различных консольных утилит и скриптов, обеспечивая достойную замену Python.

Например, когда я разбирался с BungeeCord — прокси-сервером для Майнкрафт, то нашёл вариант реализации этого функционала на Go — GoLilyPad.

Для приложений с графическим интерфейсом Go не очень пригоден, равно как и для низкоуровневого системного программирования.

Хотя я не собирался писать свою версию офиса или фотошопа на Go, было полезно узнать, что он не подходит для этих целей.

2017   Go   программирование