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

1
exports
и
1
module.exports
, основанная на статье Understanding module.exports and exports in Node.js.

Что такое
1
module.exports
и
1
exports
в Node.js

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

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

1
module.exports
и
1
exports
в Node.js. Спешу поделиться с вами тем, что я узнал по этому вопросу.

Что такое модуль (module)

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

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

1
greetings.js
, внутри которого размещены две функции:

sayHelloInEnglish = function () {
  return 'Hello';
}

sayHelloInSpanish = function () {
  return 'Hola';
}

Экспорт модуля

Польза от файла (модуля)

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

Для достижения этого необходимо слегка изменить исходный код файла

1
greetings.js
. Чтобы понять, что происходит на самом деле, в данном случае будем выполнять пошаговый процесс:

  • представьте себе, что эта строка существует в качестве первой линии кода в
    1
    
    greetings.js
    
    :
var exports = module.exports = {}
  • видоизменим обе функции в файле
    1
    
    greetings.js
    
    с помощью выражения
    1
    
    exports
    
    таким образом, чтобы они были доступны для внешних файлов (модулей):
exports.sayHelloInEnglish = function () {
  return 'Hello';
}

exports.sayHelloInSpanish = function () {
  return 'Hola';
}

В приведенном выше коде можно было бы заменить выражение

1
exports
на
1
exports.module
и получить точно такой же результат.

Если этот момент кажется вам непонятным, то помните, что выражение

1
exports
и выражение
1
exports.module
ссылаются на один и тот же объект.

  • это текущее значение выражения
    1
    
    module.exports
    
    :
module.exports = {

  sayHelloInEnglish = function () {
    return 'Hello';
  }

  sayHelloInSpanish = function () {
    return 'Hola';
  }
}

Импортирование модуля

Давайте сделаем методы модуля

1
greetings.js
общедоступными для другого файла (модуля) с именем
1
main.js
. Этот процесс также разобьем пошагово для более лучшего понимания:

  • в Node.js используется команда
    1
    
    require
    
    для импортирования одного модуля в другой модуль:
var require = function(path) {

  // ...

  return module.exports;
};
  • давайте подключим модуль
    1
    
    greetings.js
    
    в модуль
    1
    
    main.js
    
    :
// main.js
var greeting = require('./greetings.js');

Приведенная выше строка кода равнозначна нижеследующему коду:

// main.js
var greeting = {

sayHelloInEnglish = function () {
  return 'Hello';
}

sayHelloInSpanish = function () {
  return 'Hola';
}

}
  • теперь можно использовать функции модуля
    1
    
    greetings.js
    
    внутри модуля
    1
    
    main.js
    
    как методы объекта
    1
    
    greeting
    
    :
// main.js
var greeting = require('./greetings.js');

// Hello
greeting.sayHelloInEnglish('Hello');

// Hola
greeting.sayHelloInSpanish('Hola');

Отличительные моменты

Команда

1
require
возвращает объект, свойства и методы которого доступны другим внешним модулям при помощи команды
1
module.exports
.

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

// greetings.js

// var exports = module.exports = {};

exports.sayHelloInEnglish = function () {
  return 'Hello';
}
exports.sayHelloInSpanish = function () {
  return 'Hola';
}

// Эта строка кода выполняет повторное переопределение,

module.exports = 'Bonjour';

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

1
greetings.js
в модуль
1
main.js
:

// main.js
var greetings = require('./greetings.js')

На данный момент в нашем примере ничего не поменялось. В переменную

1
greetings
помещается код, доступный из модуля
1
greetings.js
. Не более того.

Однако, если мы попытаемся воспользоваться каким-либо из методов модуля

1
greetings.js
-
1
sayHelloInEnglish
или
1
sayHelloInSpanish
, то мы получим ошибку. Это произошло в следствие того, что было произведено переопределение экспортируемой структуры модуля при помощи команды
1
module.exports
.

Другими словами, последней командой

1
module.exports
экспортируется совсем другой модуль -
1
Bonjour
, у которого другие свойства и методы. Происходит переопределение экспортируемого модуля и вызов метода
1
sayHelloInEnglish
или
1
sayHelloInSpanish
вызовет ошибку:

// main.js
// var greetings = require("./greetings.js");

/*
 * TypeError: object Bonjour has no
 * method 'sayHelloInEnglish'
 */
greetings.sayHelloInEnglish();

/*
 * TypeError: object Bonjour has no
 * method 'sayHelloInSpanish'
 */
greetings.sayHelloInSpanish();

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

1
greetings
, можно вывести их в консоль:

// "Bonjour"
console.log(greetings);

Заключение

Импорт и экспорт модулей в Node.js является ежедневной задачей. Я надеюсь, что благодаря этой статье стала ясна разница между командой

1
exports
и командой
1
module.exports
. Более того, если у вас когда-либо произойдет ошибка при доступе к общедоступным методам модуля в будущем, то я надеюсь, что у вас есть лучшее понимание того, почему может возникнуть эти ошибки.

Заключение автора перевода

Если честно - прочитал статью и даже потрудился перевести ее, а вот разницы между

1
exports
и
1
module.exports
не заметил. Я хочу сказать, что автор этой статьи (как мне кажется) так и не показал разницы между ними. Могу ошибаться, конечно и буду рад комментариям.

UPD. Вопрос снят, так как решен. В принципе, существование этой и предыдущей статьи уже не надобно, так как есть отличный скринкаст от Ильи Кантора по Node.js, где раскрываются все вопросы - Скринкаст NODE.JS.

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


Данная статья является прочтением и переосмыслением перевода Node.js, Require и Exports статьи-оригинала Node.js, Require and Exports.

Помимо этого, существует еще одна неплохая статья, посвященная данной тематике - Understanding module.exports and exports in Node.js.

Тематика данного поста посвящена двум командам Node.js -

1
require
и
1
module.exports
. Обе эти команды являются служебными и “принадлежат” Node.js.

С помощью этих команд Node.js осуществляет взаимодействие своих модулей между друг другом.

Команда

1
require
подключает один модуль к другому. Команда
1
module.exports
делает модуль доступным для других модулей.


Ниже - краткое изложение статьи-оригинала …

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

Например, у нас есть файл

1
misc.js
следующего содержания:

const x = 5;
let summ = function (value) {
  return value + x;
}

Привычный доступ к константе

1
x
и переменной
1
summ
из другого файла невозможен. Это никак не связано с использованием
1
var
.

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

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

Сейчас речь пойдет о том месте, где пишется -

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

let someModule = require('./some_module');

Другими словами можно сказать, что в Node.js служебное слово

1
require
служит для подключения одного независимого модуля (файла) к другому независимому модулю (файлу). Принцип подключения через
1
require
заключается в создании в целевом модуле объекта и помещении в этот объект подключаемого модуля.

Конечно же, до тех пор, пока наш модуль (

1
some_module
) ничего не отдает, все приведенные примеры бесполезны.

А чтобы наш модуль (

1
some_module
) что-нибудь отдал, мы будем использовать служебное слово
1
module.exports
:

const x = 5;
let summ = function (value) {
  return value + x;
};
module.exports.x = x; // сделали константу 5 доступной из других модулей
module.exports.summ = summ; // сделали переменную summ доступной из других модулей

Вот теперь наш модуль (

1
some_module
) стал гораздо более полезным:

let someModule = require('./some_module');

В результате в целевом модуле будет создан объект

1
someModule
со свойством
1
x = 5
(
1
someModule.x
) и методом
1
summ
(
1
someModule.summ
).

Есть ещё такой способ отдать штуки из нашего модуля:

let User = function (name, email) {
  this.name = name;
  this.email = email;
};
module.exports = User;

То есть, в исходном модуле создается объект

1
User
со свойствами
1
User.name
и
1
User.email
. Затем с помощью служебного слова
1
module.exports
объект
1
User
делается доступным для других модулей Node.js.

Разница между этими подходами не велика, но важна. Как видно, в данном случае мы экспортируем функцию напрямую:

module.exports.User = User;

// vs

module.exports = User;

Всё это к тому, что потом ее будет легче использовать:

var user = require('./user');

var u = new user.User();

// vs

var u = new user();

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

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

let powerLevel = function (level) {
  return level > 9000 ? "it's over 9000" : level;
};
module.exports = powerLevel;

Когда вы подключите данный модуль используя

1
require
, фактически им будет являться функция, что позволит вам сделать следующее:

let someModule = require('./powerlevel')(9000);

Что, по сути, является упрощенной записью следующего кода:

let someModule = require('./powerlevel');
someModule(9000);

Это все кратко о командах

1
require
и
1
module.exports
.

Данная статья Tips for Creating a First-Class Personal Portfolio показалась мне интересной в качестве повышения личного опыта. Советы в этой статье больше относятся к дизайнерам; но их в полной мере можно отнести и к Frontend Developer’у. Статья написана редактором и основателем Speckyboy Design Magazine Полом Эндрю (Paul Andrew). Ниже привожу вольный перевод статьи.

Логотип и слоган

Для начала начнем с основ. Ваш логотип - это ваш бренд; а ваш слоган - кто вы есть. С помощью логотипа и слогана вы должны привлечь внимание потенциальных клиентов и быстро ответить на их вопрос - “Почему?”. В противном случае посетитель быстро уйдет со страницы и тотчас забудет о вашем портфолио.

Уникальный логотип из портфолио Inal Уникальный логотип из портфолио Inal

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

Итак, запомните: быстрый и краткий ответ на вопрос “Зачем” или же потенциальный клиент забудет о вашем портфолио раньше, нежели вы можете себе это представить.

Слоган из портфолио Mike Etheridge Слоган из портфолио Mike Etheridge

Простая навигация

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

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

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

Простая и доступная навигация из портфолио Robin Man Простая и доступная навигация из портфолио Robin Man

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

Доступные контакты

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

Кнопка "Связаться со мной" из портфолио Matthew Miller Matthew Miller

Показывайте только лучшее

В портфолио должны быть представлены только самые лучшие работы.

Страница из портфолио Camille Leonard Страница из портфолио Camille Leonard

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

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

Продвинутая страница портфолио Kata Farkas Продвинутая страница портфолио Kata Farkas

Сортируйте ваши работы

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

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

Каталогизация работ в портфолио Huncwot Каталогизация работ в портфолио Huncwot

Добавьте отзывы

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

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

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

Что вы умеете

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

Страница с услугами из портфолио Studio Sweep Страница с услугами из портфолио Studio Sweep

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

Личная информация

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

Страница с личной информацией из портфолио Calvin Teoh Страница с личной информацией из портфолио Calvin Teoh

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

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

X-фактор

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

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

И снова вернемся к теме ответа на вопрос “Почему?” Если принимать во внимание X-фактор, то это поможет потенциальному заказчику ответить на его вопрос.

Уникальность дизайна из портфолио Colin Snow Уникальность дизайна из портфолио Colin Snow

В заключение можно привести ссылку на подборку из 50 креативных портфолио, которые могут послужить образцом для подражания и примера - 50 Inspirational and Creative Portfolios Sites.


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

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

Чтобы облегчить нагрузку на глаза, необходимо периодически давать возможность отдохнуть последним. Для этой цели существуют программы особого рода, которые относят к классу Repetitive Strain Injury (RSI). По-русски такой термин звучит как Спазм аккомодации.

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

В статье будет рассмотрен процесс знакомства с программой Workrave, бесплатной и хорошо проработанной. Эта программа доступна под OS Linux любого семейства из соответствующего репозитория.

Под OS X автор не нашел достойного бесплатного аналога программы Workrave. Как заменитель, автор использует программу из класса Pomodoro - удобное сочетание планирования рабочего времени и предупреждения RSI.

Под Windows программы класса Repetitive Strain Injury (RSI) рассматриваться не будут, ибо - если вы используете Windows - мои вам соболезнования.

Workrave

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

А вот настройка и использование программы Workrave автору кажется делом не совсем интуитивно понятным.

Установка Workrave не должна вызывать каких-либо проблем. Она имеется в репозитории любого Linux-дистрибутива. После установки нужно обязательно ее настроить. Но - не забыть добавить программу в автозагрузку! ))

Панель настроек Preferences разбита на три основных раздела - Timers, User Interface, Network.

Раздел Timers - самый обширный и самый главный. С него и начнем.

Workrave - Timers

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

Все время в Workrave делится на три категории:

  • краткие перерывы (Micro Break)
  • длинные перерывы (Rest Break)
  • дневной лимит работы (Daily Limit)

Вот как это выглядит “на деле”.

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

Прошло 15 минут непрерывной работы на компьютером - настало время краткого перерыва (Micro Break) продолжительностью 30 секунд. Нужно отвести взгляд от монитора и по желанию - просто посмотреть вдаль или сделать какое-либо упражнение для глаз (советую просто закрыть глаза - прекрасный способ дать отдохнуть).

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

Прошло 30 секунд - модальное окно пропадает и пошел отсчет нового 15-минутного отрезка работы. И так до тех пор, пока не настает черед длинного перерыва (Rest Break) продолжительностью 10 минут.

Конечно, 10 минут торчать за компом (бездельничая) никто не будет, поэтому есть смысл встать, сходить за кофе и так далее - по вкусу.

Длинный перерыв (Rest Break) закончился - начался отчет нового длинного перерыва (Rest Break), состоящего из серии кратких перерывов (Micro Break).

Когда общее время работы за компьютером достигнет четырех часов - все, пора бросать работу за компом, ибо настал Daily Limit!

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

Поэтому давайте откроем окно настроек программы Workrave и несколько углубимся в детали.

На каждой из вкладок - Micro Break, Rest Break, Daily Limit имеется галочка Enable Timer, смысл которой должен быть понятен - включить или выключить этот тип таймера. Другими словами, нужен ли такой тип таймера в вашем рабочем процессе.

Workrave Microbreak

На вкладках Micro Break и Rest Break имеются одинаковые разделы Timers. Здесь устанавливаются продолжительность работы (Time between breaks) и продолжительность отдыха (Break duration) в каждом конкретном случае.

Например, в моем случае для Micro Break я установил продолжительность работы (Time between breaks) в 19 минут, а продолжительность отдыха (Break duration) - в 1 минута. В сумме получается - 60 минут.

Для Rest Break я установил (Time between breaks) в 1 час. То есть, один Rest Break состоит из трех Micro Break. Продолжительность отдыха (Break duration) для Rest Break я установил в 10 минут. Другими словами - один час поработал, встал и отдохнул 10 минут.

Продолжительность дневной работы Daily Limit я установил в 6 часов с перерывом 20 минут. То есть - отработал 6 часов (или 6 Rest Breaks) и отдыхаешь 20 минут. Название Daily Limit (Дневной лимит) конечно чисто условное - можно установить и 12-часовой режим работы ))

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

Дело в том, что на каждом модальном окне программы Workrave имеется кнопка Postpone (Отложить).

Смысл этой кнопки вот в чем - вам в голову пришла светлая идея и вы в азарте стучите по клавишам, чтобы материализовать ее; и тут бац - выскакивает надоедливое окно программы Workrave с предупреждением - “Бросай работать!”.

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

Если вы не доверяете самому себе, то можно убрать кнопку Postpone из модального окна Workrave. Для этого в разделе Options нужно снять галочку Show ‘Postpone’ button. И тогда вы не сможете обмануть программу Workrave, так как не сможете отсрочить очередной запанированный перерыв.

Помимо кнопки Postpone, в модальном окне Workrave имеется еще одна кнопка - Skip. Смысл ее понятен без перевода - это когда время не терпит и плевать на все перерывы. При нажатии на нее пропускается конкретный текущий таймер (Micro Break или Rest Break) и тотчас запускается отсчет нового таймера.

Если был пропущен Micro Break, то начнется отсчет нового Micro Break; если был пропущен Rest Break, то начнется отсчет нового Rest Break с входящими в его состав Micro Breaks.

Также есть возможность отключить кнопку Skip в модальном окне Workrave. Это делается в разделе Options, строка Show ‘Skip’ button.

Секция Break prompting наименее важная и смысл ее существования сводится к одной вещи - предупреждать о готовящемся очередном перерыве (Prompt before breaking). Число попыток (Maximum number of prompts), которые программа Workrave сделает, чтобы выполнить перерыв, по умолчанию равно трем.

На вкладке Rest Break имеются две дополнительные строки. Первая строка Number of exercises служит для установки количества упражнений. Что это такое - упражнения?

Дело в том, что в программе Workrave имеются слайды с упражнениями-гимнастикой, служащей для снятия напряжения, разминки. Количество слайдов - это количество упражнений (от 1 до 10), которые программа Workrave будет предлагать вам сделать во время длительного перерыва (Rest Break).

Вторая строка Start restbreak when screen is locked - это предложить программе запускать длительный перерыв (Rest Break) когда подойдет его время даже тогда, когда экран монитора заблокирован.

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

Вкладка Daily Limit также практически ничем не отличается от предыдущих двух. За одним исключением - есть строка Regard micro-breaks as activity. Она просто говорит о том, что Daily Limit нужно запускать несмотря на то, что одновременно запущен краткий перерыв Micro Break.

С самым большим и важным разделом Timers разобрались. Пора переходить к остальным двум.

Workrave - User interface

Раздел User interface не столь важен для настройки программы Workrave. Первые две вкладки General и Sounds можно смело пропустить.

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

На третьей вкладке Status Window убрать галочки в секции Display - строки Show status window и The status windows stays always on top of other windows.

User Interface Status Window

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

User Interface Applet

Все эти действия позволят “запрятать” программу Workrave в фоновый режим и не мешать основной работе. Теперь напоминания о перерывах (Micro Rest, Rest Break, Daily Limit) будут появляться только тогда, когда наступит их черед.

Workrave - Network

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

Как говорится в Википедии:

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

Заключение

Вот и все, что мне кажется нужным сказать о программе Workrave.


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

При помощи linting‘а можно обнаруживать небольшие ошибки кода “на лету”, в процессе написания этого кода - например, пропущенную точку с запятой в JavaScript-коде. Возможность обнаружения ошибок в редакторе Sublime Text осуществляется с помощью плагина SublimeLinter, который необходимо установить прежде всего.

Если в какой-либо строке кода этот редактор обнаружит ошибку, то данная строка будет подсвечена в gutter редактора Sublime. Более того, если поместить курсор мыши в строку с ошибкой, то в status bar редактора Sublime Text отобразится краткое описание ошибки, что поможет принять меры для ее правильного устранения.

Ниже представлен наглядный пример подсветки ошибок в Sublime Text с помощью плагина SublimeLinter:

SublimeLinter

Плагин SublimeLinter сам по себе не выполняет процесса “отлавливания” ошибок в коде, так как является всего-лишь фреймворком, основой для других плагинов (linter), каждый из которых создан для обнаружения ошибок в каком-то определенном языке - JavaScript, PHP, Ruby, Python, HTML, CSS и так далее.

SublimeLinter в Sublime Text

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

Поэтому первоначально необходимо установить этот фреймворк (как плагин) в редактор Sublime Text и самый простой способ это сделать - воспользоваться менеджером пакетов Package Control. Для этого нажимаем сочетание клавиш Shift+Ctrl+P (Linux \ Windows) или Shift+Cmd+P (Mac OSX). В поле поиска вводим название устанавливаемого пакета - SublimeLinter. Далее - производим установку.

Теперь необходимо определиться с тем, в каких языках программирования необходимо “отлавливать” ошибки. Другими словами, на каких языках программирования вы пишете и в каких из них вам необходима поддержка SublimeLinter.

Допустим, это серверный язык PHP. Тогда для включения возможности обнаружения ошибок в Sublime Text необходимо установить плагин Sublime​Linter-php, так же через менеджер пакетов Package Control. Стоит оговориться, что дополнительной зависимостью этого плагина является язык PHP, который предустановлен в операционных системах Linux\MacOSX, но который необходимо заранее установить отдельно в операционной системе Windows.

Примером работы связки Sublime​Linter + Sublime​Linter-php в редакторе Sublime Text может послужить нижеследующее изображение:

SublimeLinter PHP

Рассмотрим другой случай, когда в редакторе Sublime Text используется язык программирования JavaScript. Тогда для возможности отлавливания ошибок в JS-коде необходимо установить плагин Sublime​Linter-jshint. В этом случае вопрос зависимостей этого пакета выглядит несколько сложнее. Плагин Sublime​Linter-jshint основывает свою работу на JSHint, который необходимо установить в виде пакета под Node.js и устанавливается с помощью менеджера пакетов npm. Поэтому в операционной системе заранее должны быть установлены Node.js, npm и JSHint.

Примером работы плагина Sublime​Linter-jshint может послужить нижеследующее изображение:

Sublime​Linter JSHint

Рассмотрим еще один случай, когда в редакторе Sublime Text используется язык таблиц каскадных стилей CSS (куда же без него?). Тогда необходимо доустановить в Sublime Text плагин Sublime​Linter-csslint.

Рассмотрение подобных плагинов (linter) можно продолжать еще долго. Поэтому ограничимся только тремя вышеприведенными. Стоит сказать, что для поиска какого-либо конкретного плагина (linter) удобно воспользоваться online-сервисом Package Control, в поисковой строке которого достаточно ввести начало названия искомого пакета, например, так - “SublimeLinter-“. Система автоматически выдаст список все плагинов под фреймворк SublimeLinter.

Как нетрудно заметить, окончание (суффикс) в названии каждого из плагинов является подсказкой, для поддержки какого языка был создан этот плагин. Например, для языка Ruby существует плагин Sublime​Linter-ruby, для препроцессора Haml имеется плагин Sublime​Linter-haml.

Также стоит сказать, что необходимо внимательно читать описание к каждому из тех плагинов, которые планируется установить, так как каждый из них имеет разные зависимости. Наглядный пример зависимостей у плагинов Sublime​Linter-php и Sublime​Linter-jshint был приведен выше.

Настройка SublimeLint

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

Linting Modes

Эта настройка отвечает за поведение плагина SublimeLinter - когда плагин должен оповещать об обнаруженной ошибке в коде программы или документа.

  • Background - это поведение по умолчанию плагина SublimeLinter. Сообщения об обнаруженных ошибках будут появляться по мере их обнаружения (другими словами - по мере написания строк кода) и будут обновляться каждый раз, когда будет производиться исправление обнаруженных ошибок. Такой режим может показаться излишне назойливым, так как иногда сообщение об ошибке может появиться прежде, чем будет дописана до конца инструкция, в которой вкралась ошибка.
  • Load\Save - в этом случае сообщения об ошибках будут отображаться плагином только после сохранения или загрузки сохраненного документа.
  • Save Only - сообщения об обнаруженных ошибках будут отображаться только при сохранении документа.
  • Manual - ручной вызов проверки на ошибки, из командной панели редактора Sublime Text.

Лично я предпочитаю режим Load\Save, так как в этом случае плагин SublimeLinter не мешает работать с кодом до тех пор, пора не будет выполнено сохранение этого кода в файле. Режим Background может показаться излишне назойливым, так как сообщения об ошибках будут появляться постоянно, мешая работе.

Для того, чтобы изменить поведение плагина SublimeLinter через настройку Linting Modes, необходимо зайти в командную панель редактора Sublime Text с помощью сочетания клавиш (Shift+Ctrl+P или Shift+Cmd+P) и ввести в строке поиска следующее:

sublimelinter lint mode

… откроется выпадающий список со всеми настройками плагина SublimeLinter, из которого необходимо выбрать SublimeLinter: Choose Lint Mode:

SublimeLinter Lint Mode

Mark Style

Настройка Mark Style отвечает за внешний вид выделения ошибки в строке кода. Значением по умолчанию является outline. Но можно выбрать любое другое значение из предустановленных настроек.

В соответствии с официальной документацией SublimeLinter имеются несколько вариантов выделения ошибок в строке кода:

  • fill
  • outline
  • solid underline
  • squiggly underline
  • stippled underline

Аналогично с режимом Linting Modes, режим Mark Style настраивается через командную панель редактора Sublime Text - Shift+Ctrl+P (Linux \ Windows) или Shift+Cmd+P (Mac OSX). В выпадающм списке нужно выбрать строку Sublime Linter: Choose Mark Style.

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

Fill

Mark Style Fill

Outline

Mark Style Outline

Solid Underline

Mark Style Solid Underline

Squiggly Underline

Mark Style Squiggly Underline

Stippled Underline

Mark Style Stippled Underline

Gutter Themes

В дополнение к настройке выделения ошибок в строке кода, можно выполнить настройку иконок, который помещаются в области gutter редактора Sublime Text напротив строки с обнаруженной ошибкой. Такое выделение строки служит для большей информативности.

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

Blueberry – cross

SublimeLinter Gutter Blueberry Cross

Blueberry – round

SublimeLinter Gutter Blueberry Round

Circle

SublimeLinter Gutter Blueberry Circle

Danish Royalty

SublimeLinter Gutter Danish Royalty

Hands

SublimeLinter Gutter Hands

Knob – simple

SublimeLinter Gutter Knob Simple

Knob – symbol

SublimeLinter Gutter Knob Symbol

Koloria

SublimeLinter Gutter Koloria

ProjectIcons

SublimeLinter Gutter Project Icons

Изменить настройки отображения иконок можно, зайдя в командную панель редактора Sublime Text и выбрав в выпадающем списке строку Sublime Linter: Choose Gutter Theme.

Заключение

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

Рассмотренные в этой статье возможности плагина SublimeLinter являются далеко не исчерпывающими. На официальной странице документации вы всегда найдете для себя что-то новое. Для этого нужно только периодически просматривать эту документацию.