вторник, 19 апреля 2011 г.

Поиск по файлам в Vim


Выдалось немного времени, решил написать, как удобно организовать поиск по файлам в vim.

Скажу стразе, что в vim есть 2 функции, которые позволяют совершить поиск по файлам grep - выводит результат поиска в консоль, а vimgrep выводит результат поиска в командную строку vim.

Читайте: help vimgrep и help grep

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

Но vim был бы не vim, если бы там чего-то нельзя было сделать. Итак мой пример организации поиска по файлам в vim.

Для организации поиска по файлам я использую плагин grep.vim (автор Yegappan Lakshmanan) Данный плагин позволяет удобно делать поиск и работать с результатами поиска.

Кладем grep.vim в папку $VIM_HOME/plugin/

Данный плагин использует утилиту grep. Для пользователей Windows автор предусмотрел переменную Grep_Path

:let Grep_Path = 'с:\progs\grep.exe'

У Вас появятся целая куча новых функций для работы с поиском: :Grep, :GrepAdd, :Rgrep, :RgrepAdd, :GrepBuffer, ... Тут очень детально все описано http://www.vim.org/scripts/script.php?script_id=311.

Опишу лишь то, что чаще всего использую я.

Rgrep - рекурсивный поиск по файлам
RgrepAdd - добавляет  результат поиска к результатам предыдущего поиска
GrepBuffer - поиск по всем открытым буфферам

Так же удобно забиндить какую-нибудь клавишу для поиска, я, например, использую F2 и F3.

Для этого открываем vimrc и добавляем такой код:

" F2 - Run recursive grep
nnoremap <silent> <F2> :Rgrep<cr>

" Shift-F2 - Same as ":Rgrep" but adds the results to the current results
nnoremap <silent> <S-F2> :RgrepAdd<cr>

" F3 - Search for a pattern on all open buffers
nnoremap <silent> <F3> :GrepBuffer<cr>

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



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

Вот и все. В лучших традициях, так сказать, жирных IDE.


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

С ув. antonfin

Читать дельше...

воскресенье, 17 апреля 2011 г.

Thanks to Paul Allen...

У меня произошла некоторая проблема при работе с одним проектом.

Я использовал модуль GD::SecurityImage при создании каптчи. Модуль удобный тем, что может использовать разные библиотеки в бекграунде, по умочанию, естественно, GD.

Чисто для справки, мне больше нравиться использовать Image::Magick, но вот не могу подружить данную замечательную библиотеку с одним сервером на freebsd.

В общем стала задача при определенных условиях изменять размеры картинкам. Для чего был использован замечательный модуль Image::Resize.

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

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

С начала логически, а потом экспериментально,, было выявлено, что каптча меняет бекграунд при добавлении строки 'use Image::Resize;'. Модуль где происходил ресайз и модуль для генерации капчи друг-друга не вызывали, то есть возможный ре-импорт какой-либо функции я откинул (Но оба модуля вызывались одним fcgi скриптом).

Значит вызов Image::Resize, чего-то менял в окружении или в логике работы самой GD.

perldoc -m Image::Resize;

Жму v.

Открывается vim c кодом модуля Image::Resize.

10-11 строчки

# Thanks to Paul Allen for this tip
GD::Image->trueColor( 1 );

Что за нафиг?

perldoc GD

Ищу метод trueColor. Пишут такое:

For backwards compatibility with scripts previous versions of GD, new images created from scratch (width, height) are palette based by default. To change this default to create true color images use:

GD::Image->trueColor(1);

somewhere before creating new images. To switch back to palette based by default, use:

GD::Image->trueColor(0);

Ну что же. Можно попробовать изменить.

Добавляю у себя перед созданием каптчи GD::Image->trueColor(0).

И у меня создается каптча с белым бекграудом! Ура! То что нужно!

Вот так фикс Пола Аллена испортила мне воскресный вечер. Thanks to Paul Allen....

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


С ув. antonfin.


Читать дельше...

понедельник, 11 апреля 2011 г.

Маркетинг vs Разработки

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

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

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

Ну, предположим, реализовали они какой-то крупной финансовой группе Web-сайт. Ну что, кто-то считает что там больше 20-50 тис. хостов в неделю? Ну вспомните, когда Вы последний раз заходили на сайт банка, в котором храните деньги. Я один раз, в жизни зашел, чтобы посмотреть телефон поддержки.

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

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

Но вот в чем суть-то. Все эти сайты из портфолио они имеют больше маркетинговую ценность для Web-студии, 90% знают компанию "Бла-бла-бла Банк" (выдумал), и если Вы/Ваша студия писала им сайт, то средний обыватель подумает: "Ну, это круто! Все знают банк "Бла-бла-бла Банк", и все знают facebook и google, значит эта студия сможет реализовать любой проект, будь-то Социальная сеть, или Мега-портал, или файловый хостинг".

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

Нет, нет, они реализуют Вам прекрасную соц.сеть, которая с легкостью выдержит 10-15 тис. хостов в день (это где-то 1000 пользователей) (НО заплатите Вы, конечно, как за клон facebook-а).

Вы запуститесь, а дальше...
70% - не наберут и 250 постоянных пользователей, через год закроются, так как финансировать такое мероприятие, затея не из дешевых.
20-25% - смогут дотянуть до 500-700 постоянных пользователей и тоже закроются.
3-4% - скорее всего сумеют втюхать данный проект какому-нибудь инвестору и радоваться жизни, проект скорее всего загнется, если инвестор не наймет толковую команду, которая потихоньку все перепишет.

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

Подумайте, кто работает в Web-студиях на должности программистов? Зачем студии держать толкового perl-программиста со знаниями c, или гуру unix систем, или профессионального js-разработчика? Ведь 90% задач сводиться к написанию визитки или интернет-магазина на базе какой-нибудь CMS, где важен дизайн и CEO-оптимизация.

Какая репликация, какой шардинг, какой Memcached, какие нереляционные БД? Зачем?!?
Тут все сводится к вопросу нужно ли использовать для визитки шаблонизатор.

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

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

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

Мне надо опимизировать БД, я иду в Web-студию и говорю, у меня проблема с БД. Стоп... Не так...

Сайт начинает очень медленно работать. Вы идете в Web-студию и говорите сайт медленно работает, что делать? Они говорят:
- N-килобаксов и мы в течении 3-5 дней ищем и устраняем проблемы.
- Еб.. 3-5 дней! От меня пользователи разбегутся! Мне надо сейчас!
- К сожалению мы не можем прям сейчас, разработчик(и), который писал(и) Ваш сайт ушли/умерли/в отпуске/в отгуле/верстаю срочно кому-то визитки.
Вы с матюгами:
- 2*N-килобаксов!
- Секундочку! (деньги делают чудо). Сережа посмотри, что там с сайтом товарища.

Какой-то непонятный Сережа мыкается 2 часа по сайту и выдает: "Проблема с БД. Надо оптимизировать! Как?!? Сервер БД уже давным-давно на отдельной мега-машине!?! Ну давайте попробуем Memcached. Но у Вас код не заточен, чтобы его использовать, поэтому нам надо 2 недели, чтобы все переписать (кто не знает, но на практике через 2 недели никогда ничего не бывает). И Вы понимаете, что дешевле было держать 2-3 Сереж-программистов у себя в офисе полгода, чем решить эту проблему с БД. А пользователи тем временем бегут с Вашего сайта, потому что он превратился в унылое медленно "Г".


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

В общем парадоксальная ситуация в разработке серьезных проектов "КАЧЕСТВО ПРОГРАММНОЙ ЧАСТИ" часто имеет меньшее значение, чем дизайн, ceo или promotion. Как Вам такой вывод?

С ув. antonfin.


Читать дельше...

понедельник, 4 апреля 2011 г.

Вышел очередной perl podcast

1 апреля был анонсирован новый YAPP #2: Новости за прошедший месяц, источники информации на русском, новые cpan модули за 01.03.2011 - 01.04.2011.

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

Но от себя хочу сказать, следующее:

Во-первых, ребята делают большое дело в популяризации perl.

Во-вторых, для компаний, где штат perl-программистов превышает 2-3 человека распространение новостей происходит быстро и люди вполне могут находиться в курсе последних событий perl-сообщества. 
Но для perl-программиста в маленькой компании или perl-программистов фрилансеров, такие подкасты просто необходимы, чтобы иметь представления о том, что происходит с языком.


Так, например, я являюсь единственным разработчиком и мне очень трудно приходиться следить за последними новинками даже несмотря на то, что я подписан на рассылку с planetperl.ru, слежу за постами о perl в блогах (советую koorchik.blogspot.com), обязательно просматриваю видео с различных perl конференций.


В общем слушайте YAPP #2. И делайте язык, который любите, популярным!

Кстати, в комментариях пишите, где Вы берете интересную информацию о perl.

С ув. antonfin.


Читать дельше...

суббота, 2 апреля 2011 г.

PHP-разработчики - люди которых я боюсь

Сегодня на Хабре наткнулся на неплохую задачу для своих мозгов.

Нужно было реализовать функцию read_conf принимающую имя файла с содержимым:

id=www
session.timeout=120
session.server.0.host=127.0.0.1
session.server.0.port=1111
session.server.0.id=session1
session.server.1.host=127.0.0.1
session.server.1.port=1111
session.server.1.id=session2
image.width=640
image.height=480
image.watermark.small=wsmall.png
image.watermark.normal=wnormal.png


Которая приводит конфиг к такой переменной:

array(3) {
    ["id"]=>strong(3) "www"
    ["session"]=>array(2) {
        ["timeout"]=>string(3) "120"
        ["server"]=>array(2) {
            [0]=>
            array(3) {
                ["host"]=>
                string(9) "127.0.0.1"
                ["post"]=>
                string(4) "1111"
                ["id"]=>
                string(8) "session1"
            }
            [1]=>
            array(3) {
                ["host"]=>
                string(9) "127.0.0.1"
                ["port"]=>
                string(4) "1111"
                ["id"]=>
                string(8) "session2"
            }
        }
    }
    ["image"]=>
    array(3) {
        ["width"]=>
        string(3) "640"
        ["height"]=>
        string(3) "480"
        ["watermark"]=>
        array(2) {
            ["small"]=>
            string(10) "wsmall.png"
            ["normal"]=>
            string(11) "wnormal.png"
        }
    }
}



На задачу выделялось 10 минут.

Задача не очень сложная, если не ограничиваться временем, честно признаться мне немного не хватило 10 минут,
но я и не претендую на звания "Гуру php", да и не это важно.

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

По мнению большинства читателей топика наилучшее решение (наибольшее число позитивных отзывов за комментарий)
было следующее решение:

<?php

$r = read_conf( "config.txt" );
print var_dump( $r );

function read_conf($filename) {
    foreach (parse_ini_file($filename) as $key=>$value) {
        $key = vsprintf('$result["%s"] = "%s";', array(
            str_replace('.', '"]["', $key),
            $value,
        ));
        eval($key);
    }
    return $result;
}

?>


Гениально! Наименьшее число строк! Никакой рекурсии! Умница!

Вы тоже так подумали? Нет? И ПРАВИЛЬНО!

Ведь дырка! Ну как никто из них об этом не подумал? Теперь в конфиг можно вставить, какой угодно код, который будет выполнен запускаемым скриптом!

Не верите? Попробуйте вот такой конфиг (будет работать в Unix-подобной ОС, но для пользователей Windows можно написать свой пример).

id=www
session.timeout=120
session.server.0.host=127.0.0.1
session.server.0.port=1111
session.server.0.id=session1
session.server.1.host=127.0.0.1
session.server.1.port=1111
session.server.1.id=session2
image.width=640"\";shell_exec('ls -l > hack');\""
image.height=480
image.watermark.small=wsmall.png
image.watermark.normal=wnormal.png



Я его немного изменил, добавил вот такой кусочек "\";shell_exec('ls -l > hack');\"". И теперь имею снимок поточной директории.
Но мы можем с легкостью изменить конфиг добавив вместо 'ls -l > hack', например 'rm -Rf /'. В общем еще очень много гадости можно придумать.

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

Как таким людям можно доверить серьезный проект? В общем я бы побоялся.

А Вы?

С ув. antonfin

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


Читать дельше...