Мыльный калькулятор / Калькулятор щёлочи

Всех приветствую!

Несколько лет назад я стал учить Java Android. На работу меня программистом Java никуда не брали – то нет опыта работы в команде, то уровень Джун (т.е. если по-русски – младший специалист), то нужен молодой лет двадцати…Я как-то не привык в таких случаях отступать, по этому создал свой аккаунт плеймаркете, выбрал тему приложения близкую мне и опубликовал. Однако, в этом году Гугл стал немного не в адеквате, отключил монетизации, по тому я решил сменить платформу на Huawei. Этот поганец тоже оказался не лучше – нет работающего механизма монетизации для российских разработчиков. Остались НашСторе и РуСторе, но как я писал уже свою статью, НашСторе начал за здравие и потом йок…Остался РуСторе, хотя и у него тоже есть неразработчико-ориентированная позиция. Так вот…

Рис.1

Рис.1

Мыльный калькулятор (рис.1)- это приложение предназначено для мыловаров, т.е. людей, которые делают мыло “с нуля”. В общем сам процесс не особо замысловатый – берете разные масла, щёлочь и воду, всё смешиваете в нужных пропорциях и получаете мыло. Конечно, требуется соблюдать некоторые технологические режимы, но они не сложные и по этому мыло люди варят дома. Проблема тут только в том, что где взять эти нужные пропорции всех ингредиентов. По этому нужно либо брать уже готовые рецепты, либо использовать калькулятор щёлочи (он же – мыльный калькулятор), и он сам всё посчитает. Тут ещё есть такой момент, что иногда формулы мыла получаются очень даже интересные, и их хорошо бы где-то хранить. По этому в приложении реализован ещё и рецептурный блокнот. Идея сделать это пришла мне несколько лет назад, хотя в этот момент были уже и сайты с такими калькуляторами и даже отдельные приложения, и одной из причин было, что некоторые моменты мне там не нравились или были неудобными. Само приложение получилось не сложное ни с точки зрения рядового пользователя (который конечно же знает хотя бы как примерно вообще изготавливается мыло), ни с точки зрения написания этого приложения.

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

Самое приложение на RuStore находится здесь, а на Play Market (только для Белоруссии и России) здесь.

Шахматы-онлайн (обновлено 18.02.2023)

Всех приветствую!

Сегодня произошло в моей творческой карьере достаточно важное событие. Я таки завершил разработку наиболее серьёзного (по моим меркам) мобильного приложения – “Шахматы-онлайн”, и довёл его до стадии альфа-тестирования

Кстати, мой шахматный сервер развернут на VPS – партнёрская ссылка:

https://beget.com/p1223557

Я действительно могу рекомендовать этого хостера как наиболее надежного и дружелюбного. За три года хостинга не было никаких проблем, а все вопросы к службе поддержки решаются быстро и профессионально. У хостера есть бесплатные платформы, такие как WordPress, Jumla, движки интернет-магазинов и т.п. На днях я решил перейти у него с хостинга на VPS. Процесс оказался настолько прост, что это мне удалось сделать самостоятельно за один день. И как было не сделать, если у Beget есть разные стандартные пресеты операционных систем, в частности такие как LAMP-сервер. VPS очень масштабируемы – можно начать сначала с самой скромной конфигурации, а затем расширить число ядер, объем оперативной памяти и т.п. Что меня ещё удивило, что компания эта сама является регистратором доменов, по этому когда я регистрировал свои домены, цены на них оказались значительно ниже остальных (возможно оно и сейчас так). В общем, кто меня знает – ради пары рублей я хрень рекомендовать не буду, и уж тем более ей пользоваться ради экономии этих самых пары рублей.

Приложение позволяет играть, что характерно, в шахматы, причем по двум правилам. Первые – классические (рис.1), о которых все знают и тут останавливаться особо не на чем; вторые – малоизвестные, но очень интересные на мой взгляд – это шахматы Фишера (рис.2) или как их иногда называют Шахматы-960. Предложенный некогда вариант 11-м чемпионом мира по шахматам – Робертом Фишером, очень понравился мне. Ради возможности играть по второму варианту, я и решил замутить это приложение. Правила шахмат Фишера практически ничего не меняют в обычных, кроме как начальную расстановку фигур на поле – они располагаются случайно, пешки расставляются аналогично классическим шахматам.

Рис.1. Классические шахматы

Рис.1. Классические шахматы

Есть в шахматах Фишера в случайной расстановки фигур всё же некоторые правила: король обязательно должен быть где-то между двух ладей, слоны обязательно должны быть черного поля и белого поля, фигуры черных и белых расставляются симметрично относительно друг друга. Рокировка также доступна только один раз вправо или влево, но количество свободных полей (между королём и ладьёй) для её осуществления зависит от начальной позиции.

Рис.2. Один из 960 вариантов начальной позиции шахмат Фишера

Рис.2. Один из 960 вариантов начальной позиции шахмат Фишера

Подобная расстановка позволяет игроку продемонстрировать не шахматную эрудицию, а мышление. Ведь не секрет, что много в партии зависит от первых нескольких ходов, и многие шахматисты просто выучили наиболее частые шахматные дебюты, в следствии чего шансы на успех всей партии существенно возрастают. Расстановка Шахматы-960 умножает на 960 количество вариантов шахматных дебютов, выучить которые практически невозможно. По этому игрок оказывается каждый раз в новой для себя позиции, заставляющей по новому строить свою тактику.

Теперь немного по самому приложению

После открытия приложение запросит от вас никнейм (рис.3). Введите удобное для вас имя.

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

Рис.3. Начало работы с приложением

Рис.3. Начало работы с приложением

После установки соединения с сервером, вы оказываетесь в списке игровых столов (рис.4).

Рис.4. Список игровых столов

Рис.4. Список игровых столов

Здесь можно создать свой собственный со своими правилами удобным для вас цветом стороны (рис.5), либо присоединиться к уже существующему, приняв правила этого стола (рис.6).

Рис.5. Создание нового игрового стола.

Рис.5. Создание нового игрового стола.

Рис.6. Присоединение к существующему столу

Рис.6. Присоединение к существующему столу

Если вы присоединяетесь к пустому столу (за которым нет игроков), то у вас появляется возможность изменить его правила также, как если бы вы создавали новый игровой стол. Отсутствие игрока за столом отображается знаком “-//-” зелёного цвета на стороне той стороны-цвета, где игрока нет, либо с двух сторон, если за столом нет игрока. Полностью занятые столы двумя игроками могут в списке не отображаться совсем.

Оказываясь за столом, за которым кроме Вас никого нет, приложение находится в режиме ожидания присоединения другого игрока-оппонента (рис.7).

Рис.7. Приложение в режиме ожидания подключения оппонента.

Рис.7. Приложение в режиме ожидания подключения оппонента.

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

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

После присоединения другого игрока к партии, надпись “Ожидание подключения игрока” исчезнет и приложение перейдет в режим готовности каждого игрока (рис.8). В этот момент каждый из двух игроков должен сообщить о своём намерении играть партию, кликнув по кнопке “Предложить новую игру”. Если другой игрок уже опередил Вас в намерении начать партию, то кнопка приобретёт вид “Согласиться на новую игру”, сохраняя при этом тот же смысл.

Рис.8. Ожидание готовности каждого игрока

Рис.8. Ожидание готовности каждого игрока

После того как оба игрока выразили намерение играть партию, приложение переходит в режим игровой партии, а игровое время начнет счет (рис.9).

Рис.9. Ход игровой партии

Рис.9. Ход игровой партии

В это режиме доступны следующие действия: произвести ход, сдаться, предложить игру, покинуть игровой стол признав при этом своё поражение. Когда один игрок предлагает ничью, другой получает на экране уведомление (рис.10).

Рис.10. Уведомление, когда другой оппонент предлагает ничью.

Рис.10. Уведомление, когда другой оппонент предлагает ничью.

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

Для совершения хода кликните по своей фигуре один раз чтобы выделить ту фигуру, которой собираетесь ходить (рис. 11). При этом также буду подсвечены все доступные ходы этой фигуры. Если данной фигурой походить невозможно (либо нет свободных клеток, либо ход приведет к шаху “своего” короля), то подсвеченной будет только эта фигура (рис.12).

Рис.11. После клика на пешку e2. Подсвечиваются два возможных хода на e3 и e4, также подсвечивается сама клетка пешки e2.

Рис.11. После клика на пешку e2. Подсвечиваются два возможных хода на e3 и e4, также подсвечивается сама клетка пешки e2.

Рис.12. Слоном c1 невозможно походить, т.к. он заблокирован другими фигурами, по этому подсвечивается только клетка слона на c1.

Рис.12. Слоном c1 невозможно походить, т.к. он заблокирован другими фигурами, по этому подсвечивается только клетка слона на c1.

Повторный клик по подсвеченной фигуре снимает с неё выделение. Если в момент выделения одной фигуре кликнуть по другой, то выделение переставляется на другую фигуру, также подсвечивая доступные её ходы.

Для выполнения хода нужно кликнуть по одному из подсвеченных полей кроме поля, где находится сама фигура (Рис.13).

Рис.13. После того как была выделена пешка e2, клик по доступному полю на e4 привел к ходу пешки e2e4.

Рис.13. После того как была выделена пешка e2, клик по доступному полю на e4 привел к ходу пешки e2e4.

Для выполнения рокировки необходимо произвести “длинное нажатие” на соответствующую ладью пока это не приведет к перемещению фигур (рис.14). Если “недодержать” длительный клик, то программа “решит”, что вы хотите просто походить ладьёй вместо рокировки и выделит ладью.

Рис.14. Выполнение рокировки. Нужно длительно нажать на клетку h1, пока это не приведет к перестановке фигур.

Рис.14. Выполнение рокировки. Нужно длительно нажать на клетку h1, пока это не приведет к перестановке фигур.

Если в течение 20 минут за игровым столом не происходит хотя бы одной игры, стол автоматически закрывается.

Актуальные ссылки на скачивание:

RU-STORE:

https://apps.rustore.ru/app/com.elvinto.elvintochess

Play Market:

https://play.google.com/store/apps/details?id=com.elvinto.elvintochess

На моём домене:

https://chess.elvinto.ru/downloads/app-release.apk

Социум. История 1 (“Проблема поколений”)

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

Социум. История 1 ("Проблема поколений")

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

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

Социум. История 1 ("Проблема поколений")

Говорю, мол мамань, ну что можно объяснить – наколки на организме, потому что говорит Богу, мол он плохо над телом постарался, по этому решил сам за него скульптуру доделать. Почему на груди портрет нездорового вида эмбриона? Я не знаю, мамань, но видимо на этом этапе и начала появляться у него идея привести созданное Богом тело в порядок. Цепь золотая тебе должна быть понятна зачем – ты же в юности занималась фигурным катанием, спортсменка, по этому хорошо знаешь, что цепь с таким весом хорошо тренирует широчайшую мышцу спины, настраивает правильную осанку, если бы взял алюминиевую цепь, ему бы пришлось брать толщиной с якорную, да и одёжу нужно не перепутать, а то цепь наружу будет, не комильфо. Губищи, маман, не знаю, ну ты вопросами меня валишь, не знаю я зачем у него губищи такие…Погоди, мамань, что ты спрашиваешь? А-а-а, ну да, я сказал “у него”. Ну да…Не, не у неё, а у него. Ага…Да точно…Так вот, губищи, мамань, наверно чтобы если какие проблемы серьёзные, то если надают, то не так заметно было. Опять-таки, если будет на губищи падать лицом на асфальт, то сработают как бампер…Мамань, ну почему не убедительно? Ну а как иначе, сурово нынче…Ну как всё неправда? Да ну, мамань, зачем валерьянку-то сразу пить, посмотри телик лучше…Уже лет пять не смотришь? Там такого не показывают?..Ну не знаю, мамань, ладно, потом ещё чего-нибудь обсудим…

Мои сны в рисунках

Сон 2008 год. Незнакомый железнодорожный вокзал и незнакомка.
Сон 2005 год. Кафе у незнакомого железнодорожного вокзала
Сон 1999 год. Замок-небоскрёб
Сон 1995 год. Город над городом
Сон 1997 год. Тёплая планета-океан
Сон 1995 год. Красивый скалистый полуостров на планете-океан
Сон 1999. Вид космоса недалеко от планеты-океан
Сон 1992 год. Послание с планеты-океан

Начало программирования вообще с нуля. Часть 1

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

К моменту прочтения этой статьи, вам желательно иметь навыки продвинутого пользователя. Это действительно необходимо, в ином случае вы несколько спешите заниматься программированием и даже погружаться в этот мир, так как сложно объяснить что такое спидометр, если человек не знаете в чём измеряется расстояние и как выглядят часы. Однако, если вы способны самостоятельно найти и прочитать в Дзене эту статью, то будьте уверены – вы на правильном пути, и понемногу уже можно начинать)).

Компьютеры сейчас практически в любых электронных устройствах – стиральные машины, холодильники, утюги, термометры, не говоря уже о мобильниках, моноблоках и т.п. В среде информационных технологий это принято называть ёмким словом «железо», а у программистов принято называть «устройство». С точки зрения программирования, компьютер – это обычный калькулятор с расширенным набором функций. Единственное, что отличает его от калькулятора, это то, что в компьютере вы одной командой можете запустить выполнение сразу миллиарда различных действий, а в калькуляторе только одно (умножить, разделить и т.д.). Такое получается по тому, что в любом компьютере действия выполняются по программе, т.е. заранее подготовленной последовательности команд. Вы их подготовили, убедились, что всё верно, и запустили выполнение. И вот этот набор команд начал выполняться до тех пор, пока не завершится выполнение всех команд, пока их выполнение кто-то не остановит специальной командой, либо пока в коде что-то не сломается, т.е. была ошибка, её не заметили, но проявилась она не сразу, а по мере выполнения. Такое поведение в компьютерах принято соответственно называть терминами «запустить программу», «прервать выполнение программы», «ошибка выполнения программы». Часто эти термины встречаются в англоязычном представлении:

run, exec, execute – запустить выполнение
break, abort, cancel, terminate, stop, exit, kill, die – прервать выполнение
run-time error – ошибка выполнения

Вообще, если строго говорить, то англоязычного очень много в программировании, если конечно вы не хотите изучать только язык 1С и ничего больше, но как правило, это маловероятно. Однако, английский язык вам специально изучать не нужно, просто в этом нет необходимости. Во время изучения какого-либо языка программирования, вам так или иначе нужно будет запоминать команды, что они делают, а их названия достаточно отождествлены с их смыслом. Например, команда input (пер.: ввод, подвод, подводимый) в языках программирования – это ввод данных, по смыслу подходит. Но если вы обладатель хороших знаний английского языка и встречаете команду print (пер.: печатать, напечатать, печатный), то чисто английский вам мало поможет, а может даже и навредит, т.к. на самом деле никуда на бумагу печатать ничего не будет, а это просто вывод на экран строки символов. Эта команда – история программирования, идёт с тех времен, когда на клавиатуре не писали, а печатали, а на экране синхронно выводился текст; говорили не «писать текст программы», а «печатать текст программы». Также лепту внес и древний язык бейсик, где команда, если не ошибаюсь PRINT#1, как раз выводила текст на тогда ещё матричный принтер. В общем, в современном мире программирования это вывод на экран строки текста, причём на большом количестве языков программирования. Ну привыкли все к этой команде, зачем менять. По этому нужен ли английский знать, ну так, нужен, но не в этом. Пригодиться язык может только для того, чтобы читать англоязычные форумы, где публикуют большое количество решений различных проблем, как то сделать, как это, а почему у меня не работает код, который написал, а что нужно написать, чтобы это заработало. Я часто бываю на этих форумах, но пользуюсь либо Гуглом для перевода, либо Яндексом))…Но уже сейчас замечаю, что что-то стал понимать и без переводчика, причём иногда даже если пишут фразу «Wt u know about…» (What you know about… – что вы думаете о…) или «I lkn 4…» (I looking for… – я ищу…). Опять таки, по многим языкам программирования есть огромное количество и русскоязычных форумов.

Что внутри компа?

Внутри любого компьютера (компа), есть следующие основные вещи:

1. Процессор, которым часто называют ящик на столе, который на самом деле системный блок. По факту процессор – это большая микросхема внутри системного блока, в которой и происходят все вычисления и координация действий всего компьютера.
2. Оперативная память, которая работает очень быстро, но способна хранить в себе данные только пока компьютер включен (синонимы – ОЗУ. RAM, DDR).
3. Постоянная память, которая работает намного медленнее оперативной памяти, но способна хранить информацию даже если всё выключено (жесткие диски – HDD, твердотельные диски – SSD, флешки)
4. Периферия – устройства соединяющие все внешние устройства (клавиатуры, мыши, принтеры, наушники, мониторы, очки виртуальной реальности, сетевые карты и т.п.) с процессором и оперативной памятью. Функционал периферии выполнен как правило на материнских платах (возможно этот термин вам уже встречался) и устройствах размещенные непосредственно на них. Однако есть и периферия, которая выполнена вне материнских плат, например, внешние жесткие диски, внешние аудио-карты для написания музыки, внешние устройства для захвата видео изображения и т.п.
С точки зрения программирования, всё что пишет программист – это написание функционала взаимодействия между этими устройствами. И вот тут есть важный момент, о котором чуть подробнее.
Работа компьютера с точки зрения программирования сводится к следующему принципу на протяжении многих десятков лет:

1. Ваша программа загружается из постоянной памяти в оперативную при помощи другой (системной) программы.
2. В оперативной памяти системная программа (которая загружала вашу) по ряду признаков определяет, где в вашей программе просто обычные данные, например обычные слова типа «Введите логин и пароль», которые вы часто видите на экране, и где в вашей программе код из набора команд, которые будут переданы процессору на выполнение.
3. Запускает выполнение кода программы.
4. Завершает выполнение кода программы
5. Стирает из оперативной памяти программу, освобождая драгоценное место (из постоянной не стирается)

Как из предыдущего можно понять, что пока программа находится в постоянной памяти на накопителе, это просто обычные данные, но как только они загружаются в оперативную память, часть из них становиться кодом выполнения, а часть продолжают оставаться в виде обычных данных. Чтобы такое происходило безотказно и компьютер всегда знал что у вас код, который нужно выполнять, а что есть просто данные типа фразы «Введите логин и пароль», нужно предварительно правильно подготовить вашу программу для запуска. Этот процесс называет компиляцией программы. Т.е. вы написали программу на языке программирования, но в таком виде процессор компьютера её не поймет. Теперь нужно её скомпилировать чтобы компилятор (программа, которая компилирует вашу программу) преобразовал её в тот вид, в котором процессор вашего компьютера её поймет и однозначно сможет определить где в ней находится код выполнения, а где простые данные. Как можно понять из вышеперечисленного, что в современном компьютере выполняется не одна какая-то программа, а одна программа передаёт выполнение другой, которая была загружена вами ранее или была загружена автоматически, и все внутри взаимодействует как большой электронный организм. Выполнение каждых программ регламентировано и происходит по разным правилам и с разными условиям. Например, вы по экрану водите мышкой и кликаете в браузере загрузить страницу, в этот момент происходит лавинный запуск сотен программ, одни грузят страницу из сети интернет, другие программы отображают её на экране, третьи проверяют не продолжаете ли вы двигать мышью по экрану, ещё одна продолжает отображать часы в углу экрана и ещё миллионы других действий. Всё это происходит в строгой последовательности со скоростью в десятки миллиардов раз за одну секунду, по этому кажется с виду, что всё запускается одновременно.
По этому знание и понимание этого очень важно для программирования. Сначала, когда вы включаете компьютер, запускается операционная система (Windows, Linux и т.п.), с точки зрения компьютера это тоже программа, которую писали программисты операционной системы. Потом, вы как программист, хотите написать свою первую программу. Для этого вам нужно загрузить среду разработки, это тоже некая программа, написанная другими программистами. Вы её загрузили, в ней написали свою программу, после этого запускаете в среде разработки компиляцию уже вашей программы. Теперь у вас есть готовый для запуска код, который вы уже можете запустить без среды разработки или передать друзьям знакомым, опубликовать в интернете и все, кто работает на такой же операционной системе как у вас, сможет выполнить написанную вами программу. Так и происходит весь этот процесс в общих чертах от программирования до конечного пользователя.
Как я уже ранее написал, в компьютере происходит взаимодействие различных программ. Их можно разделить на несколько типов с точки зрения уровня использования.
1. Операционная система. Это программа, которая является средством согласования различных пользовательских программ с конкретным вашим устройством. Например, вы наверно замечали, что в мире множество производителей мобильных устройств, ещё больше производителей микрочипов. Общего международного стандарта никакого нет, каждый производитель чипов как считает его функционал оптимальным, выгодным и конкуретноспособным, так и выпускает его. Получается так, что он определил какие команды будет этот процессор обрабатывать, а какие нет. При этом доминирующие операционные системы для мобильных устройств только две iOS и Android. Например, для Андроид зарегистрировано более 10 тысяч моделей различных телефонов на разных процессорах. И вот вы скачиваете на Samsung например приложение от Сбера, а ваш знакомый на Xiaomi скачивает это же приложение. И там и там оно работает. Как может быть такое чудо, ведь процессоры разные, команды делали их производители под то, как им удобно, а приложение выполняется и там и там. Это всё заслуга программистов операционных систем. Они написали специальные программы-драйверы для каждого процессора и каждого из 10 тысяч устройств. Эти драйверы являются частью операционных систем и являются промежуточным звеном к той же программе от Сбера, которые говорят, например «Слушай, Сбер, скажи пользователю, что я не могу оплатить покупку телефоном, т.к. в нем нет устройства NFC». А другой драйвер говорит, «Слушай, приложение камеры, предложи пользователю вариант включить свет на вспышке, т.к. уже темно в помещении». И это всё для каждого типа устройств писали программисты. Теперь понимаете, держа в руках телефон, какая титаническая работа десятков тысяч программистов была проделана, что бы каждый из нас мог пользоваться тем устройством, какое подходит под наш типаж, мировоззрение и комфорт? С точки зрения персональных компьютеров, всё примерно также как и в мобильных устройствах.
2. Драйвер устройства. Как уже упомянул, это программа часть операционной системы, но выделяет её в отдельную категорию лишь то, что поставляться драйвер устройства может отдельно от операционной системы. Такое раньше можно было часто встретить, например, при покупке новой мыши прилагался компакт диск с драйверами. В современных операционных системах большинство драйверов устройств уже есть изначально, но иногда их всё же нужно устанавливать. Правда, сейчас они чаще идут не на компакт-дисках, а находятся на официальных сайтах производителей оборудования. Например, купили видео карту, но операционная система поняла, что это видео карта и монитор показывает изображение, но производитель уже успел внести в её схему дополнения повышающее её производительность и возможности, но операционная система может об этом ещё не знать. По этому нужно этот драйвер скачать с официального сайта, установить и он станет частью операционной системы и откроет все возможности вашей видео карты.
3. Пользовательские программы. Это те программы, которые мы используем в повседневной жизни – текстовый редактор, калькулятор, бухгалтерские программы, компьютерные игры и т.п.

Первые два пункта – это стезя системных программистов. Здесь нужны глубокие знания в узкоспециализированной информации. Часто это информация скрыта и доступна только производителям оборудования или операционных систем. По этому стать программистом-системщиком (так их иногда называют) сидя за домашним компом попивая чаёк, крайне сложно, и всё потому, что документации найти сложно, а спрос на такие программы примерно равен нулю – никто не будет пользоваться вашими написанными драйверами, если есть драйвера производителя. Причины две – производитель лучше знает как должно правильно работать его устройство, информационная безопасность сильно страдает, так как часто драйвера обладают уровнем привилегий и прав больше обычных, и в случае неправильной работы могут навредить либо информации, находящейся на компьютере, либо самому компьютеру. Эта работа только для тех, кто работает непосредственно в организации по производству оборудования, либо у производителя операционных систем. Вопрос философский, куда пойдет программист-системщик, если уволится, ведь у него большие знания только в области одного типа/производителя оборудования? Сколько будет искать новую работу? Как на новом месте сможет адаптировать свои знания к новой структуре, может мгновенно, а может придётся с нуля приобретать новый опыт. Но, чаще всего, зарплаты там очень крутые, и увольняться обычно никого не тянет, кто-то наверно всю жизнь и работает на одной работе.


Что внутри программы?

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

1. Присвоение значения переменной. Нужно чтобы потом удобно было работать с формулами – вы меняете значение только вначале, а дальше в формуле оно будет вычислено автоматически. Иначе нужно будет менять число далее во всех формулах, где встречается, и можно тут где-то случайно пропустить или ошибиться. Грубо говоря – это аналог математической переменной (кто в школе учил математику в 5 классе). Присвоение значения переменной принято называть инициализацией переменной. В некоторых языка программирования это обязательное условие компиляции, т.е. компилятор не позволяет как-то использовать переменную, пока вы дадите ей какое-то начальное значение.

a = 1

Как правило имя переменной может быть различным:

result = 0

Есть некоторые негласные правила имен переменных. Они выработаны в долгих поисках и чтении чужого когда, да и своего тоже, и придуманы не мной, а огромной командой программистов всех времен.
Во многих языках программирования переменные можно писать только латинскими буквами с цифрами и знаками _ (подчеркивание). Другие символы запрещены. Если это правило есть и в том языке, который вы будете изучать, то тогда сами переменные называйте английскими словами.

MoiResultat = 0; // НЕПРАВИЛЬНО – тут человек может взгляд сломать. Возми гугл, переведи и дай название переменной на английском, что ли…

MyResult = 0; // ПРАВИЛЬНО – название переменной латинскими буквами на английском языке

МойРезультат = 0; // ПРАВИЛЬНО – если язык программирования позволяет вводить кириллицей (например язык 1С), то так будет правильно

МайРизалт = 0; // НЕПРАВИЛЬНО – ты что бюргер что ли?

Иногда в название переменной закладывают сразу несколько слов, чтобы наделить её сразу смыслом. Если название переменной состоит из нескольких слов, то начинайте каждое слово с большой буквы.

myresultwhenigotinthemyfunctionfactorial = 1; // НЕПРАВИЛЬНО – Нормальный человек в здравом уме такое не прочитает…и не напишет…и представьте, что весь код такой и его сотни страниц…

MyResultWhenIGotInTheMyFunctionFactorial = 1; // ПРАВИЛЬНО – ну согласитесь, такое читать куда легче

myResultWhenIGotInTheMyFunctionFactorial = 1; // ПРАВИЛЬНО – первую букву иногда заглавной не делают, т.к. например в языке C и Java принято с заглавной буквы называть объекты, а с маленькой – их переменные.

ТаблицаВыгрузкиСальдоБухгалтерскихСчетовБезАналитикиСводноПоМесяцамКромеЗабалансовых = Неопределено; // ПРАВИЛЬНО – это 1С, товарищ, не хиханьки и не хаханьки! (это всё название переменной, без этого в 1С была бы засада)

В некоторых языках программировании при первой инициализации переменной необходимо обязательно указать тип данных, которые она будет хранить:

int a = 1; // Переменная a будет хранить только целые числа. Попытка запихнуть туда что-то другое, вызовет сначала недоумение компилятора и он попробует преобразовать это в целое число, например, 1.1922324 будет всё равно 1, либо просто начнет ругаться
string b = “Hello, world!”; // Норм! Так пойдёт! строку хранит переменная с типом строки
int a = “Hello, world!”; // СОВСЕМ НЕ НОРМ! – что за бодяга? как эта строка может быть целым числом??? С точки зрения компилятора – никак.


Разных типов может быть бесчисленное множество, так как программист может создавать свои собственные, но есть всё таки базовый набор простых типов, такие как:
Булево (bool) – тип переменной, которая может принять только одно из двух значений – истина или ложь
Целое число (byte, int, long, word, dword) – переменная может хранить только целые числа. Типов целого числа много, тут всё зависит от того до какого предельного значения вы хотите хранить целое число и нужен ли будет математический знак минуса (иногда необходимо хранить только положительные числа), это и определяет вариант.
Вещественное число (float, double) – числа, где нужно хранить дробную часть. Иногда их называют числа с плавающей точкой или плавающей запятой (оттуда и название float). Также их несколько и определяют точность дробной части.
Символ (char) – хранит символ
Строка (string) – хранит множество символов. В мире программирования постоянно происходят метания что при случае выбрать массив char или переменную string (см.далее массивы). Эти метания в основном связаны со спецификой работы каждого типа и функциональными особенностями языка, но по здравому смыслу это одно и тоже.

Переменная может быть массивом (о чем только что писал):

int p[100];

Это значит, что будет создано 100 переменных p, но доступ каждой из них будет по индексу, т.е. p[0], p[1] и т.д. Это удобно, когда нужно выполнить действия сразу над множеством значений одной смысловой группы, например, вы производили 10 замеров температуры на кухне до и после приготовления жаркого, и у вас есть 10 значений. Но вам нужно среднее, чтобы понять превышало ли это среднюю норму домашнего труда или нет. Можно конечно задать так:
a = 23;
b = 25;
c = 27;
d = 28;
….
j = 24;

и потом посчитать по формуле:
Tc = (a + b + c +…+ j) / 10;

а можно сделать так:

int temp[10];

temp [0] = 23;
temp [1] = 25;
temp [2] = 27;
temp [3] = 28;

temp [9] = 24;

Tc = 0; // Так надо, мы не начали ещё считать температуру, значение полинома равно нулю
for (i = 0; i < 10; i++) { // Перебирает от 0 до 9 значения i, а потом использует их как индексы массива для расчета среднего
Tc += temp [i] ;
}
Tc /= 10; // Взять из Tc значение и поделить на 10, а потом запихнуть обратно в Tc

Когда речь идет о сотнях или миллионах чисел, то массив – это единственное решение. Лично я, если чего-то такого больше двух, то как правило делаю массив. Процесс выбора правильного алгоритма, в каком случае взять массив, а в каком создать пару отдельных переменных, как назвать их чтобы потом было понятно, называется творчеством, по этому кто говорит, что программирование – это конвейерная рутинная работа – неправ!

2. Выражение. Иными словами, это формула с числами, переменными или иными величинами.

b = a+2

или

с = sin(alfa)

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

If (b == 2) {
// Что-то выполнить здесь, если вдруг окажется, что благодаря каким-то действиям компьютера это значение станет равным 2, то выполнить нужно код заключенный в эти фигурные скобки, в ином случае просто проигнорировать этот код и перейти дальше
}

Для языка 1С тоже самое:

Если Б = 2 Тогда
// Что-то тут
КонецЕсли;

Для Бейсика:

if b = 2 then
// ???
end

4. Циклы. Чтобы не быть как в анекдоте про нового русского, когда он летит в самолете, а стюардесса объявляет «Наш самолет летит в Баден-Баден», новый русский её останавливает и говорит «Слыш, тут чё лохи летят, зачем Баден два раза повторять?». Так вот чтобы не быть лохом, в программировании придумали циклы, т.е. конструкцию, которая позволяет выполнять одинаковую часть кода несколько раз.

Если делать неправильно, новый русский лохом бы назвал:

print(‘Мы летим в’);
print(‘Баден’);
print(‘Баден’);

А так правильно, новый русский бы оценил:

print(‘Мы летим в’);
for( i = 1; i < 3; i = i+1) { // Перебирать от 1 пока i будет меньше 3, т.е. только значения 1 и 2
print(‘Баден’);
}

Но как бы не делали, в результате на экране будет всё равно одно и то же:
Мы летим в
Баден
Баден

Всё как в анекдоте)))…ну, или не летим…))

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

a = sin(alfa); // это стандартная функция вычисления синуса

function mySin(alfa) {
// Тут, если владеете математикой, раскладываете расчет синуса в ряд Тейлора-Маклорена, и пишите код, который будет вычислять его по вашему алгоритму. Например, если вам нужна бОльшая точность, чем вычисляет это стандартная функция
}

a = mySin(alfa); // А теперь можно наслаждаться результатом

6. Класс. Современные языки позволяют делать иерархию методов (см.п.5), когда несколько методов и/или переменных объединяются по смыслу в один объект – класс. Например, вы делаете приложение чем кормить ваших питомцев. Вам нужно по каждому из них хранить информацию, мол как зовут, что хавает, когда кормил последний раз, где нас***, да вообще как он чувствует себя после этого. Мы делаем класс и называем его ёмким словом «Питомец» (Pet)

class Pet {
string name = “???”
string type = “???”
string eat = “???”

function ThrowASlipperAtItBecauseItMadeAMess() {
// Тут какой-то код
}

function GiveCookies () {
// Тут какой-то код
}
}

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

Pet pet1 = new Pet();

pet1.name = ‘Петроний’;
pet1.type = ‘Кот’;
pet1.eat = ‘Захавал мою сметану – не поплохело’;

pet1. ThrowASlipperAtItBecauseItMadeAMess(); // Выполнить код, запускающий в него тапок

Pet pet2 = new Pet();

pet2.name = ‘Барбос;
pet2.type = ‘Пёс’;
pet2.eat = ‘Принёс назад тапок для запуска его в кота, дал печеньку’;

pet2. GiveCookies (); // Этот код даёт питомцу печеньку


В класса есть такая штука как расширение одного класс другим. Например, для кота Петрония и пса Барбоса есть общие переменные, такие как имя, тип и еда, но вот давать печеньки коту глупо, а пулять тапком в собаку не безопасно. Т.е. для пса выполнить метод ThrowASlipperAtItBecauseItMadeAMess() (переводится как «запустить тапком, так как съел сметану») можно только в шаговой недоступности. По этому эти методы по идее должны быть уникальными для каждого типа. Это можно делать так:

class Pet() {
string name = “???”
string type = “???”
string eat = “???”
}

class PetCat() extends Pet {
function ThrowASlipperAtItBecauseItMadeAMess() {
// Тут какой-то код
}
}

class PetDog() extends Pet {
function GiveCookies () {
// Тут какой-то код
}
}

Объявление их тоже будет немного по другому:

PetCat pet1 = new PetCat();

pet1.name = ‘Петроний’;
pet1.type = ‘Кот’;
pet1.eat = ‘Захавал мою сметану – не поплохело’;

pet1. ThrowASlipperAtItBecauseItMadeAMess();


PetDog pet2 = new PetDog();

pet2.name = ‘Барбос;
pet2.type = ‘Пёс’;
pet2.eat = ‘Принёс назад тапок для запуска его в кота, дать печеньку’;

pet2. GiveCookies (); // Этот код даёт питомцу печеньку

Но никто не мешает делать, конечно, и так:

Pet pet1 = new PetCat(); // Всё внимание на тип вначале! Найдите отличия.
Pet pet2 = new PetDog(); // pet2 тоже с тем же типом, хотя создаётся экземпляр другого объекта (уже расширенного)

Но тогда перед тем как вызвать функцию, нужно сначала убедиться в типе этого объекта, т.к тип Pet ничего не знает и не ведает о том, что его где-то кто-то стал расширять.

Теперь уже не получится запульнуть в пса тапком и дать коту печеньку, т.е. например, так не выйдет – pet1. GiveCookies (); – этот метод теперь только для объекта PetDog(), компилятор скажет, что у этого объекта нет такого метода.

Как вы заметили, переменные объявляются только один раз в родительском классе (классе, функционал которого мы расширяем).

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

7. Комментарии. Это те части кода, которые просто нужны чтобы программист сделал какие-то заметки для себя или других программистов, которые могут работать с этим кодом. Компилятор будет их полностью игнорировать.


Философия “Hello World!”

Когда-то в далёком эээ…уже не помню каком году, мы с одноклассниками сидели на табуретках с электрогитарами в руках и спорили нужно ли для хорошей игры учить пассажи известных музыкантов, таких как Джо Сатриани или Ван Халена. Мне говорили обязательно нужно, иначе не будешь знать основ и не сможешь нормально играть, а я говорил, что если я буду учить других, то мне сложно будет придумать своё, а в музыке это означает потерять индивидуальность. И как показала жизнь, у каждого была тогда своя правда. В программировании так же. Здесь нужно всего в меру, меньше неё будет недостаточно для написания рационального и лаконичного кода, а если будет слишком много – разрушит элементы творчества, ты просто превращаешься в великого комбинатора – взял там кусок кода, взял тут готовый метод…хотя, это тоже в некотором роде творчество. Приведу пример. Некогда я писал много и для души на ассемблере. Часто приходилось обнулять 32-битный регистр, т.е. записывать в него значение ноль. Я делал это таким способом, кстати, строго по умной книжке:

MOV EAX, 0

Эта команда занимала, если не соврать, 5 байт в режиме 32 битного режима процессора по умолчанию. Но потом дизассемблируя чей-то код из игрухи типа «Принц оф Персия», я увидел интересную конструкцию:

XOR EAX, EAX

которая занимала уже только 1 байт. Результат тот же, но логическое действие совершенно не очевидное, эта команда не помещает ноль в регистр, она берёт то, что там уже есть и исключает само себя. Согласитесь, это красиво как любимая женщина (с мужской стороны, как для милых дам написать, я не знаю, что для вас сравнимо по красоте)) ). Тут то я и понял, насколько важно всё-таки иногда заглядывать на то, как делают другие, и о чём в книгах могут не написать.
При изучении нового языка программирования, уже так повелось, люди первым делом пишут вывод фразы «Hello, world!», ну или «Привет, мир!» (кому как удобнее). И вот какой в этом смысл:
1. Вы понимаете, что у вас работает среда разработки
2. Вы понимаете, что у вас правильно настроен и работает компилятор
3. Вы понимаете какой именно код заставил миллиарды транзисторов вашего устройства выстроить такую последовательность сигналов, что это привело к написании на вашем устройстве этой фразы, и на этом этапе всё, что вы делали правильно, и это работает…кстати, иногда пишут и такую фразу «It’s work!» (это работает).
Моя рекомендация – начинайте всегда изучать языки программирования с этой фразы. Она даёт дозу того самого волшебного пинка – психологически, если сразу что-то начинает работать, хотя ты только начал изучать, сильно бодрит, внушает чувство власти тебя над вычислительной системой, она выполняет команды, которые ты вводишь как верный пёс)), как любовь с первого взгляда.

Соблюдайте следующие принципы программирования

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


Не делайте избыточные комментарии:

a = 0; // Поместить в a ноль чтобы проверить как на него делить – ПРАВИЛЬНО

b = 1 / a; // Поделить 1 на a, которое содержит ноль – НЕПРАВИЛЬНО (избыточно), и так ясно, что здесь 1 делиться на a, которое содержит ноль, что тоже указано в предыдущем комментарии


Не делайте код совсем без комментариев. Часто бывает, что текущий проект нужно отложить на время. Потом, когда вы сможете к нему возвратиться, вам точно будет сложно понимать некоторые вещи, особенно если проект большой. Если вы ведете командную разработку, то это может быть иногда даже обязательным условием – уважайте время других программистов, напишите почему вы делаете этот алгоритм именно таким, хотя бы вначале, вкратце.


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

a = 0; // Поместим в a ноль и проверим как на него делить – НЕПРАВИЛЬНО – вы может и помещаете, а лично Мы – нет.

a = 0; // Помещаю в a ноль чтобы проверить как на него делить – НЕПРАВИЛЬНО – ну и хорошо, помещай дальше что хочешь, я тут при чём? Мне что за тобой следить нужно? И давай уже решайся быстрее что туда помещать!

a = 0; // Помещаем в a ноль чтобы проверить как на него делить –
НЕПРАВИЛЬНО – я уже ответил про вас, мы не помещаем ничего никуда, тем более в перманентном процессе, да, это будет, но только один раз…и без вас

a = 0; // Помести в a ноль и проверь как на него делить –
НЕПРАВИЛЬНО – как ты груб с компом, фу!

a = 0; // Поместить в a ноль чтобы проверить как на него делить – ПРАВИЛЬНО – да, нужно поместить, а уж пометит ли он на самом деле и определяет что ты за программист и на каком железе работаешь)).

Кстати, в математике нельзя поделить число на ноль, но в компьютерных процессорах – можно. Результат будет «не число». Но большинство программ отрабатывают этот результат деления как ошибку «Деление на ноль», ну чтобы не вводить в заблуждение рядового пользователя)).


2. На каком бы языке вы не программировали, делайте код таким, чтобы он был наиболее удобно читаемым.

ЕслИ а = 1 ТОгДА ЧтоТоОБъЯвляюЗдесьПотомВыход = Истина; КонЕцЕсли; // НЕПРАВИЛЬНО – буквы скачут, всё условие в одну строку. Это всё равно что программиста, который будет этот код читать, обматерить в грубой форме

// ПРАВИЛЬНО – удобно читать код, код аккуратен.
Если а = 1 Тогда
ЧтоТоОбъявляюЗдесьПотомВыход = Истина;
КонецЕсли;

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

Так пишу я:

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

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

Хотя никто не запрещает писать так:

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

К моменту прочтения этой статьи, вам желательно иметь навыки продвинутого пользователя.-2

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

3. Сам язык программирования (любой) выучить не сложно, имеется ввиду его синтаксис, потому что выучить все методы современного языка физически невозможно, их десятки тысяч, да и кому это нужно. Например, зачем вам глубоко погружаться в специфику программирования для работы с устройствами Bluetooth, если вы никогда не будете их программировать в обозримом будущем, а только по этим классам сотни методов. С другой стороны, знание только языка вряд ли сможет закрыть вопросы решения современных задач. Так или иначе нужно изучать смежные технологии. Например, если вы решили сделать программу, которая передаёт файл по сети в другую такую же программу, то вам как минимум нужно будет понимать как работает сеть, чтобы знать логику и порядок выполнения тех или иных команд, их значения. Например, невозможно это сделать в ряде случаев, если вы не знаете что такое IP адрес, доменное имя или что такое сокет, не знаете, что сокет нужно открывать, а после использования закрывать. Даже не знание простых вещей иногда приводит к неверной работе программы. Например, вы в своей программе выделяете место в оперативной памяти, и как это сделать вам даст изучение языка, но нужно ли потом принудительно освобождать память и в каких случаях это нужно делать принудительно, а в каких система сама разберется с этим лучше, чем кто либо, знание только языка программирования вам не даст. Там например будет просто описание функции free() – освобождает память, а зачем она это делает, а зачем вообще это нужно, ни одно описание языка программирования вам это не скажет. Многие описания предполагают принцип «Вы конкретно знаете что хотите сделать, но определенно не знаете как это сделать».

Итог

Теперь остается только хорошенько всё обдумать, выбрать нужный язык программирования и приступить к созданию своей первой программы.