Как написать скрипт

Как написать скрипт

Учимся писать userscript’ы

Доброго времени суток всем желающим приобщиться к миру пользовательских скриптов (они же userscript, userJS, юзерскрипты).

В этой статье я хочу поведать о том, что такое юзерскрипты, c чем их едят и, главное, как их готовят!

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

Что такое юзерскрипты?

Кратко: юзерскрипт — это программа, написанная на языке JavaScript, хранящаяся на компьютере пользователя и подключаемая браузером на определенных страницах. Юзерскрипт представляет собой файл с расширением .user.js (именно по расширению браузеры понимают, что файл является юзерскриптом), содержащий метаданные и непосредственно javascript-код.

При подключении к странице юзерскрипт выполняется так же, как и обычные javascript-сценарии.
У юзерскрипта есть доступ к DOM-дереву страницы, в контексте которой он выполняется.
В современных браузерах у юзерскрипта есть доступ к localStorage и прочим HTML5 API.

Юзерскрипты поддерживаются всеми основными современными браузерами (и даже кое-как поддерживаются IE7 и выше).

Самый известный портал юзерскриптов — userscripts.org. Тут можно найти хранилище скриптов, инструменты управления своими скриптами на портале и, что не маловажно, отзывчивый форум (всё на английском).

Немного общей теории

Самыми распространенными являются скрипты под расширение GreaseMonkey для браузера Firefox.
Подробную информацию по GreaseMonkey и написанию юзерскриптов под GreaseMonkey можно узнать на http://wiki.greasespot.net.
Так сложилось исторически, что данный браузер был (и остаётся по сей день) первым, в котором поддержка юзерскриптов была выполнена на высоком уровне.

Не все скрипты, написанные для GreaseMonkey, могут запускаться в других браузерах. Причина в криворукости том, что во многих скриптах используется GM API — набор javascript-функций, специфичных для GreaseMonkey.

Особенности юзерскриптов

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

Важно:Если вы не доверяете автору скрипта, главное удостовериться, что скрипт не отсылает пользовательские данные (куки, вводимый текст) на сторонние сервисы!

Все юзерскрипты запускаются после того, как загрузились все основные элементы страницы, но ещё не загрузились картинки. Можно сказать, что юзерскрипты грузятся по событию DOMContentLoaded.
В любом случае, проверки на window.onload не нужны.

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

Анатомия юзерскриптов

Юзерскрипт — это текстовый файл с расширением user.js. В начале файла располагается блок метаданных — описание самого скрипта. После блока метаданных следует javascript-код, который и будет исполняться браузером.

Рассмотрим тестовый скрипт, который показывает alert с текстом на определенной странице.

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

В самом начале располагается блок метаданных (в виде комментария).

Этот блок состоит из директив описания юзерскрипта. Ниже в таблице представлены основные директивы и их назначение.

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

Директива Назначение
@ name Название юзерскрипта.
Это название будет отображаться в интерфейсе управления
юзерскриптами. Если директива отсутствует, то название
юзерскрипта будет таким же, как и название файла.
@ description Описание юзерскрипта.
Это описание будет отображаться в интерфейсе управления
юзерскриптами.
@ namespace Пространство имён.
Определяет уникальность набора скриптов.
Сюда можно вписать имя домена, принадлежащего вам. Или любую другую строку.
Считайте, что это второе название скрипта. Обязательная директива для Trixie!
@ author Имя автора.
@ license Название лицензии, по которой распространяется юзерскрипт.
@ version Номер версии юзерскрипта.
К сожалению, механизма автообновления нету ни в одном браузере,
поэтому номер версии — это просто цифры, которые отображаются в интерфейсе.
@ include Директива описания url страницы,
на которой нужно запускать юзерскрипт.
Поддерживает вайлдкард *(применимо в GreaseMoneky, Opera, IE).
Для каждого отдельного url нужно использовать отдельную директиву @ include.
@ exclude Директива описания url страницы,
на которой не нужно запускать юзерскрипт.
Поддерживает вайлдкард *(применимо в GreaseMonkey, Opera, IE).
Для каждого отдельного url нужно использовать отдельную директиву @ exclude.
@ match Аналогично @ include, но с более жесткими ограничениями
(применимо в GreaseMonkey старше 0.9.8, Google Chrome).
Подробнее об ограничениях и формате директивы можно
прочитать на этой странице.
Для каждого отдельного url нужно использовать отдельную директиву @ match.

Важно: При отсутствии директив @ include или @ match, юзерскрипты будут запускаться на всех страницах.

Результат

Наш юзерскрипт готов к использованию!
Нет, серьёзно, вы можете скопировать код юзерскрипта в файл, назвать его my.user.js, и закинуть полученный файл в браузер (используйте Chrome или Firefox с установленным GreaseMonkey).

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

Источник

Что такое скрипт

Общее понимание скрипта

С английского языка слово «скрипт» переводится как сценарий, из чего уже можно сделать определенные выводы. Это набор команд, то есть строк кода, которые вкупе выполняют конкретную задачу. Для ее выполнения и создаются скрипты. Они могут быть как очень маленькими по объему и отвечать за запуск каких-то простых служб операционной системы, так и объемными, сравнивая переменные и выводя результат на сайте.

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

Скрипты сейчас активно интегрируются на сайтах, в качестве примера можно привести популярный скриптовый язык – JavaScript. Однако изначально они работали в операционных системах и выполнялись при помощи внутреннего синтаксиса командной оболочки.

История появления скриптов

Для общего развития предлагаю немного окунуться в историю появления скриптов и взглянуть на то, какими они были раньше. Начали применять их под управлением семейства операционных систем Unix еще 50 лет назад. Одной из первых командных оболочек была sh, в ней использовались shell scripts, которые позволяли выполнять самые разнообразные задачи на компьютере.

Ниже вы видите небольшой код, предназначенный для конвертирования изображения из JPG в PNG:

Обозначения после знаков # являются комментариями и не относятся к скрипту, они только описывают для пользователя действия. Этот пример был взят из открытой библиотеки и отлично показывает, что всего несколько строк кода позволяют обработать изображение, сменив его формат на другой. Сейчас скрипты могут быть более массивными и выполнять задачи на уровень сложнее.

Сферы использования скриптов

Скрипты часто используются на веб-сайтах. Чаще всего они пишутся на языках PHP и JavaScript. Первый используется для написания той части сайта, которую не видит посетитель, то есть бэкенда, а второй в большинстве случаев отвечает за визуал, то есть разные анимации, плавные переходы и другие действия (фронтэнд).

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

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

Если говорить о Windows, то в ней вы можете найти встроенный инструмент CMD (PowerShell), который и предназначен для запуска скриптов, хранящихся в формате BAT.

Самостоятельное написание и применение скриптов

Разберем самостоятельное написание и применение скриптов на примере Windows. Допустим, у вас стоит задача проверить стабильность соединения с конкретным сайтом без запуска браузера. Для этого есть одна полезная команда, запускаемая через Командную строку. А если нужно еще сформировать и отчет о результатах проверки, не совсем удобно будет вводить несколько разных команд по очереди, особенно в тех случаях, когда задача выполняется раз в несколько дней или чаще. Тогда создается BAT-файл с таким содержимым:

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

Источник

Руководство по JavaScript, часть 1: первая программа, особенности языка, стандарты

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

Это руководство, по замыслу автора, рассчитано на тех, кто уже немного знаком JavaScript и хочет привести свои знания в порядок а также узнать о языке что-то новое. Мы решили немного расширить аудиторию этого материала, включить в неё тех, кто совершенно ничего не знает о JS, и начать его с написания нескольких вариантов «Hello, world!».

Hello, world!

Программа, которую по традиции называют «Hello, world!», очень проста. Она выводит куда-либо фразу «Hello, world!», или другую подобную, средствами некоего языка.

JavaScript — это язык, программы на котором можно выполнять в разных средах. В нашем случае речь идёт о браузерах и о серверной платформе Node.js. Если до сих пор вы не написали ни строчки кода на JS и читаете этот текст в браузере, на настольном компьютере, это значит, что вы буквально в считанных секундах от своей первой JavaScript-программы.

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

Первая программа в консоли браузера — вывод сообщения в консоль

Ещё один вариант браузерного «Hello, world!» заключается в выводе окна с сообщением. Делается это так:

Вот результат выполнения этой программы.

Вывод сообщения в окне

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

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

Источник

Как писать bash-скрипты надежно и безопасно: минимальный шаблон

Скрипты на Bash. Как много в этом слове. Любому разработчику рано или поздно приходится их писать. Почти никто не скажет «да, я люблю писать bash-скрипты», и поэтому этой теме уделяют мало внимания.

Я не буду пытаться сделать из вас эксперта в Bash, а просто покажу минимальный шаблон, который поможет сделать ваши скрипты более надежными и безопасными.

Лучше всего суть Bash-скриптинга была выражена недавно в одном твите:

Но у Bash есть кое-что общее с другим многими любимым языком. Как и JavaScript, он просто так не исчезнет. Хоть Bash (к счастью!) и не станет основным языком буквально для всего, он все равно всегда будет где-то рядом.

Bash можно найти почти в каждой Linux-системе, включая образы Docker. Так что если вам нужно создать скрипт для запуска серверного приложения, этапа CI/CD или запуска интеграционных тестов, Bash подойдет в самый раз.

Да, Bash очень далек от совершенства. Синтаксис просто кошмарный. Обработка ошибок сложна. Повсюду подводные камни. И нам придется с этим что-то делать.

Шаблон bash-скрипта

Давайте сразу к делу

Bash, к сожалению, никак не упрощает эту задачу из-за отсутствия какого-либо способа управления зависимостями. Одним из решений было бы иметь отдельный скрипт со всеми стандартными и служебными функциями и запускать его в самом начале. Недостатком этого варианта будет необходимость всегда таскать этот второй файл повсюду, что уже все-таки далеко от идеи «простого Bash-скрипта». Поэтому я решил добавить в шаблон только то, что считаю минимально необходимым и сделать его максимально коротким.

А теперь давайте углубимся в детали.

Выбираем интерпретатор

Скрипты обычно начинаются с шебанга. Для лучшей совместимости я использую /usr/bin/env вместо непосредствено /bin/bash. Хотя, учитывая комментарии на StackOverflow по ссылке выше, даже это может иногда не сработать.

Fail fast

Что произойдет, если ‘./backups/’ не существует? Именно, вы получите сообщение об ошибке в консоли, но прежде чем вы успеете отреагировать, файл уже будет безвозвратно удален второй командой.

О том, как работает ‘-Eeuo pipefail’ и от чего он защищает, можно прочитать вот в этой статье.

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

Узнаем путь

Эта строка пытается определить директорию расположения скрипта.

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

Но если наша CI-система запустит скрипт вот так:

то наш скрипт сработает не в директории проекта, а в каком-то совершенно другом месте. Мы можем исправить это, перейдя по нужному пути перед выполнением скрипта:

Но гораздо лучше решить эту проблему на стороне скрипта. Итак, если скрипт читает какой-то файл или запускает другую программу из той же директории, где лежит он сам, он будет делать это так:

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

Прибираемся

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

Отображаем справочную информацию

Располагая usage() где-то в начале скрипта, мы одним выстрелом убиваем двух зайцев:

Отображаем справочную информацию для пользователя, который хочет узнать все возможные и необходимые параметры для его запуска и не хочет изучать весь скрипт чтобы разобраться в них;

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

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

Красивый вывод сообщений

Тут нужно отметить несколько вещей:

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

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

Функция msg() предназначена для печати всего, что не является непосредственно выхлопом скрипта. Сюда входят все логи и сообщения, а не только ошибки.

Чтобы проверить, как он себя ведет, когда stderr не является интерактивным терминалом, добавьте в скрипт строку, подобную приведенной выше. Затем запустите его, перенаправив stderr на stdout и подключив его к cat. В результате операции конвейера вывод больше не отправляется непосредственно на терминал, а отправляется следующей команде, поэтому теперь вы не увидите цветов, но и не увидите никакого мусора:

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

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

Есть три основых типа параметров CLI: флаги, именованные параметры и позиционные аргументы. Все они поддерживаются функцией parse_params().

В шаблоне уже для примера объявлен флаг (-f) и именованный параметр (-p). Просто измените или скопируйте их, чтобы добавить другие параметры. И не забудьте после этого обновить usage() 🙂

Использование шаблона

Просто скопипастьте его, как вы это обычно делаете с кодом, который вы находите в интернете.

После того, как вы его скопируете, вам нужно изменить только 4 вещи:

текст usage() с описанием скрипта;

основную логику скрипта 🙂

Переносимость

Я тестировал шаблон на MacOS (где по дефолту древний Bash 3.2) и нескольких образах Docker: Debian, Ubuntu, CentOS, Amazon Linux, Fedora. Всё работает.

Очевидно, что он не будет работать в средах без Bash, таких как Alpine Linux. Alpine, как минималистичная система, использует легковесный ash.

Вы можете спросить: не лучше ли использовать Bourne Shell-совместимый скрипт, который будет работать почти везде? Ответ, по крайней мере в моем случае: нет. Bash безопаснее и мощнее (пусть и не прост в использовании), поэтому я могу смириться с отсутствием поддержки нескольких дистрибутивов Linux, с которыми мне редко приходится иметь дело.

Внеклассное чтение

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

И в заключение

Я не первый и не последний, кто создал шаблон скрипта Bash. Хорошей альтернативой является этот проект, хоть он и слишком большой для моих повседневных нужд. В конце концов, я стараюсь делать bash-скрипты как можно компактнее.

При написании скриптов Bash используйте среду IDE, которая поддерживает линтер ShellCheck, например IDE JetBrains. Это не даст вам наворотить кучу вещей, которые могут привести к неприятным последствиям.

Источник

Как написать PHP скрипт

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

Команда контент-менеджеров wikiHow тщательно следит за работой редакторов, чтобы гарантировать соответствие каждой статьи нашим высоким стандартам качества.

Количество просмотров этой статьи: 31 867.

PHP — это серверный язык написания скриптов, предназначенный для создания интерактивных веб-страниц. Он стал очень популярен благодаря простоте использования, функциям интерактивности внутри веб-страниц и интеграции с HTML. Только представьте себе, что происходит в момент редактирования страницы даже на этом сайте. За этим процессом стоит множество, а возможно, даже сотни PHP скриптов, контролирующих изменение веб-страниц в зависимости от различных обстоятельств. В данной статье вы узнаете о том, как можно написать несколько очень простых PHP скриптов — так вы получите общее представление об основах работы PHP.

Источник

Как начать писать на JavaScript с нуля

Очень сложно представить современные сайты без интерактива с пользователем. Тогда бы они никак не взаимодействовали с нами, а любое нажатие приводило бы к полной перезагрузке страницы. Согласитесь, это очень скучно.

Рассмотрим, из чего состоят веб-странички. HTML (HyperText Markup Language) отвечает за придание странице структуры (показывает, где меню сайта, а где заголовок, логотип или статья) и контента (различные тесты, списки, изображения и т. д.). CSS (Cascading Style Sheets) отвечает за визуальную составляющую страницы: определяет, какого цвета и размера должен быть тот или иной блок, как его оформить и вывести пользователю.

Структура и оформление есть, но где же взаимодействие? Здесь на сцену выходит JavaScript. Виртуальный «диалог» с пользователем — от изменения части содержимого сайта в ответ на действия до современных игр в браузере — реализуется с помощью скриптов JavaScript. Этот язык программирования работает в браузере и позволяет взаимодействовать с веб-страницей в режиме реального времени, оживляя её и предоставляя пользователю обратную связь на все действия.

У JavaScript очень интересная история. Он — реализация стандарта ECMAScript, может работать не только в браузере. Но в статье мы рассмотрим только взаимодействие с браузером.

Создаём самый простой скрипт

В первом задании, которое традиционно выполняет студент при изучении языка программирования, нужно вывести на экран фразу «Hello, world». Это позволяет отработать самый важный аспект — вывод информации пользователю, а также познакомиться с базовой структурой программы. Поступим так же.

Есть множество способов что-то вывести на экран в браузере, но мы выберем самый простой. Откроем «Инструменты разработчика» (Developer Tools) в браузере Chrome. Сделать это можно через сочетание клавиш Ctrl + Shift + I или F12 (Cmd + Opt + I на macOS) или через меню браузера. В Google Chrome нужно нажать на три точки, в других браузерах эта настройка может выглядеть иначе. Далее выбираем пункт «Дополнительные инструменты» и «Инструменты разработчика».

У вас должно появиться примерно такое окно, как ниже. Какой именно сайт выбрать для работы, не важно, можете открыть и GeekBrains.

Нас интересует вкладка Console. В ней могут быть ошибки и предупреждения (красные или жёлтые надписи) — не обращайте на них внимания, они нам не помешают. Выполним задание — выведем «Hello, world» на экран. Для этого нам понадобится команда alert(). Она выводит текст, который передан в круглых скобках.

Обратите внимание на регистр — здесь он имеет значение. Также не упустите кавычки — любой текст мы обязаны обрамлять в двойные или одинарные кавычки.

Мы выполнили первое задание — вывели простой текст на экран.

Учимся писать чуть более сложные скрипты

На экране перед нами статичный текст, что не очень интересно. Хотелось бы больше взаимодействия с пользователем. Что, если мы будем спрашивать имя зашедшего на сайт и здороваться с ним?

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

Для создания переменной в JavaScript нужно применить ключевое слово let. Есть и другие, но не будем так глубоко погружаться в детали.

Требования к именованию переменных:

Создадим простую переменную, поместив в неё имя. Например, Иван.

Обратите внимание: мы объединили слово «привет» и переменную. Здесь имеет значение каждый символ: сначала alert, потом открывающая круглая скобка, которая говорит, что дальнейшие инструкции нужно вывести на экран. Затем кавычки, в которых заключён приветственный текст. Далее знак +, который подсказывает программе, что текст справа от знака нужно объединить с тем, что слева. И завершает это закрывающая круглая скобка.

Мы вывели имя из переменной на экран, но ведь было нужно показать имя, которое сообщит пользователь. Исправим это. Нам понадобится команда prompt(). Она задаст пользователю вопрос — запишем его в круглых скобках. Сохраним в переменную результат выполнения команды prompt().

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

Сохраняем наш первый скрипт

Редактировать и сохранять файлы со скриптами можно с помощью любого текстового редактора. Cамый простой и примитивный — «Блокнот», который поставляется вместе с Microsoft Windows. Есть и специальные редакторы кода, например, Visual Studio Code. В блоге даже выходила специальная подборка редакторов кода JavaScript — выбирайте и дерзайте 🙂

Читайте также:  когда выход на пенсию женщинам 1967 года рождения 2 детей

А если хотите извлечь из JavaScript максимум — приглашаем на факультет Fullstack JavaScript-разработки GeekBrains!

Очень сложно представить современные сайты без интерактива с пользователем. Тогда бы они никак не взаимодействовали с нами, а любое нажатие приводило бы к полной перезагрузке страницы. Согласитесь, это очень скучно.

Рассмотрим, из чего состоят веб-странички. HTML (HyperText Markup Language) отвечает за придание странице структуры (показывает, где меню сайта, а где заголовок, логотип или статья) и контента (различные тесты, списки, изображения и т. д.). CSS (Cascading Style Sheets) отвечает за визуальную составляющую страницы: определяет, какого цвета и размера должен быть тот или иной блок, как его оформить и вывести пользователю.

Структура и оформление есть, но где же взаимодействие? Здесь на сцену выходит JavaScript. Виртуальный «диалог» с пользователем — от изменения части содержимого сайта в ответ на действия до современных игр в браузере — реализуется с помощью скриптов JavaScript. Этот язык программирования работает в браузере и позволяет взаимодействовать с веб-страницей в режиме реального времени, оживляя её и предоставляя пользователю обратную связь на все действия.

У JavaScript очень интересная история. Он — реализация стандарта ECMAScript, может работать не только в браузере. Но в статье мы рассмотрим только взаимодействие с браузером.

Создаём самый простой скрипт

В первом задании, которое традиционно выполняет студент при изучении языка программирования, нужно вывести на экран фразу «Hello, world». Это позволяет отработать самый важный аспект — вывод информации пользователю, а также познакомиться с базовой структурой программы. Поступим так же.

Есть множество способов что-то вывести на экран в браузере, но мы выберем самый простой. Откроем «Инструменты разработчика» (Developer Tools) в браузере Chrome. Сделать это можно через сочетание клавиш Ctrl + Shift + I или F12 (Cmd + Opt + I на macOS) или через меню браузера. В Google Chrome нужно нажать на три точки, в других браузерах эта настройка может выглядеть иначе. Далее выбираем пункт «Дополнительные инструменты» и «Инструменты разработчика».

У вас должно появиться примерно такое окно, как ниже. Какой именно сайт выбрать для работы, не важно, можете открыть и GeekBrains.

Нас интересует вкладка Console. В ней могут быть ошибки и предупреждения (красные или жёлтые надписи) — не обращайте на них внимания, они нам не помешают. Выполним задание — выведем «Hello, world» на экран. Для этого нам понадобится команда alert(). Она выводит текст, который передан в круглых скобках.

Обратите внимание на регистр — здесь он имеет значение. Также не упустите кавычки — любой текст мы обязаны обрамлять в двойные или одинарные кавычки.

Мы выполнили первое задание — вывели простой текст на экран.

Учимся писать чуть более сложные скрипты

На экране перед нами статичный текст, что не очень интересно. Хотелось бы больше взаимодействия с пользователем. Что, если мы будем спрашивать имя зашедшего на сайт и здороваться с ним?

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

Для создания переменной в JavaScript нужно применить ключевое слово let. Есть и другие, но не будем так глубоко погружаться в детали.

Требования к именованию переменных:

Создадим простую переменную, поместив в неё имя. Например, Иван.

Обратите внимание: мы объединили слово «привет» и переменную. Здесь имеет значение каждый символ: сначала alert, потом открывающая круглая скобка, которая говорит, что дальнейшие инструкции нужно вывести на экран. Затем кавычки, в которых заключён приветственный текст. Далее знак +, который подсказывает программе, что текст справа от знака нужно объединить с тем, что слева. И завершает это закрывающая круглая скобка.

Мы вывели имя из переменной на экран, но ведь было нужно показать имя, которое сообщит пользователь. Исправим это. Нам понадобится команда prompt(). Она задаст пользователю вопрос — запишем его в круглых скобках. Сохраним в переменную результат выполнения команды prompt().

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

Сохраняем наш первый скрипт

Мы написали программу (скрипт) в консоли браузера. Это было быстро и просто, но не очень практично — такой программой с пользователями не поделишься. Чтобы сделать это, сохраним программу в файл с расширением *.html. Имя можем дать произвольное. Так как HTML подразумевает определённую структуру контента, нужно её отчасти соблюсти, чтобы всё работало. Понадобятся теги и

Источник

Гайд для начинающих: как писать на JavaScript

Современный интернет немыслим без скриптов. Учимся писать на JavaScript.

Если бы для интернета писали Библию, она начиналась бы так:

Сначала была почта. И увидели инженеры, что это хорошо. И создали они WWW с гиперссылками. И увидели инженеры, что это тоже хорошо. И создали они тогда язык JavaScript для оживления страничек.

Примерно так происходило в реальности. JavaScript придумали, чтобы «оживить» HTML. Скрипты JavaScript пишутся непосредственно в текст HTML или хранятся в отдельных файлах, как и стили CSS. Они выполняются сразу после загрузки страницы в браузер.

Даже сам язык в первое время назывался LiveScript. Потом его переименовали в JavaScript, потому что планировали как-то увязать с языком общего назначения Java. Но сейчас у них нет практически ничего общего, а JavaScript — совершенно независимый язык программирования со своей четкой спецификацией ECMAScript.

Формально JavaScript является торговой маркой Oracle, а этот язык — «расширение» ECMAScript, наряду с JScript от Microsoft и ActionScript, но это скорее заморочки владельцев торговых марок. Главное, что свободный ECMAScript никому не принадлежит.

Со временем сфера влияния JavaScript значительно расширилась. Его начали использовать не только для скриптов на странице HTML, но и для серьезных больших веб-приложений и целых программ, которые работают в браузере. Есть инструменты, чтобы специальным образом «упаковать» эти программы и выполнять их отдельно от браузера.

Приложения JavaScript выполняются в любой среде, где есть соответствующий интерпретатор.

Как сделать JavaScript? Написать элементарный скрипт не сложнее, чем простую HTML-страничку, ведь скрипты JavaScript пишутся обычным текстом, то есть их можно создавать буквально в том же «Блокноте», сохраняя потом в отдельных файлах или вставляя в тело HTML-документа. Самые простые вещи на JavaScript делаются действительно просто.

Как написать JavaScript

Для примера сделаем простой скрипт для выполнения сервером сценариев Windows. Этот скрипт можно написать прямо в «Блокноте» и выполнить без браузера.

Пишем этот текст в «Блокноте», затем сохраняем файл под именем skillbox.js и запускаем в «Проводнике» Windows.

alert()

Метод alert() отображает окошко с кнопкой «OK». В окне выводится сообщение, которое указано в скобках. Например, «Привет, Skillbox!». То есть в данном случае браузер делает ровно то же самое, что перед этим делал сервер сценариев Windows.

Эти примеры тоже можно писать в «Блокноте», только сохранять в файлах с расширением HTML. Например, skillbox.htm.

В качестве аргумента alert() можно указать не только конкретный текст, но и результат каких-либо вычислений или обработки других данных. Например, alert(x), где x вычисляется отдельно.

confirm()

Метод confirm() выводит такое же окно с сообщением, но уже с двумя кнопками — «ОК» и «Отмена». В зависимости от того, какую кнопку щелкнет пользователь, метод возвращает либо значение true, либо false. Сервер получает это возвращаемое значение от пользователя и выполняет какое-то действие, в зависимости от ответа.

Синтаксис такой же, только здесь логически предполагается выбор, так что пользователю задают вопрос.

prompt()

Метод prompt() выводит диалоговое окно с сообщением и текстовым полем, куда пользователь вводит данные. Здесь тоже предусмотрены две кнопки «ОК» и «Отмена». По нажатию первой кнопки метод возвращает на сервер введенный текст, а по нажатию второй кнопки возвращает логическое значение false.

Синтаксис здесь такой:

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

Возможности современного JavaScript выходят далеко за рамки примитивного ввода-вывода данных через формы. Эти методы мы привели только в качестве самых простых примеров. Кроме этого, JavaScript позволяет реагировать на действия пользователя. Например, на движения мышкой или нажатие определенных клавиш. JavaScript часто используется для обеспечения асинхронной работы ( Технология AJAX), когда информация на странице обновляется без ее перезагрузки. В этом режиме данные отправляются на сервер и загружаются оттуда в интерактивном режиме. Кроме того, JavaScript способен манипулировать с HTML-элементами на странице (создавать и прятать теги и т.д.) и делать многое другое.

Полезные инструменты

Консоль разработчика

Во всех популярных браузерах есть специальная консоль разработчика. Она показывает код скриптов на странице, а также выводит другую полезную информацию. В Chrome, Firefox и IE консоль разработчика открывается по нажатию горячей клавиши F12, в Safari — Ctrl+Shift+I или Ctrl+Alt+C. На скриншоте скрипты отображаются справа вверху, вместе с другими элементами веб-страницы.

Редакторы кода

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

Для начала можно рекомендовать один из легких редакторов:

В будущем есть смысл присмотреться к IDE:

Источник

Titiaiev / bash-guide-1.md

Бесплатная книга-сайт на русском, полный гайд
Advanced Bash-Scripting Guide

BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.

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

Что необходимо знать с самого начала

в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash ) поменяйте её на ваш путь.

Переменные и параметры скрипта

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

Результат выполнения скрипта:

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

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

#!/bin/bash
#в переменную source засовываем первый параметр скрипта
source=$1
#в переменную dest засовываем второй параметр скрипта
dest=$2

Результат выполнения скрипта:

Структура if-then-else используется следующим образом:

для построения многоярусных условий вида:

для краткости и читаемости кода, можно использовать структуру:

Условия. Множественный выбор

Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.

esac #окончание оператора case.

После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )

Прведу список логических операторв, которые используются для конструкции if-then-else-fi:

-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( # меньше
-le,( # меньше или равно
-gt,(>) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»

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

Циклы. Цикл for-in.

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
Синтаксис следующий:

Рассмотрим небольшой пример:

Циклы. Цикл while.

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0).
Синтаксис оператора следующий:

Пример работы цикла рассмотрим на следующем примере:

А теперь результат работы скрипта:

Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.

Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.
Вот пример:

Результат выполнения скрипта:

Ну вот, как видите ничего сложного, список математических операций стандартный:

+ — сложение
— — вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль(деление по модулю), остаток от деления
let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: a = a+b эквивалентно a +=b и т.д

Работа с внешними программами при написании shell-скриптов

Для начала немного полезной теории.

Если есть необходимость дописывать в файл(при использовании » > » он заменятеся), необходимо вместо » > » использовать » >> «

после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.
Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:

символ » & » означает указатель на дескриптор 1(stdout)
(Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).

Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой:
команда1 | команда 2 — означает, что вывод команды 1 передастся на ввод команде 2
Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную.

Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в « ковычки, например

Результат работы: qwerty

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

Источник

Учимся писать скрипты правильно

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

Ниже я бы хотел сразу показать начинающим веб-разработчикам как надо учиться сразу писать скрипты, чтобы затем не испытывать лишних проблем и не «ловить» непонятно откуда вылезающие ошибки.

Сразу скажу, что я сам с этим столкнулся, так что все это прошло через мои мучения.

Рассматривать я буду следующие моменты:

1. Настройка PHP для локальной машины и на сервере.
2. Где зарыта «@»?
3. register_globals = Off и никак иначе.
4. Основные аспекты синтаксиса. Литерал ор нот литерал.

1. Настройка PHP для локальной машины и на сервере.

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

Но сначала хочу сделать небольшое лирическое отступление по части того, как настраивать PHP, как Apache modul или fast-CGI.
Самый оптимальный вариант – настраивать, как модуль веб-сервера. Для этого в конфигурационном файле httpd.conf веб-сервера Apache пишем следующие строчки:

Отличие от FastCGI – следующие. Первое. При FastCGI php.ini будет подгружаться в память веб-сервера приблизительно каждый второй раз при запуске скрипта, при установке, как модуля Apache загрузка конфигурации PHP будет осуществляться только при загрузке или рестарте веб-севрера, само собой быстродействие и нагрузка на сервер будет меньше. Помимо этого, при установке как fastCGI недоступны определенные функции. Начинающему программисту они не понадобятся., но при разработке крупного Интернет-приложения вы можете столкнуться с проблемами. А проблемы лучше предотвращать.

Теперь перейдем к конфигурации самого PHP. В конфигурационном файле php.ini в обязательном порядке устанавливаем следующие директивы с ниже написанными значениями:

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

По умолчанию директива max_execution_time имеет значение 30, но для быстроты работы, лучше ставить меньше. Если у вас что-то «зациклилось», то 10 секунд вполне достаточно чтобы понять это.

В 3 главе я расскажу более подробно об этом.

Очень часто начинающие веб-разработчики не понимают разницы между ‘ и “, поэтому выключаем директиву. В 4 главе данный момент будет показан на примере.

2. Где зарыта «@»?

Это, пожалуй, самая основная ошибка начинающих программистов – использование “@”. Этот символ, перед каким-либо оператором подавляет вывод ошибки и ее запись в лог. Он не позволяет на стадии отладки отследить ошибку, и вы судорожно пытаетесь понять, в чем дело.

Поэтому строго на строго запрещаем вам использовать @.

Вы спросите, а как же тогда сделать, чтобы не выводилась ошибка?
Чтобы не выводилась ошибка ее надо либо предотвращать, как в случае с файлами, то есть а) проверять файл на существование, б) проверять, а можно (есть права) в него что-то записать is_writeable();.

В других случаях, например при использовании mysql_connect(); надо проверять значение, которое вернет функция. Как правило, по нему можно определить, есть ошибка или нет. Обычно при ошибке возвращается значение FALSE, NULL или пустая строка.

Это позволит вам, выдавать пользователю не пустую страницу, если, к примеру, он попытался обратиться к информации (?n=14), а информация хранится у вас в файлах, и файла 14 не существует, а текст сообщение: «Информация не найдена».

«Ловля» ошибок является также очень важным аспектом безопасности при работе скрипта.

3. register_globals = Off и никак иначе.

Если в первых двух главах я делал акцент на тех моментах, с которыми начинающий программист столкнется уже сразу, то в этой главе я расскажу о таком моменте, который проявится уже позже. зачастую с ним все сталкиваются при переносе скрипта (уже готового) на сервер хостинг провайдера. Лично я долго привыкал к register_globals = Off, поэтому товарищи, начинающие программисты, сразу ставьте эту директиву выключенной. Помимо этого, данный момент ОЧЕНЬ ВАЖЕН в обеспечении безопасности скрипта.

Итак. В чем же вся загвостка. Сначала рассмотрим случай, когда у нас register_globals = On. Как вы уже, наверное, знаете, данные в скрипт могут передаваться тремя способами, сказал грубо, на самом деле их два. Первый это GET, т.е. данные передаются через адресную строку браузера после символа “?”, второй – POST, при его использовании данные предаются в неявном для пользователя виде. Метод POST используется, как правило, для отправки данных формы. Ну и третий – это Куки, переданные от пользователя скрипту.

Рассмотрим такой случай. У нас есть форма, которая находится по адресу index.php? form. В форме несколько текстовых полей полей. Пусть это будет family, name, phone. Форма отправляется на тот же index.php но методом POST. Проверив все данные, мы записали пользователю две Куки с именами family и form, во второй мы записали время доступа к форме, к примеру.

Представим, что у нас часть файла index.php состоит из следующего кода, т.е. в случае если пользователь уже ввел данные на форме, они ему показываются, если нет – выводится форма. И все это по адресу index.php?form.

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

Теперь о том, как это реализовать под register_globals = Off

Что это значит. Ниже я просто перепишу скрипт, данные мною ранее для register_globals = Off..

В этой же главе хочу рассмотреть следующий маленький пример. Опять же сначала рассмотрим пример с включенным register_globals.

4. Основные аспекты синтаксиса. Литерал ор но литерал.

Разницы между “ и ‘ нет.

2. Вывод переменных часто осуществляют таким образом:

Такая строка «разбирается» интерпретатором намного должен, чем

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

Источник

Что такое скрипты и с чем их едят — Lua & C++

Добрый день, Хабрахабр!
Решил написать этот топик на тему скриптов

Что нужно знать?

Но есть способ, на голову выше — использование скриптов.

Решение проблемы

«Окей, для таких дел хватает обычного файла с описанием характеристиков игрока. Но что делать, если в бурно развивающемся проекте почти каждый день приходится немножко изменять логику главного игрока, и, следовательно, много раз компилировать проект?»
Хороший вопрос. В этом случае нам на помощь приходят скрипты, держащие именно логику игрока со всеми характеристиками либо какой-либо другой части игры.
Естественно, удобнее всего держать, логику игрока в виде кода какого-нибудь языка программирования.
Первая мысль — написать свой интерпретатор своего скриптового языка, выкидывается из мозга через несколько секунд. Логика игрока определенно не стоит таких жутких затрат.
К счастью, есть специальные библиотеки скриптовых языков для С++, которые принимают на вход текстовый файл и выполняют его.

Читайте также:  зао курганстальмост инн 4501001235

Об одном таком скриптовом языке Lua пойдет речь.

Как это работает?

Прежде чем начать, важно понимать, как работает скриптовый язык. Дело в том, что в скриптовых языках есть очень мало функций, при наличии конструкций for, while, if, прочих.
В основном это функции вывода текста в консоль, математические функции и функции для работы с файлами.
Как же тогда можно управлять игроком через скрипты?

Мы в С++-программе делаем какие-либо функции, «регистрируем» их под каким-нибудь именем в скрипте и вызываем в скрипте. То есть если мы зарегистрировали функцию SetPos(x,y) для определения позиции игрока в С++-программе, то, встретив эту функцию в скрипте, «интерпретатор» из библиотеки скриптового языка вызывает эту функцию в С++-программе, естественно, с передачей всех методов.
Удивительно, да? 🙂

UPD: Внимание! Один юзер обратился мне с мейлом, что, когда я заливал код, я не полностью устранил все ошибки — habrahabr.ru/post/196272/#comment_6850016
В коде с позволения хабра проникли жучки
Замените участки кода вроде

И еще вместо lua_CFunction проскакивает lua_cfunction
Спасибо!

Я готов!

Когда вы поняли преимущества скриптовых языков программирования, самое время начать работать!
Скачайте из репозитория на гитхабе (низ топика) lib’у и includ’ы Lua, либо возмите их на официальном сайте.

Создаем консольный проект либо Win32 (это неважно) в Visual Studio (у меня стоит версия 2012)

Заходим в Проект->Свойства->Свойства конфигурации->Каталоги VC++ и в «каталоги включения» и «каталоги библиотек» добавьте папку Include и Lib из репозитория соответственно.

Теперь создаем файл main.cpp, пишем в нем:

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

Теперь переходим к кодингу

Обещаю, что буду тщательно объяснять каждый момент

У нас за скрипты будет отвечать класс Script. Я буду объявлять и одновременно реализовывать функции в Script.h/.cpp
Создаем Script.cpp и пишем в нем

Создаем Script.h и пишем в нем

После 2 строчки и перед #endif мы определяем класс скриптов
Этот код пишется для предотвращения взаимного включения файлов. Допустим, что файл Game.h подключает Script.h, а Script.h подключает Game.h — непорядок! А с таким кодом включение выполняется только 1 раз

Теперь пишем внутри этого кода вот это

Первая строчка подключает сам lua.lib из архива.
Для чего нужен extern «C»? Дело в том, что lua написан на С и поэтому такой код необходим для подключения библиотек.

Дальше идет подключение хорошо известных многим файлов для работы с консолью

Теперь приступим к определению класса

Самый главный объект библиотеки Lua для C++ — lua_State, он необходим для выполнения скриптов

Дальше идут публичные функции

Эта функция инициализирует lua_State

Его определение в Script.cpp

Первой строчкой мы инициализируем наш lua_State.
Потом мы объявляем список «подключенных библиотек». Дело в том, что в «чистом» виде в луа есть только функция print(). Для математических и прочих функций требуется подключать специальные библиотеки и потом вызывать их как math.foo, base.foo, io.foo. Для подключения других библиотек добавьте в lualibs, например, <«math», luaopen_math>. Все названия библиотек начинаются с luaopen_. в конце lialibs должен стоять

Просто используем lua_close()

А эта функция выполняет файл. На вход она принимает название файла, например, «C:\\script.lua».
Почему она возвращает int? Просто некоторые скрипты могут содержать return, прерывая работу скрипта и возвращая какое-нибудь значение.

Как вы видите, я выполняю скрипт и возвращаю int. Но возращать функция может не только int, но еще и bool и char*, просто я всегда возвращаю числа (lua_toboolean, lua_tostring)

Теперь мы сделаем функцию, регистрирующую константы (числа, строки, функции)

Мы действуем через шаблоны. Пример вызова функции:
Ее определение

Для каждого возможного значения class T мы определяем свои действия.
*Капитан* последнее определение — регистрация функции
Функции, годные для регистрации, выглядят так:

Где n — количество возвращаемых значений. Если n = 2, то в Луа можно сделать так:

Читайте мануалы по Луа, если были удивлены тем, что одна функция возвращает несколько значений 🙂

Следующая функция создает таблицу для Луа. Если непонятно, что это значит, то тамошная таблица все равно что массив

Следующая функция регистрирует элемент в таблице.

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

Наконец, заполненную таблицу нужно зарегистрировать

Ничего особенного нет

Следующие функции предназначены в основном только для функций типа int foo(lua_State*), которые нужны для регистрации в Луа.

Первая из них — получает количество аргументов

Эта функция нужна, например, для функции Write(), куда можно запихать сколь угодно аргументов, а можно и ни одного
Подобную функцию мы реализуем позже

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

Можно получить все типы, описывавшиеся ранее, кроме таблиц и функций
index — это номер аргумента. И первый аргумент начинается с 1.

Наконец, последняя функция, которая возвращает значение в скрипт

Боевой код

Пора что-нибудь сделать!
Изменяем main.cpp

Компилируем. Теперь можно приступить к тестированию нашего класса

Помните, я обещал сделать функцию Write? 🙂
Видоизменяем main.cpp

А в папке с проектом создаем файл script.lua

Компилируем и запускаем проект.

Теперь изменяем script.lua

Теперь программа будет выводить по 2 строки («\n» — создание новой строки), ждать нажатия Enter и снова выводить строки.

Экспериментируйте со скриптами!

Вот пример main.cpp с функциями и пример script.lua

Полезные советы
Вопросы и ответы

Источник

В любой непонятной ситуации — пиши скрипты

Скрипты — один из самых распространенных способов сделать приложение более гибким, с возможностью поправить что-то прямо на ходу. Конечно же, у этого подхода есть и недостатки, нужно всегда помнить про баланс между гибкостью и управляемостью. Но в этой статье мы не будем рассуждать “в общем” по поводу плюсов и минусов использования скриптов, мы рассмотрим практические способы реализации этого подхода, а также представим библиотеку, которая предоставляет удобную инфраструктуру для добавления скриптов в приложения, написанные на Spring Framework.

Несколько вводных слов

Когда хочется добавить возможность менять бизнес-логику в приложении без перекомпиляции и последующего развертывания, то скрипты — один из способов, который приходит на ум в первую очередь. Зачастую, скрипты появляются не потому что так было задумано, а потому что так получилось. Например, в спецификации есть часть логики, которая вот прямо сейчас не до конца ясна, но, чтобы не тратить лишние пару дней (а иногда и дольше) на анализ, можно сделать точку расширения и вызывать скрипт — заглушку. А потом, конечно, этот скрипт будет переписан, когда требования прояснятся.

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

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

Ничего личного, только скриптинг

С JSR-233 скриптинг в Java стал очень простым. Существует достаточное количество скриптовых движков, основанных на этом API (Nashorn, JRuby, Jython и ещё некоторые), так что добавить немного скриптовой магии в код — не проблема:

Очевидно, что, если такой код будет раскидан по всему приложению, то оно превратится непонятно во что. И, безусловно, если у вас в приложении больше одного вызова скрипта, то нужно делать отдельный класс для работы с ними. Иногда можно пойти ещё дальше и сделать специальные классы, которые будут оборачивать вызовы evaluateGroovy() в обычные типизированные Java методы. В этих методах будет довольно однотипный служебный код, как в примере:

Такой подход сильно увеличивает прозрачность при вызовах скриптов из кода приложения — сразу видно, какие параметры скрипт принимает, какого они типа и что возвращается. Главное — не забыть добавить в стандарты написания кода запрет на вызов скриптов не из типизированных методов!

Прокачиваем скрипты

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

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

И было бы несправедливо не упомянуть GraalVM — экспериментальный движок, который умеет выполнять программы на разных языках (JVM и не-JVM) и позволяет вставлять в Java приложения модули на этих языках. Я надеюсь, что Nashorn рано или поздно уйдет в историю, и у нас будет возможность писать части кода на разных языках в одном исходнике. Но это пока только мечты.

Spring Framework: предложение, от которого сложно отказаться?

В Spring есть встроенная поддержка исполнения скриптов, построенная на базе API JDK. В пакете org.springframework.scripting.* можно найти много полезных классов — все, чтобы можно было удобно использовать низкоуровневый API для скриптинга в своем приложении.

Кроме этого, есть более высокоуровневая поддержка, она подробно описана в документации. Вкратце — нужно сделать класс на скриптовом языке (например, Groovy) и опубликовать его как бин через XML описание:

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

Выглядит неплохо, но нужно делать “настоящие” классы для того, чтобы их опубликовать, обычную функцию в скрипте не напишешь. Кроме того, скрипты можно хранить только в файловой системе, для использования БД придется лезть внутрь Spring. Да и XML конфигурацию многие считают устаревшей, особенно если в приложении уже все на аннотациях. Это, конечно, вкусовщина, но с ней зачастую приходится считаться.

Скрипты: трудности и идеи

Итак, у каждого решения есть своя цена, и, если говорить о скриптах в Java приложениях, то при внедрении этой технологии можно столкнуться с некоторыми трудностями:

Вдобавок ко всему, если каждый скрипт будет связан только с одним методом, можно быстро найти все точки вызова в приложении при помощи меню “Find Usages” из IDE и понять место скрипта в каждом конкретном алгоритме бизнес-логики.

Упрощается тестирование — оно превращается в “обычное” тестирование классов, с использованием привычных фреймворков, mock’ами и прочим.

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

Репозитории скриптов — концепт

Задумка довольно проста и должна быть знакома тем, кто хоть раз работал со Spring, особенно со Spring JPA. Что нужно — сделать Java интерфейс и при вызове его методов вызывать скрипт. В JPA, кстати, используется идентичный подход — вызов CrudRepository перехватывается, на основе имени метода и параметров создается запрос, который потом выполняется движком БД.

Что нужно, чтобы реализовать концепт?

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

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

Полезным дополнением будет возможность использовать методы с реализацией в интерфейсе (a.k.a. default) — этот код будет работать, пока бизнес-аналитик не выведает более полную версию алгоритма, а разработчик не сделает скрипт на основе
этой информации. Или пусть аналитик скрипт пишет, а разработчик потом просто скопирует его на сервер. Вариантов много 🙂

Итак, предположим, что для интернет-магазина нужно сделать сервис для вычисления скидок на основе профиля пользователя. Прямо сейчас непонятно, как это делать, но бизнес-аналитик клянется, что всем зарегистрированным пользователям полагается скидка 10%, остальное он выяснит в течение недели у заказчика. Сервис нужен прямо завтра — сезон все-таки. Как может выглядеть код для такого случая?

А потом подоспеет и сам алгоритм, написанный, например, на groovy, там скидки будут немного отличаться:

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

Это были идеи, на основе которых была сделана небольшая библиотека для работы со скриптами. Она предназначена для Spring приложений, этот фреймворк использовался для создания библиотеки. В ней предоставляется расширяемый API для загрузки скриптов из различных источников и их выполнения, который скрывает рутинную работу со скриптовыми движками.

Как это работает

Общее устройство библиотеки показано на диаграмме. Синим выделены компоненты, которые нужно разработать, белым — которые уже есть в библиотеке. Значком Spring помечены компоненты, которые доступны в контексте Spring.

Когда вызывается метод интерфейса (по факту — прокси-объекта), запускается обработчик вызова, который в контексте приложения ищет два бина: провайдера, который будет искать текст скрипта, и исполнителя, который, собственно, найденный текст будет выполнять. Потом обработчик возвращает результат вызвавшему методу.

Можно заметить аннотации @ScriptParam — они нужны для того, чтобы указывать имена параметров при передаче их в скрипт, поскольку Java компилятор стирает исходные имена из исходников (есть способы заставить его это не делать, но лучше на это не полагаться). Можно имена параметров и не указывать, но, в таком случае, в скрипте нужно будет использовать “arg0”, “arg1”, что не сильно улучшает читаемость.

Тестирование и версионирование

Поскольку скрипты меняются часто и легко, нужно иметь способ как-то убедиться, что изменения ничего не ломают. Библиотека совместима с JUnit, репозиторий просто можно протестировать как обычный класс в составе юнит или интеграционного теста. Mock библиотеки тоже поддерживаются, в тестах к библиотеке можно найти пример того, как сделать mock на метод репозитория скриптов.

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

Итого

Представленная библиотека поможет организовать скрипты в Spring приложении:

Источник

Написание Shell сценария с нуля

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

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

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

Одно замечание: этот учебник немного связан с моим предстоящим курсом Tuts + Premium «Advanced Command Line Techniques». Чтобы узнать больше о чем-либо в этом уроке, следите за обновлениями этого курса. В дальнейшем в этом уроке он будет называться «курс».

Начнем с файла сценария.

Конечно, мы также должны сделать этот файл исполняемым; В противном случае мы не сможем его запустить. Мы можем сделать это, выполнив следующую команду:

Теперь, когда мы можем фактически выполнить скрипт, добавим очень важную часть. Все сценарии оболочки должны начинаться с shebang). Как говорит Википедия, это должна быть первая строка сценария; Он указывает, какой интерпретатор или оболочка должен запускать этот сценарий. Мы просто собираемся использовать базовую стандартную оболочку:

Хорошо, теперь когда у нас все настроено, мы готовы начать писать фактический код.

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

Это должно выглядеть знакомо, особенно если вы использовали Git:

Это хорошая идея, чтобы обернуть печать текста справки в функции, потому что нам нужно называть его более одного раза. Нам нужно определить функцию до ее вызова, поэтому мы поставим ее наверху. Мне это нравится, потому что теперь, как только я открываю файл, я вижу документацию для скрипта, которая может быть полезным напоминанием при возвращении к коду, который вы не видели долгое время. Без дальнейших церемоний, вот функция help :

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

Мы передаем первый параметр в оператор case ; он должен соответствовать одному из четырех вариантов: «init», «create», «run» или «wildcard», default case. Обратите внимание, что у нас нет явного случая «help»: это просто наш случай по умолчанию. Это работает, потому что ничего, кроме «init», «create» и «run», не является командами, которые мы распознаем, поэтому он должен получить текст справки.

Помните, что в этой строке нет пробелов вокруг знака равенства.

Теперь, когда у нас есть наш zip-файл, мы можем разархивировать его и подготовить содержимое:

Этот двойной амперсанд является логическим И; Он для второго условия, которое мы хотим проверить. То есть, имеет ли SpecRunner.html этот атрибут? Мы можем просто запустить команду xattr на файле и сравнить ее вывод с строкой, которую мы ожидаем. (Мы не можем просто ожидать, что файл будет иметь этот атрибут, потому что вы можете отключить эту функцию в Mac OS X, и мы получим сообщение об ошибке при попытке удалить его, если файл не имеет атрибута).

Итак, если xattr найден и файл имеет атрибут, мы удалим его с флагом d (для удаления). Довольно просто, правда?

Наконец, мы сообщим пользователю, что Jasmine был инициализирован. И на этом наша команда jazz init готова.

Затем мы позволим нашим пользователям создавать файлы JavaScript и связанные с ними файлы спецификаций. Эта часть кода войдет в раздел « create » в case, который мы писали ранее.

Если есть имя файла, мы начнем с создания этих двух файлов (внутри then части):

Вы можете заменить эту первую echo строку следующим:

И тогда jazz create View приведет к следующему:

Мы начинаем так же, как и раньше: редактирование на месте без резервного копирования. Затем наша команда: в строке 11 мы хотим добавить две следующие строки. Важно избегать двух новых строк, чтобы они отображались в тексте. Как вы можете видеть, это просто вставляет те два скриптовых тега, именно то, что нам нужно для этого шага.

Мы можем закончить с небольшим выводом:

Первоначально, if условие выглядело так:

Вся эта лишняя словесность об open может показаться оправданием для отсутствия у меня хорошего решения, на самом деле это указывает на что-то важное в командной строке. Не путайте понимания терминалов с пониманием конфигурации компьютера. Этот учебник и связанный с ним курс научили вас немного работе в оболочке Bash (и оболочке Z), но это не значит, что каждый компьютер, который вы используете, будет настроен одинаково; Существует множество способов установки новых команд (или разных версий команд), а также удаления команд. Предостережение разработчику.

Ну, это весь скрипт! Здесь снова, все вместе:

Ну, продолжайте, попробуйте!

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

Вывод

Итак, у вас теперь есть это! Мы только что написали сценарий оболочки промежуточного уровня; Это было не так уж плохо, не так ли? Не забудьте следить за моим предстоящим курсом Tuts + Premium; Вы узнаете гораздо больше о многих методах, используемых в этой статье, а также о многих других. Получайте удовольствие от работы в терминале!

Источник

Автоматизация однотипных действий, ч.2 ⁠ ⁠

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

А теперь продолжим изучать создание сценариев действий в Clickermann.

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

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

Для этого есть следующие комбинации:
Alt + A – Запуск сценария;

Alt + A – Пауза сценария (после его запуска);

Alt + S – Полная остановка;

Alt + R – Начать запись сценария;

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

То при таком, она уже работать не будет(если не внедрять проверку с анализом экрана, но об этом позже):

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

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

Немаловажный момент касается цикличности исполнения. Например если ваш скрипт подразумевает повторы, условно:

1) Открыть браузер
2) Нажать на закладку с адресом сайта
3) Скопировать информацию
4) Занести в таблицу эксель
5) Перейти к п.1

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

1) Открыть браузер

2) Нажать на закладку с адресом сайта

3) Скопировать информацию

3.5) Закрыть браузер

4) Занести в таблицу эксель

Читайте также:  Как сделать линию над текстом

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

Тогда у вас будет достаточно времени, чтобы подойти и отключить скрипт.

Как вы понимаете отредактировать такое будет невозможно, но если вам не нужны просто движения мышкой без кликов и действий, то открываем настройки и в разделе «Интерпретатор» убираем галочку «Записывать движения мыши» и жмём «применить».

Теперь наш скрипт получился намного короче, но разобраться в нём всё ещё довольно сложно:

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

Далее мы начнём углубляться в настоящее программирование своих сценариев.

Вероятно так (напишем псевдокодом):

Работает? Да, но выглядит не очень, трудно читать и понимать.

Чтобы внести порядок в наш скрипт, мы будет использовать переменные и циклы.

Допустим, мы точно знаем, что нам каждый день приходит 5 писем, тогда мы можем сделать так:

ВАЖНО: общепринято выделять внутренности цикла отступом для пущей красоты и удобства понимания. для этого выделяем участок кода внутри цикла и нажимаем TAB или пробел. Вуаля, вы восхитительны.

У нас появляются новые команды:

>= «Больше или равно»

Это вы, сравниваете количество ваших новых задач на столе по высоте пальца

Хорошо, а что на счёт вариативности кода? Если дальнейшие действия зависят от воли случая?
Для этого у нас есть операторы IF и SWITCH

Мы создаем переменную, кладем в неё значение 2. Оператор IF проверяет, равна ли var двойке, если да воспроизведется звуковой файл, если нет, пропустит эту строку. Конец блока кода оператора IF определяется оператором END_IF

Теперь оператор IF проверяет на соответствие переменной двойке, если она равна 2, воспроизведется файл end.wav, при любом другом значении переменной var будет воспроизведен файл start.wav

Бывают случаи, когда нам мало двух условий, например вы публикуете фотографии в 10 социальных сетях, под каждую социальную сеть, вы подготовили разные фотографии и положили их на 10-ти разных листах в документе excel, как сделать так, чтобы в нужную социальную сеть, попадало нужное фото?

Таким образом, применяя IF и SWITCH вы можете создать по настоящему вариативную программу и уже начинать называть себя программистом =)

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

Работать это должно примерно так:

Для этого нам потребуется функция:

243 поста 4.1K подписчиков

Правила сообщества

-При возникновении споров относитесь с уважением друг к другу, а так же приводите аргументы.

Разрешено всё, что не запрещено правилами Пикабу.

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

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

Вообще интересно, но намного интереснее на конкретных примерах.

дайте мне тоже работу, которую можно вот так автоматизировать.

Здорово объяснили простое зацикливание и зацикливание с условиями! Не терпится испытать это и применить! Я хочу задать переменную цветом пиксела, то есть при изменении цвета пиксела цикл заканчивается. Завтра попробую )

Это ж кем нужно работать, что бы заниматься такой хернёй?

а у меня проблема такая, я захожу на комп через anydesk и на том компе мышка блокирует мне ввод, видимо курсор у нее дергается постоянно, я блокирую ввод на удаленном компе, но это блокирует работу и скрипта, кнопки перестают нажиматься. Это как-то можно решить? Выключать мышь физически на том компе поможет? Или он скажет нет мышки-нет вообще никаких кликов?

Извините а на телефон такое можно в среде андроид?

где 3я часть то?)

Когда же 3-я часть будет?

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

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

Принцип работы на примере Пикабу

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

Список ресурсов на которых проверял работоспособность

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

Любая критика, замечания приветствуются

Ответ на пост «Как автоматизировать однотипную, монотонную работу бесплатно и без навыков программирования»⁠ ⁠

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

Но запустить можно где и под Linux и даже под MacOS

Умный дом⁠ ⁠

Всем привет! Особенно моим 5 подписчикам) Без вас, вероятно, я б еще лет 9 ничего не писал)

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

Набора мне хватило надолго: я и светодиодами помигал и двигателями повращал.

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

Они и сейчас стоят под телевизором, безумно радуя глаз.

Это было моё первое знакомство с пайкой: навесной монтаж, удары напряжением 180V, постоянно горящие компоненты. К тому же из-за экономии я купил паяльник в фикспрайсе, так как дедовским было жутко неудобно, и даже не понимал, насколько он плох, пока у меня не появилась паяльная станция с феном)

Потом я разработал отцу на дачу систему автополива на 6 зон, с датчиками температуры и влажности почвы(чтоб не поливать в мороз и дождь), с экранчиком, часами реального времени и расписанием полива. Заказать подобную систему стоило 300к+. так что тысяч 280 мы сэкономили)

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

В тот момент я захотел умный дом.

Готовые решения были отвергнуты сразу: пол ляма за однокомнатную квартиру? Нет, спасибо!

И я начал разрабатывать. Первая версия была на основе arduino mega с ethernet shield w5100(AMS) и умела только включать/выключать телевизор и свет в комнате через веб страницу. Долго он не продержался, так как mega дорогая и большая, а из доски для прототипирования постоянно выпадали проводки.

Сервером был выбран windows планшете, raspberry pi был отброшен из-за отсутствия экрана и батареи.

И началась разработка: Sprint-Layout, ЛУТ, smd, бесконечные даташиты. Arduino IDE сменил SmingHub. Моя комната превратилась в мастерскую, во все свободные(и не очень) места были поставлены металлические стеллажи из леруа, куча коробок с компонентами с али. Тогда-то я и понял, что значит паять на коленке.

Спустя 2 года(спасибо СДВГ) у меня была плата версии 1.1 и прошивка 1.0! На ней работало всё, что я задумывал, чего не скажешь о предыдущих версиях.

все версии по порядку (сверху вниз, слева направо). AirDots для масштаба)

В итоге устройство умеет и имеет:

— Управлять светодиодной лентой RGBW (10м без усилителя)

— Имитировать сигналы пультов с инфракрасным сигналом(тв, аудио системы и т.д.)

— Передавать RF(радио) команды

— 2 датчика температуры ds18b20

— 2 датчика движения

— 1 аналоговый вход (напр. для датчика света или влажности почвы)

— прошивка по USB

— обновление по воздуху

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

Тут без комментариев

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

Для автоматического света предусмотренно 3 режима: дневной, вечерний, ночной.

Например, в спальне днём включаются лента и точечники. Вечером, когда годовасик ложится спать, только лента на 4 процента яркости, которая не бьёт по глазам, не мешает спать, но позволяет всё видеть. Ночью включается лента на 1% яркости, при этом хорошо видно очертания предметов. Жене очень удобно посреди ночи махнуть рукой (чтоб включился свет) и найти потерянную ребёнком соску. Когда ночью идёшь в туалет, ты не бьешься об углы, никуда не врезаешься, потому что не приходится делать это наощупь в темноте: в коридоре свет включается на 20%, а в туалете на 14%.

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

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

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

Сценарий по голосовой команде «включи проектор»

Включается аудио система, переключает каналы на 5.1, выставляет настроенную громкость и слегка добавляет басов(+2)

Опускается полотно проектора.

Шаровые краны с датчиками протечки: в случае протечки перекрывают трубы с холодной и горячей водой, приходит уведомление в телеграмм и голосом оповещается о протечке

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

«Вручную» можно использовать и необычным способом)

Электромеханический замок на входной двери спасает, когда забыл ключи, либо когда пришли гости: в этом случаем не обязательно идти к двери (лень!) и открывать её, достаточно сказать «Алиса, открой дверь».

И это не весь функционал: датчики температуры в каждой комнате, климат-контроль с кондиционерами и окнами. могу ещё долго рассказывать..

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

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

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

Шторы: 3*10к = 30к

Приводы для окон: 3*5к = 15к

Жалюзи на балкон: 3*3,3к = 10к

Себестоимость моих контроллеров

Замок на дверь: 3к

Мелочевка вроде датчиков протечки, датчиков движения и блоков питания

Пишем автоматически обновляемую смету в Excel VBA⁠ ⁠

Задача: сделать смету на ремонтно-строительные работы с автоматическим обновлением цен на материалы

Решение: пишем макрос в Excel

Set ws = ThisWorkbook.Worksheets(«список»)

Присваиваем переменной TotalRow значение количества использованных строк листа ws

TempString = «=VLOOKUP(A» & i + 1 & «,каталог!$H$1:$I$24605,2,0)»

Присваиваем переменной TempString значение формулы ВПР из листа каталог. В макросах используются только английские формулы. В формуле используется переменная, обозначающая номер строки (А1, А2 и т.д.)

Заполняем ячейки, начиная с B2 листа ws значением переменной TempString

Set IE = CreateObject(«InternetExplorer.Application»)

Присваиваем переменной IE объект InternetExplorer

Присваиваем переменной URL значение ячейки, начиная с ячейки B2 (ВПР ссылки из каталога)

Переходим браузером по URL

Do Until (IE.readyState = 4 And Not IE.Busy)
DoEvents
Loop

Ожидаем загрузку страницы

Присваиваем переменной ieDoc значение HTML-кода загруженной страницы

Set detail_elements = IE.Document.getElementsByTagName(«span»)

Присваиваем массиву detail_elements значение массива всех элементов с тегом «span»

For Each detail_element In detail_elements

If detail_element.getAttribute(«class») = «retailPrice» Then

ws.Cells(i + 1, 3) = detail_element.innerText

Если условие истинно, записываем внутренний текст элемента в ячейку, начиная с ячейки C2. Этот код считывает цену из интернет-каталога.

Присваиваем переменной TempString значение формулы ЗНАЧЕН

Записываем в ячейки, начиная с D2, формулу из переменной TempString

MsgBox «Обновление данных завершено»

Сообщение для удобства

Разработка IoT-шлюза на базе Raspberry CM3+⁠ ⁠

Рисунок 1 — Плата устройства

Большой опыт работы в сфере промышленной автоматизации и АСУТП, казалось бы, должен способствовать тому, что со временем уже много всего видел и много всего знаешь. Но не тут-то было. Оказывается, иногда могут возникать задачи и проекты, которые трудно реализовать стандартными средствами. Так под один крупный проект по мониторингу и управлению в «облаке» одного небезызвестного завода N требовалось найти подходящее железо. Однако оказалось, что в России по требованиям помехозащищенности устройства и открытости системы ничего подходящего не существует. Попытка заказать идеально подходящее нам устройство из-за рубежа провалилась, поскольку на территорию нашей страны оборудование с пометкой «IoT» весьма трудно ввести в промышленных масштабах. Другие же поставщики не устроили сроками доставки в 12 недель при небольших объемах и ценой. Поэтому в голове родилась и плотно осела мысль о создании своего устройства. Причем такого, чтобы оно было универсальным и подходило не только конкретно под этот один проект, а под множество других. В итоге от момента зарождения идеи, подбора поставщиков и корпуса, разработки платы, её отладки и тестирования, написания инструкций и технической документации прошло весьма много времени. Но зато теперь я держу с легким трепетом в руках полностью законченное и рабочее устройство, и могу заявлять, что мы это сделали!

Почему именно Raspberry?

Raspberry Pi – это небольшой и дешевый универсальный микрокомпьютер, гибко настраиваемый под любые задачи. С 2014 года он выпускается как самостоятельный вычислительный модуль Compute Module, то есть из привычной платы с различными интерфейсами и разъемами осталось только самое важное: процессор, ПЗУ и ОЗУ. Такое исполнение позволяет использовать это устройство для любых мыслимых и немыслимых задач, все лишь упирается в возможности фантазии для создания обвязки вокруг модуля. Стоит также заметить, что с момента выхода в свет первой версии устройства вышло уже три версии модулей, а после выхода Raspberry Pi 4, вероятно, стоит ожидать еще и четвертую версию в скором времени. Всё это говорит о том, что разработчики активно развивают свой продукт, увеличивают его мощность и быстродействие, и что их устройство пользуется определенной популярностью у людей. Эта популярность не беспочвенна: за всё это время они зарекомендовали себя как надежные устройства, способные решать задачи различного уровня в любых условиях, даже в космосе. Также программировать на Raspberry Pi условно просто, они обладают большим количеством интеграторов по всему миру.

Открытая операционная система Linux позволяет устанавливать на устройство абсолютно любое программное обеспечение в зависимости от требуемой задачи. Например для решений в области умного дома возможны стыковки с OpenHab, Home Assistant, iRidiumMobile, NodeRed и др. Для промышленности возможна установка SCADA-систем, таких как CODESYS, Rapid SCADA, OpenSCADA с возможностью использовать устройство как шлюз для передачи данных на верхний уровень по протоколам MQTT, http, REST API или CoAP. Также возможна интеграция с различными облачными сервисами.

Что по интерфейсам?

Рисунок 2 — Вид платы сверху и снизу

Устройство в минимальном исполнение поддерживает следующие интерфейсы:

— LED х 1 (программируемый);

Вышеописанные интерфейсы позволяют внедрить устройство практический в любой проект. А дополнительные аппаратные модули для установки в слоты Mini PCI-e от сторонних производителей решают проблему с наличием связи и интернета у устройства. Такой путь с установкой модулей связи нами был выбран не случайно, поскольку наличие USB-адаптеров (так называемых «свистков») является не очень надежным и качественным вариантом, а установка промышленных роутеров по типу Robustel R2000-3P является дорогостоящим (около 12 т.р.). Поэтому мы остановились на установке двух разъемов под модули Mini PCI-e, которые можно использовать по собственному желанию:

3G, LTE, GPRS модуль (HUAWEI MU709s-2, цена: 2,5 т.р.);

Wi-Fi модуль с возможностью подключения к нему направленной антенны;

LoraWan модуль для построения сети «интернет вещей».

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

— Аппаратные часы реального времени;

— Энергонезависимая память EEPROM;

— Металлический корпус и крышки (алюминий 3 мм);

— Диапазон питания 9-36 В;

Рисунок 3 — Устройство AntexGate в корпусе

Автоматизация предприятий как она есть на самом деле⁠ ⁠

Гендир: Мы купили автобус, потому что производитель заверил, что он быстро едет и мы все поместимся. Теперь мы быстро доберёмся до цели.

Главный продажник: Дык а чего мы едем вокруг то? Цель там, а мы куда?

Прог: Ну просто дорога вокруг же и надо по ней ехать жеж.

Главный продажник: Что за ересь? Соседи вон напрямик же едут! Ты, прог, сделай так что бы и мы могли к цели двигаться, а не вокруг.

Прог: Но у них же трактор на гусеницах. Ну ладно, сейчас тут и тут поправим, это прикрутим, это подогнём. Вот, вроде всё. Как и просили, теперь тоже можем напрямик ехать.

Гендир: Я не понял, а что мы со скоростью таракана едем? Изготовитель обещал 80 км/ч!

Программист: Ну тут ведь это. гусеницы поставили, а они ж того..

Гендир: Что ты тут мне лапшу вешаешь? Производитель же заверил, что быстро ехать будем. Это ты просто ничего не умеешь и надо спеца пригласить.

Спец-автоматизатор: Оооо, друзья, это же извечная проблема всех контор. Посмотрите как живут настоящие счастливчики. За скромную плату мы вам прикрутим пропеллер и будете летать как все настоящие конторы на вертолёте.

Гендир: Что-то я не понял, а что за фигня сверху крутится, шумит, а мы теперь ещё и провода с деревьями должны объезжать?

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

Автоматизация на почте⁠ ⁠

Устроился на работу сотрудником почты. На окраине города стоит полупустое здание, там начальство решило сделать архив. Рабочие привезли туда огромную груду мешков с письмами, которые требовалось отсортировать и занести в базу. Процесс таков: имеется пачка писем, обвязанная шпагатом. У каждой пачки есть накладная со штрихкодом, в котором зашифрована информация по этой пачке. Нужно 1) нажать в программе кнопку «сканировать штрихкод» 2) провести сканером по накладной 3) подождать 10-30 секунд пока программа расшифрует ШК 4) нажать кнопку «внести данные» 5) подождать 30-90 секунд 6) написать на пачке диапазон номеров, которые программа присвоила этим письмам (10-15 сек) 7) нажать кнопку «закрыть накладную» (5-10 сек), выйти назад в меню 8) следующий цикл.

Как видите, все эти ожидания плюс время на нажатие кнопок отнимает много времени. Во время 10-30 и 30-90 секундных перерывов можно занять себя открывая очередной мешок в другом конце комнаты и вытаскивая новые пачки, однако приходится бегать туда сюда и жать кнопки. Тогда я написал скрипт, автоматически определяющий когда закончился предыдущий шаг (распознавание экрана), жмущий нужные кнопки, а также назначил горячие клавиши, которые быстро выходят в меню и начинают новый цикл. Также я наловчился писать цифры загодя на основе диапазонов предыдущих пачек и количества писем в текущей. Теперь процесс выглядит так: сканирую ШК, иду занять себя другими делами (вскрытие мешков, написание цифр на следующих накладных, складирование готовых), программа в это время сама проходит полный цикл, возвращаюсь, сканирую следующий ШК и т.д. Скорость работы приблизилась к теоретическому пределу: теперь все упиралось в скорость работы программы, ускорить которую я не мог. Но этого вполне хватало, программа постоянно что-то обрабатывала, а я выполнял другие работы.

Также были бракованные накладные или пачки писем вообще без накладных. Приходилось брать каждое письмо 1) сканировать его ШК 2) клик «ввести данные» 3) 1-2 секунды программа думает 4) вылезает окно с характеристиками письма, тут ничего не делаем, все письма одинаковые, жмем «сохранить письмо» 5) следующий цикл

Как видите, опять много ненужных движений, нужно откладывать сканер в сторону, тянуться к мышке, два раза жать в разные места на экране. Моментально был написан скрипт, автоматизирующий всю эту лабуду, теперь процесс свелся к «пикнул письмо сканером (сканер издает звук при считывании), жду 2 секунды, пикаю следующее письмо» и т.д. Работа ускорилась в 2-4 раза, да и сил тратится гораздо меньше.

Но мне и этого показалось мало. Мало приятного в двухсекундном пялении в монитор. Открыл блокнот, занес туда штрихкоды писем, каждое письмо требует треть-полсекунды. Затем пишется еще один скрипт, который заносит в программу из блокнота по письму каждые 2 секунды, а я иду пить чай (а писем очень много, 10-30 тысяч, их накопилось достаточно за три года). Или не иду. Принес с собой ноутбук, пока скрипт работает над другой пачкой писем, открываю на ноуте блокнот и вношу туда следующую партию. Скорость работы выросла еще больше.

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

Источник

Статьи обо всем