Я ламер.
Я, честно, не являюсь сверхпрофессионалом ни в одном языке программирования, не понимаю, как работает современное ядро windows, linux, в знании ассемблера не продвинулся дальше знания PDP11 и слегка x86 (да и то что знал — забыл), что такое функциональные языки узнал не очень давно и так и не удосужился изучить теорию, в итоге не очень их понимаю. Более того, я с трудом могу объяснить, как работает процессор, программировал ПЛИСы и PIC-контроллеры только в институте и было это очень давно.
Но почему-то у меня очень часто получается решить проблемы, перед которыми пасуют крутые профессионалы.
Вместе с этим мне хотелось бы поднять вопрос необходимости ШИРОКИХ знаний у любого IT'шника. Да и не только IT'шника.
Отчасти этот пост — протест против засилья мнения, что PHP-программисту не нужен JavaScript (например комментарии здесь), аналитику не надо уметь пользоваться Visual Basic'ом в Excel'е, а маркетологу достаточно прочитать Котлера, и после этого ему надо только креативить. Т.е. против узкой специализации. Я видел, как хорошие специалисты делали удивительные вещи при помощи сводных таблиц в Excel, пока все остальные требовали от IT-специалистов срочно внедрить BI и сделать нужные отчеты.
Боюсь, что поднятие этой темы в чистом и первозданном виде уведет всех в очень философские разговоры, которые ни к чему не приведут.
Поэтому, вот пример того, как я решаю свои проблемы, пользуюясь головой и не имея супер-знаний.
Проблема.
Как-то раз сотрудник, которому приходилось часто переводить таблицы из Excel в html сказал, что делать это без DreamWeaver очень долго и сложно. И вообще нет бесплатных редакторов, которые позволят работать достаточно быстро.
Я усомнился в этом и решил посмотреть, что можно сделать в Notepad++.
Проблема в том, что Excel генерит кучу лишних атрибутов в тэгах и код надо долго и муторно чистить. Причем, Excel дробит строчки на части, а поиск и замена Notepаd++ проводит замену построчно.
В общем, попробуйте сами сохранить xls файл в html, а затем открыть html в Notepad++.
Т.е. проблема есть. И на первый взгляд — не решаемая. Как я уже говорил, я ламер и не могу написать свой плагин или быстренько поправить код Notepad++.
Но есть Google, который сказал, что есть замечательный плагин Pork2Sausage, который позволяет обработать выделенный текст произвольным консольным приложением.
Я тут же скачал этот плагин, написал приложение на c# и… И понял, что мне он не поможет.
Почему-то русские буквы жутко корежились.
Сдаваться не хотелось, потому я скачал исходник Pork2Sausage и со страхом открыл его. Оказалось все не так страшно. Код был простой и мне пришлось только поправить запутанный кусок, который я толком не понял. И все заработало. Правда только для текстов в UTF-8, но мне этого вполне хватало.
Теперь я могу:
- чистить тэги одной кнопкой
- делать новые утилиты для изменения текста. Очень полезно во многих случаях. Могу, например, сделать в notepad++ утилиту, которая будет забирать все тексты из habrahabr по какому-нибудь тэгу. Ну или любую другую глупость
Что для этого пришлось сделать.
Pork2Sausage
Код:
std::string inputA = pAsciiText;
std::wstring inputW(inputA.begin(), inputA.end());
inputW.assign(inputA.begin(), inputA.end());
selectedText += inputW;
заменить на:
size_t templen = 0;
while (pAsciiText[templen]!=L'\0' && templen <= asciiTextLen) templen++;
templen = (templen-1)/sizeof(wchar_t);
wchar_t *inputW = new wchar_t[templen];
wcsncpy(inputW,pAsciiText,templen);
selectedText += inputW;
Ну и добавил в функцию launchProgram:
char* filename;
if (progInputStr != TEXT("")) {
filename = new char[progInputStr.length()];
wcstombs(filename,progInputStr.c_str(),progInputStr.length()+1);
remove(filename);
}
if (progOutputStr != TEXT("")) {
filename = new char[progOutputStr.length()];
wcstombs(filename,progOutputStr.c_str(),progOutputStr.length()+1);
std::remove(filename);
}
чтоб файлы не плодились.
Наверняка я сделал глупо и не оптимально, но работает.
Собственно скрипт очистки
Создал консольное приложение на С# с кодом:
string strAll="";
strAll = File.ReadAllText("C:\\tmp\\in_"+args[2]);
Regex reg = new Regex(args[0]);
strAll = strAll.Replace("\r\n", " \r\n");
strAll = reg.Replace(strAll, args[1]);
strAll = strAll.Replace(" \r\n", "\r\n");
File.WriteAllText("C:\\tmp\\out_" + args[2], strAll);
Тоже код не мастерский.
Конфигурируем
Написал в ini файле Pork2Sausage
[excel_convertor]
progPath=C:\regexp_notepad\bin\Release\regexp_notepad.exe
progCmd=regexp_bstd "<([a-z]*) [^>]*>" "<$1>" "$(TIMESTAMP)"
workDir=C:\regexp_notepad\bin\Release\
progInput=C:\tmp\in_$(TIMESTAMP)
progOutput=C:\tmp\out_$(TIMESTAMP)
Все. Все работает.
И не надо быть суперпрограммистом, чтоб решить большинство проблем.
Те, кто дочитал до конца наверняка имеют свои LifeHack'и такого вида. Давайте делиться.
И повторяю вопрос.
Надо ли программисту иметь широкие знания? Например, не бояться задач на JavaScript, если ты PHP-программист? Уметь, если надо воспользоваться Excel'ем и VisualBasic'ом, не бояться MS SQL, сводных таблиц и прочих кубов, если ты аналитик и т.д.?
Или это все от нечистого и если работодатель не обеспечил всеми материалами (отчетами, данными в нужном виде и т.д.), то можно ничего не делать и ждать, а если требуют делать, то начальство не понимает специфики?