Неплохая статья, радует что код грамотно подсвечен и не слишком перегружен деталями.
Высказывания в первой части спорны. В частности вы выступаете портив 3-4 лишних генерируемых строк, забывая о том, что сам по себе PyQt содержит десятки тысяч строк на python и C++, не говоря уж о самом Qt. Но в любом случае стремление к чистоте похвально:) Не надо лишь делать столь категоричных выводов о том, что pyuic4 плохо.
По поводу того, зачем класс интерфейса наследуется от object: Стиль кода Qt и рекомендации по стилю для Python программ очень отличаются. Вы не можете полностью отказаться от питон-стиля (т.к. он используется стандартной библиотеке), а так же не можете отказаться от стиля Qt (иначе вы потеряете связь с интерфейсом).
В серьезных программах единство кода является серьезной проблемой. Разделение кода формы и генерируемого кода для этой формы на разные классы и разные файлы позволяют изолировать визуальный Qt-код от кода программы и свести использование Qt-стиля к минимуму, сохраняя единство и целостность проекта.
Единственный минус, который вижу в статье — отсутствие выводов. Здесь, возможно, уместно добавить области использования PyQt и наоборот те случаи, когда его использование не целесообразно.
Впрочем, коли вы обозначили стиль как беседу, то это простительно, но все равно могло бы значительно улучшить полезность текста.
Для популярных ресурсов мой совет бесполезен — там имеет смысл потратить и более чем 3 часа, потому какая бы ни была защита ее все равно сломают.
Другое дело, что там кучи народу, которые легко могут отфильтровать спам, плюс у компаний много денег на внедрения инновационных и интеллектуальных решений по выявлению спама.
Но ни первое, ни второе не относятся к небольшим сайтам, о которых я вел речь в своем посте.
Помните, как reCaptcha набирала популярность? Популярность растет и сейчас. Однако спамерами она стала пробиваться на ура.
Заинтересовавшись вопросом, провел некоторый поиск и нашел сервис антикапчи, который предлагает ручной взлом 1000 капч за 1$.
Предлагать-то многие предлагают, скажете вы, а работает ли? Вот и мне стало интересно… Написал небольшую прогу, не пожалел бакса на счет, проверил десятка 4 капч из рекапчи — распознали все правильно.
Какой из этого вывод?
Спам — это бизнес.
Любая защита будет побита, когда станет экономически выгодно ее побить. А значит единственный эффективный способ защитить свой сайт — сделать так, чтобы его было не выгодно ломать.
А для этого подойдет, пускай самая примитивная, но своя защита.
Час работы хорошего программиста стоит 250-500 рублей. Очевидно, что если на взлом вашего блога потребуется 1-3 часа, то он автоматически становится неинтересным для спама.
1. Если меняется название скрипта настроек, то имеет смысл обратиться к модулю ConfigParser и вынести настройки в ini-файл, оставив при этом в покое сам модуль конфигурационного файла.
2. Идеи правильного именования вы найдете в таких трудах, как «Совершенный код» (глава 11), «Domain driven development» и многих других.
Позволю себе привести отрывок из первой упомянутой книги:
Имя переменной нельзя выбирать, как кличку собаке:… В отличие от собаки и ее клички, которые являются разными сущностями, переменная и ее имя формируют по идее одну сущность. Поэтому и адекватность переменной во многом определяется ее именем. Выбирайте имена переменных со всей тщательностью.
Попробуйте читать код после обфускатора, если считаете что стиль и имена переменных не имеют значения.
Не обижайтесь, пожалуйста, но код похож либо на то, что вы очень торопились, и главное было сделать программу с заданными функциями в заданный срок, либо вы еще изучаете инструментарий.
Например участок с конфигурационным файлом. Вместо
mod = __import__(modName)
host = getattr(mod, 'host', 'horn:intur')
user = getattr(mod, 'user', 'SYSDBA')
можно использовать простое и понятное
import settings
… settings.host…
… settings.user…
Кроме читаемости это будет соответствовать принципам «Simple is better than complex», «Namespaces are one honking great idea» и другим, включенным в The Zen of Python.
функция «завершить i-й файл»:
… На форме у нас есть некоторый ListWidget, возьмем его
… Допишем к тексту i-го элемента в нем слово «готово»
… Возьмем некоторый прогрессбар на форме и установлим его прогресс в 0.
Отсюда сразу встают вопросы, что за ListWidget, что за элементы в нем хранятся, каково их назначение, и почему функция «завершить файл» вместо того, чтобы завершать этот файл, лишь констатирует факт что файл завершен.
Я не претендую на истинность своих слов, это лишь результат быстрой выкладки, но можно было бы переписать так:
Я приношу извинения, если тон или стиль моего изложения задел вас, и вовсе не хочу сказать, что имею что-то против вас лично. Напротив, выложить свой код на суд общественности — смелое решение и в полной мере достойно уважения.
Лишь хочу сказать, что в данной статье не хватает (помимо подсветки кода) некоторой центральной идеи.
Говорю о том, что читателю вряд ли нужна точно такая программа, как есть у вас. Читатель хочет научиться чему-то, каким-то принципам, каким-то приемам.
Потому полезно ткнуть пальцем «вот тут сделано то-то так-то потому, что...». А учиться лишь по одному исходнику способны гики, которые вряд ли обучаются программированию на хабре.
Обратите внимание на PyInstaller — малоизвестный инструмент, между тем превосходящий по фичам и удобству упомянутый py2exe.
Один из ключевых моментов — автоматически распознает и подключает PyQt/lxml и прочие библиотеки. Т.е. не надо делать абсолютно никаких телодвижений — оно работает «из коробки».
Впрочем, для объективности отмечу и минусы — для поддержки .manifest файлов требует патча (не знаю как с этим у py2exe), и лучше использовать SVN-ветку программы т.к. они почему-то уже год с лишним как не хотят выкладывать на публику версии своей утилиты, несмотря на то, что работает отлично и разработка идет, проект не мертв.
Хотелось бы видеть в начале статьи краткую аннотацию с описанием того, что конкретно делает ваша программа.
Прочитать неподсвеченный код без комментариев — весьма сомнительное удовольствие, особенно не зная что там должно быть.
Какая цель этой статьи? Кому должна быть полезна?
Тот кто не знает PyQt от такого изложения не поймет ничего. А кто знает, скажет вам, что код ваш откровенно средненького качества.
Опишите интересные и полезные, на ваш взгляд, моменты, а скачивание кода сделайте архивом — так всем и проще и удобней — можно не только прочитать, но и самостоятельно запустить или подредактировать.
Если сейчас там есть какие-то достойные моменты — то их не видно в вашей куче. Если нет — то незачем писать статью.
В данный момент все это похоже на «Я вот сделал за вечер на коленке программку, посмотрите какой я молодец, вот ее исходник».
Вот буквально 4 дня назад сидел, смотрел ПДФ версию романа Пелевина (продающуюся официально) и там сама ПДФ текстовая, но местами весьма странные помарки…
И вот и думал — а что если сделать такие помарки в разных местах и…
Ну в общем, сия публикация точно подтверждает что идея не бредовая:)
Частично соглашусь с вами — при явке с повинной и доказательствах принуждения, директор должен получить срок больший, чем исполнитель.
Но исполнитель тем не менее все равно преступление совершил. Пусть срок он получит и условный, но это будет судимость. Об оправдании здесь речи не может идти — он осознанно все сделал.
Да и работу он после этого точно потеряет.
Может проще просто уволиться по собственному желанию?
Так вот, в УК РФ есть категории: — обычное преступление,
— тяжкое,
— особо тяжкое.
Убийство — тяжкое преступление.
Установка уже двух фотошопов или фотошоп+офис+винда тоже относит вас к тяжким преступниками.
Суд обязан руководствоваться законами, а не домыслами и мнениями что «фотошоп поставить — это же не убить человека»… Да, когда принимали кодекс, то эти преступления приравняли. Да, это факт.
Я понимаю, что это звучит абсурдно, но убийство и нарушение копирайта — это соседние статьи в УК. Обе — тяжкие и особо тяжкие.
Теперь вопрос: если А и Б заключат договор, по которому А убивает 20 человек с особой жестокостью, а Б за это несет ответственность, то сможет ли при этом А избежать уголовной ответственности?
Чего ж вы тогда человеку советы то такие даете… Он с нами проблемой делится, а вы его на верный способ получить срок наставляете.
Нельзя переложить ответственность за осознанно совершенное уголовное преступление на кого-то. Совершить такое действие столь же абсурдно как если бы от вас требовали убить свою жену, вы бы записали требования и предупредили при этом, что убьете, но переписка сохранена.
А тот факт, что вы предупредили начальство будет лишь еще одним доказательством, что вы знали, что нарушали закон, но все равно сделали это.
Высказывания в первой части спорны. В частности вы выступаете портив 3-4 лишних генерируемых строк, забывая о том, что сам по себе PyQt содержит десятки тысяч строк на python и C++, не говоря уж о самом Qt. Но в любом случае стремление к чистоте похвально:) Не надо лишь делать столь категоричных выводов о том, что pyuic4 плохо.
По поводу того, зачем класс интерфейса наследуется от object:
Стиль кода Qt и рекомендации по стилю для Python программ очень отличаются. Вы не можете полностью отказаться от питон-стиля (т.к. он используется стандартной библиотеке), а так же не можете отказаться от стиля Qt (иначе вы потеряете связь с интерфейсом).
В серьезных программах единство кода является серьезной проблемой. Разделение кода формы и генерируемого кода для этой формы на разные классы и разные файлы позволяют изолировать визуальный Qt-код от кода программы и свести использование Qt-стиля к минимуму, сохраняя единство и целостность проекта.
Единственный минус, который вижу в статье — отсутствие выводов. Здесь, возможно, уместно добавить области использования PyQt и наоборот те случаи, когда его использование не целесообразно.
Впрочем, коли вы обозначили стиль как беседу, то это простительно, но все равно могло бы значительно улучшить полезность текста.
Вот это уже действительно хорошее решение! Спасибо:-)
А когда университет закончен, родители ждут от вас помощи, а вы не можете работать — то конечно тут уже не до OpenSource проектов будет.
Другое дело, что там кучи народу, которые легко могут отфильтровать спам, плюс у компаний много денег на внедрения инновационных и интеллектуальных решений по выявлению спама.
Но ни первое, ни второе не относятся к небольшим сайтам, о которых я вел речь в своем посте.
Заинтересовавшись вопросом, провел некоторый поиск и нашел сервис антикапчи, который предлагает ручной взлом 1000 капч за 1$.
Предлагать-то многие предлагают, скажете вы, а работает ли? Вот и мне стало интересно… Написал небольшую прогу, не пожалел бакса на счет, проверил десятка 4 капч из рекапчи — распознали все правильно.
Какой из этого вывод?
Спам — это бизнес.
Любая защита будет побита, когда станет экономически выгодно ее побить. А значит единственный эффективный способ защитить свой сайт — сделать так, чтобы его было не выгодно ломать.
А для этого подойдет, пускай самая примитивная, но своя защита.
Час работы хорошего программиста стоит 250-500 рублей. Очевидно, что если на взлом вашего блога потребуется 1-3 часа, то он автоматически становится неинтересным для спама.
Суть не в конкретном формате, а в том, что есть модуль Settings, в котором есть параметры.
Откуда они там берутся — это проблема модуля settings и никакого другого модуля программы.
2. Про переменные даже отвечать не буду. Я вам привел ссылки на литературу, считаю что этого достаточно.
2. Идеи правильного именования вы найдете в таких трудах, как «Совершенный код» (глава 11), «Domain driven development» и многих других.
Позволю себе привести отрывок из первой упомянутой книги:
Попробуйте читать код после обфускатора, если считаете что стиль и имена переменных не имеют значения.
Например участок с конфигурационным файлом. Вместо
можно использовать простое и понятное
Кроме читаемости это будет соответствовать принципам «Simple is better than complex», «Namespaces are one honking great idea» и другим, включенным в The Zen of Python.
Так же, например, код:
Читая его получаем:
Отсюда сразу встают вопросы, что за ListWidget, что за элементы в нем хранятся, каково их назначение, и почему функция «завершить файл» вместо того, чтобы завершать этот файл, лишь констатирует факт что файл завершен.
Я не претендую на истинность своих слов, это лишь результат быстрой выкладки, но можно было бы переписать так:
Ваш код весьма запутан, а хорошая программа всегда имеет простой (не путать с примитивностью) код, даже если эта программа сама по себе крайне сложна.
Я приношу извинения, если тон или стиль моего изложения задел вас, и вовсе не хочу сказать, что имею что-то против вас лично. Напротив, выложить свой код на суд общественности — смелое решение и в полной мере достойно уважения.
Лишь хочу сказать, что в данной статье не хватает (помимо подсветки кода) некоторой центральной идеи.
Говорю о том, что читателю вряд ли нужна точно такая программа, как есть у вас. Читатель хочет научиться чему-то, каким-то принципам, каким-то приемам.
Потому полезно ткнуть пальцем «вот тут сделано то-то так-то потому, что...». А учиться лишь по одному исходнику способны гики, которые вряд ли обучаются программированию на хабре.
Один из ключевых моментов — автоматически распознает и подключает PyQt/lxml и прочие библиотеки. Т.е. не надо делать абсолютно никаких телодвижений — оно работает «из коробки».
Впрочем, для объективности отмечу и минусы — для поддержки .manifest файлов требует патча (не знаю как с этим у py2exe), и лучше использовать SVN-ветку программы т.к. они почему-то уже год с лишним как не хотят выкладывать на публику версии своей утилиты, несмотря на то, что работает отлично и разработка идет, проект не мертв.
Прочитать неподсвеченный код без комментариев — весьма сомнительное удовольствие, особенно не зная что там должно быть.
Какая цель этой статьи? Кому должна быть полезна?
Тот кто не знает PyQt от такого изложения не поймет ничего. А кто знает, скажет вам, что код ваш откровенно средненького качества.
Опишите интересные и полезные, на ваш взгляд, моменты, а скачивание кода сделайте архивом — так всем и проще и удобней — можно не только прочитать, но и самостоятельно запустить или подредактировать.
Если сейчас там есть какие-то достойные моменты — то их не видно в вашей куче. Если нет — то незачем писать статью.
В данный момент все это похоже на «Я вот сделал за вечер на коленке программку, посмотрите какой я молодец, вот ее исходник».
И вот и думал — а что если сделать такие помарки в разных местах и…
Ну в общем, сия публикация точно подтверждает что идея не бредовая:)
Я ничуть не ставлю крест, лишь показываю, что никакие записки и отписки не только не помогут, но и усугубят положение.
Так что мирно и только мирно… Либо увольняться. На хорошего специалиста всегда место найдется.
Но исполнитель тем не менее все равно преступление совершил. Пусть срок он получит и условный, но это будет судимость. Об оправдании здесь речи не может идти — он осознанно все сделал.
Да и работу он после этого точно потеряет.
Может проще просто уволиться по собственному желанию?
Так вот, в УК РФ есть категории:
— обычное преступление,
— тяжкое,
— особо тяжкое.
Убийство — тяжкое преступление.
Установка уже двух фотошопов или фотошоп+офис+винда тоже относит вас к тяжким преступниками.
Суд обязан руководствоваться законами, а не домыслами и мнениями что «фотошоп поставить — это же не убить человека»… Да, когда принимали кодекс, то эти преступления приравняли. Да, это факт.
Плохой он или хороший — другой вопрос. Но факт.
Так уж повелось, что в УК РФ есть несколько категорий преступлений:
Теперь вопрос: если А и Б заключат договор, по которому А убивает 20 человек с особой жестокостью, а Б за это несет ответственность, то сможет ли при этом А избежать уголовной ответственности?
Чего ж вы тогда человеку советы то такие даете… Он с нами проблемой делится, а вы его на верный способ получить срок наставляете.
Нельзя переложить ответственность за осознанно совершенное уголовное преступление на кого-то. Совершить такое действие столь же абсурдно как если бы от вас требовали убить свою жену, вы бы записали требования и предупредили при этом, что убьете, но переписка сохранена.
А тот факт, что вы предупредили начальство будет лишь еще одним доказательством, что вы знали, что нарушали закон, но все равно сделали это.
Естесственно, ее можно забиндить на то же _d(), и это займет ровно одну строчку кода.