<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7953735488269591163</id><updated>2012-02-15T22:47:18.383-08:00</updated><category term='gw'/><category term='QtPIM'/><category term='JS'/><category term='ClaudMedia'/><category term='GooglePIM'/><category term='TheStorage'/><category term='Thought'/><title type='text'>Project SemEn blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8643625379405271035</id><published>2010-03-28T08:33:00.000-07:00</published><updated>2010-03-30T02:45:58.179-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gw'/><title type='text'>TBPD: HelpDesk</title><content type='html'>Так, с наворотами в HelpDesk в виде цепочки задач я немного психанул...&lt;br /&gt;* там нет много задач. Там одна задача. Которую надо как-то порешать.&lt;br /&gt;* состояния открыто/закрыто - мало. Схема new-accepted-done-submited - лучше. Это тоже, что и Opened/Close, но используя простейшее квитирование (подтверждение приема). Open/Close годится для Google Task - когда сам себе автор и исполнитель. Где участвует двое - там нужно подтверждение, что до человека дошло.&lt;br /&gt;* Другой вопрос - ведение журнала изменения состояния задачи. Это - да, вещь. Пока можно ограничиться заливкой в журнал Django - с каментами - что произошло.&lt;br /&gt;Итого - схема такая:&lt;br /&gt;* Задача - одна.&lt;br /&gt;* Состояний - 4 (New, Accepted, Completed, Approved) - отдельная модель.&lt;br /&gt;* Переходов - 8:&lt;br /&gt;** Create ( None =&gt; New)&lt;br /&gt;** Route ( New/Accepted =&gt; New )&lt;br /&gt;** Invalid/Duplicated ( New =&gt; Completed )&lt;br /&gt;** Accept ( New =&gt; Accepted )&lt;br /&gt;** MkDep ( Accepted =&gt; Accepted ) - родить подзадачу / зацепиться за существующую&lt;br /&gt;** Done ( Accepted =&gt; Completed )&lt;br /&gt;** ReOpen ( Completed/Approved =&gt; New )&lt;br /&gt;** Approve ( Completed =&gt; Approved )&lt;br /&gt;* Форм - 2 (список (с фильтром) / задача (с историей))&lt;br /&gt;* ведется журнал в системном журнале Django:&lt;br /&gt;** объект - эта задача&lt;br /&gt;** время - автомат&lt;br /&gt;** user - понятно&lt;br /&gt;** каменты: действие (переход из - в), каменты (юзеровские)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_InC1mhDtHQg/S6_JgCPSATI/AAAAAAAAEaE/tZXI_ugSlHI/s1600/SD_GwHelpDesk.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 381px;" src="http://4.bp.blogspot.com/_InC1mhDtHQg/S6_JgCPSATI/AAAAAAAAEaE/tZXI_ugSlHI/s400/SD_GwHelpDesk.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453799225962922290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ЗЫ: Не, нифига. Сливать задачу Из New в Invalid - не надо. Человек нажаль педаль Просмотреть на задаче - всё, он её прочитал - значит - Принял (Accept). А потом уже пусть делает с ней всё, что хочет - перенаправляет, сливает, жалуется - пофик. Он её _прочитал_ =&gt; принял к сведению. Типа подтверждения прочтения. Чтобы вариантов "а я еще не заглядывал в список - компьютер не работал" не было.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_InC1mhDtHQg/S7HILfgdPJI/AAAAAAAAEaM/IYXM3cvAKcQ/s1600/SD_GwHelpDesk.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 303px; height: 400px;" src="http://2.bp.blogspot.com/_InC1mhDtHQg/S7HILfgdPJI/AAAAAAAAEaM/IYXM3cvAKcQ/s400/SD_GwHelpDesk.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454360723484130450" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8643625379405271035?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8643625379405271035/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8643625379405271035' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8643625379405271035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8643625379405271035'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/03/tbpd-helpdesk.html' title='TBPD: HelpDesk'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_InC1mhDtHQg/S6_JgCPSATI/AAAAAAAAEaE/tZXI_ugSlHI/s72-c/SD_GwHelpDesk.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-3211520929294952359</id><published>2010-03-08T11:58:00.000-08:00</published><updated>2010-03-08T14:58:27.181-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gw'/><title type='text'>TBPD: Tasks</title><content type='html'>С контактами (организациями и людьми) разобрались - там хоть и навороченно, но вопросов пока нет концептуальных.&lt;br /&gt;Переходим к Задачам.&lt;br /&gt;Экспериментировать будем на HelpDesk. За пример возьмем opentodo и bugzilla - с доработкой напильником под себя.&lt;br /&gt;(Следующей кошкой можно взять классику - Заявка/Счет/Оплата/Доверка/Накладная|Акт+СФ/Оприход. Тут уже интереснее - масса ветвлений и неожиданных поворотов - зато всё определено (а на этой базе можно сделать данный документооборот - с формами, но без бухучета... Кстати - идея! :-)).&lt;br /&gt;Общие принципы:&lt;br /&gt;* все объекты (в т.ч. задачи) наследуют одного предка;&lt;br /&gt;* все специфичные задачи наследуют общий класс Задача - с доработкой по месту;&lt;br /&gt;прохождение задачей своего жизненного пути - это цепь задач, только одна из которых (последняя в цпочке) может быть активной. Остальные уходят в архив - для истории;&lt;br /&gt;* Задача может быть только открытой и закрытой;&lt;br /&gt;* Закрыться задача может только успешно - или родив следующую задачу;&lt;br /&gt;Задача может включать другие задачи, только когда все подзадачи завершены (условия и/или - потом);&lt;br /&gt;* Задачу можно заблокировать успешным выполнением другой задачи (то, что в bugzilla назвается блокирующим багом). Это - не подзадача, а совсем из другого потока.&lt;br /&gt;Итак - пора рисовать классы (на пальцах):&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;GwObject&lt;/span&gt;&lt;br /&gt;Предок всех остальных классов. Gw - от GroupWare. Здесь прошиты возможности наследования, группировки и ассоциаций - всё по-взрослому. Все поля (кроме type) - необязательные:&lt;br /&gt;* type:GwOType - тип наследника (расписыват не буду - просто enum); Обязательно прописывается наследниками.&lt;br /&gt;* ancestor:GwObject - предок - объект, с которого тянутся поля, которые в данном объекте не прописаны (пример: девушку угораздило выйти замуж; тогда всё, кроме фамилии, она может наследовать от своей предыдуще жизни);&lt;br /&gt;* group:GwObjects[] - массив подчиненных объектов. Хотя в первой версии лучше сделать поле master:GwObject - объект, которому подчинен данный. В последнем случае 1 объект может входить только в одну группу, но на безрыбье пока хватит.&lt;br /&gt;* links:GwObjects[] - связи, просто связи. Связи образуют некие группы, один объект может участвовать в нескольких группах связей. Реализация тривиальна, расписывать не буду.&lt;br /&gt;Методы:&lt;br /&gt;* delete() - здесь объект должен поприбивать всех подчиненных (это будет сделано автоматом) и связи (аналогично).&lt;br /&gt;* addson() - (решил сюда перенести, раз уж группы - здесь) - добавить подобъект (того же типа (?)).&lt;br /&gt;* delson() - хез, может надо...&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Task&lt;/span&gt;&lt;br /&gt;Задача в самом общем виде. В принципе, её можно сразу и сажать в некий tasklist. Все поля (почти) тоже необязательны.&lt;br /&gt;* subtype:TaskType - здесь, например, HdTask (задача HelpDesk'а) указывает свой подтип.&lt;br /&gt;* author - понятно&lt;br /&gt;* assignee - понятно&lt;br /&gt;* created - обязательно, автомат&lt;br /&gt;* deadline - понятно&lt;br /&gt;* subject - обязательно&lt;br /&gt;* description - понятно&lt;br /&gt;* completed:bool - True - задача завершена&lt;br /&gt;* result:enum(Null/ok/forward) - если задача завершена, то поле должно быть установлено - в ok, если всё чики, или в forward - если неуспешно и управление перешло следующей задаче. Вариант #2 - этого поля нет, а поле prev заменить на необязательное next - так будет лучше с т.з. неизбыточности даннных.&lt;br /&gt;* prev:Task - какой задаче перешло управление по завершению данной. Обе задачи должны иметь один subtype (?). Это поле - реализация последовательности задач - об чем, собсно, и гениальность идеи - реализация бизнес-процессов как групп/последовательностей задач. По существу - однонаправленный список (хотя, может, лучше сделать двунаправленный?..)&lt;br /&gt;Методы:&lt;br /&gt;* delete() - здесь, ко всему прочему, надо "выкусить" себя из последовательности.&lt;br /&gt;* complete() - завершить успешно. Мы не можем завершить задачу, пока не завершены успешно все подзадачи.&lt;br /&gt;* forward() - завершить эту задачу, родить новую, передать ей всё, что надо - и сообщить папе (master'у группы), что мы уже не играем, мы в домике (архиве) - а за нас играет следующая задача (вот её окончания и надо ждать).&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HdTask&lt;/span&gt;&lt;br /&gt;Собсно, задача для HelpDesk. Все поля - необязательные.&lt;br /&gt;* project:Project - ну или там тема, категория... Для фильтра.&lt;br /&gt;* state:enum - состояние текущей задачи - в соответствии с диаграммой состояний.&lt;br /&gt;* comments:txt[] - каменты.&lt;br /&gt;* files:File[] - файлы.&lt;br /&gt;Все поля можно указать только в главной задаче, в подзадачах - или не указывать совсем, или наследовать - кроме state (пока не решил).&lt;br /&gt;Диаграммы состояний opentodo и bugzilla:&lt;br /&gt;В принципе, если выкинуть справа состояние Unconfirmed (которое нужно только в public-трекерах), то диаграммы очень похожи. Ну, разве что, слева - более упрощена. Кроме того, добавим action "поцепить зависимость от другой задачи" (есть прецеденты).&lt;br /&gt;Вот теперь будет use cases на пальцах.&lt;br /&gt;* Юзверь создает задачу. Создается HdTask и сразу же - его первая (если не будет аварии - единственная) подзадача того же типа HdTask. Мегазадача будет ждать, пока текущая подзадача не завершится успешно. Пусть юзверь не назначил исполнителя (блондинко, куле...), подзадача будет со статусом Unassigned.&lt;br /&gt;* Сисодмин видит список Unassigned-задач, назначает исполнителя. Этим он завершает задачу-сына, но не успешно, а forward: эта подзадача закрывается, открывается новая, в старой прописывается поле next, мастер-задаче вместо первой подзадачи подсовывается новая, старая уже не играет и уходит в историю. Теперь мастер-задача ждет окончания второй подзадачи. Новая задача имеет статус Assigned. Можно браться за работу.&lt;br /&gt;* Исполнитель может обнаружить, что одна задача требует массу телодвижений. Не бидэ - жмем педаль "Подзадачи" - и текущая подзадача (2-го уровня) рождает несколько подзадач (уже третьего) - и будет нежно ждать успешного завершения всех из них.&lt;br /&gt;* Или же исполнитель обнаружил, что ему сказали налить ведро воды, а он вчера сказал секретутке купить ведро (оракул потому что). Тогда он может повесить свою задачу в DenendsOn задаче, которую дали ему. Это разные задачи и не из одной группы - но факт имеет место быть. Тут пока плавает, на первом этапе можно похерить (возможно, лучше сделать вхождение объекта во много групп).&lt;br /&gt;* Ну, пуст исполнитель тупо выполнил задачу Assigned. Жмем педаль, задача закрывается, пойвляется новая - с состоянием Resolved (Master-задаче статус не даем - она тупо ждет завершения всех подзадач - это для тех мастер задач, которые запускают сразу несколько подзадач).&lt;br /&gt;* Автор проверят результат, жмет "Одобряю". Состояние новой подзадачи становится - Verified.&lt;br /&gt;* Исполнитель жмет "Close". Подзадача завершается успешно. Можно вручную или или же автоматом закрыть и основную задачу. Тема закрыта.&lt;br /&gt;Слайды&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_InC1mhDtHQg/S5VYr_VrCdI/AAAAAAAAEXw/_OL-cWsqte0/s1600-h/tasks.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 163px;" src="http://2.bp.blogspot.com/_InC1mhDtHQg/S5VYr_VrCdI/AAAAAAAAEXw/_OL-cWsqte0/s400/tasks.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5446356837134436818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_InC1mhDtHQg/S5VYzhGii4I/AAAAAAAAEX4/awksb82F9HM/s1600-h/SD_helpdesk.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 357px; height: 400px;" src="http://4.bp.blogspot.com/_InC1mhDtHQg/S5VYzhGii4I/AAAAAAAAEX4/awksb82F9HM/s400/SD_helpdesk.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5446356966456855426" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-3211520929294952359?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/3211520929294952359/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=3211520929294952359' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/3211520929294952359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/3211520929294952359'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/03/tbpd-tasks.html' title='TBPD: Tasks'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_InC1mhDtHQg/S5VYr_VrCdI/AAAAAAAAEXw/_OL-cWsqte0/s72-c/tasks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-1272135210147840392</id><published>2010-03-04T10:53:00.000-08:00</published><updated>2010-03-04T11:16:05.781-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gw'/><title type='text'>Addresses</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_InC1mhDtHQg/S5AG66zwa1I/AAAAAAAAEWU/3Xi4k8ijw_w/s1600-h/CD.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 224px;" src="http://2.bp.blogspot.com/_InC1mhDtHQg/S5AG66zwa1I/AAAAAAAAEWU/3Xi4k8ijw_w/s400/CD.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5444859558779448146" /&gt;&lt;/a&gt;&lt;br /&gt;Начал рисовать МегаСуперБазу классов. Коих аж ДВА - 1. Контакты, 2. Задачи.&lt;br /&gt;А больше ничего интересного пока нед.&lt;br /&gt;В контактах вроде всё разрулил, дошедши до самого интересного - адреса.&lt;br /&gt;Скачал КЛАДР - почитал - долго думал...&lt;br /&gt;Резюм: а) ребята проделали охренительно огромную работу. Само ТЗ - высший пилотаж. После того, как прочитамши, что может быть адрес населенный_пункт-дом или там область-какой-то_километр_жд-будка - выпал в астрал...&lt;br /&gt;б) но реализация... все эти DBF-выкрутасы с индексами в 2010-м году выглядят в лучшем случае странно...&lt;br /&gt;&lt;br /&gt;Итого принято решение - что будем делать с Адресом:&lt;br /&gt;1. адреса будут в отдельной модели, у Контактов будет сцылки на адреса.&lt;br /&gt;2. база адресов - _своя_. И представляет собой одну-единственную рекурсивную таблицу.&lt;br /&gt;3. но - в базе указываются "мягкие" (зависящие от страны - типо "KLADR:123456789000") ссылки на местные справочники, по которым можно проверить правильность адреса.&lt;br /&gt;&lt;br /&gt;Слайды:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-1272135210147840392?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/1272135210147840392/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=1272135210147840392' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1272135210147840392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1272135210147840392'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/03/addresses.html' title='Addresses'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_InC1mhDtHQg/S5AG66zwa1I/AAAAAAAAEWU/3Xi4k8ijw_w/s72-c/CD.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-3847372576777954414</id><published>2010-02-24T09:00:00.001-08:00</published><updated>2010-03-07T08:09:09.626-08:00</updated><title type='text'>TBPD: Tasks-based Business-Processes Definition</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;Ну, в общем, тут, видимо, этой штуке и место.&lt;br/&gt;Общая идея в том, чтобы автоматизировать бизнес-процессы не на базе Activities, а на базе Задач.&lt;br/&gt;Итак:&lt;/p&gt;&lt;h3&gt;Суть:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Все бизнес-процессы (т.е. последовательности действий) есть последовательности Задач: одно действие - один тип Задач;&lt;/li&gt;&lt;li&gt;Задача может зависеть от других Задач - как начало Задачи, так и её завершение;&lt;/li&gt;&lt;li&gt;Задача не может быть удалена или изменена - только завершена с тем или иным исходом;&lt;/li&gt;&lt;li&gt;Задача может "включать" другие Задачи путем установления зависимостей. Вариант "включения" - когда подзадача активируется при активации надзадачи, а надзадача может быть завершена при завершении подзадачи.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Особенности:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Любая Задача имеет как минимум автора, дату/время создания, исполнителя, дату/время прочтения задачи исполнителем; дату/время завершения (для завершенных);&lt;/li&gt;&lt;li&gt;Задача может быть только в четырех состояниях: неактивная, активная непрочитанная, активная прочитанная (автомат), выполненная (с тем или иным исходом);&lt;/li&gt;&lt;li&gt;Состояние задачи может зависеть от состояния других Задач:&lt;/li&gt;&lt;ul type='circle'&gt;&lt;li&gt;Задача может быть неактивной до тех пор, пока не будут завершены с нужным исходом другие Задачи, от которых зависит эта задача;&lt;/li&gt;&lt;li&gt;Активная задача не может быть завершена с определенным исходом, если не завершены с нужным исходом Задачи, от которых она зависит;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Выполнение задачи может создавать другие задачи (какие - может зависеть от исхода);&lt;/li&gt;&lt;li&gt;Самая первая задача в бизнес-процессе может быть создана Событием - специальный тип Задачи без задачи-родителя;&lt;/li&gt;&lt;li&gt;Завершение Задачи может породить другую Задачу того же типа; тогда в работе участвует только последняя задача в такой цепочке - получается "история выполнения задачи";&lt;/li&gt;&lt;li&gt;С Задачами можно работать в любом ПИМе; некоторые можно там же завершать, если ПИМ поддерживает нужные исходы.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Примеры:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Зависимость неактивности: "Оплатить счет" неактивна, пока не выполнено "Получить счет";&lt;/li&gt;&lt;li&gt;Зависимость завершения: "Оплатить счет" не может быть завершена успешно, пока не выполнена задача "Получить выписку из банка" - тоже успешно;&lt;/li&gt;&lt;li&gt;Группировка: "Купить товар" не может быть завершена, пока не завершены "Оплатить товар" и "Получить товар"; "Оплатить товар" не появляется, пока не появится "Купить товар".&lt;/li&gt;&lt;li&gt;Зависимость следующих задач от исхода предыдущей: завершение "Оплатить счет" создает "Получить товар" (если счет оплачен успешно) - или же "Купить за нал", если не оплачен по причине денег на счету ёк;&lt;/li&gt;&lt;li&gt;Задача порождает задачу того же типа: изменение сроков выполнения задачи, замена исполнителя.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Отличия от классики:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Нет "состояния" процесса или его части (начал выполнять, выполнил наполовину и т.д.) - есть только Задачи - выполненные и не выполненные. Т.е. "состояние" процесса - это суперпозиция состояний всех его задач.&lt;/li&gt;&lt;li&gt;Нет многих состояний Задачи (начал выполнять, почти закончил выполнять и т.д.) - только выполнена или нет (неактивна/активна, прочитана/не прочитана - это уже просто техника, юзер оперирует только "открыта" и "закрыта").&lt;/li&gt;&lt;li&gt;Самое главное: контролируется не &lt;em&gt;процесс&lt;/em&gt;, а &lt;em&gt;результат&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Ключевые преимущества:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;динамическое планирование проекта - схема выполнения проекта может меняться на лету без дополнительных усилий - просто в силу внешних обстоятельств и результатов решения промежуточных задач;&lt;/li&gt;&lt;li&gt;внятное визуальное представление хода выполнения проекта - для руководства (цветной граф задач и их связей - цвет задачи/связи зависит от успешности и сроков её выполнения);&lt;/li&gt;&lt;li&gt;простое и удобное представление для исполнителей (простой список задач с возможностью группировки/сортировки/фильтров);&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Идеи:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;задачи обеспечивают/требуют (Requires/Provides) некие "сервисы" (на самом деле - события). Триггеры вешаются на эти сервисы. Задачи включают/выключают сервисы. Это более удобно, чем вешать триггеры пачки задач на пачки друггих задач (которые сегодня есть - завтра нет).&lt;/li&gt;&lt;li&gt;Задачи завершаются &lt;u&gt;всегда&lt;/u&gt; - или исполнителем, или системой по дедлайну (с генерацией следующих задач - для принятия решения).&lt;/li&gt;&lt;li&gt;Возможно, если задача не меняется в течении всего своего цикла жизни (а это уже не задача, а бизнес-процесс) - то хранить только один экземпляр и вести историю изменений.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;img height='1' width='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-3847372576777954414?l=tisemen.blogspot.com'/&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-3847372576777954414?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/3847372576777954414/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=3847372576777954414' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/3847372576777954414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/3847372576777954414'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/02/tbpd-tasks-based-business-processes.html' title='TBPD: Tasks-based Business-Processes Definition'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-1885006290374400043</id><published>2010-02-03T09:30:00.000-08:00</published><updated>2010-02-03T09:42:25.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GooglePIM'/><title type='text'>Пробуем raw http</title><content type='html'>Идея была такая - а что, если python-gdata делает, больше, чем просят? В смысле - запрашивает.&lt;br /&gt;План работы:&lt;br /&gt;1. написать приложение, которое, пользуясь _чистым_ http сделает те же запросы (ну и вообще полезно для отладки).&lt;br /&gt;2. сравнить результаты.&lt;br /&gt;Сделал. Python+httplib+urllib. По дороге научился получать у гугля ключи от хаты (токен авторизации) - классная вещь.&lt;br /&gt;Результаты: не отличаются НИЧЕМ :-(&lt;br /&gt;gdata отдал 20KB (оформлено - с ns и всё такое), raw http - 19KB неоформленного xml.&lt;br /&gt;Информация - та же.&lt;br /&gt;Вывод - чудо не произошло.&lt;br /&gt;Остался последний патрон: Atom feed history spec (RFC 5005).&lt;br /&gt;ЗЫ: ну не может быть чуда нед! Гугль даже пишет журнал _всех_ запросов! О чем прямо сказано в Google API - "указывайте приложение, каким просите - надо для истории".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-1885006290374400043?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/1885006290374400043/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=1885006290374400043' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1885006290374400043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1885006290374400043'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/02/raw-http.html' title='Пробуем raw http'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-4677046167409827599</id><published>2010-01-24T13:14:00.000-08:00</published><updated>2010-01-24T13:40:49.457-08:00</updated><title type='text'>GooglePIM alive</title><content type='html'>Ну вот...&lt;br /&gt;Замучила совесть вконец - человеку ж обещал поработать надо темой - а сам закинул, цуко... Не от хорошей жизни, а от работы - но тем не менее...&lt;br /&gt;Сегодня бортанул все халтуры и немного поработал с GData.&lt;br /&gt;Вопрос был простой: как-то обеспечить синхронизацию локальных данных с гуглем.&lt;br /&gt;Для этого надо знать - что с последнего запроса:&lt;br /&gt;1. удалено&lt;br /&gt;2. добавлено&lt;br /&gt;3. изменено&lt;br /&gt;Ну, с 3) проблем больших нет - нам бы только узнать, что изменилось, а подробности уже получим, когда наступим на это дело. GData такую информацию отдает (в смысле - можно попросить прислать "updated с...").&lt;br /&gt;С 2) тоже не проблема - как 3), только "published с ...".&lt;br /&gt;А вот с 1) - полная засада. Т.е. гугль просто не скажет, что удалено. Удаляется с концами. Единственное исключение - Контакты - они помечаются deleted и живут так ровно 1 мес (если спецом не удалить вообще).&lt;br /&gt;&lt;br /&gt;Итого родился алгоритм - спросить гугля пачкой сразу:&lt;br /&gt;1. спросить - сколько элементов вообще (эта цифра ничего не значит еще).&lt;br /&gt;2. спросить - сколько появилось новых (вот в этом месте мы уже будем знать - сколько удалено; хотя, к сожалению, не будем знать - кто - придется шерстить всех, цуко!).&lt;br /&gt;3. и кто изменился.&lt;br /&gt;&lt;br /&gt;Для этого сегодня был проведен эксперимент: сколько и каких данных отдаст гугль по простейшим запросам типа "кагдила".&lt;br /&gt;Тестировал на своем блогспоте (справка - блогспотом я называю точку входа в блоггер, откуда можно узнать линки на все свои блоги (у меня их - 12), оттуда - на посты, оттуда - на каменты; т.е. блогспот - это корень блоггера (для данного юзверя)).&lt;br /&gt;&lt;br /&gt;Есть 2 новости - плохая и как всегда.&lt;br /&gt;Плохая - если гуглю ничего не сказать, то по запросу к блогспоту он отдаст:&lt;br /&gt;1. кол-во блогов (это хорошо)&lt;br /&gt;2. updated будет равно времени запроса (это плохо) - а не времени updated хоть одного блога (или времени удаления... короче - времени изменения состояния блогспота);&lt;br /&gt;3. и, цуко, все блоги - с id, линками, названиями, тегами и прочей муйней.&lt;br /&gt;Итого 12 блогов мне обошлись в 20KB. Не бог весть что - но тоже ж жалко... Это только блоги. Контактов, я думаю, отдаст на все 100 кил. Один пук - и 100 кил коту под хвост. С мобилы, ога...&lt;br /&gt;&lt;br /&gt;Хорошая новость в том, что можно попросить ?max_results=0 - и гугль отдаст только голову - кол-во блогов (если попросить - то кол-во богов, соответсвующих критерию (updated, published).&lt;br /&gt;Получилось 1KB. Тоже не фонтан - но не 20 же ж!&lt;br /&gt;&lt;br /&gt;Теперь - к следующему уроку приготовить:&lt;br /&gt;* попробовать получить блогспот не через python-gdata (может это он гонит - слишком заносит хвост клеенту и берет то, что не просили), а напрямую по atom (только надо разобраться с авторизацией - гугль же хрен отдаст просто так - за что и уважаю).&lt;br /&gt;* Попробовать сделать batch-запрос - итого+published+updated.&lt;br /&gt;* попросить Деда Мороза прислать мне инфу - как попросить гугль отдать только entry id вместо всего entry. Тогда я бы просто получил список id обновленных и новых entries, пометил в своей базе, что они - несвежие, а разбирался бы потом. А самое главное - сразу бы удалил несуществующие.&lt;br /&gt;&lt;br /&gt;Еще надо бы внимательнее почитать http://code.google.com/p/libgcal/ - там есть упоминание о некоем fastsync (хотя в чЮдеса не верится).&lt;br /&gt;&lt;br /&gt;PS. Но вообще прямо в руки лезет идея промежуточного сервера, который всю эту мороку с rss возмет на себя - а мне отдаст в чистом виде.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-4677046167409827599?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/4677046167409827599/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=4677046167409827599' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/4677046167409827599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/4677046167409827599'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2010/01/googlepim-alive.html' title='GooglePIM alive'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-5851932645972972590</id><published>2009-10-07T12:39:00.000-07:00</published><updated>2009-10-07T12:51:22.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GooglePIM'/><title type='text'>GooglePIM reloaded</title><content type='html'>Мда, забросил я было это дело...&lt;br /&gt;А тут недавно обнаружил, что гугель уже прикрутил Todo в свою балалайку.&lt;br /&gt;Это то, чего не хватало.&lt;br /&gt;Вот теперь можно лепить полноценный ПИМ. Или Гугль-десктоп :-)&lt;br /&gt;&lt;br /&gt;В прошлой серии тормознулось из-за того, что при каждом старте софтины надо снимать _всю_ ленту Atom. Т.е. прокачиват сотни метров.&lt;br /&gt;Идея появилась - сделать прокладку в виде SyncML. Но это ж кто её будет делать...&lt;br /&gt;Поэтому сейчас сделаем проще (образно) и хитрее - воспользуемся возможностями сомого gdata.&lt;br /&gt;&lt;br /&gt;Общая идея в том, чтобы не качать лишнего.&lt;br /&gt;Для этого:&lt;br /&gt;1. все данные надо кешировать&lt;br /&gt;2. все изменения - журналировать и выполнять оптом (ессно, с проверкой - вдруг кто-то что-то там во время редактирования изменил.&lt;br /&gt;&lt;br /&gt;Что для этого надо?&lt;br /&gt;1. хранить последнее updated фида&lt;br /&gt;2. хранить времена updated всех элементов&lt;br /&gt;3. в случае изменения updated фида:&lt;br /&gt;3.1. снять все элементы, у которых update &gt;= feed update (ркурсивно повторить 2+)&lt;br /&gt;3.2. причем не полностью элементы, а только id и updated&lt;br /&gt;3.3. снять все _deleted_ элементы на тех же условиях.&lt;br /&gt;4. снимать элементы небольшими порциями&lt;br /&gt;&lt;br /&gt;Да, локально будет храниться полная копия всех элементов. А шо рабиць?&lt;br /&gt;Еще прийдется разруливать конфликты, паче они случатся.&lt;br /&gt;Зато можно поработать offline - и опубликовать в гугле одной педалькой.&lt;br /&gt;В batch-режиме&lt;br /&gt;Локальной базой можно сделать BerkleyDB или SQLite.&lt;br /&gt;&lt;br /&gt;Итого план работы:&lt;br /&gt;1. изучить возможности п.п. 3.2 и 3.3&lt;br /&gt;2. разработать алгоритм синхронизации&lt;br /&gt;3. разработать формат базы&lt;br /&gt;&lt;br /&gt;Полетели.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-5851932645972972590?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/5851932645972972590/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=5851932645972972590' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/5851932645972972590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/5851932645972972590'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2009/10/googlepim-reloaded.html' title='GooglePIM reloaded'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8193045044939968858</id><published>2009-05-17T09:42:00.000-07:00</published><updated>2009-05-17T09:50:58.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClaudMedia'/><title type='text'>FeelingSensitivity</title><content type='html'>Идея - чтобы система была чувствительна к настроению хозяина. Хуже - "угадывало" его желания.&lt;br /&gt;Пример - пришел домой, хочется музыки. Какой - хез, её много, выбирать - влом.&lt;br /&gt;Система, базируясь на статистике, биоритмах, состоянии расчетного счета etc - грит:&lt;br /&gt;С: хозяин - может это?&lt;br /&gt;Х: не...&lt;br /&gt;С: это?&lt;br /&gt;Х: не!&lt;br /&gt;С: (так... хозяин не в духе... пора думать) Хозяин, приложите руку к сенсору - мы попробуем погадать.&lt;br /&gt;(дальше вычисляется давление, пульс, дыхание, потение etc.)&lt;br /&gt;С: Хозяин, у Вас фигня какая-то... Дыхните в трубочку, плиз.&lt;br /&gt;(хозяин дишит)&lt;br /&gt;С: Кхм... Вроде и пил немного... Хозяин - а посмотрите в камеру своим хлебальцем!&lt;br /&gt;(хозяин смотрит в уеб-камеру)&lt;br /&gt;С: Мдымс... Хозяин, у вас показатели в норме, пили Вы немного, но - судя по выражению Вашего хлебала, у Вас - мегадепрессняк. Предлагаю Rainbow'74, потом - PinkFloyd "The Wall" - и вызвать девочек.&lt;br /&gt;Если Вам что-то посреди дороги не понраится - убейте меня апстену - данная информация поступит в статистику и будет учтена в следующий раз.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8193045044939968858?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8193045044939968858/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8193045044939968858' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8193045044939968858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8193045044939968858'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2009/05/feelingsensitivity.html' title='FeelingSensitivity'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8478375245382637880</id><published>2009-03-31T10:23:00.001-07:00</published><updated>2009-03-31T10:23:46.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QtPIM'/><title type='text'>Где граница между PIM/DMS/GroupWare?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Имеем классику PIM:&lt;br/&gt;1. Контакты&lt;br/&gt;2. Задачи&lt;br/&gt;3. Мыло&lt;br/&gt;Еще (во многих):&lt;br/&gt;4. Заметки (Notes)&lt;br/&gt;и вот тут начинается интересное:&lt;br/&gt;* notes бывают типа разные. Проще всего - plain-text&lt;br/&gt;* которые быстро становятся richtext (с форматированием)&lt;br/&gt;* который быстро перерастает в html&lt;br/&gt;* или в другой формат (rtf/doc/odt/docbook (!)/иное)&lt;br/&gt;* а еще документы бывают не только текстовые, но еще и типа spreadsheet&lt;br/&gt;* или там media (audio/video/image)&lt;br/&gt;* и вся эта хрень требует навигации&lt;br/&gt;* и получается локальный себе DMS&lt;br/&gt;* а потом оказывается, что этим надо бы поделиться (share)&lt;br/&gt;* и получается groupware&lt;br/&gt;* ...&lt;br/&gt;&lt;br/&gt;Где начало того конца, которым кончается начало?&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=2998a6f7-4889-80fd-875e-5665bff7cb1c' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8478375245382637880?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8478375245382637880/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8478375245382637880' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8478375245382637880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8478375245382637880'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2009/03/pimdmsgroupware.html' title='Где граница между PIM/DMS/GroupWare?'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-1069575568644025090</id><published>2009-03-01T00:36:00.000-08:00</published><updated>2009-04-01T00:51:31.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TheStorage'/><title type='text'>Starting TheStorage</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Нельзя объять необъятное. Начинается с каталогов с отдельными схемами, потом пошли связи между объектами внутри каталогов, потом - между объектами разных каталогов, потом - объекты в нескольких каталогах, плюс категории... И заканчивается семавеб, которого нет. Думать можно вечно.&lt;br/&gt;Выход - дорогу осилит идущий.&lt;br/&gt;Сиречь - все таки сделать один продукт за раз. И - трансляторы.&lt;br/&gt;Продукт будет называться скромно и со вкусом - TheStorage.&lt;br/&gt;Размещаться - в code.google.com/p/semen&lt;br/&gt;Там же - keyfeatures etc&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=b2256c44-a36b-8fc4-95bd-3231c24f271b' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-1069575568644025090?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/1069575568644025090/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=1069575568644025090' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1069575568644025090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1069575568644025090'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2009/03/starting-thestorage.html' title='Starting TheStorage'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-2984085988435617770</id><published>2009-01-12T10:15:00.000-08:00</published><updated>2009-01-12T10:18:57.244-08:00</updated><title type='text'>$</title><content type='html'>IMHO - на этом таки можно заработать.&lt;br /&gt;Подписать на нормальный сервис на божеских условиях за божеские дегни.&lt;br /&gt;Like (Google Apps):&lt;br /&gt;* demo - ограничено + сказки (+desktop под все платформы)&lt;br /&gt;* trial - Full на X дней&lt;br /&gt;* и там разные схемы - от ёмкости, скорости etc.&lt;br /&gt;&lt;br /&gt;Ибо задалбывает всё в голове держать патамушта.&lt;br /&gt;&lt;br /&gt;ЗЫ: а это уже катит на бизнес-план... тока хрен там - йа сам :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-2984085988435617770?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/2984085988435617770/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=2984085988435617770' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/2984085988435617770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/2984085988435617770'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2009/01/blog-post.html' title='$'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8006270463711027006</id><published>2008-11-09T11:07:00.000-08:00</published><updated>2008-11-09T11:25:44.854-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GooglePIM'/><title type='text'>Google Gears, SyncML и всё-всё-всё</title><content type='html'>Ковыряюсь же ж с этим поделием - GooglePIM.&lt;br /&gt;Каждый старт - медленная закачка по Atom (aka RSS) всех блогов, постов и каметов.&lt;br /&gt;Порезал - чтобы по одному.&lt;br /&gt;Всё-равно долго.&lt;br /&gt;Ессно, возникает мисль кешировать это дело.&lt;br /&gt;Вспомнив, что еще хотелось бы оффлайн работать (например - писать блоги в метро), возникает мисль локального кеширующего типа прокси-сервера...&lt;br /&gt;Оформляются требования, продумывается архитектура... На всякий случай - попытка проверить - может уже умные люди что-то подобного сделали... И тут - шойтан! - всплывает Google Gears. Читаем спецификацию - точно! - то, что доктор прописал :-)&lt;br /&gt;Но есть один нюанс (с) - он делает хороший занос хвоста, но политика синхронизации - каждый сам себе доктор.&lt;br /&gt;Формируем себе ТЗ, определяем гениальный алгоритм синхронизации, учитываем все возможные засады... На всякий случай - может уже есть? Например - SyncML. Шойтан! - там уже всё прописано :-)&lt;br /&gt;&lt;br /&gt;Ессно, возникает вопрос - а зачем было самотужки выдумывать свои решения, если есть готовые?&lt;br /&gt;Спрашивали - отвечаем:&lt;br /&gt;1. их - готовых - вагон и телега;&lt;br /&gt;2. если сначала сам _допер_ как что надо делать - а потом это же прочитал в спецификациии - значит, а) ты правильно допер, и б) это - правильная спецификация.&lt;br /&gt;3. когда до этого допрешь сам - та же спецификация читается совсем по-другому - не "и нафига этот цирк?..", а "ну ессно!".&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;синкмл синкмлом, но пока не всё так радужно.&lt;br /&gt;1. SyncML очень многое оставляет на реализацию.&lt;br /&gt;2. во всех 7 вариантах синхронизации сервер - активный партнер. В плане гугля последний - пассивный партнер.&lt;br /&gt;3. RTM (как пример использования Gears) - штука хорошая, но они ж сам себе сервер... Активный сервер.&lt;br /&gt;Вооот...&lt;br /&gt;&lt;br /&gt;Пока что (влёт) приходят в голову только следующие варианты:&lt;br /&gt;* таки да, пытаться взять на себя (сиречь - на каждое устройство) функции и кеширования, и синхронизации;&lt;br /&gt;* кеширование оставить на устройстве (ессно), но сделать промежуточный сервер (GAE), реализующий SyncML-интерфейс к GData;&lt;br /&gt;* иное&lt;br /&gt;Для этого надо:&lt;br /&gt;* поковырять Google Gears - может, расколятся, как у них там устроено?&lt;br /&gt;* поковырять GData Atom - может, через Atom удастся получить _удаленные_ объекты? (это самое геморрное в этой истории).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8006270463711027006?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8006270463711027006/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8006270463711027006' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8006270463711027006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8006270463711027006'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/11/google-gears-syncml.html' title='Google Gears, SyncML и всё-всё-всё'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8585028411034967145</id><published>2008-07-04T00:31:00.000-07:00</published><updated>2008-07-04T00:58:32.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JS'/><title type='text'>ТЗ на JS</title><content type='html'>&lt;dl&gt;&lt;br /&gt;&lt;dt&gt; Цель:&lt;br /&gt; &lt;dd&gt; создание программы на JavaScript, включаемой в статическую online-страницу, для динамической навигации по ресурсам Internet.&lt;br /&gt;&lt;dt&gt; &lt;a href="http://kylescholz.com/projects/wordnet"&gt;Прототип&lt;/a&gt;&lt;br /&gt;&lt;dt&gt; Данные:&lt;br /&gt; &lt;dd&gt; xml-файл с описанием узлов/рёбер графа. Для узлов - название, ссылка, подсказка.&lt;br /&gt;&lt;dt&gt; Внешний вид:&lt;br /&gt; &lt;dd&gt; на странице отображается центральный узел и ближайшие связанные с ним узлы - уровень рекурсии указывается пользователем. Каждый узел - это элемент "ссылка". Если у узла (внешнего) существуют связи с узлами за пределами текущего отображения - рядом с таким узлом появляется элемент &lt;a&gt;+&lt;/a&gt;. При нажатии на сам узел происходит переход на его URL. ПРи нажатии на + - узел оказывается в центре нового графа - со всеми вытекающими.&lt;br /&gt;Размещение элементов - по алгоритму DirectGraph, но может быть изменено пользователем.&lt;br /&gt;&lt;dt&gt; Поведение&lt;br /&gt; &lt;dd&gt; Смена одного графа на другой - с анимацией, алгоритм которой можно будет изменять:&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt; Удаляемые узлы - остаются на месте и постепенно исчезают;&lt;br /&gt;    &lt;li&gt; Новые узлы - постепенно проявляются на своих местах;&lt;br /&gt;    &lt;li&gt; Остающиеся узлы - двигаются от старых координат к новым&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt; Рёбра двигаются за узлами. Перемещение от начального состояния к конечному - за конечное же время. Физика перемещения может быть в дальнейшем заменена.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;Т.о. выделяются модули, которые можно будет в дальнейшем заменять:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; data (источник данных - файл, внешний ресурс)&lt;br /&gt;&lt;li&gt; layout (алгоритм размещения узлов)&lt;br /&gt;&lt;li&gt; animation (алгоритм анимации)&lt;br /&gt;&lt;li&gt; view (метод отображения - html/svg/canvas)&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8585028411034967145?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8585028411034967145/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8585028411034967145' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8585028411034967145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8585028411034967145'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/07/js.html' title='ТЗ на JS'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-7072914957734896591</id><published>2008-06-27T10:45:00.000-07:00</published><updated>2008-06-27T11:34:39.470-07:00</updated><title type='text'>Standalone (AKA OnPage) dynamic graph</title><content type='html'>An idea is - to make 1 (one) js + 1 (one) graphml data, that:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://kylescholz.com/projects/wordnet"&gt;Prototype&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;dynamic from-to&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Functions:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Standalone expand/collapse&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customed speed&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customed recurse level&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Customed Layout&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technologies:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;use pure HTML (div + position)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Runge-Kutta lines&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-7072914957734896591?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/7072914957734896591/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=7072914957734896591' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7072914957734896591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7072914957734896591'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/06/standalone-aka-onpage-dynamic-graph.html' title='Standalone (AKA OnPage) dynamic graph'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8589275113615188876</id><published>2008-06-26T01:56:00.001-07:00</published><updated>2008-06-26T02:00:01.412-07:00</updated><title type='text'>Pure HTML graphics</title><content type='html'>Окаааазывается!&lt;br /&gt;Можно рисовать графику (по крайней мере ту, что нас интересует - графы) на чистокровном HTML!&lt;br /&gt;Без svg, flash, canvas и т.д.!&lt;br /&gt;Показываю (в левом верхнем углу (100x100px) должно появиться сцылко node0, текст node1 и цепочка между ними):&lt;br /&gt;&lt;div id="n0" style="position: absolute; left: 100px; top: 100px;"&gt; &lt;a href="?n0"&gt;node0&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;div id="n1" style="position: absolute; left: 150px; top: 125px;"&gt; node1 &lt;/div&gt;&lt;br /&gt;&lt;div id="e0:1"&gt;&lt;br /&gt; &lt;div id="e0:1:0" style="width: 2px; height: 2px; background-color: rgb(136, 136, 136); position: absolute; left: 120px; top: 110px;"&gt; &lt;/div&gt;&lt;br /&gt; &lt;div id="e0:1:1" style="width: 2px; height: 2px; background-color: rgb(136, 136, 136); position: absolute; left: 130px; top: 115px;"&gt; &lt;/div&gt;&lt;br /&gt; &lt;div id="e0:1:2" style="width: 2px; height: 2px; background-color: rgb(136, 136, 136); position: absolute; left: 140px; top: 120px;"&gt; &lt;/div&gt;&lt;br /&gt; &lt;div id="e0:1:3" style="width: 2px; height: 2px; background-color: rgb(136, 136, 136); position: absolute; left: 150px; top: 125px;"&gt; &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8589275113615188876?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8589275113615188876/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8589275113615188876' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8589275113615188876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8589275113615188876'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/06/pure-html-graphics.html' title='Pure HTML graphics'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8739875000025913420</id><published>2008-06-25T00:22:00.000-07:00</published><updated>2008-06-25T00:37:08.335-07:00</updated><title type='text'>Onpage vs client-server</title><content type='html'>Речь о том, какой вариант навигатора делать, все-таки, первым - встроенный в страницу на JS, или же клиент-серверный.&lt;br /&gt;Onpage имеет то преимущество, что его можно разместить где угодно - даже на Google pages в статических страничках. За это мы имеем:&lt;br /&gt;1. заморочки с JS;&lt;br /&gt;2. большой и тяжелый для браузера код;&lt;br /&gt;3. инсекурность данных;&lt;br /&gt;4. ограничение в применяемых инструментах - т.е. _все_ программы надо носить с собой.&lt;br /&gt;С другой стороный, C-S вариант требует наличия этого самого S. Зато мы не ограничены в средствах, разгружаем клиента, сохраняем know-how.&lt;br /&gt;Резюме - первым бум делать вариант C-S, рендер - graphviz, исходные данные - xml, формат вывода - svg, без анимации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8739875000025913420?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8739875000025913420/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8739875000025913420' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8739875000025913420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8739875000025913420'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/06/onpage-vs-client-server.html' title='Onpage vs client-server'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-8886819090539271939</id><published>2008-06-21T05:51:00.000-07:00</published><updated>2008-06-21T06:00:05.086-07:00</updated><title type='text'>n-dimention</title><content type='html'>2D-сеть для отображения - это хорошо. Но - мало.&lt;br&gt;Было бы намного презентабельней - 3D вариант.&lt;br&gt;Но этого тоже бывает мало - бывает, необходимо искать/фильтровать по &lt;br&gt;8..10..X размерностям.&lt;br&gt;Здесь можно остальные измерения обозначить другими атрибутами (а не &lt;br&gt;только связями) - цвет (заливки и границы), форма узлов, текстура и т.д. &lt;br&gt;По этим атрибутам можно как минимум фильтровать. По цвету - даже близкие &lt;br&gt;цвета (с заданной глубиной).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-8886819090539271939?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/8886819090539271939/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=8886819090539271939' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8886819090539271939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/8886819090539271939'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/06/n-dimention.html' title='n-dimention'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-7244267564206935231</id><published>2008-06-19T03:03:00.001-07:00</published><updated>2008-06-19T03:03:52.778-07:00</updated><title type='text'>Net vs Table</title><content type='html'>Вообще, конечно, сетевое представление данных - тоже не идеал.&lt;br /&gt;Оно годится для навигации по очень разнородным данным, хитро связанным между собой.&lt;br /&gt;Тогда как по однородным данным лучше, всё-таки, таблица. Тут можно быстро сравнить позиции, сортировать, фильтровать. Наглядно получается.&lt;br /&gt;Пример - знаменитые краны шаровые.&lt;br /&gt;Выглядеть это будет так:&lt;br /&gt;1. набираем в поисковой строке "кран"&lt;br /&gt;2. получаем сеть, где есть все краны - шаровые и нет, для газа и жидкости, металлические и ПЭ. Рядом - связанные понятия - среда, материал, категории (арматура) - может, человек и не кран искал, а клапан.&lt;br /&gt;3. и вот теперь, когда он выберет конкретный тип крана (шаровый металлический под газ) - получает таблицу всех кранов - и ряд полей для уточнения рядом: DN, PN etc - т.е. общие атрибуты для данного типа кранов&lt;br /&gt;4. Он может выбрать и 2 типа оборудования - e.g. ПЭ под газ и металл под жидкость. Тогда отображаются и те и те - с общими атрибутами.&lt;br /&gt;Возможно, часть поля останется с сетью - для дальнейшей навигации и чтобы быть в курсе дела, а часть - под таблицу с выбранным оборудованием.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-7244267564206935231?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/7244267564206935231/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=7244267564206935231' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7244267564206935231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7244267564206935231'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/06/net-vs-table.html' title='Net vs Table'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-7716858980756649344</id><published>2008-04-07T07:06:00.000-07:00</published><updated>2008-11-09T07:07:17.353-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GooglePIM'/><title type='text'>GooglePIM start</title><content type='html'>Вот, завел новый блог - к проекту GooglePIM.&lt;br /&gt;Первое приложение этого проекта - как раз работа с блогом.&lt;br /&gt;GoogleAPI, конечно, рулит - потрясающе.&lt;br /&gt;Еле разобрался, что куда.&lt;br /&gt;В общем стартовый объект - один, назвал я его blogspot.&lt;br /&gt;В нем может быть несколько блогов.&lt;br /&gt;В каждом блоге - несколько постов.&lt;br /&gt;Ну, и к каждому посту - несколько комментариев. На этом вложенность, слава богу, заканчивается.&lt;br /&gt;На текущий момент уже получаю все блоги, посты и каменты.&lt;br /&gt;Используется python и python-gdata.&lt;br /&gt;Теперь это надо красиво в PyQt4 закатать - сделать дерево блогспот-блог-пост-камент.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-7716858980756649344?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/7716858980756649344/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=7716858980756649344' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7716858980756649344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/7716858980756649344'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/04/googlepim-start.html' title='GooglePIM start'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-2442925933935835608</id><published>2008-03-15T06:12:00.000-07:00</published><updated>2008-08-08T06:18:38.786-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thought'/><title type='text'>Grouping-sorting-filtering</title><content type='html'>1. Выборка осуществляется в графическом режиме, подбором "шнуров" (т.е. ребер графа) в "шнуркомплекты". Т.е. Если надо отобрать "Краны" И "DN50" - то отбираются именно эти узлы (или ребра?) в комплект;&lt;br /&gt;2. Каждый пользователь может создать свою пачку шнуркомплектов;&lt;br /&gt;3. Можно создать библиотеку общих комплектов (шаблонов?);&lt;br /&gt;4. схема комплектов может быть сетевой (т.е. "формула" комплекта для выборки данных из сети - сама - сеть);&lt;br /&gt;5. но основная схема - неизбыточна (что я имел в виду?..).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-2442925933935835608?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/2442925933935835608/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=2442925933935835608' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/2442925933935835608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/2442925933935835608'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2008/03/grouping-sorting-filtering.html' title='Grouping-sorting-filtering'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7953735488269591163.post-1453448483162089467</id><published>2007-09-01T05:12:00.000-07:00</published><updated>2008-06-25T05:18:37.715-07:00</updated><title type='text'>About</title><content type='html'>Проект SemEn (SEMantic ENVironment) - это попытка сделать управление информацией максимально близким человеческому типу мышления - ассоциативному. Проект основан на идеях Semantic Web и Semantic Desktop, но называется Environment - т.к. Web (по смыслу) - это управление информацией в Сети, а Desktop - соответственно - на машине. Мне же хочется, чтобы пользователь не заморачивался разделением - что у него в вебе, а что - на машине (да еще знать - на какой из).&lt;br /&gt;Общий смысл - создание семантического окружения - т.е. все объекты информационного поля связаны (ассоциированы) друг с другом по смыслу - а не по ключевым словам, тегам и т.д.&lt;br /&gt;Т.о. поиск информации в такой системе - это проход по смысловым связям, что повторяет образ мышления человека.&lt;br /&gt;По идее - должно сильно помочь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7953735488269591163-1453448483162089467?l=tisemen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tisemen.blogspot.com/feeds/1453448483162089467/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7953735488269591163&amp;postID=1453448483162089467' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1453448483162089467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7953735488269591163/posts/default/1453448483162089467'/><link rel='alternate' type='text/html' href='http://tisemen.blogspot.com/2007/09/about.html' title='About'/><author><name>TI_Eugene</name><uri>http://www.blogger.com/profile/10500806098725224609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
