Здравствуйте, Vamp, Вы писали:
KV>>Я не радуюсь неудачам опенсорса и не являюсь его противником. Просто тут кое-кто с пеной у рта доказывал, что ОО не хуже MSO и я совсем чуточку радуюсь его неправоте. V>Хуже, лучше — понятия субъективные. Кому то лучше, кому-то хуже.
Дык я за себя-то и говорю.
KV>>Но также, лично я, вижу несколько вещей в идеологии открытого ПО и его сторонниках, которые несовместимы с понятием "качественный продукт". Причем, чем дальше в лес, тем толще партизаны, тем сильнее проявляются эти вещи и влияют на развитие окрытого ПО не в самую лучшую сторону. Но это — тема отдельного серьезного разговора, вообще-то. V>Ну так давай об этом и поговорим
KV>Дык я за себя-то и говорю.
Да, но конструктивная дискуссия в таком раскладе невозможна в принципе.
KV>Ок, постараюсь сформулировать позицию ASAP.
Ну, АСАП не обязательно
Здравствуйте, Sheridan, Вы писали:
F>> S>бджалд, F>> чочочо?. мат на моём rsdn?. да ещё и с безумными грамматическими ошибками?. S>А както мамут высказался, мне и понравилось. Очень хорошее слово. Явно нехорошее, но в то же время произнести трудновато. Следовательно произносится сие слово только когда ну совсем нехорошо.
Приветствую, kochetkov.vladimir, вы писали:
k> Это ж на каком уровне абстракции должны быть эти фильтры, ... k> И, боюсь, что если бы я таки-разработал такую систему "фильтрации", то на ближайшие несколько лет необходимости зарабатывать на существование просто не было бы
А в чем сложность? Не знаю как ты, но я примерно представляю как все это должно выглядеть.
Разбивай задачу на атомарные действия (найти человека (клиентский комп), найти скачивание файла...). По необходимости дописывай новые атомы. А затем из атомов составляй запрос, подставляя нужные параметры.
Если бы все думали как ты ("ой, это сложно, значит — невозможно"), то никаких бы netflow не было бы.
Приветствую, neFormal, вы писали:
F> S>А както мамут высказался, мне и понравилось. Очень хорошее слово. Явно нехорошее, но в то же время произнести трудновато. Следовательно произносится сие слово только когда ну совсем нехорошо.
F> тебя линуксу тоже во дворе научили мальчики?.
Здравствуйте, kochetkov.vladimir, Вы писали:
AV>>Слабенький какой-то вброс. Я могу написать тебе подобных историй про Management Console, что несколько дней будешь читать.
KV>Я тебе даже больше скажу. Я потом еще и несколько дней на них отвечать буду, а ты, я надеюсь, мне. Потом подтянется местная публика... Йоу, у нас теперь есть чем тут заняться на ближайший месяц
KV>Я в смысле, ты пиши давай, раз есть что, а там посмотрим, кто сколько дней чего читать будет.
Начну с банальностей.
1. Создаем не сильно навороченное дерево. Когда кол-во узлов станет приближаться к полутысяче начинаются регулярные вылеты консоли. Причем вылеты в unmanaged dll.
Про быстродействие и говорить уже нечего.
2. MMC используется AppDomain. Сама работает в одном домене. А snap-in'ы грузит в другие сборки. Это сделано для того, чтобы вылет одного snap-in не выносила остальные. В одной сборке можно хранить несколько snap-in. Теперь попробуй угадать как будут загружаться эти несколько snap-in. Если в один msc-файл добавляется несколько snap-in разных типов, то будут ли они грузиться в один домен или в разные? Если в один msc-файл добавляется несколько snap-in одного типа, то будут ли они грузиться в один домен или в разные? Попробуй угадать, прежде чем читать дальше. Правильные ответы: 1 — разные домены, 2 — один. Интересно было бы увидеть обяснение в чем заключается различие в этих ситуациях.
3. Продолжим тему нескольких экземпляров snap-in одного типа. Никаких идентификаторов snap-in найти не удалось. То есть если мы где-то (например, в реестре) сохраним настройки каждого экземпляра. Как при загрузке snap-in разобраться где чьи настройки?
4. Продолжим тему настроек. Кто-то скажет, что нечего хранить настройки абы где, а пользоваться предоставленными механизмами. Да, Management Console предусматривает механизм сохранения настроек каждого из snap-in. В документации честно написано, что если выставить флажок, что данные snap-in изменились, то вызывается функция в которой я могу отдать данные для сохранения настроек. Все классно. Вот только в документации забыли написать, что если в msc-файле есть аттрибут LogicalReadOnly равный true, то плевала консоль на все эти флажки. И никто не будет беспокоить snap-in по этому поводу, пусть этот флажок в каждой второй строке устанавливается.
4. Продолжим тему msc-файла. Что это такое и какой у него формат нигде не сказано. В общем пришлось быть обезьянкой. Смотрим msc-файлы, которые идут в винде и пытаемся угадать что нам нужно.
5. Вернемся к настройкам. Положим разобрались мы с LogicalReadOnly и настройки у нас сохраняются. Где они хранятся? Правильно. C:\Users\%USERNAME%\Application Data\Microsoft\MMC\. В этом каталоге находится файлик совпадающий с именем нашего msc-файла. А что будет если в системе окажется два продукта, которые имеют msc-файлы с одинаковым именем? Далее еще веселее. Что будет если мы снесем продукт, а потом поставим заново? Правильно, все старые данные подымутся. Что не есть правильно. Кто-то может сказать, что если нас не удовлетворяет такое поведение, то при uninstall надо самим удалять файлики с настройками. У кого удалять?
6. Про документацию предпочту помолчать. Ибо "обнять и плакать". Больше сказать нечего.
Есть еще куча всего. Но там уже нужно хотя бы немного описывать детали. Если кого-то заинтересует, то могу как-нибудь поделиться.
Здравствуйте, Sheridan, Вы писали:
S>Приветствую, kochetkov.vladimir, вы писали:
k>> Это ж на каком уровне абстракции должны быть эти фильтры, ... k>> И, боюсь, что если бы я таки-разработал такую систему "фильтрации", то на ближайшие несколько лет необходимости зарабатывать на существование просто не было бы
S>А в чем сложность? Не знаю как ты, но я примерно представляю как все это должно выглядеть. S>Разбивай задачу на атомарные действия (найти человека (клиентский комп), найти скачивание файла...). По необходимости дописывай новые атомы. А затем из атомов составляй запрос, подставляя нужные параметры.
Да, конечно можно наваять декларативный DSL, описывающий критерии отбора и искомые отношения между отбираемыми данными, можно вообще его с SQL содрать или преобразовывать логи в реляционные таблицы с правильной структурой (компьютеры-пользователи-сессии-запросы-хосты и т.п.), а уже потом использовать обычный SQL и не выеживаться с DLS... Можно много чего сделать, но за рамки скрипта, который нужен пару раз в месяц, это по-моему уже выходит.
S>Если бы все думали как ты ("ой, это сложно, значит — невозможно"), то никаких бы netflow не было бы.
Блин, ну вот опять ты делаешь выводы из того, что я не утверждал. Я не говорю, что это невозможно. Я лишь сказал, что это весьма востребованная на рынке система (как мне кажется, могу ошибаться), достаточно сложная и требующая совершенно иной уровень трудозатрат по сравнению с одноразовыми скриптами. Возможно ей и стоило бы заняться, но не в рамках решения повседневных задач, а в качестве отдельного проекта. В рамки повседневных задач она не вписывается хотя бы из-за временных ограничений, накладываемых сроками решения этих задач.
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Он есть, но закрыт за семью NDA. Я не отмазываюсь, и рад бы это обсудить с тобой, но правда не могу Скажем так, через SOC сейчас проходят данные ээээ... с другого уровня абстракции, нежели логи ISA. И этого для задач мониторинга ИБ пока хватает. А для остального и придумали нас
А ISA значит не за 7-ю NDA
DOO>>ТКП на Symantec SIM + Symantec DLP не прислать?
KV>Хотя, если под рукой есть готовое предложение (чтоб тебя не напрягать лишний раз), которое ты можешь прислать — кинь плс, лично мне было бы интересно глянуть.
На самом деле нет... Высоковат класс системок, чтобы типовое ТКП держать... Но в целом связка интересная (хотя не идеальная) — как раз для ловли инсайдеров Все ищу возможность на ком-нибудь ее испытать
KV>Дык я и не утверждаю, что в MSO все хорошо. Я говорю о том, что в ОО еще хуже.
Дык от задачи зависит... ИМХО, разработчики writer'а больше думали об опытных пользователях, чем разработчики word'а.
DOO>>Ну вы хоть Sawmill купите... А так — конечно, не предназначен KV>Да BIIS вполне себе справляется. А задачи глянуть в логи за сегодня прямо сейчас, возникают не так часто, чтобы можно было серьезно говорить о вложении каких-либо средств в это.
Ну ты ж сказал, что это не просто глянуть здесь и сейчас — а инсайдера поймать, понимаешь...
Кстати, а почему поведение разное? x86/x64?
W>Наверное, файл мелкий, и версия не та?
Оно у меня действительно падало, и есть подозрение, что падало оно не только из-за объема лога, но и из-за объема содержимого ячеек. Попробуй сгенерировать такой же файл, но в котором, хотя бы в одном из столбцов (а лучше, в нескольких) будет не менее 2048 символов на каждую строчку.
Здравствуйте, Michael7, Вы писали:
M>Здравствуйте, kochetkov.vladimir, Вы писали: KV>>Наброс окончен, спасибо за внимание. Жду аргументов о том, что OO под эти задачи не предназначен и что домохозяйки логи прокси на нем парсить не будут
M>Домохозяйки парсить будут в gnumeric из состава Gnome Office,
О! Попробую, как только до работающего линукса дотянусь.
Здравствуйте, Sheridan, Вы писали:
k>> Это ж на каком уровне абстракции должны быть эти фильтры, ... k>> И, боюсь, что если бы я таки-разработал такую систему "фильтрации", то на ближайшие несколько лет необходимости зарабатывать на существование просто не было бы S>А в чем сложность? Не знаю как ты, но я примерно представляю как все это должно выглядеть.
от примерного представления до реализации ооочень далеко. я пока не видел таких всеумеющих "скриптов" со сроком жизни хотя бы год, а я их много видел
S>Разбивай задачу на атомарные действия (найти человека (клиентский комп), найти скачивание файла...). По необходимости дописывай новые атомы. А затем из атомов составляй запрос, подставляя нужные параметры.
молодец, изобрёл sql кстати, в чём отличие от фильтра в excel-е? кроме NIH естественно.
S>Если бы все думали как ты ("ой, это сложно, значит — невозможно"), то никаких бы netflow не было бы.
замени "невозможно" на "нерационально"
и почему некоторые в одном месте пытаются решить сразу все проблемы на свете, а в другом кричат что весь функционал фотошопа мало кому нужен?
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Кстати, а почему поведение разное? x86/x64?
Сам лишь сегодня об этом узнал
W>>Наверное, файл мелкий, и версия не та? KV>Оно у меня действительно падало, и есть подозрение, что падало оно не только из-за объема лога, но и из-за объема содержимого ячеек. Попробуй сгенерировать такой же файл, но в котором, хотя бы в одном из столбцов (а лучше, в нескольких) будет не менее 2048 символов на каждую строчку.
То был файл 57Мб / 8 колонок / 1млн строк
Я уже заинтересовался в потугах "завалить" — родил файл 125Мб / 6 колонок / 1.2 млн строк (реально загрузилось 1048576) + конвертация данных с дату
Загрузилось даже быстрее! (минута от силы)
В общем, кажется, что у ОО как-то нелинейно возрастает время обработки csv файла в зависимости от кол-ва колонок, и от входной кодировки. Размер входной строки для парсинга и наличие преобразования типа данных, насколько вижу, роли не играют.
Ща попробую на очень длинных строчках с парой десятков колонок.
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Оно у меня действительно падало, и есть подозрение, что падало оно не только из-за объема лога, но и из-за объема содержимого ячеек. Попробуй сгенерировать такой же файл, но в котором, хотя бы в одном из столбцов (а лучше, в нескольких) будет не менее 2048 символов на каждую строчку.
big2.csv ~920+ Мб. "Парыдесятковколоночек" — что-то не получилось: на виртуалке столько свободных гигабайт не оказалось
a = '"' + ("0123456789ABCDEF" * 100) + '"'
b = "#{a},#{a},#{a},#{a},#{a},#{a}\n"
1.upto(100000) { |i|
$stdout.write(b)
}
После примерно 3 минут работы:
Попробовал еще такой вариант (~610Мб, 1 поле, зато длины 3+ кб)
В общем, ощущение, что описанная проблема скорее всего характерна
для конкретной связки Windows7 (насколько помню, у вас именно она) или NT6+ и OO3.2/win
Здравствуйте, Wolverrum, Вы писали:
W>big2.csv ~920+ Мб. "Парыдесятковколоночек" — что-то не получилось: на виртуалке столько свободных гигабайт не оказалось
В смысле, тестовый файл генерился под виртуальной виндой, а испытывался уже на убунтовой сборке опенофиса
Здравствуйте, kochetkov.vladimir, Вы писали:
k> Оно у меня действительно падало, и есть подозрение, что падало оно не только из-за объема лога, но и из-за объема содержимого ячеек. Попробуй сгенерировать такой же файл, но в котором, хотя бы в одном из столбцов (а лучше, в нескольких) будет не менее 2048 символов на каждую строчку.
1258014 строк * 2048 символов = 2.4GB (а у тебя 718 метров). Пробуем соблюсти число строк и объем. Генератор:
Файл получился размером 972M. Открываем его в ОО — он сразу предложил нужные разделители (кодировка здесь не актуальна). Жмем "ОК". Начали в ~01:35, закончили в ~01:42 с сообщением об ошибке "Превышено максимальное число строк. Строки, превышающие заданное число, не были импортированы!". Жмем "ОК", смотрим количество строк: 1048575.
Железо: CPU T1400@1.73GHz, 1GB RAM
P.S. Во время конвертации спокойно читаем RSDN, т.к. занято всего одно ядро из двух, а 972 метра почти влезут в оперативку без интенсивного свопинга (хотя 200 метров оно все же откушало).
P.P.S. На работе часто приходится анализировать логи под несколько гигабайт. Твой способ "через эксель" позабавил
P.P.P.S. [troll mode on] Получается, ты наглядно продемонстрировал убогость винды и офиса [troll mode off]
Приветствую, Anton Batenev, вы писали:
AB> 1258014 строк * 2048 символов = 2.4GB (а у тебя 718 метров). Пробуем соблюсти число строк и объем. Генератор:....
ок, нагенерировал генератором
AB>....с сообщением об ошибке "Превышено максимальное число строк. Строки, превышающие заданное число, не были импортированы!".
Аналогично.
Отработало
AB> Железо: CPU T1400@1.73GHz, 1GB RAM
AMD Athlon(tm) 64 X2 Dual Core Processor 3800+, 2Г оперативки
AB> P.P.S. На работе часто приходится анализировать логи под несколько гигабайт. Твой способ "через эксель" позабавил
Угу, я тоже поржал.
Здравствуйте, kochetkov.vladimir, Вы писали:
k> Довольно часто, по долгу службы, мне приходится работать с логами корпоративного прокси
Но больше всего меня возмутил совсем другой момент:
k> Это ж на каком уровне абстракции должны быть эти фильтры, чтобы ими можно было задать что вот сейчас мне нужно найти пользователя, который зашел на mail.ru, создал черновик письма, потом зашел на depositfiles и что-то туда залил, потом открыл этот черновик изменил его (вставил ссылку на закаченный файл), после чего отправил письмо и отпрапортавал об этом по аьске?
А у вас после посещения сотрудниками сортира образцы попадают сразу в хранилище или сначала проводится анализ на бак-посев?
Здравствуйте, kochetkov.vladimir, Вы писали: AF>>быстрее сделать руками, чем придумать скрипт; KV>Именно поэтому. Если задача возникает нечасто и мне быстрее сделать ее руками, чем садиться за скрипт, то я делаю это руками, до тех пор пока... (см. "если").
Я тут немножко попропагандирую одноразовые скрипты, можно?
Вы это и без меня, скорее всего, знаете, но может кого-то убедит больше автоматизировать.
Универсальные "всемогутеры" для одноразовой задачи не нужны.
Одноразовый скрипт, в принципе, не обязан решать задачу полностью. Он может просто помочь доделать задачу вручную. Время на выполнение задачи сведётся к:
время написания скрипта + время ручной шлифовки,
что часто бывает меньше, чем просто:
время ручного выполнения задачи
.
За счёт этого время разработки скрипта сильно уменьшается — ведь все хитрые случаи можно:
оставлять "как есть" (чревато проблемами — можно потерять необработанные записи среди остальных);
оставлять "как есть", но указывать их местоположение (уже гораздо лучше);
прерывать скрипт, предлагать обработать запись пользователю, продолжить после подтверждения правки (тоже неплохой вариант);
другие средства уведомления пользователя (тут что фантазия подскажет).
Если идёт не редактирование, а поиск записи, сложную для скрипта запись можно включать в результат, обработав одним из вышеуказанных методов.
...ИМХО: всё то, что безвозвратно удаляет или искажает данные. Удаление файлов, запись в оригинальный файл (не копию).
К теме топика ещё в конце кусочек. А так далее идёт борьба с мельницами при помощи велосипедоварения (возможно, описываемая ниже идея — баян, но она упорно не гуглится и знакомые о ней ничего не знают )
Долой препятствия!
Можно делать так:
Создаётся файл, куда-то сохраняется, в нём пишется скрипт, отдаётся интерпретатору, правятся синтаксические/логические ошибки, выполняется работа, результат куда-то сохраняется, файл удаляют или забывают про него. Меня всегда раздражала процедура сохранения куда-нибудь файла, а мусорить где попало мне не хотелось.
Открывается интерпретатор с возможностью исполнения кода "на лету", в нём пишется скрипт (правятся ошибки...) и исполняется. Часто в интерпретаторах неудобно получать результат и редактировать код .
Открывается IDE... Для одноразового скрипта, ИМХО — перебор и это будет только отталкивать от их написания.
Я предлагаю пойти дальше. Скрипт может исполнятся из любого окна, в котором можно вводить текст и откуда можно скопировать данные! Хоть блокнот, хоть адресная строка браузера (концептуально; я предпочитаю исполнять скрипты, записывая их в Notepad++ или открытом окошке блокнота (совсем мелкие)).
Изобретаем велосипед с изменяемой геометрией колеса.
Для вышеуказанного нам потребуется менеджер горячих клавиш в возможностью повесить запуск программы на комбинацию (или multimedia-клавишу, если у кого есть на клавиатуре) и небольшая написанная нами программа.
На него мы повесим, во-первых, любимый текстовый редактор пошустрее (подсветка синтаксиса используемого скриптового языка — это плюс).
Программа, которую нужно написать, должна:
1) Скопировать выделенный текст из текущего окна (под Windows — элементарная посылка Ctrl+C или Ctrl+Insert окну с фокусом ввода);
Далее два пути:
2.a.1) Создать временный файл, в который записать заранее сформированный stub-файл (написанному на том же скриптовом языке, с подключением всех часто используемых библиотек и своей библиотечки (об этом ниже)) с добавленным скопированным текстом;
2.a.2) Отдать временный файл на скормление интерпретатору, перенаправив вывод в pipe и заботливо этот вывод запомнить;
2.a.3) Не забыть удалить временный файл;
(этот вариант использовал я — он простой, работает в случае, если биндинга со скриптовым языком нет, так можно работать с далеко не скриптовыми, компилируемыми языками; про грабли — ниже);
Либо:
2.b.1) Используя связку ЯП, на котором пишется программа со скриптовым ЯП (boost::python, нативный python-интерфейс, lua ещё имеет возможность встроиться и т.д.) подключить нужные библиотеки, скормить скопированный текст банальным exec-м, результат выполнения (вывод скрипта) запомнить;
3) Собственно, сохранить результат выполнения. Есть два варианта — поместить его в буфер обмена или поместить его в буфер обмена и вставить в то окно, откуда брали (эмуляция Ctrl+V или Shift+Insert). Я рекомендую изменять это поведение от ключей командной строки, настроив две комбинации клавиш в менеджере — со вставкой и без вставки.
4) Если произошла ошибка (интерпретатор завершился не с нулевым кодом возврата, функция exec выплюнула ошибку) — выдать её пользователю MessageBox-м, например.
Когда где-то год назад мне захотелось сделать вышеуказанное, я состряпал страшненький прототип (C++ + WinAPI), который во время выполнения скрипта светил чёрным консольным окошком. Для ожидания, когда скопируется текст, был использован простой Sleep (лень тогда было делать, да ). И я до сих пор им пользуюсь (пришлось немного исправить в этом году, но это bugfix)! Выкладывать её, думаю, смысла нет, но в общих чертах опишу подводные камни:
Текст из буфера обмена принимать и устанавливать лучше в UNICODE. Я чуть с ума не сошёл, когда с очередным обновлением винды (тогда использовал ANSI-версии функций) стало зависеть от текущей раскладки — скопируется текст нормально или вся кириллица заменится на вопросительные знаки.
Окну, из которого скопировали, лучше снова дать фокус ввода и вывести его наверх перед вставкой данных.
Ctrl+C у меня не работало на некоторых программах, поэтому я выбрал Ctrl+Insert.
Нельзя забывать про задержки или ожидания, когда окно будет готово к приёму данных.
Возможны грабли с перенаправлением вывода у интерпретатора — к Python пришлось делать workaround.
Stub-файл может содержать подключение нужных библиотек, workaround для какой-нибудь багофичи и т.п. Из-за того, что скопированный текст находится в хвосте stub-файла, при сообщении об ошибке съедет номер строки Но я сделал ровно 10 строк в stub'е, поэтому просто мысленно вычитаю 10 .
Приделываем к велосипеду антикрыло.
В нагрузку у нас получился замечательный калькулятор, позволяющий считать где угодно . Единственное, что меня раздражало — приходилось писать:
Так же появилась идея сделать предустановленный набор функций и, выбирая одну из них, преобразовывать выделенный текст. Сказано — сделано — уже скрипт на python (+PyQt) копировал выделенный текст и позволял преобразовать его одной из функций, доступных из меню с возможностью замены или сохранения результата в буфере обмена.
К примеру:
Выделяем:
'Container', 'container', False, 'j'
Выбираем в открывшемся по горячей клавише меню (клавиатурой, буквами, а не стрелочками ): "&cpp->&for each", результат вставляется на место выделения:
Горячая клавиша + x (пункт меню "&xeval") — результат:
3.81859485365
Алгоритм примерно такой:
При запуске собрать меню из определённых функций;
После выбора пункта меню скопировать текст (на случай, если случайно нажали горячую клавишу, дабы не грохнуть содержимое буфера обмена);
Можно копировать не текст, а отдавать скопированное пользовательской функции — так можно работать с файлами и со всем, что копируется и может распарситься скриптом.
Если того требует фунция, распарсить текст на аргументы (можно в самой ф-ции... Я использую eval ( '"' + text + '"' ) );
Запустить выбранную функцию, её возвращаемое значение преобразовать в текст, скопировать в буфер обмена и вставить (опционально) туда, откуда взяли.
Т.е. если в первом случае выделенный текст исполнялся как код, то во втором над выделенным текстом производятся заранее определённые манипуляции.
Дальнейшее облегчение скриптостроения.
Можно написать "библиотеку", в которую включать громоздкие и/или часто используемые операции. И подключать её, скажем, в stub-файле.
Для "меню" ("велосипед с антикрылом") у меня определены:
Изменение регистра текста;
Изменение закодированного через %-ы utf-8 текста;
Открытие Wikipedia-статьи для выделенного слова;
Несколько функций для получения путей к выделенным файлам (абсолютные пути, только имена и т.п.);
eval ( ... );
Несколько функций для работы с C++-кодом;
Копирование полного пути к файлу (explorer при копи)
И т.п.
Для варианта с выполнением кода ("велосипед с изменяемой геометрией колеса") определено несколько функций, но пора их обновить — часть выкинуть, добавить новые
Грабли.
А куда без них?
Если не реализовать ввод (скажем, input и raw_input в python программа будет беспомощно висеть на фоне);
У меня сильно упрощённый прототип без сохранения состояния, запуском интепретатора и т.п. — естественно, это вело к тормозам. Меню, кстати, тормозит — но это лично моя вина.
Невозможность отладки — можно и прикрутить, но это как-то странно будет выглядеть.
Не нарвитесь на патч Бармина!
Ещё что-то упомянуть хотел, да вот забыл...
Так было сделано у меня:
Скрытый текст
В качестве подопытного выбран Python.
stub-файл:
# -*- coding: cp1251 -*-from __future__ import print_function # привыкаю потихоньку к новому синтаксисуfrom __future__ import unicode_literals # важно! Иначе все строки с кириллицей придётся предварять 'u'.import sys
sys.path.append ( r"D:\Development\bin\Python" )
import codecs, my, os, re, random
from math import * # :shuffle: не люблю писать math.sin
sys.stdout = codecs.getwriter ( 'cp1251' )( sys.stdout, errors = 'replace' ) # это workaround - из-за перенаправления вывода в pipe.
# 9 строк вниз для того, чтобы ошибки выводились со строки №10.
Параметры командной строки для программы:
clipboard_runner run-type wait-time template-file program [program-parameters]
run-type — с заменой или нет (-only_copy или -copy_to_place),
wait-time — время задержки в ms (для того, чтобы окно успело отреагировать, у меня 150),
template-file — имя/путь к stub-файлу,
program — что запускать (у меня — Python)
[program-parameters] — с какими параметрами запускать
Перенаправления stderr в stdout из консоли делается так (рекомендую сделать нормально, через WinAPI pipe или аналог ):
2>&1
У Qt (у меня меню с преднаписанными функциями на python + PyQt) есть фича: при закрытии содержимое буфера обмена не сохранится. Я делал так:
# Специально для того, чтобы в Windows сохранилось содержимое буфера обмена после
# закрытия программы:
app.sendEvent ( QApplication.clipboard (), QEvent ( QEvent.Clipboard ) )
где app — экземпляр QApplication.
Из велосипеда сделать автомобиль.
По-хорошему нужно было сделать программу с опциональным сохранением состояния (сохранение определённых функций on fly), подключающуюся к биндингу скриптового языка, нормальным GUI, кучей настроек, собственным менеджером горячих клавиш...
Создать opensource-проект, чтоли? Хотя, может, никому, кроме меня это не нужно .
Возвращаясь к исходной проблеме.
Телепат из меня фиговый. Скорее всего, формат лога сильно сложный, или время обработки его скриптом больше, чем время загрузки в Excel.
Но в бесконечно идеальном сферическом в вакууме мире, где скрипты на Python перемалывают гигабайты данных быстрее, чем бабочка машет крыльями, где в логе отдельным пунктом стоят имя пользователя и посещаемый им сайт, в этом случае (здесь
Это ж на каком уровне абстракции должны быть эти фильтры, чтобы ими можно было задать что вот сейчас мне нужно найти пользователя, который зашел на mail.ru, создал черновик письма, потом зашел на depositfiles и что-то туда залил, потом открыл этот черновик изменил его (вставил ссылку на закаченный файл), после чего отправил письмо и отпрапортавал об этом по аьске? Причем примерно в такой последовательности, т.к. сотрудников, работавших с теми же сайтами, но иначе было несколько?
я бы сделал фильтрацию скриптом вида:
with open ( r"D:\log.log", "r" ) as file :
file.readline () # заголовок пропускаемfor line in file :
values = line.split ()
# ...фильтрация...
по вхождению в определённое время (или пропустил бы это даже) и посещению файлов mail.ru и depositfiles и отправке сообщения icq. А уже потом руками среди меньшего числа записей хоть в том же Excel. Хотя раз уж Вы делали через Excel, это там сделать быстрее без промежуточных скриптов.
Здравствуйте, Antikrot, Вы писали:
S>>Разбивай задачу на атомарные действия (найти человека (клиентский комп), найти скачивание файла...). По необходимости дописывай новые атомы. А затем из атомов составляй запрос, подставляя нужные параметры. A>молодец, изобрёл sql кстати, в чём отличие от фильтра в excel-е? кроме NIH естественно.
— последовательной обработкой документа без необходимости держать его в памяти целиком
— потенциальной возможностью конвееризации действий (например просмотр в экселе уже отфильтрованных результатов)
Здравствуйте, Anton Batenev, AB>А у вас после посещения сотрудниками сортира образцы попадают сразу в хранилище или сначала проводится анализ на бак-посев?
Не смешно. Если считаешь, что эта часть моей работы доставляет радость, то ты сильно ошибаешься сейчас. А ковыряться зачастую приходится именно что в натуральном дерьме и ради чего? ... Вот скажи, если нерадивый сотрудник твоего сотового оператора сольет куда-нибудь твои ПДн или детализацию, ты, придя в их офис, будешь продолжать защищать права их сотрудников или таки-вспомнишь о своих?
И ты зря думаешь, что у вас в конторе данный процесс поставлен принципиально иначе