вторник, 15 октября 2013 г.

Настраиваем squid

Настраиваем squid

Общая настройка сквида чаще всего не вызывает сложностей. Сложности обычно вызывают три вещи - настройка ACL (access control list - список прав доступа) и правил для них, настройка дополнительных программ вроде баннерорезалок и настройка ограничений использования канала. Вот эти три вещи я и постараюсь описать в этой статье.

Итак, ACL. Обратимся к соответсвующему месту файла squid.conf и прокомментируем его.

ACL прописываются в виде строки acl имя_acl тип_acl параметры или acl имя_acl тип_acl "файл" - при этом в файле сохраняется по одному значению на строку.

Итак, пойдем по типам списков.

acl aclname src ip-address/netmask - в этом acl описывается ip-адрес или сеть, принадлежащая клиентам squid. Например:

acl vasya src 192.168.1.1/255.255.255.255 описывает единственную машину с адресом 192.168.1.1 и назначает ей ACL с именем vasya

acl office src 192.168.1.1/255.255.255.0 описывает диапазон машин с адресами 192.168.1.1-.254 и назначает этому ACL имя office. Если диапазон необходимо сузить, то необходимо либо изменить маску подсети, либо воспользоваться явным указанием - acl vip_user src 192.168.1.1-192.168.1.5/255.255.255.0. Здесь squid выбирает тот диапазон адресов, который окажется меньше - либо по маске, либо по явному указанию.

acl aclname dst ip-address/netmask - этот тип ACL описывает уже сервер, страницы с которого будут запрашивать клиенты. Особо отмечу - что в этом типа ACL задается не символьный адрес сервера, а ip.

acl aclname srcdomain .domain.ru - описывает клиентов, но уже не по ip-адресам, а по реверсным DNS. То есть в данном примере нет разницы, какие ip-адреса принадлежат клиентам - главное, что бы они определялись dns. Соответсвенно, пож это правило попадут все клиенты, стоящие в домене domain.ru.

acl aclname dstdomain .domain.ru - описывает сервер. Сравнивается с запросом из URL. Под этот ACL попадут все сервера 3его уровня домена domain.ru.

acl aclname srcdom_regex [-i] xxx
acl aclname dstdom_regex [-i] xxx
Описания аналогичны предыдущим, но теперь для выяснения, подходит ли правило под запрос, используются regex-правила. Если символьный адрес не смог определиться из ip-адреса, к запросу будет применена строка none.

acl aclname time [day-abbrevs] [h1:m1-h2:m2] - ACL, описывающий время. Коды дней недели определяются так: S - Sunday - Воскресенье, M - Monday - Понедельник, T - Tuesday - Вторник, W - Wednesday - Среда, H - Thursday - Четверг, F - Friday - Пятница, A - Saturday - Суббота.

Ну а вместо h1:m1 и h2:m2 вставляется время. Запомните - h1:m1 всегда должно быть меньше h2:m2.

Итак, acl worktime time MTWHF 08:00-17:00 описывает рабочее время с понедельника по пятницу, с 8 утра до 5 вечера. acl weekday time SA описывает целиком субботу с воскресеньем, а acl evening time 17:00-23:59 описывает время до полуночи. Если необходимо описать всю ночь, то приходится заводить два ACL- первый с вечера до полуночи, а второй с полуночи до утра.

acl aclname url_regex [-i] ^http:// - regex-правила, применяемый ко всему URL.

acl aclname urlpath_regex [-i] .gif$ - аналогичные правила, применяемые к URL.

acl aclname port 80 70 21 - ACL, описывающий порты. Вместо простого перечисления можно указать диапазон, например 1-1024.

acl aclname proto HTTP FTP - ACL, описывающий протокол, по которому клиент желает сделать запрос на сервер.

acl aclname method GET POST - метод, которым передаются данные клиента серверу.

acl aclname browser [-i] regexp - regexp запрос на клиентский браузер. Вычисления основаны на заголовке User-Agent, который отдает браузер.

acl aclname ident username - ACL описывает имя пользователя, от которого запущена программа на клиентской машине. Имя узнается с помощью ident-сервера.

acl aclname ident_regex [-i] pattern - то же самое, но основанное на regex правилах.

acl aclname proxy_auth username
acl aclname proxy_auth_regex [-i] pattern - ACL, описывающие имя пользователя. Это имя возвращает внешняя авторизующая программа.

acl aclname maxconn number - Это правило сработает, если клиент сделат больше number запросов к кешу.

acl req_mime_type mime-type1 - правило, срабатывающие при аплоаде файлов клиентом. Заметье, АПЛОАДЕ, а не скачивании.

Я конечно, некоторые описания ACL пропустил (большей частью по незнанию, что они значат), но большинство необходимых в повседневной жизни я описал. Думаю, мо вам этого тоже будет достаточно. Если не достаточно - то добро пожаловать на просмотр squid.conf - там все описано, правда, по английски.

Итак, давайте создадим правила обычной сети.

acl all src 0.0.0.0/0.0.0.0
acl office src 192.168.1.0/255.255.255.0 


all - правило, описывающий все машины и office - описывающий все машины в подсети 192.168.1.

http_access allow office
http_access deny all 


эти два правила описывают полный доступ машинам, описываемый acl office и запрещает доступ машинам, описываемым all. Как же так - спросите вы - как могут машины использовать прокси-сервер, если они попадают под правило all - а этому правилу запрещено? Тут в дело вступает порядок просмотра ACL - они просматриваются в порядке обьявления, и если сработало одно правило, то другие уже не просматриваются.

К примеру, если мы введем в дополнение ACL
acl vasya src 192.168.1.100/255.255.255.255 

и расположим правила так:

http_access allow office
http_access deny vasya
http_access deny all 


то машина с ip-адресом 192.168.1.100 по прежнему будет иметь возможность ходить через прокси-сервер.

а если так:

http_access deny vasya
http_access allow office
http_access deny all


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

Если в списке нет ни одно правила, то запрос будет отвергнут. Если не одно правило не сработало, то за основу берется последнее. Если, к примеру, мы заменим предпоследнее правило на http_access allow all, то нашим прокси-сервером смогут совпользоваться абсолютно все (кроме vasya), кто сможет соедениться с портом squid. Так что будьте аккуратнее. Но авторы squid постарались - даже если последнее правило будет разрешающим всем все, то запрос будет отвергнут. Это поможет избежать дыр в прокси-сервере.

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

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

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

Итак, давайте разберемся с траффик-шейпингом - именно так эта штука называется. В squid же эта вещь носит название delay-pool. Замечу, что squid при сборке должен быть собран с опцией --enable-delay-pools.

Итак, сначала разберемся, какие есть пулы. Пулы делятся на 3 класса. Первый, и самый простой, это когда всему acl зарезается трафик до определенной величины. Второй - когда отдельно зарезается трафик для одной машины из подсети и для всей подсети. И третий класс - когда зарезается трафик для отдельных машин, для подсети класса С или меньше и для подсети класса B. Не понятно? Сейчас разьясню.

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

delay_pools 1 - у нас всего 1 пул.
delay_class 1 1 - 1й пул у нас первого класса
delay_access 1 allow vasya
delay_access 1 deny all


В первый пул попадают только машины, описываемые ACL vasya. Остальные ходят как им положенно - ведь им доступ к 1му пулу заказан.

delay_parameters 1 800/64000

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

Если он вас совсем достал, то напишите правило delay_parameters 1 800/800 - и злобный качальшик все будет качать на скорости 800 байт в секунду.

Но у вас офис и в его канале периодически начинается толчея - все хотя что-то качать, в итоге никому ничего не хватает.

Исправляем строчку с delay_pools на delay_pools 2

теперь у нас будет 2 пула

delay_class 2 2 - второй пул будет второго класса (совпадение номеров чисто случайно ;-)) - первый - это vasya

delay_access 2 allow office
delay_access 2 deny all


во второй пул попадают только машины с ACL office.

delay_parameters 2 64000/64000 4000/4000

В итоге вся подсеть, описываемая office, будет использовать канал не больше 512Кбит/с (64Кб/с), но каждый отдельный хост будет качать не более 4Кб в секунду. Этим правилом очень легко разграничить по скорости разные подсети, использующие один канал.

К примеру, у нас есть две подсети, описываемые office и office1. При этом office не должно иметь никаких ограничений на канал (примем канал за 256Кбит) в целом, но каждый из office не должен качать быстрее 6Кб/с. А office1 - это нехорошие дяденьки и тетеньки с большин гонором, которым всем и 5Кб/с хватит за глаза.

Создаем 2 пула 2го класса и прписываем для них ACL. Затем определяем этим пулам параметры.

delay_parameters 3 -1/-1 6000/6000 - это определение для office (ему отдан номер пула 3)

delay_parameters 4 5000/5000 -1/1 - а это для office1.

В итоге после применения этих правил получаем все, что заказано - первый офис грузит канал как хочет (-1/-1), но никто из сотрудников больше 6Кб/c на нос не получает. А второй офис грузит канал не больше 5Кб/с, а как данные 5Кб/с распределяются между его сотрудниками - не наша головная боль. Пауки в банке, так сказать.

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

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

Итак, опять лезем в squid.conf и прописываем туда строку redirect_program /squid/bin/redirector, где /squid/bin/redirector - путь до выполняемой программы, которая как раз и обеспечивает разбор URL. Ее можно написать на чем угодно, но наиболее предпочтительным является Perl - этот язык как раз предназначен для подобного рода работ.

Итак, вот эта программа.
#!/usr/bin/perl 
$0 = 'redirect' ; 
$| = 1 ; 

@banners = ('reklama.ru/cgi-bin/banner/', 
 'anekdot.ru/cgi-bin/banner/', 
 .................. 
 'linux.ru.net/counter.ph', 
 'counter.allhits.ru/counter?' 
); 

while (<>) { 
 ($url, $who, $ident, $method) = /^(S+) (S+) (S+) (S+)$/ ; 
 $url = 'http://linuxnews.ru/images/1x1.png' 
 if grep ($url=~/$_/i, @banners) ; 
 print "$url $who $ident $method " ; 
}
Эта программа проста по сути - если данный URL попадает под список banners, то в ответ браузеру возвращается http://linuxnews.ru/images/1x1.png. Как легко догадаться - там лежит картинка размером 1 на 1 пиксел. Везде в описании баннеров и счетчиков стоит размер, поэтому браузеры сами растягивают эту картинку до размеров баннера. Понятно, что адрес можете заменить на свой, но можете оставить и мой - поесле первого обращения прокси закэширует эту картинку и больше к ней обращаться не будет.

Все, все необходимые действия проделаны (надеюсь, вы не забыли поставить аттрибут исполнения на redirector?), теперь просто перезагрузите сквид, очистите кэш браузера и пройдите по сайтам. Особый эффект наблюдается на price.ru - скорость закачки страниц подпрыгивает на очень большую величину.

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

В общем, это хорошо. Да, чуть не забыл - полная версия редиректора лежит на http://linuxnews.ru/redirector - я ее обновляю время от времени, поэтому она почти соответствует последним веяниям баннеров (правда для тех сайтов, где народ из моего офиса обычно бывает). Оригинал редиректора был найден в сети, поэтому я никаких прав на него предявить не в состоянии, да и нет желания ;-)

Пользуйтесь на здоровье, вернее на пользу канала.

(с) 2001 Вячеслав Калошин multik@asplinux.ru


8 Мая 2001
Multik

Превращаем Sublime Text 2 в Notepad++



Сейчас огромную популярность набирает текстовой редактор Sublime Text 2. Я же в давние времена перешел наNotepad++ и много лет им активно пользовался, радуясь и восхищаясь. И когда стали появляться слухи, что Sublime теснит Notepad++, то решил проверить и попробовать на него перейти. Но, к сожалению, обнаружил, что много фишек, которым мне так нравился Notepad++ (не все идут в исходных настройках) я не вижу, несмотря на обилие новых других интересных возможностей. И было решено попробовать настроить Sublime так, чтобы им можно было пользоваться также, как и Notepad++ (с плагинами), имея попутно возможности Sublime Text 2, коих нет в первом редакторе. И да, Sublime Text 2 настраивался в Windows 7.

Введение



Данная статья показывает, какие особенности можно повторить, а какие еще ищут своего решения. Предполагается, что базовые настройки Sublime Вы уже провели:
  • Русский язык корректно отображается;
  • Менеджер пакетов установлен.

Итак, пойдем по порядку тех возможностей и деталей, которые мы можем переделать и настроить в Sublime Text 2.

Внешний вид



Цветовая схема Sublime Text 2 по умолчанию непривычна для пользователей Notepad++, да и сам шрифт «не такой» после многолетней работы.



Danny Connell предложил решение (далее почти дословно его слова). Качаем файл Notepad++.zip.
  • Переходим в папку цветовых схем. В Windows 7 она находится по адресу: C:\Users\[your username]\AppData\Roaming\Sublime Text 2\Packages\Color Scheme — Default или по другому%appdata%/Sublime Text 2/Packages/Color Scheme — Default или Preferences → Browse Packages, а оттуда в папку Color Scheme — Default. И копируем содержимое архива в эту папку.
  • В программе идем по меню Preferences → Color Scheme → Notepad++.
  • Изменим шрифт и другие настройки. Для этого идем Preferences → Settings — User.
  • Добавляем нижеприведенный текст и сохраняем Ctrl+S.

    "font_face": "Courier New",
    "highlight_line": true,
    "line_padding_bottom": 1,
    "line_padding_top": 1

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

{
    "color_scheme": "Packages/Color Scheme - Default/Notepad++.tmTheme",
    "font_face": "Courier New",
    "highlight_line": true,
    "line_padding_bottom": 1,
    "line_padding_top": 1
}

В итоге, Sublime выглядит гораздо привычнее:



И можно включить постоянный перенос строки строк (но это по желанию). Идем Preferences → Settings — Default, находим строчку:

"word_wrap": "auto",

и слово auto заменяем на true.

Контекстное меню



Разочаровало отсутствие в Windows контекстного меню открытия любого файла, как в Notepad++:



Как оказалось, при установке Sublime Text 2 нужно отметить галочку:



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



Сортировка строк



F9 и Ctrl+F9 (по чувствительности к регистру отличаются) — позволяет отсортировать выделенные строки в алфавитном порядке (в Notepad++ этим занимается плагин TextFX). Но не позволяет отсортировать корректно числа в строках, так как строки воспринимаются как строки, а не как числа. То есть строки:

5
1
10

будут отсортированы как:

1
10
5

В Notepad++ есть для этого плагин NppColumnSort. Как быть тут? Нашел способ, как поменять основную функцию сортировки. Но в Notepad++ плагины TextFX и NppColumnSort реализуют две разные функции, а в Sublime нам нужно либо одной, либо другой пользоваться. Что делаем? Пишем дополнительный плагин, заодно и потренируемся.

Tools → New Plugin... и создается заготовка для нашего плагина. Плагин я переделывал из плагина обычной сортировки%appdata%/Sublime Text 2/Packages/Default/sort.py. Заменяем код заготовки на такой:

import sublime, sublime_plugin
import re

# Uglyness needed until SelectionRegions will happily compare themselves
def srcmp(a, b):
    aa = a.begin();
    ba = b.begin();

    if aa < ba:
        return -1;
    elif aa == ba:
        return cmp(a.end(), b.end())
    else:
        return 1;

def case_insensitive_sort(txt):
#   txt.sort(lambda a, b: cmp(a.lower(), b.lower()))
#   return txt
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9.,]+)', key) ]
    return sorted(txt, key=alphanum_key)

def case_sensitive_sort(txt):
#   txt.sort(lambda a, b: cmp(a, b))
#   return txt
    convert = lambda text: int(text) if text.isdigit() else text
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9.,]+)', key) ]
    return sorted(txt, key=alphanum_key)

def shrink_wrap_region( view, region ):
    a, b = region.begin(), region.end()

    for a in xrange(a, b):
        if not view.substr(a).isspace():
            break

    for b in xrange(b-1, a, -1):
        if not view.substr(b).isspace():
            b += 1
            break

    return sublime.Region(a, b)

def shrinkwrap_and_expand_non_empty_selections_to_entire_line(v):
    sw = shrink_wrap_region
    regions = []

    for sel in v.sel():
        if not sel.empty():
            regions.append(v.line(sw(v, v.line(sel))))
            v.sel().subtract(sel)

    for r in regions:
        v.sel().add(r)

def permute_lines(f, v, e):
    shrinkwrap_and_expand_non_empty_selections_to_entire_line(v)

    regions = [s for s in v.sel() if not s.empty()]
    if not regions:
        regions = [sublime.Region(0, v.size())]

    regions.sort(srcmp, reverse=True)

    for r in regions:
        txt = v.substr(r)
        lines = txt.splitlines()
        lines = f(lines)

        v.replace(e, r, u"\n".join(lines))

class SortLinesNumericCommand(sublime_plugin.TextCommand):
    def run(self, edit, case_sensitive=False,
                        reverse=False,
                        remove_duplicates=False):
        view = self.view

        if case_sensitive:
            permute_lines(case_sensitive_sort, view, edit)
        else:
            permute_lines(case_insensitive_sort, view, edit)

        if reverse:
            permute_lines(reverse_list, view, edit)

        if remove_duplicates:
            permute_lines(uniquealise_list, view, edit)

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

class SortLinesNumericCommand(sublime_plugin.TextCommand):

Поэтому название класса должно быть отличным от названий других команд Sublime. Было SortLinesCommand сталоSortLinesNumericCommand (в конце должно быть часть Command). А как будет называться команда в настройках Sublime? Может для Питона это обычно (или это фишка Sublime?), но я в нем почти не работал, и для меня это было малость неочевидно. Итак, берем название класса SortLinesNumericCommand, откидываем часть Command, а в полученной части всё приводим к малому регистру, но перед буквами, что были заглавными, кроме первой, ставим нижнее подчеркивание. То есть команда теперь в Sublime будет называться sort_lines_numeric.

Сохраняем данный файл в папке %appdata%/Sublime Text 2/Packages/, например, под именем SortLinesNumeric.py. Теперь у нас данный плагин уже загружен в Sublime, и по сути мы можем вызывать его функции.

Небольшое отступление. Если Вы разрабатываете свой плагин, сохранили его, и у Вас плагин без ошибок и что-то выполняет, то если в дальнейшей разработке Вы плагин привели к виду, где есть критические ошибки, сохранили его и проверяете, то ошибок не увидите: так как Sublime будет использовать загруженный в память рабочий вариант плагина. Мне помогал перезапуск Sublime.

Итак, плагин с функцией сортировку у нас написан. Теперь назначим функции sort_lines_numeric горячие клавиши и затащим ее в контекстное меню. Открываем файл %appdata%/Sublime Text 2/Packages/Default/Default (Windows).sublime-keymap (в соответствии с Вашей операционкой). найдите там строчку:

{ "keys": ["ctrl+f9"], "command": "sort_lines", "args": {"case_sensitive": true} },

По аналогии с ней добавим строчку нашей команды:

{ "keys": ["ctrl+shift+f9"], "command": "sort_lines_numeric", "args": {"case_sensitive": true} },

Теперь выделенный текст при нажатии ctrl + shift + f9 отсортируется с учетом того, что там могут быть числа.

Открываем файл %appdata%/Sublime Text 2/Packages/Default/Context.sublime-menu. Здесь собраны команды для контекстного меню. Добавляем нашу команду и получаем такой файл (я еще добавил пустую строчку, чтобы отделить пользовательские команды):

[
    { "command": "copy" },
    { "command": "cut" },
    { "command": "paste" },
    { "caption": "-", "id": "selection" },
    { "command": "select_all" },
    { "caption": "-", "id": "file" },
    { "command": "open_in_browser", "caption": "Open in Browser" },
    { "command": "open_dir", "args": {"dir": "$file_path", "file": "$file_name"}, "caption": "Open Containing Folder…" },
    { "command": "copy_path", "caption": "Copy File Path" },
    { "command": "reveal_in_side_bar", "caption": "Reveal in Side Bar" },
    { "caption": "-", "id": "usercommand" },
    { "command": "sort_lines_numeric", "caption": "Сортировка с учетом чисел" },
    { "caption": "-", "id": "end" }
]

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



Пример работы плагина:

Текст
Кот
5
50
Вот так
1
10
10005
7

сортируется так:

1
5
7
10
50
10005
Вот так
Кот
Текст


Проверка орфографии



В Notepad++ проверка осуществляется через Aspell, правда подчеркивание слов с ошибками там нет. Был один плагин, но он не работает с последними версиями программы. В Sublime проверка орфографии встроена, но нет русского словаря. Используется чуть отредактированный способ Comphobby.ru.

Идем на сайт http://extensions.services.openoffice.org/en/dictionaries. Так скачиваем какой-нибудь русский словарь. Я выбралРусский орфографический словарь (АОТ е+ё). Russian spellcheck dict (ieyo). Based on works of AOT.ru. 

Если файл имеет расширение не zip, то переименовываем и меняем на zip.

Можете скачать здесь: dict_ru_RU-AOT-0.2.7-ieyo.

Из архива вытягиваем два файла с расширениями .aff и .dic. У меня это файлы russian-aot-ieyo.aff и russian-aot-ieyo.dic. И кидаем файлы в папку с плагинами %appdata%/Sublime Text 2/Packages/.

Теперь открываем эти файлы в Sublime. Проверьте, чтобы там были нормальные русские слова, а не русские произвольные наборы букв, что означает неверную кодировку. И если в файле с раcширением .aff первой строчкой идет:

SET KOI8-R

то, значит кодировка KOI8-R. А нам нужно сохранить в UTF-8.

Для обоих файлов идем File → Reopen with Encoding → Cyrillic (KOI8-R). Теперь в файлах должны появиться осмысленные слова маленькими буквами. И далее идем File → Save with Encoding → UTF-8 и сохраняем Ctrl+S.

И в файле с раcширением .aff первую строчку меняем на:

SET UTF-8

Теперь выбираем наш словарь View → Dictionary → [наш словарь] и включаем режим проверки орфографии F6:



Теперь все наши ошибки подсвечены:


Я также с помощью утилиты http://habrahabr.ru/post/158441/ собрал из словаря Firefox более объемный словарь:russian_english.

Это уже готовые .aff и .dic файлы. Просто копируем их в папку с плагинами и в меню выбираем словарь. В этом словаре нет проблем с заглавными буквами. Плюс это русско-английский словарь.



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

Но есть проблема: словарь не предлагает вариантов для замены (в отличии от Notepad++). Кто сможет — предложите варианты решения. Так что получается, что Notepad++ предлагает варианты исправления ошибок, но их не подчеркивает, а Sublime Text 2 подчеркивает, но варианты исправления не дает.

Открытие новых вкладок



Sublime Text 2 всегда открывает документ в новой вкладке, как следующую после текущей. Данная его особенность просто бесит после нормальной реализации в Notepad++: файл открывается в новой вкладке в самом конце вкладок. Хотя думаю, что приверженцев идеологии Sublime тоже найдется не мало. Но если не нравится, то вот способ.

Скачиваем плагин https://github.com/stylishmedia/SublimeText-Tabright.

Файл Tabright.py копируем в папку плагинов %appdata%/Sublime Text 2/Packages. Теперь файлы будут открываться в нужной вкладке.



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

Говорят также, что в последней dev версии плагин не работает. Не знаю — не проверял.

История буфера обмена



В Notepad++ для этого есть функция Clipboard History: Правка → Панель истории файлов:



Для Sublime Text 2 нужно установить плагин с аналогичным названием Clipboard History. Качаем его сhttps://github.com/kemayo/sublime-text-2-clipboard-history.

Копируем папку с распакованным плагином в папку с плагинами %appdata%/Sublime Text 2/Packages. Теперь при нажатии Ctrl + Alt + V откроется окно буфера обмена:



В отличии от Notepad++ есть поиск по буферу обмена. Но есть и серьезный недостаток: в историю буфера обмена копируется только текст, который копировался внутри Sublime. В Notepad++ в истории буфера сохраняется текст из всех программ, что часто бывает очень удобным. И панель в Sublime не может быть постоянной как в Notepad++, что также не гуд, когда нужно постоянно вставлять некоторые варианты небольших кусков кода. Или работа со снипетами может решить эту проблему?

Помеченные строки (Bookmarks)



В Notepad++ строки помечаются кликанием слева около строки:



В Sublime Text 2 для этого приходится использовать комбинацию клавиш Ctrl + F2 (по ней же и снимается). А хотелось бы всё-таки делать это визуально мышью. И сами отметки слабо отмечаются глазами (а они же отметки!).



Чтобы немного облегчить жизнь в файл %appdata%/Sublime Text 2/Packages/Default/Context.sublime-menuдобавляем строчку:

{ "command": "toggle_bookmark", "caption": "Отметить строку" },

И в контекстном меню появится соответствующая команда.

Переход же от отметки к отметке производится аналогично, как и в Notepad++, через клавишу F2 (Shift + F2 в обратную сторону).

Поиск и замена



В Sublime имеется «умный» поиск по Ctrl + P, но хоть он удобен, но всё равно не выполняет полные функции поиска (или выполняет?) — задачи у «умного» поиска несколько другие. Рассмотрим решение стандартных задач поиска и замены в двух редакторах (мне вначале в Sublime всё не было интуитивно понятно).

В обоих редакторах панель поиска, как и положено во всех программах, вызывается через Ctrl + F.

Маленькое отступление. А как закрыть то панель поиска у Sublime? Обратно по Ctrl + F не закрывается, крестика нет. Оказалось, что Esc выполняет эту функцию. С одной стороны очень понятно и просто, с другой — сообразить без гугла у меня не получилось.

На рисунке показаны соответствия команд панели поиска.



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

Функция: «Найти всё во всех открытых документах».

В Notepad++ эта замечательная функция выглядит так:



В Sublime нажимаете Ctrl + Shift + F. Вам выйдет следующее окошко:



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



При двойном щелчке по выделенным фрагментам Вы переместитесь на нужный Вам файл и место. Но постоянно переключаться между вкладкой результатов поиска и вкладками документов неудобно. В Notepad++ же панель результатов поиска расположена внизу. Нажимаем Shift + Alt + 8 (разбиваем экран на верхнюю и нижнюю половину) и перетаскиваем туда нашу вкладку с результатами поиска. Панель вкладок только слишком большая для второго окна. Уменьшить бы ее.



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

Также в этой панели реализована функция замены по всем открытым файлам.

Функция: «Заменить».

При нажатии на Ctrl + H — откроется панель замены в текущем документе:



Тут всё понятно, но маленькая ремарка. Уже три комбинаций горячих клавиш на три разные панели поиска и замены! А если добавить и «умный» поиск, то и все четыре! В Notepad же всё реализовано в одной панели — ничего искать и запоминать не нужно.

Функция: «Найти всё в текущем документе».

В Notepad++ эта замечательная функция выглядит так:



В Sublime в панели обычного поиска есть кнопка Find All, но он только выделяет все найденные результаты. Поэтому, чтобы хоть как-то повторить реализацию в Notepad++, приходится использовать функцию поиска по всем открытым файлам, и в разделе Where вводить имя файла, в котором производится поиск. А если название длинное? Неудобно. Также, если открыто несколько файлов с одинаковым именем (по разным папкам раскиданы), то поиск будет проведен по всем таким одноименным файлам.

Функция: «Подсчитать».

В Notepad++ всё просто:



Почти в финальной редакции этой статьи было написано, что не смог найти решение в Sublime. Оказывается, всё банально просто:



Функция: «Найти в файлах».

В Notepad++ есть соответствующая вкладка:



В Sublime при расширенном поиске Ctrl + Shift + F при нажатии кнопки ... есть возможность добавление папки.



И еще одна проблема, общая для всех поисков в Sublime. Я не нашел истории поисковых запросов. В Notepad++ есть выпадающее меню, а тут ничего такого.

Подсвечивание скобок



Notepad++ при попадании курсора на скобку подсвечивает их ярким цветом:



В Sublime же есть лишь небольшое малозаметное подчеркивание:



Можно исправить ситуацию плагином BracketHighlighter. Установим его через Package Control. Идем Preferences →Package Control, начинаем набирать Install Packages:



И в появившемся окне вводим имя плагина и по нему щелкаем:



Плагин установился. Перезапускаем Sublime и видим, что стало получше:



Кто-нибудь знает, как сделать при работе этого плагина BracketHighlighter с белым фоном, но красным цветом текста при выделении скобок? И как подсвечивать не только скобки, но и теги?

Копирование имени файла



В Notepad++ я постоянно пользуюсь удобной функцией копирования имени файла, пути к нему и полное имя файла по клику правой кнопкой по вкладке файла:



А что предлагает Sublime? У него есть только одна функция copy_path не в контекстном меню вкладки, а в контекстном меню самого тела файла. Что не есть удобно. Итак, открываем файл %appdata%/Sublime Text 2/Packages/Default/copy_path.py и меняем его содержимое на следующее (не бойтесь, основная функция будет нетронута):

import sublime, sublime_plugin
import os.path

class CopyPathCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        if len(self.view.file_name()) > 0:
            sublime.set_clipboard(self.view.file_name())
            sublime.status_message("Copied full file path")

    def is_enabled(self):
        return self.view.file_name() and len(self.view.file_name()) > 0

class CopyFileNameCommand(sublime_plugin.TextCommand):
    def run(self, edit):
     full_name = self.view.file_name()
     folder_name, file_name = os.path.split(full_name)
        if len(self.view.file_name()) > 0:
            sublime.set_clipboard(file_name)

            sublime.status_message("Copied file name")

class CopyPathOfFileCommand(sublime_plugin.TextCommand):
    def run(self, edit):
     full_name = self.view.file_name()
     folder_name, file_name = os.path.split(full_name)
        if len(self.view.file_name()) > 0:
            sublime.set_clipboard(folder_name)

            sublime.status_message("Copied path of file")


Тем самым мы ввели две команды copy_file_name и copy_path_of_file. Открываем файл %appdata%/Sublime Text 2/Packages/Default/Tab Context.sublime-menu и добавляем строчки (не забывайте о правильной расстановке запятых), сохраняем:

    { "command": "copy_path", "caption": "Полный путь к файлу" },
    { "command": "copy_file_name", "caption": "Имя файла" },
    { "command": "copy_path_of_file", "caption": "Путь к директории файла" }

Теперь при нажатии на правую кнопку по вкладке у нас в меню будут три наших функции, которые в буфер обмена копируют нужные нам тексты:



Печать



Notepad++ умеет печатать (причем с подсветкой кода). И это даже не его преимущество — это свойство почти всех нормальных программ. И было удивительно не увидеть этой функции у Sublime. Что делать? По сути адекватного решения пока нет. Можно скопировать код в другой редактор и распечатать, но тогда теряется вся прелесть, и исчезает вся подсветка кода. В общем нехорошо. Можно воспользоваться одним костылем в виде одного плагина. Итак, открываем панель команд CTRL + Shift + P, пишем Install package, пишем название плагина Print to HTML и устанавливаем его:



В итоге в меню File появляются два пункта:



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



При выборе второго пункта меню откроется текст этой самой html страницы. Может кому и пригодится.

Сравнение файлов



Часто требуется сравнить два файла. Например, найти измененную строчку в двух почти одинаковых файлах. В Notepad++ за это отвечает плагин Compare:



В Sublime для этого нужен плагин FileDiffs. Итак, открываем панель команд CTRL + Shift + P, пишем Install package, пишем название плагина FileDiffs и устанавливаем его.

Открываем два наших файла в двух подряд вкладках. Жмем правой кнопкой по первой вкладке:



И там выбираем Diff with Tab. В результате чего нам показывают результат работы сравнения:



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

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

Выделение определенного текста



В Notepad++ можно выделить конкретный текст (как будто маркером провели):





Как быть в Sublime? Я пока не нашел решения.

Синхронизация вертикальной прокрутки



Еще одна важная для меня функция, которую не нашел в Sublime. Когда имеется два файла одного типа часто требуется просмотреть их синхронно. В Notepad++ все реализовано:



А что с Sublime? Кто-нибудь знает решение?

Фолдинг



Это одна из главных претензий к Sublime Text 2. Я даже в отдельный блок выделил, а не в конечный список нерешенных проблем выделил. Он сворачивает блоки кода только, когда они правильно оформлены отступами. Но не всегда же это так! К тому же разные программисты по разному оформляют табуляцию. В общем очень некрасиво получается, когда половина div или функций не сворачивается. В Notepad++ всё сворачивается вне зависимости от отступов. Решений я пока не нашел.





Соответствие команд



Ниже приводится соответствие некоторых команд, которыми часто пользуюсь, в Notepad++ и Sublime Text 2, если они вызываются разными методами:

Дублирование участка кода.
  • Notepad++: CTRL + D.
  • Sublime Text 2: Ctrl + Shift + D.

Перекодирование файла.
  • Notepad++: Кодировки → Преобразовать в ....
  • Sublime Text 2: File → Save with Encoding → ....

Открыть файл в другой кодировке.
  • Notepad++: Кодировки → Кодировать в ....
  • Sublime Text 2: File → Reopen with Encoding → ....


Комментирование кода.
  • Notepad++ I вариант: Клик правой кнопки мыши → Вкл./Выкл. Комментарий строки (раскомментировать аналогично).
  • Notepad++ II вариант: Клик правой кнопки мыши → Закомментировать выделенное (раскомментировать автоматически нельзя).
  • Sublime Text 2 I вариант: Ctrl → / (раскомментировать аналогично).
  • Sublime Text 2 II вариант: В файл %appdata%/Sublime Text 2/Packages/Default/Context.sublime-menuдобавляем строчку:

    { "command": "toggle_comment", "caption": "Закомментировать" },


Поменять регистр букв на большие буквы.
  • Notepad++: Клик правой кнопки мыши → ПРОПИСНЫЕ.
  • Sublime Text 2 I вариант: Ctrl → K, а потом Ctrl → U (я не понимаю, зачем это было делать на два клавиатурных сочетания).
  • Sublime Text 2 II вариант: В файл %appdata%/Sublime Text 2/Packages/Default/Context.sublime-menuдобавляем строчку:

    { "command": "upper_case", "caption": "ПРОПИСНЫМИ" },


Поменять регистр букв на маленькие буквы.
  • Notepad++: Клик правой кнопки мыши → строчные.
  • Sublime Text 2 I вариант: Ctrl → K, а потом Ctrl → l.
  • Sublime Text 2 II вариант: В файл %appdata%/Sublime Text 2/Packages/Default/Context.sublime-menuдобавляем строчку:

    { "command": "lower_case", "caption": "строчными" },


Разделить окно на две части.
  • Notepad++: Вид → Операции с документом → Переместить в другое окно.
  • Sublime Text 2 I вариант: View → Layout → Colums: 2.
  • Sublime Text 2 II вариант: В файл %appdata%/Sublime Text 2/Packages/Default/Tab Context.sublime-menuдобавляем строчку (не забывайте о правильной расстановке запятых):

    { "command": "set_layout","args":{"cols": [0.0, 0.5, 1.0],"rows": [0.0, 1.0],"cells": [[0, 0, 1, 1], [1, 0, 2, 1]]}, "caption": "Создать второе окно" }


Выбор подсветки синтаксиса.
  • Notepad++: Ситаксис → ....
  • Sublime Text 2: View → Syntax → ....


Перейти к соответствующей скобке (закрывающейся или открывающейся).
  • Notepad++: Ctrl + B.
  • Sublime Text 2 I вариант: Goto → Jump to Matching Bracket.
    Sublime Text 2 II вариант: Ctrl + M.


Некоторые числовые опыты



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

В одном опыте я открывал текстовой файл размером 177 Мб (в обеих программах был включен перенос, а потом отключен). Notepad++ открывал его 3 секунды, а Sublime Text 2 за 90 секунд. При этом Notepad++ даже не собирался показывать признаки медленной работы, а вот Sublime начал заметно притормаживать. После этого решил провести поиск фрагмента, который встречался в тексте где-то 42000 раз. Notepad++ потратил 10 секунд, а Sublime — 22, и при этом не отвечал ни на что.

В другом опыте я решил открыть 1136 файлов общим объемом 20Мб. Sublime открыл за 50 секунд, а Notepad++ за 45 секунд. Так что здесь оба показали одинаково себя. После нужно было найти в открытых файлах количество слова «table». Notepad++ справился за 3 секунды, а вот Sublime справился почти мгновенно? чем очень приятно удивил.

Выводы делайте сами по этим опытам.

Нерешенные проблемы и вопросы



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

  • Есть более полный англо-русский словарь в виде .dic и .aff файлов?
  • При проверке орфографии не предлагаются варианты исправления русских слов.
  • Нет возможности добавлять в словарь новых слов.
  • Работает ли плагин Tabright в последней dev версии Sublime Text 2? Upd. Нет. (singlewolf)
  • При закрытии вкладки до последней при использовании плагина Tabright программа вылетает.
  • Как по нормальному открывать вкладки, чтобы при открытии файла, вкладка появлялась в конце вкладок?
  • Плагин Clipboard History не сохраняет буфер обмена других программ.
  • Панель Clipboard History нельзя зафиксировать на постоянной основе.
  • Можно ли ставить пометки Bookmarks без горячих клавиш?
  • Можно ли ставить пометки Bookmarks сделать более заметными? Upd. Отредактируйте Sublime Text 2\Packages\Theme — Default\bookmark.png (singlewolf)
  • Нельзя все поиски свести в одну панель.
  • Как найти текст и вывести список найденных мест не во всех файлах, а только в одном (без ввода имени файла, без одноименных файлов)?
  • Нельзя результаты поиска по всем файлам выводить не в отдельной вкладке. Upd. отщелкните кнопку «use buffer»(sebres)
  • Нет истории поисковых запросов в панелях поисков и замен. Upd. Просто в поле ввода запроса нажимайте клавишу Вверх или Вниз. (akzhan)
  • Сворачивает код (фолдинг) только с правильными отступами (одна из главных проблем).
  • Кто-нибудь знает, как сделать при работе этого плагина BracketHighlighter с белым фоном, но красным цветом текста при выделении скобок?
  • И как подсвечивать не только скобки, но и теги? Upd. В файле \Sublime Text 2\Packages\BracketHighlighter\BracketHighlighter.sublime-settings нужно, чтобы строчка была «tag_enable»: true,
  • Нет функции печати в самой программе (только через использование браузера).
  • Как можно выделять конкретный текст как маркером на бумаге?
  • Есть нормальный способ сравнения файлов, как это обычно делают в соответствующих программах?
  • Как вертикальной прокруткой синхронизировать два файла? Upd. github.com/terminalbell/SublimeSynchroScroll(Helsus)


Желательно все настройки Sublime делать в настройках для пользователя, чтобы потом можно ыло быстро перенести

Скорее всего, есть еще множество неучтенных взаимных моментов, но пока закончу.

На данный момент полный переход на Sublime Text 2 для меня довольно болезненный, так как я не нашел всего того, чем привык пользоваться. Хотя я уже некоторые задачу выполняю с его помощью, где он показывает себя с лучшей стороны.

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

P.S. И выскажу немного «кощунственную» мысль (возможно, что она не верна). Sublime Text 2 набирает обороты и становится популярным, потому что вариант «из коробки» малопригоден для работы (как минимум надо настроить кодировку для русского языка, изучить горячие клавиши). И этот факт заставляет людей настраивать редактор, а, следовательно, изучать его возможности. Notepad++ «из коробки» гораздо более работоспособный, и пользователь может вообще ничего не изменять, не настраивать и прекрасно работать. У него нет необходимости лезть в дебри и изучать возможные дополнительные настройки (про разницу во времени создания программ я знаю).

P.P.S. Пара моментов об использовании этих программ. Каждый использует эти редакторы по разному, поэтому важно вначале сказать о некоторых особых моментах. Я не любитель горячих клавиш. Запоминать десятки комбинаций в десятках программ для меня тяжело. Особенно когда голова забита проектом, а нужно вспоминать, а какие клавиши тут надо нажать. Использую редакторы не только для написания кода. Не являюсь чистым кодировщиком, поэтому мыслю над проектом много больше, чем кодю. Поэтому ускорители написания кода мне не нужны. И у меня мало повторяющегося кода.

P.P.P.S. Некоторые возможности Sublime Text 2 считаются фишками данного редактора. Однако многие из находятся и в Notepad++: множественное выделение, вертикальное выделение, миникарта (правда она реализована менее удобно), работа с проектами и др.

Upd. Спасибо пользователям jekakmail, leventov, WAYS за найденные ошибки.

Upd. Ввиду того, что в комментариях неоднократно спрашивают один вопрос: «Зачем ты это делал? Выбери просто один инструмент и пользуйся», отвечаю на него тут.

Я не превращал один продукт в другой. Что было сделано?

1. Поменял для привычки внешний вид. Кто не хочет — пусть не делает.
2. Нашел соответствие функциям в одном и другом редакторе. Для чего? Решил человек перейти на Sublime (ну, жутко ему понравились сниппеты или внешний вид), но никак не может найти привычной функции для перехода к закрывающей кавычке или поиск по открытым файлам. Абсолютно логичное желание.
3. Добавлены некоторые плагины, дополняющие недостающий функционал.
Всё!

Почему я не выберу один инструмент? А почему тогда в Windows, разных дистрибутивах Linux, Mac — почему они постоянно копируют в том или ином виде новшества и идеи?

Меня не полностью устраивает Notepad++, поэтому я в поисках альтернатив. Но я хочу в новом каком-либо инструменте всё то, к чему я привык в Notepad++. С точки зрения оптимизации я хочу найти инструмент, который будет по всем критериям не хуже, чем Notepad++, а по некоторым лучше.