Агрегация собственного опыта, идей, мыслей.
Итак, по шагам.
- Самое первое - решить, а нужно ли? возможно уже существует более лучшее решение, в котором легче допилить, то, что тебя не устраивает?
- Берем бумажку, блокнот (блокнот - лучшее оружие вор^Wпрограммиста!), и пишем те задачи которые должна решать программа, эдакие основные фичи, глобальные юзкейсы.
- Продумываем, при помощи того же блокнотика, интерфейс, если он есть.
- По результатам берем, рисуем блок-схему, для начала укрупненную. Особенно это нужно для диалоговых приложений.
- Далее начинаем детализировать блок схему, в виде отдельных схем описываем отдельные алгоритмы, помогает продумывать в том числе и общую архитектуру.
- Если нужна база данных, начинаем чертить таблички, придумывать поля, смотреть какого типа они должны быть, придумывать связи
- Когда уже получится достаточно стройная картина, обязательно переложить все это в электронный вид - если проект закрытый, будет самим легче разобраться, а если OpenSource - то сторонним разработчикам.
- Выбираем инструментарий: тут в основном язык, библиотеки (в том числе с опорой на лицензию, для собственного использования - пофиг, но если планируешь распространять, то озадачься).
- Распечатываем алгоритмы, обклеиваем ими стену - что бы всегда было перед глазами, что бы в любой момент можно было увидеть цельную картину проекта, какие части как между собой взаимодействуют.
- Глядим на все это дело, начинаем думать, какими структурами языка это все реализовывать: что засунуть в структуру, что - в класс, какие классы будут базовыми, какие наследоваться, какие интерфейсы внутри классов, делаем пометки на той же бумажке (результаты уже не нужно будет заносить в комп, точнее не нужно в том виде, в каком вы их, эти пометки делали).
- Может и не логичное место: придумайте правила оформления кода (мои заметки можно глянуть
тут), от себя хочу сказать - все равно какой он будет главное:
* соблюдайте его на протяжении всего проекта
* используйте отступы и пусты строки для оформления блоков - читабельность кода увеличивается в разы
* не чурайтесь комментариев (немного далее)
- Про комментарии сказано было, но я рекомендую сразу подумать и о системе документирования самого кода, API библиотек и тому подобного. Для себя использую Doxygen, в коде просто вставляются комментарии в нужной форме, но основе которых, при помощи Doxygen генерируется документация на код в формате HTML/RTF/man
- Ну, наверное, в основном - все. Для проверки - перейдите к пункту 1 :simple_smile:
Естественно, разработка это ниразу не линейный процесс, по ходу дела могут меняться требования, мысли. Главное не забывайте отражать эти изменения в документации. Что перечислено выше, отнимает достаточно много времени, но потом писать становится значительно проще, количество костылей сводится к минимуму. Да и лишний раз заставит подумать - а нужно ли оно?
Из дополнительных пунктов:
- распределение обязанностей в команде: что бы каждый занимался ровно своим делом
- политика использования системы контроля версий
- пиши прототипы: для проверки какой-то новой концепции, создания нового функционала, отладить будет проще, когда эта функциональность является в прототипе основной, легче написать переносимый модуль. Из прототипов можно потом готовую программу собраться как из конструктора.
Ссылки в тему:
- Блок-схемы:
- Почитать книжку Эрика Рейнмонда “Искусство программирования для Unix”:
PS
Пишите код так…
На правах кросс-постинга:
http://serj-nickel.livejournal.com/139844.html
От себя: предлагаю также репостить, и поддержать петицию.
//Уважаемые пользователи!
18 февраля 2010 года компанией “Ру-Центр” (Москва, Ленинградский проспект, д.74, корп.4, тел +7 (495) 994-46-01 +7 (495) 737-06-01,
www.nic.ru ) без предупреждения, и какого либо уведомления было приостановлено делегирование домена TORRENTS.RU. По информации из “Ру-Центра” “Делегирование домена TORRENTS.RU приостановлено на основании Постановления следственного отдела по Чертановскому району Прокуратуры г.Москвы от 16.02.2010г”.
В “Ру-Центр” направлен соответствующий запрос, однако, весьма вероятно, что выяснение обстоятельств займет некоторое время, в течение которого адрес torrents.ru будет недоступен.
В связи с этим мы вынуждены были в срочном порядке сменить доменное имя на rutracker.org.//
Такой вот текст можно сейчас видеть на главной странице крупнейшего русскоязычного трекера. По этому поводу - несколько мыслей.
Самая “частная” мысль: какого чёрта?! Во-первых, что это за “приостановление делегирования”? Я что-то не пойму - там что, есть решение суда?! Я не юрист, но с позиции здравого смысла мне кажется, что в столь экстренном порядке что-то закрывать можно лишь в том случае, когда это реально угрожает чьей-то безопасности. А здесь что происходит? 16 февраля накатали какую-то там бумагу - и через два дня уже всё готово, всё закрыто? Ну допустим, в России плохой суд, нечестный и коррупционный, но здесь-то не было никакого суда! Пиздец, короче. Видимо, в сраной рашке этой стране любой чиновник имеет право закрыть что угодно. В таком случае заявляю о скором издании Постановления о закрытии к ебёной матери следственного отдела по Чертановскому району прокуратуры г.Москвы от 18.02.2010г.
Во-вторых, уж кто-то, а Торрентс.ру был максимально лоялен к правообладателям. В правилах там написано, что каждый запрос с документально подтверждёнными правами на материалы, выложенные на трекере, приведёт к удалению соответствующих раздач, и так в самом деле происходило! Я ещё как-то могу понять мотивы суда над Pirate Bay - эти ребята делали то же, но открыто называли себя пиратами, игнорируя все попытки с ними договориться. При этом в их родной Швеции был громкий судебный процесс, длившийся несколько месяцев, имевший огромнейший резонанс (взять хотя бы место Пиратской партии в Европарламенте!). Да и в Рунете большинство трекеров не отличается особым рвением оставаться в правовом поле. Торрентс.ру - исключение. И тем не менее наехали именно на него.
Мысль номер два: все эти т.н. правообладатели (если это они) не ведают, что творят. Ежу понятно, что файлообмен в том или ином виде победил. Нужно пытаться извлекать из этого выгоду, а не устраивать бессмысленные репрессии. Неужели они не знают, что помимо более 9000 копий экранки фильма “Аватар”, который можно найти в любой локальной сети, Торрентс.ру - хранилище ссылок на редчайшие материалы, купить которые легально просто невозможно даже в Москве, не говоря уже о провинции?! Взять хотя бы
первый фильм Тарантино, оцифрованный и переведённый, как и сотни других раритетов, энтузиастами! А помните
последний фильм братьев Коэн, который в нашей отсталой северной стране даже в прокат не вышел? А что насчёт собственных оцифровок виниловых пластинок? Что, в конце концов, насчёт авторских раздач, которых не так мало, как может показаться? Подскажите, где это взять легально? На Горбушке? Может быть, проведя полдня и пройдя пять километров вдоль прилавков, я таки найду половину того, чего искал. Но это в столице. А как насчёт Тулы и Рязани, не говоря уже о Барнауле и Томске? А что насчёт русскоязычного населения за рубежом? Думаете, православный храм в центре Парижа для эмигрантов полезнее, чем возможность смотреть русское кино и слушать русскую музыку? Не думаю.
Пока государство занималось чёрт знает чем, люди сами решили для себя проблему культурного голода. Более объёмной и при этом структурированной коллекции произведений искусства на русском языке в свободном доступе объективно нет. Было бы чертовски несправедливо, если бы такой проект погиб из-за чьей-то банальной жадности. Торренты - дело огромной важности, действительно объединяющее носителей русскоязычной культуры по всему миру. Дадут фору любым хвалёным нацпроектам - факт.
И, наконец, третья мысль. Железным аргументом структур, пытающихся помешать свободному файлообмену, является такой: “Это незаконно!” Ах, вот ведь радетели за законность нашлись! Но даже не в этом суть. Суть в том, что закон для человека, а не человек для закона. Если реалии изменились, общество должно иметь право издать новые законы, этим реалиям соответствующие. Атеизм, гомосексуализм, эвтаназия - все эти вещи ещё совсем (по историческим меркам) недавно были под запретом. А, например, расовая сегрегация была в порядке вещей. Однако общество изменилось, и в процессе своего развития поменяло взгляды на эти вещи и, как следствие, к власти пришли люди, которые привели законодательство в соответствие с ними. Так происходит в идеале; так должно происходить.
Грустный же вывод напрашивается сам собой: по видимому, в России проделать подобную корректировку законодательства мы не в силах.
PS Некоторое время назад я открыл статистику ThePirateBay.org и Torrents.ru и увидел, что количественные показатели (число зарегистрированных пользователей, раздач, сидов, личеров) у них очень близки. Принимая во внимание, что Бухту называют трекером номер один в мире, и что информация на его русскоязычном аналоге куда как лучше структурирована, я испытал чувство, которое испытываю довольно редко - гордость за то, что именно люди, которые говорят со мной на одном языке, собрали, по видимому, крупнейшую коллекцию своей культуры. Я увидел, что они испытывают потребность в культурном обмене друг с другом, что многим из них правда интересно и доставляет удовольствие потратить своё время и силы на поиск, оцифровку, перевод материала - и выложить его в свободный доступ, не прося ничего взамен, а лишь ожидая, что с ними так же поделятся чем-нибудь полезным.
Я считаю, что Торрентс.ру - более достойный предмет для гордости, чем олимпийская сборная, потому что торрент-сообщество - это сборная мира по обмену культурным наследием на русском языке, что важнее, чем катание на санях на время. И уж тем более, более достойный, чем самодержавно-православно-народные дядьки в телевизоре, учащие нас патриотизму.
PPS
http://www.girus.ru/petition/33/
UPD Желающие сделать перепост - делайте! (с кнопочкой не вышло, но и вручную это не так сложно)
Все знают про man страницы (man чаво?) и удобную программу apropos, все, надеюсь, ими активно пользуются.
Все знают и про info-страницы, рожденные в недрах проекта GNU, но, управление у программы info достаточно… неудобное, just for me.
В Geeqie продолжили традцию предка GQView в части технологии инструментов, что удобно - теперь они редактируются созданием .desktop файла и могут быть расположены в любом пункте меню/подменю (не до конца доделано, но пользоваться уже можно).
Итак, что потребуется
- imageshack-upload из одноименного пакета, Арчеры могут поставить пакет из AUR
- xmessage или zenity для формирования диалога изменения разрешения картинки
Начнем…
Запускаем Geeqie, идем: Edit -> Preferences -> Configure editors. Откроется окно настройки редакторов, которые могут вызываться из Geeqie.
Нажимаем Create. Появится окно создания нового инструмента, где в основном окне ввода расположен шаблон, который можно подправить под себя. Начинаем с того, что в нижем окне ввода заменяем new.desktop на что-то вроде: ImageShackUpload.desktop. В качестве тела .desktop файла вставляем:
[Desktop Entry]
Version=1.0
Type=Application
Name=Image Shack Upload
# If you have zenity installed use:
#
# cmd="zenity --list --text='$Q' --column='Selector' --column='Size' --radiolist TRUE No FALSE 1024x768 FALSE 800x600 FALSE 640x480 FALSE 400x300 || echo No"
#
# if you have xmessage installed use:
#
# cmd="xmessage -print -buttons 'No,1024x768,800x600,640x480,400x300' '$Q'"
#
# If you use other dialog system, configure it, or use next command for disable resoultion selection:
#
# cmd="echo No"
#
Exec=Q="Resize image before upload?"; cmd="zenity --list --text='$Q' --column='Selector' --column='Size' --radiolist TRUE No FALSE 1024x768 FALSE 800x600 FALSE 640x480 FALSE 400x300 || echo No"; size=`eval $cmd`; (for img in %F; do send_img=$img; if [ x"$size" != x"No" ]; then base=`basename $img`; noext=`echo $base | sed 's/.[A-Za-z0-9]*$*'`; ext=`echo $base | sed "s/^$noext*"`; send_img="/tmp/${noext}_$size$ext"; convert -scale $size $img $send_img > /dev/null 2>&1 || send_img=$img; fi; imageshack-upload $send_img 2>&1 | grep '^http:'; done)
# Desktop files that are usable only in Geeqie should be marked like this:
Categories=X-Geeqie;
OnlyShowIn=X-Geeqie;
# Show in menu "File"
X-Geeqie-Menu-Path=FileMenu/FileOpsSection
# This is a filter - $GEEQIE_DESTINATION is required
X-Geeqie-Filter=false
# It can be made verbose
X-Geeqie-Verbose=true
В зависимости от того, стоит у вас zenity/xmessages - вы должны заменить команду cmd="…" на нужно вам. Кроме того, настройки тут говорят - располагать пункт в меню File. Нажимаем Save, возвращаемся опять в окно настройки инструментов, где наблюдаем и наш новосозданный инструмент. Закрываем.
Теперь выбираем файлы за для закачки и идем File -> Image Shack Upload, появляется диалог, в котором нам предстоит выбрать разрешение, в которое пережмется картинка, или No, если изменение размера не нужно. После закрытия окна начнется процесс закачки (если кстати прервать нельзья, только с соседнего терминала чем-то вроде killall curl), ссылки на закачанные файлы будут выведены в окне, откуда их можно скопировать и вставить в нужное вам место.
Enjoy!
На правах юмора, бояна и
кросспостинга
навеяно
#536746, почему христианская церковь, не одобряэ Linux (да, это относится так же и к Unix):
- там часто фигурирует число зверя – 666
- там говорится про вилы (а чем черти колют грешников) – fork()
- там часто фигурируют демоны
- там часто взучат призывы убить (kill) и убить всех (killall)
- очень часто упоминается про убийство родителей и детей
- там обитают зомби
- там ложь — это истина (общепринято: 1 – true, 0 – false, так в оболочке, нормальное завершение процесса, это код возврата – 0)
- из
#536746: тут ведется пропаганда детской порнографии (cp)
что ещё?
Отдельно, то, что не подходит как обощение, частно для конкретного дистрибутива/семейства
- у FreeBSD вообще черт на логотипе
- Толстый пингвин на логотипе — пропаганда чревоугодия
тут тоже – что ещё?
./configure для qmake-based проектов
Что бы очень не заморачиваться с формированием ./configure скрипта (и configure.exe программы для windows) при помощи autotools, когда вся их мощь не очень нужна, поможет проект
qconf
Для Арчеводов, можно собрать из
AUR svn версию:
http://aur.archlinux.org/packages.php?ID=18686
Далее, на правах вольного пересказа английского README.
Intro
Итак, собираем, устанавливаем. Далее идем в корень вашего проекта, где лежит qmake файл, cоздаем там, для примера, файл myproject.qc примерно следующего содержания (это xml файл):
<qconf>
<name>myproject</name>
<profile>myproject.pro</profile>
</qconf>
дале пускаем:
qconf myproject.qc
На выходе получаем скрипт ./confugure с функционалом, в базовой части соответствующей autotools.
Если запустить без аргумента, будет выбран первый найденный .qc файл, если их найдено не будет - автоматически будет выбран первый .pro файл, и на основе его собран минимальный .qc файл (как в примере выше).
На целевой машине qconf не нужен (нужные только его модули конфигурации, но логично распространять их с самим проектом), нужен только разработчику.
Итак, на этот момент мы имеем готовый ./configure скрипт, который запускаем без параметров или смотрим ./configure --help
.
Как это работает
После запуска ./configure, будет сформирован файл conf.pri, в котором будут содержаться различные переменные, отвечающие за сборку, основные из которых:
- PREFIX
- BINDIR
- LIBDIR
- QTDIR
Этот файл вы можете включать в ваш .pro файл:
include(conf.pri)
Т.е. обобщая, как это работает: qconf формирует, на основе .qc файла, скрипт ./configure, который, будучи запущенным, выполняет нужные вам проверки, создает conf.pri, запускает qmake для вашего .pro файла, который (как я выше написал) может включать conf.pri файл (соответственно, все что будет записано в conf.pri - будет доступно для qmake).
Возможные директивы для .qc файла
<name>NAME</name>
- имя проекта
<profile>FILE.pro</profile>
- .pro файл проекта
<dep>...</dep>
- описываем зависимости, проверка на которые будет проводиться:```xml
* `"type"` - определяет модуль (примеры модулей идут вместе с qconf, правда только два: qt31.qcm и qt41.qcm). Если type задана как **pkg**, проверка происходит при помощи pkg-config (выводы --libs и --cflags будут добавлены при компиляции):
* опрашивается параметры:
* `"name"`
* `"pkgname"`
* `"version"` в которой могут содержаться знаки отношения: ">=", "<=", иначе принимается "="
* `<required />` - определяет обязательность зависимости
* `<disabled />` - зависимость выключена
<arg>DESRIPTION</arg>
- дополнительные агрументы для скрипта ./configure, сам аргумент будет доступен через переменную окружения QC_NAME (большими буквами, можно достучаться в модулях проверки через getenv), включают атрибуты:
"name"
- имя
"arg"
- значение
<lib />
- включает режима, когда собираемый проект - библиотека
<static />
- в случае, если <lib />
, собирать статическую библиотеку
<noprefix />
- очищает PREFIX
<nobindir />
- очищает BINDIR
<prefix>PATH</prefix>
- задаем PREFIX (по умолчанию: /usr/local)
<bindir>PATH</bindir>
- задаем BINDIR (по умолчанию: PREFIX/bin)
<incdir>PATH</incdir>
- задаем INCDIR (по умолчанию: PREFIX/include)
<libdir>PATH</libdir>
- задаем LIBDIR (по умолчанию: PREFIX/lib)
<datadir>PATH</datadir>
- задаем DATADIR (по умолчанию: PREFIX/share)
<qtdir>PATH</qtdir>
- задаем QTDIR
<moddir>PATH</moddir>
- добавляет пути поиска модулей для
<qt3 />
- конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)
Да, пример где используется - psi, там же, в директории qcm можно найти очень много приятных модулей проверки.
Ну и да, это всего лишь помощь к qmake, но не замена. Его тоже настраивать нужно. И читать руководства по нему.
PS пока очень сумбурно, потому как, сейчас сам только с ним столкнулся, потом будет дополняться, уточняться.
Т.к. основная ценность данного ресурса - это мои бредни, поэтому они заслуженно переезжают на главную страницу, тут же новости и прочая периодика.
Информация о ресурсе переехала на страницу
“О ресурсе”, и приобрела чуть более линейный вид.
За сим - всё.
UPD: Информация больше не актуальна, теперь подобные средства кодогенерации встроены в Qt Creator.
Долгое время пользовался для написание программ, с использованием Qt4 интегрированную среду разработки QDevelop, и хотя она почти всем устраивает, за несколькими исключениями:
- непонятно работает автодополнение
- на 500 строках и больше начинает ощутимо поддтормаживать
Текущая версия замечательного редактора tags:medit?do=showtag&tag=medit|medit
это 0.9.4 и она не обновлялась больше года. Решил собрать и попробовать сборку из mercurial, благо, смотря на даты последних изменений можно заметить, что работа ведется:
http://bitbucket.org/muntyan/moo/
Не все гладко - несколько переработан интерфейс, некоторые ошибки так и не исправлены (типа стоит галочка “переносить текст”, а он не переносится, а если убрать - будет переноситься).
Кроме того, сменили систему сборки на cmake, в результате не все доделали, и пришлось сделать два патча и один work-around для того, что бы пакет собрался вообще и с ctags, в частности. Кроме того, правила cmake пока не докрутили для python-plugin, в результате ни консоли питона, ни питоновских команд для пользовательских утилит. Хотя меня не это больше смущает - на питоне сделан терминал был, удобная, иногда, штука.
По питону, есть бага:
http://sourceforge.net/tracker/?func=detail&aid=2929703&group_id=167563&atid=843451 будемс следить.
В общем, в результате изысканий, сделал правило для сборки и поместил в AUR:
http://aur.archlinux.org/packages.php?ID=34336 там же необходимые патчи, хотя они тривиальны.
Да, рекомендую ознакомиться со справкой к программе, там вы найдете, в частности, как управлять поведением редактора на разных файлах (типа установить ширину отступа и кодировку, делается в манере, схожей с vim)
Наконец дошли руки оформить и свои устоявшиеся привычки кодирования, разложить по полочкам и свести к единому результату, а то читая свои творения некоторые, потом долго приходится волосы приглаживать.
В общем вот:
/C/C++ Coding Style
По ходу будет дополняться.