суббота, 16 августа 2008 г.

Последняя запись на blogspot'е.

Это сообщение всем своим видом сообщает, что данный блог закрыт по причине переезда на другую платформу.

RSS уже обновлен и натравлен на временное пристанище на wordPress'е. А нет ничего более постоянного, чем временное =) Цель данного переезда в том, чтобы в конечно итоге переползти на stand-alone блог и сделать ему более приветливый вид =) А WordPress подходит для этого чуть лучше, как мне кажется. Все записи успешно импортированы туда, вместе с комментариями. Спасибо команде WordPress за этот безболезненный переезд =)

Писать чаще не обещаю, да и не нужно это. Следите за изменениями на SmartMasses, там постоянно появляются новые товары, а лучше подпишитесь на RSS и тогда все обновления и скидочные акции будут падать вам в ридер.

Мой эксперимент с Oracle можно считать начавшимся, с понедельника приступаю к написанию агрегатов. Читаю Тома Кайта на ночь и восхищаюсь изворотливостью человеческого разума =)


BTheMad

воскресенье, 10 августа 2008 г.

Oracle, JDeveloper и PL/SQL

Так уж получилось, что я решил чуть-чуть сместить фокус своей девелоперской деятельности в сторону Oracle PL/SQL. Нет, мне совершенно не надоел веб, просто у меня есть свой проект Smart Masses, который представляет собой магазин для гиков и сочувствующих имени доктора Жаба, и мне его более чем достаточно для экспериментов. А учитывая, что в конторе, где я работаю всегда есть возможность выбора проекта, я решил «прокачать» знания по sql и pl/sql, с которым до этого не работал. Для начала оформил себе оракловые курсы по банальному sql и уложил все знания в систему =) Учиться понравилось. Вчера съездил в Олимпийский и закупил литературы по Oracle PL/SQL и немного Тома Кайта для души =)

Сегодня уже установил себе Oracle 10g XE на Ubuntu 8.04 и начал вдумчиво читать литературу и выполнять примеры.

У оракла есть некая IDE с незамысловатым названием JDeveloper. Не то, чтобы я горю желанием изучить ещё одну IDE, но посмотреть на неё захотелось. Ставиться она не без бубна, но официального руководства вполне достаточно. Единственная проблема возникает, когда пытаешься законнектиться к базе из неё. Проблема выражается двумя ошибками:

ORA-00604: error occurred at recursive SQL level 1
ORA-12705: Cannot access NLS data files or invalid environment specified

И ничего не признает. Выставление параметра NLS_LANG в профиле баша ничего не дает. После многочисленных расследований и поисков в гугле решение было найдено. В файл jdev.conf необходимо добавить пару строк:

AddVMOption -Duser.language=en
AddVMOption -Duser.region=us

Оказывается Ынтырпрайз Жава не очень признает всякие NLS_LANG и берет параметры прямо из среды обитания. И эти параметры оказываются неверными. Этот «хак» подходит для любых IDE, написанных на этом чудесном кросс-платформенном языке и использующихся для разработки под Oracle.

И вот ещё одна ссылка по которой можно почитать чуть более объемное описание проблемы и способы её решения. Отличный статья, рекомендую.

...тем же вечером...

Продолжая копать в нужном направлении, нарвался на SqlDeveloper, выпускаемый Oracle. Который не несет в себе столько уг, как jDeveloper. При установке был капризен и требовал путей к jvm, не смотря на то, что она была прописана в PATH. Ещё пытался (неудачно) создавать файл jdk в дирректории ~/.sqldeveloper/ и писать туда этот самый путь, чтобы не спрашивать каждый раз при старте. Но что-то у него не задавалось. Пришлось создать ему этот файлик, раздать на него 777 (на всякий случай =) и вот тогда, он туда уже всё написал.

Ну и баг NLS data files лечился тем же способом. В sqldeveloper.conf добавились те же магические строки =) Вот такой вот он...ЫнтЫрпрайз.

воскресенье, 6 апреля 2008 г.

Авиабилет Москва-Амстердам-Москва.

Сегодняшняя заметка носит запоминательный характер для меня и, возможно, пригодится кому-то из читателей.

В свете того, что мне понадобилось слетать в Амстердам =) я начал искать самую бюджетную возможность добраться до города...тюльпанов. Самолетом. В одном вменяемом агентстве мне поведали, что в Амстер летает много авиакомпаний. Просто многие из них с пересадкой в каком-нибудь европейском городе. Вот список тех, кого пробивал я:

  • Аэрофлот (без пересадки)
  • KLM (различные варианты)
  • AlItalia (с пересадкой)
  • SAS (с пересадкой)
  • LOT (с пересадкой)
  • SwissAir (с пересадкой)

Далее я аккуратно просчитал билет на одинаковые даты во всех авиакомпаниях. К сожалению, цены я тогда не переписал, а сейчас билет на те же даты стоит уже по-другому. Но в итоге я отправился за билетами в SAS, т.к. их вариант (14 т.р.) оказался самым выгодным с точки зрения времени вылета/времени полета/цены. Такой же, но беспересадочный рейс у KLM стоил на 2 т.р. дороже.

Надеюсь, что качество сервиса будет на сколько-нибудь приличном уровне и я не подпаду под статью "скупой платит дважды" =)

пятница, 4 апреля 2008 г.

Ubuntu 8.04 beta. Шаг вперед, два шага назад.

Зачем обновляться до beta?..

Угораздило меня попасть на сайт убунты, и увидеть там "25 дней до релиза". Потом угораздило прочитать в каком-то блоге об успешном обновлении до бетаВерсии. До этого читал, что человек обновился до альфы, и ему всё нравится.

Вечер был свободный ;) Поэтому и я набрал update-manager -d и смело нажал "Обновить". Убунта честно предупредила, что обновляться будет до беты, что качать придется метров 900 и что вообще всё опасно. Пути назад не было =)

Я думал, что процесс пойдет автоматически, поэтому пошёл пить чай, однако, вернувшись, я обнаружил диалоговое окошко с вопросом "Какой из конфигов использовать для ..." И таких вопросов мне задали много. Т.е. не уходите пить чай, а вдумчиво следите за обновлением. К тому же это процесс поинтереснее дефрагментации диска ;)

И что в итоге?..

В принципе, все изменения отражены в changelog'ах, поэтому я приведу лишь субъективные впечатления.

  • Пропал звук. Устройств, на которые можно подавать звук в системе обнаружено не было. Проблема была в ядре, оно обновилось спустя 4 дня. Звук появился. Ура.
  • В системе поселился Tracker, который активно за мной следит. И всё время всё индексирует. Пока я с ним не общался на предмет индекса, но лишний значок в трее заметил ;)
  • FireFox обновился до 3b4, следовательно, половина add-on'ов стала неработоспособной. Особенно мне не хватает FireBug и Del.icio.us-плагина. Ставить "check for version compatibility" в "none" мне не хочется. В прошлый раз плохо закончилось =) Подождем...
  • Слетела тема MacOsX (надеюсь, не палюсь ;) Правда не целиком, а только частично. Оччень весилит
  • Есть ощущение, что система дольше грузится. Надеюсь, после релиза ей полегчает

Вообщем, это хороший такой LTS-релиз, т.е. без наворотов и революций. Обновление прошло почти успешно, полет нормальный. Ждем релиза.

среда, 26 марта 2008 г.

Как я подСел на подКасты.

Сегодняшняя микрозаметка будет посвящена подкастам, кои я открыл для себя совершенно недавно. Дело, кажется началось с Хабра, на котором подКастам отведен отдельный тег, где они кучкуются. Вообщем, в очередной раз увидев на главной странице новость о выходе очередного подкаста, я решил послушать о чем же говорят люди. Послушав, кажется, об ИнтернетМаркетинге, я жОсктко вдохновился и понял, что подКасты являются идеальным заполнителем рыхлого времени, которое, обычно, забивается музыкой. Или, если совсем всё плохо, радио

Но не удобно же, блин качать их по ссылкам и заливать в телефон руками. Поэтому, пошерстив безнадежный рунет, нашел на забугорном сайте более или менее приличную таблицу сравнения. Прошерстив и её, выбрал самое банальное - gPodder, который в Убунте ставиться apt'ом.

GPodder умеет уже многое. Конечно с багами и прочим, но это джедаям опенСорса не помехи. Например, он может синхронизировать подкасты с плеером или iPod'ом. Мой телефон он принял за плеер и удачно залил на флешку то, что скачал. Правда с русскими кодировками у него плохо. И файлики называются _____.__C___.mp3. Но это тоже не пугает джЕдаев =)

А разжиться подКастными RSS-лентами я сумел на rpod, где их превеликое множество. Приводить список выбранных мною я не буду...мания величия у меня сегодня не в пике.

четверг, 13 марта 2008 г.

Ubuntu. Проблема с кодировкой CD/DVD дисков.

Давно возникал вопрос, почему на вставленных cd/dvd дисках папочки с русскими названиями были представлены знаками вопроса. В связи с тем, что дисками я не часто пользовался, я на это забивал =) Ну а если не забивал, то пробирался по диску вслепую =)

Ответ был подсмотрен в убунтарии на хабре. Вся (грустная) правда в том, что диски монтируются в неизвестной кодировке. Чтобы ситуацию поправить раз и навсегда, стоит открыть на редактирование /etc/fstab и дописать там в опциях монтирования оптоДисков iocharset=utf8

П.С. Больше трех месяцев в Ubuntu. Полет нормальный =)

четверг, 28 февраля 2008 г.

Обо всем по-немногу. Firefox, AMR, ExtJS.

Прошу прощения у читателей/подписчиков за продолжительное отсутствие. Проекты съедают много времени. Что не съедает работа, догрызает свое дело. Свет в конце тоннеля пока не виден, поэтому учимся жить в условиях ограниченного времени.

Сегодняшняя заметка будет очень короткой, но информативной. Посмотрим на пару улучшений, которые я давно хотел описать

Конвертация AMR и 3gp.

Я часто пользуюсь диктофоном на мобильном телефон. Во-первых, потому что не всегда есть возможность достать бумагу и ручку, а во-вторых для того, чтобы хранились логи встреч, которые потом можно послушать, если забыл что же было решено по итогам встречи ;)

Я не помню уже, чем конвертировал из amr в mp3 под Windows, но под *nix искать программу долго не пришлось. Попробовав несколько самопальных скриптов, некоторые из которых опасны для жизни файлов ;) я остановился на программе Mobile Media Converter (ссылка внизу страницы, между гуглоРекламой, долго искал =). Программа с самым банальным интерфейсом и тем очень удобна. Умеет работать с amr и 3gp, а большего мне и не нужно.

Знаменитый баг Firefox

С этим багом я столкнулся сразу же после установки Ubuntu. Это тот самый знаменитый баг, из-за которого хоткеи не работают в русской раскладке. Его уже поправили (за деньги), но исправления будут только в Firefox 3. А пока, необходимо установить маленький add-on, который всё вам поправит. И будет шастье =)

Небольшой багФикс для ExtJS

Замешивая полный винегрет из тем, упомяну ещё одну вещь. Все знают, что ExtJS можно заставить говорить по-русски в окошках/менюшках, просто подключив файл с русской локалью. Но в нем есть один неприятный и редкий баг. При работе с DateField, когда выставляется формат содержащий месяц прописью (янв, фев и пр.), мы получаем январь 1970 года и ничего кроме.

Вся проблема кроется в массиве Date.monthNumbers, в котором содержатся неверные короткие имена. Надо просто заменить его на следующий:

Date.monthNumbers = {
  Янв : 0,
  Фев : 1,
  Мар : 2,
  Апр : 3,
  Май : 4,
  Июн : 5,
  Июл : 6,
  Авг : 7,
  Сен : 8,
  Окт : 9,
  Ноя : 10,
  Дек : 11
};

На сегодня — всё. Надеюсь, что скоро станет посвободнее и я допишу туториал по ExtJS и гридам с фильтром и поиском =)

понедельник, 28 января 2008 г.

Управление сторонними библиотеками в Subversion.

В этом блоге я ни разу не постил переводы. Повода не было. Но вот в RSS пробежала статья, описывающая правильное управление внешними библиотеками в Subversion. Она мне настолько понравилась, что я решил опубликовать её вольный перевод. К сожалению, времени потестировать рецепт у меня не было, поэтому буду переводить "as is". Если заметите какие-нибудь неточности, отпишите в комментах, исправлю.

Subversion Externals

В Subversion существует удобный механизм управления внешними библиотеками, который позволяет автоматически экспортировать код из других репозиториев в рабочий проект. Это svn:externals. Этот пост создан в качестве напоминания самому себе, о том, как это реализовать. Потому что каждый раз забывая, я вынужден гуглить. А решение, к которому я прихожу каждый раз одно и то же.

Для начала, предположим, что у нас в репозитории есть папка lib/, и мы хотим положить в неё код из папок library/ и incubator/library/ проекта Zend Framework. Конечная структура папок выглядит следующим образом:


myApplication/
    lib/
        incubator/Zend/
        Zend/

Для этого необходимы следующие заклинания:


$ cd lib/
$ export SVN_EDITOR=vim
$ svn propedit svn:externals .

(Разумеется, стоит заменить vim на редактор, привычный Вам)

В запустившемся Vim'е (emacs'е, nano) необходимы следующие строки:


incubator http://framework.zend.com/svn/framework/branch/release-1.0/incubator/library
Zend http://framework.zend.com/svn/framework/branch/release-1.0/library/Zend

Стоит отметить, отметить, что release-1.0 это текущий релиз ZF, а следующий будет release-1.5. Если вам необходима текущая версия ZF 1.5, то это будет release-1.5PR

Сохраняемся, выходим из редактора и видим следующее сообщение:

Set new value for property 'svn:externals' on '.'

Вот и всё! Не забываем закоммититься и теперь для поддержания ZF в состоянии актуальности не забываем запускать svn up.

среда, 23 января 2008 г.

ExtJs. Многостраничный грид с фильтром и поиском. Часть 1.

Просматривая статистику поискового трафика, любезно предоставленную мне feedburner'ом, я замечаю, что основная масса трафика идет на тему ExtJS. Мне не совсем понятен этот момент ;) Обычно, когда мне что-то надо узнать по ExtJs, я двигаю на их форум. Потому что именно там собрана вся информация, которая вообще может пригодиться (после документации, конечно). В гугле я ищу только конкретные ошибки, которые выдает мне FireBug. Потому что поисковая система форума далека от идеала.

Но, в свете того, что я чуть подправил вектор своего блога и ориентируюсь на пользователей больше, чем раньше, я начну серию статей, посвященных ExtJS. А точнее одному удобному виджету, который может быть применен во множестве ситуаций. Речь идет о многостраничном гриде с поиском и фильтром.

Работая с ещё с ExtJS 1.1, я нашел замечательный топик, в котором рассказывалось о подобном гриде. И приводился замечательный пример. В этом примере всё отлично. Но он написан на первой версии и использует в качестве бэк-энда python. В этой серии туториалов я опишу создание такого же грида, с использованием ExtJS 2.0, php5 и Oracle (для MySQL будут приведены примеры запросов, не сильно отличающиеся от ораклинских).

В этой заметке я лишь опишу примерную структуру будущего виджета, а в дальнейшем приведу код с комментариями и пояснениями.

Итак. Наш грид будет состоять из:

  • grid.html - html-файл, содержащий разметку страницы
  • grid_data.php - файл, обслуживающий запросы к БД со стороны грида
  • grid.js - js-файл, содержащий основной код приложения

Архитектура будет банальной. Наш грид посредством AJAX-запросов, будет обращаться к php-файлику и тот будет передавать ему данные в формате JSON. Запросы к БД будут всего двух типов:

  • Запрос очередной страницы с данными
  • Поисковый запрос

Для простоты демонстрации, не будем сильно усложнять поиск и обойдемся LIKE. Но никто не мешает реализовать сложную поисковую логику. Просто это выходит за рамки этой серии статей. Ну а постраничная разбивка - это совсем просто (хотя на Oracle - чуть сложнее)

На сегодня всё. Stay on line.

воскресенье, 13 января 2008 г.

О синхронизации Google Calendar с телефоном.

С тех пор, как я последний раз поднимал эту тему, прошло немного времени, однако любезный Dragonhorse отписал в комментариях ссылку на вторую версию GCalSync'а. Напомню, что это маленькая JavaMe программка, которая устанавливается на телефон и синхронизирует календарь на телефоне с Google Calendar. В качестве ее недостатка можно было выделить лёгкую "глюкавость" и невозможность синхронизировать несколько гугло-календарей.

В связи с этим я спокойно пользовался goosync'ом в его бесплатном исполнении. Однако, во второй версии программы, был доработан интерфейс, убрана "глюкавость" (каких-то багов ещё добавили, конечно =) и, самое главное, была реализована возможность синхронизации с двумя и более гугло-календарей.

Таким образом, не вижу смысла более пользоваться GooSync и перехожу на неё. Ещё раз спасибо, Dragonhorse.

Для обладателей Motorola A1200 (и каких-нибудь ещё), привожу рецепт по преданию программе работоспособности, потому что без рецепта телефон запрещал ей читать календарь.

  1. Качаем .jar файл с программой
  2. Устанавливаем программу на флешку
  3. Подключаем телефон к компу и ищем на флешке файл .system/java/DownloadApps/MIDletxxx/registry.txt
  4. Меняем Domain: untrusted на Domain: Manufacturer
  5. Меняем Is-Trusted: 0 на Is-Trusted: 1
  6. Меняем DRM-Mode: Forbidden на DRM-Mode: Allowed

После этих манипуляций, телефон начнет доверять программе и они подружатся. А мы получим двухстороннюю синхронизацию мобильного телефона и google calendar. Что не может не радовать =)

пятница, 11 января 2008 г.

del.icio.us, как хранилище информации в системе GTD.

С тех пор, как я прочел книгу Дэвида Аллена "Getting things done", прошло уже достаточно времени. Я прикипел к ThinkingRock со всеми его фишечками и прикрученным календарем, поэтому на другие GTD-системы я смотрю, сравнивая их с тем, что есть в ThinkingRock. Единственное, с чем я не до конца определился — это хранилище информации.

Дэвид Аллен рекомендует использовать шкаф с папками. Создавать по папке на каждую тему, упорядочить их по алфавиту и хранить в шкафу. В такой системе меня не устраивает пара моментов:

  • Громоздкость
  • "Оффлайновость"

В силу того, что большая часть моей работы проходит через комп, и большая часть информации идет в цифровом виде, мне необходимо цифровое хранилище информации. Блуждая по зарубежным ресурсам (тут можно привести длинный список), я наткнулся на очередное эссе на тему "Моё ГТД", в котором упоминается макосовский софт DEVONthink, который я попробовать не смог в силу его макосОвости и небесплтатности. Но судя по заверениям создателей и личным впечатлениям автора эссе (а он, судя по всему, завсегдатай известного макОсно-ГТДшного блога 43Folders, т.е. ему верить можно ;) софт достойный.

Убедившись в очередной раз, что надо либо ставить MacOSX на PC (фи), либо покупать Mac (о, да), и поняв, что отдавать деньги в очередной раз не хочется, я решил подумать ещё раз =)

Вторая дума (по мотивам того же эссе) занесла меня на backPack. Опять же, основываясь на заверениях автора эссе и создателей сервиса, пришел к мысли, что сервис хороший. Только, он платный. Точнее есть бесплатный вариант, но настолько урезанный, что способен только заманить на платный аккаунт. А жить на нем невозможно. Это понимаешь только после бесплатной регистрации. Но попробовать его стоит. Может кому сильно понравится, и он останется там жить ;)

После нескольких часов поиска, я вспомнил про del.icio.us, который я использовал как временное пристанище для ссылок и периодический источник полезных линков. И его тэги показались мне вполне удачной идеей.

Не мудрствуя лукаво, я решил сотворить из него information storage для он-лайн статей. Есть, конечно, вероятность, что статьи канут в лету, но кэш гугла останется с нами. И, имея нормальное название статьи и линк на неё, можно у гугла будет попросить показать последнее, что он об этой странице запомнил ;)

Помня, что лучший "упорядочиватель" — это время, я решил не слишком углубляться в создание сложной структуры тэгов. Я пробежался по всем закладкам, благо их было около сотни, стер те, что были устаревшими или более не полезными, и "заТэгил" те, что остались. В процессе "тэганья", я выделил несколько основных направлений, по которым я буду (предположительно) складировать информацию и вывел их наверх (@development, @nix и пр.). Далее, я создал пару тэгов ещё повыше ;) (@@print - распечатать и @@parse - изучить). Оглядев сложившуюся систему, я поудалял тэги, в которых было по одной записи, сократив их число ещё чуть. Таким образом, получилась довольно стройная система. Разумеется, она будет изменяться. Возможно будут появляться новые верхнеУровневые тэги.

Результатом я остался доволен. По-крайней мере часть хранилища у меня есть. Если найду более универсальный способ - обязательно расскажу

Что касается хранилища оффЛайн-информации, то в субботу поеду за папками и файлами и наклейками =) Посмотрим, что из этого получится. Главное купить побольше, чтобы можно было беспроблемно выкидывать ;)

понедельник, 17 декабря 2007 г.

ThinkingRock и pocketMod.

К программке thinkingRock я уже привязался, и привык запускать её каждое утро, чтобы сориентироваться "на местности". И периодически запускать в течение дня, чтобы понять правильно ли я двигаюсь ;)

Но моя радость была бы не полной, если бы программка не позволяла делать отчеты, которые можно печатать на бумаге. И носить с собой. Учитывая стоимость одного листа бумаги, даже с тонером, можно предположить, что решение довольно оправдано. Но самым неожиданным для меня было то, что программка умеет делать pocketMod. Т.е. маленькие такие книжечки. Которые удобно таскать с собой. Правда настройка не очень тонкая, но жить можно. Всё самое важно можно вытащить.

Для тех, кого решительно не устраивает половинчатый подход к делу, есть ещё одна возможность. Помимо pocketMod, программа позволяет создавать отчеты в PDF. На листах формата A4. Здесь уже возможностей настройки больше. Но таскать с собой A4 не с руки. Можно было бы напечатать их по 4-8 на листе, резать, клеить. Но это уже не 2 минуты =) Здесь нас выручит программка PDF2PocketMod, которая умеет создавать pocketMod-блокнотики из любого документа. Лишь бы страниц было много. Правда она в альфа-версии и вообще. Но она работает ;) А больше и не надо

пятница, 14 декабря 2007 г.

В поисках "серебряной пули" для GTD. Часть 2.

Синхронизация с большой буквы Си

В первой части этой серии статей, посвященных поиску инструментов для внедрения GTD я рассказал про замечательную программу ThinkingRock. До сих пор я в ней не разочаровался и пока всё идет по плану ;).

В этой части я расскажу о синхронизации ThinkingRock с Google Calendar. Для создания этой связки есть две причины:

  1. Доступ запланированным мероприятиям из любой точки при наличии интернета
  2. Удобная синхронизация с мобильным телефоном (об этом в следующей части)

Для осуществления синхронизации, я буду использовать следующие программы:

  1. SunBird (в качестве альтернативы м.б. использован ThunderBird с plug-in'ом, Evolution, Rainlendar и вообще любые календари, которые воспринимают формат .ics)
  2. GCalDaemon - программа-демон, осуществляющая синхронизацию
  3. Сам Google Calendar =)

Настраиваем ThinkingRock

Предположим, что вы начали использовать ThinkingRock (или начнете =). Одной из его опций является ведение файла в формате .ics, в который он пишет все запланированные события и ToDo-лист. Для включения этой опции надо прогуляться в меню "Tools->Options", далее на вкладку "Miscellaneous", где открыть пункт "Calendar" и поставить там "галочку" "Publish iCalendar file". Далее необходимо задать путь до папки, где ThinkingRock будет держать наш файл. Если ThinkingRock установлен на флешке, то и файл с календарем стоит держать там же.

Как вы помните ThinkingRock кроссплатформенное приложение, написанное на Java. И из одной копии может грузиться и под *nix и под Win, и настройки у него для ОС разные. Поэтому если вы работаете и там, и там, необходимо будет проделать вышеописанную процедуру два раза. Из-под Win и из-под *nix. Ну или, для эстетов, из-под MacOSX =)

Теперь в указанном месте у нас будет жить файлик gtd.ics, который ThinkingRock будет обновлять по мере сохранения или изменения событий.

Настраиваем календарь

Я буду приводить пример настройки SunBird, но ту же процедуру можно выполнить в любом календаре, способном подхватывать ics-файлы.

Открываем SunBird, открываем "Файл->Подписаться на удаленный календарь..." В открывшемся мастере выбираем "В сети" (Далее) "Формате iCalendar" и в качестве адреса прописываем путь к нашему файлу "file:///E:/thinkingRock/gtd.ics" В результате наших манипуляций, должен подгрузиться новый календарь.

Надо заметить, что ThinkingRock'у абсолютно фиолетово что там происходит с файлом. Он просто его переписывает. Поэтому, если вы внесли правки в календарь на стороне SunBird, при следующем акте сохранения ThinkingRock, это изменения будут удалены. Это в принципе и неплохо. Мне больше нравятся централизованные инструменты.

Достаем клей

Теперь надо приклеить нашу связку к Google Calendar. Для этого скачиваем GCalDaemon для нужной нам платформы. Он тоже на Java и тоже ацке кроссплатформенный =) Теперь, в принципе, можно прекращать читать нудный текст, а двигать на сайт и осваивать там процесс установки в картинках.

Когда зарябит в глазах от всевозможностей этой программы и она заработала у вас как демон (служба Win) или просто заработала (хотя демон предпочтительней), можно обратиться к настройкам. Путем длительных махинаций с конфигурацией и календариками, было выяснено, что удобнее всего выставлять file-based synchronization (пример, правда для Rainlendar, но смысл от этого не меняется) и начинать считать, что у нас модем (file.offline.enabled=true). Тогда GCalDaemon работает практически безошибочно и не перетирает гуглом локальный файл в случае изменения. Все настройки удобнее всего править через Config Editor.

В результате, мы имеем:

  1. ГуглКалендар, доступный нам откуда угодно
  2. Файлик ics, погружаемы куда угодно
  3. StandAlone-календарь, если, вдруг, надоел web-interface
  4. Оно всё одинаковое и синхронизируется =)

С чем нас и поздравляем. Продолжение следует...

понедельник, 10 декабря 2007 г.

В поисках "серебряной пули" для GTD. Часть 1.

Практически в день публикации предыдущей записи про инструменты GTD, на просторах зарубежного (австралийского ;) интернета была обнаружена любопытная программа, названная своими создателями ThinkingRock. В вольно-дословном переводе название это означает "Камень для размышлений". На мой взгляд очень удачная метафора, да и на splash-скрине присутствует размышляющий человечек.

Если вы читали предыдущий пост, то вы помните, что я всячески открещивался от "настольного" приложения, утверждая, что оно не способно предоставить достаточно свободы. Мнения своего я не изменил. Просто начал использовать ThinkinRock =). На что есть несколько очень весомых причин.

Во-первых, это Java-приложение. Т.е. оно кроссплатформенное и свободно работает под Win, Lin, Mac. И как работает! В папке с бинарниками лежат .sh и .exe, которые запускаются в соответствующих ОС. Уникальный portable, короче. Единый файл с данными, разные файлы с настройками. Вообщем, всё продумано очень здорово.

Во-вторых, это труЪ GTD приложение. Т.е. без излишеств. Сам "процесс" GTD идентичен описанному в книге. Собираем мысли в инбокс, потом прорабатываем используя привычную "схему" (картинку найти быстро не смог, те, кто "в теме" меня поймут ;) Т.е. никаких напильников и никаких отвлекающих возможностей.

В-третьих, есть документация. И примеры. И рецепты. А для тех, кому не хватило, есть форум, на котором общаются единомышленники

В-четвертых, это опенСорс. Весомый пункт =)

С положительными моментами, пожалуй всё. Теперь переходим к отрицательным. Единственным недостатком, на мой взгляд, является мобильной версии программы. Хотя, на форуме уже разработали версию для WindowsMobile, я со своим *nix на мотороле в пролете ;) Мне удалось синхронизировать календарные задания с телефоном, но для actions нужна программка.

Надежду внушает то, что приложение написано на Java и теоретически перенести его будет не дйавольски сложно, да и разработчики обещали включить это в свой RoadMap. Но пока мобильного клиента нет.

Для меня данный софт оказался подходящим по причине того, что комп - мой рабочий инструмент и я практически всегда либо с ноутом, либо за рабочей станцией. А флешка - она не тяжелая. Вообщем, если вы не евангелист веб20 и работаете за компом, попробуйте эту программку, может она поможет вам "привести дела в порядок".

П.С. Это первая из двух частей про "серебряные пули" GTD. Во второй я расскажу, как устроить хитрую синхронизацию ThinkingRock с GoogleCalendar. Ну а про синхронизацию гуглоКалендаря с мобильным телефоном я уже писал. Могу лишь добавить, что программка GCalSync, упомянутая мной, не без глюков. Хотя и позволяет синхронизировать на неограниченное время вперед и назад (у goosync только 30 дней вперед).

понедельник, 3 декабря 2007 г.

Обживаем Ubuntu 7.10 - Итоги месяца.

Тихо и незаметно прошел месяц с того дня, как я сделал первую заметку по Ubuntu 7.10. Поставил я его чуть раньше, но это "жить" в нем начал примерно тогда же.

В принципе, за весь месяц, Ubuntu ни разу не падал =) мне не приходилось сидеть в неГрафической консоли, мне не приходилось сидеть часами что-то обрабатывать напильником для возвращения работоспособности. Может это связано с большой загруженностью, может с моей нетребовательностью, как пользователя, но можно считать, что Ubuntu обжить мне удалось =).

Я не стремлюсь к тому, чтобы стать "джедаем" и повелителем консоли. Я не использую в работе vi или emacs, просто потому, что привык к несколько другим интерфейсам и не обладаю достаточным запасом свободного времени, да и желания тоже. "Может быть, когда-нибудь" мне откроется истина, я отращу бороду и буду воспринимать gnome, как "бесполезную и ресурсоемкую надстройку над консолью" =)

Одной из причин моего перехода под *nix, стало желание, как бы это выразиться, жить честно =) Т.е. не воровать софт. И здесь я выполняю план на все сто. Да, на машине стоят проприетарные кодеки, Adobe Acrobat Reader, Skype и другие неСвободные программы. Но меня это волнует мало. Эти программы я использую с "дозволения" их создателей, следовательно они в курсе, следовательно всё с моей совестью в порядке. Я понимаю, что это странная причина =) но мне, в какой-то момент времени просто стало "западло" использовать ворованный софт.

Конечно, всё далеко не безоблачно. Конечно, Ubuntu нельзя назвать дружественным-на-все-сто-любому. Но для человека, который в состоянии читать мануалы, в курсе где живет гугл, знает, что можно задать вопрос на форуме (убедившись, что тема не поднималась), Ubuntu будет доступен. Для человека, который признает, что всегда есть несколько способов решения проблем (а не только "чтобы-эксель-как-в-вЕнде") и который ищет решения проблемы, а не "привычные способы" Ubuntu будет хорошим источником таких решений.

В конце-концов, кого нам винить за то, что мы только недавно начали просыпаться по поводу Open Source (только не кидайте в меня дисками с первой слакой ;) я тоже, помню, редХат 9 ставил =), что этот вопрос начал подниматься в сфере образования только перед "вступлением в ВТО". Но начал же, и активно. А это значит, что не только *nix идет к нам с лозунгом "год линукс на рабочих столах", но и мы должны двигаться по направлению к свободе. И чем больше пользователей переходить на *nix, тем лучше он будет становиться. Главное, чтобы пользователь понял, что он МОЖЕТ принимать участи в улучшении того, чем пользуется, а не просто сидеть, смотреть на ошибку и проклинать разработчика (кто-нибудь отправлял в майкроСофт сообщения об ошибках? ;)

Короче, "сегодня мы многое поняли..." =)

Сравнение инструментов для внедрения GTD.

В последнее время я активно интересуюсь таймМанагерством. Хотя, как замечают некоторые люди, правильнее это называть делоМанагерством, так как временем управлять невозможно. Оно течет себе вперед с постоянной скоростью. И управлять мы можем лишь его наполнением.

вот с наполнением у меня как раз проблемы. Я ленив, неорганизован и ведение трех рабочих проектов и бесконечные рутинные дела часто соревнуются за место в моем мозге, заставляя меня забывать друг друга. И это служит для меня источником раздражения и фрустрации

Первым, что я прочел была книга Глеба Архангельского "Тайм Драйв", которая в простой и доступной форме излагала простые и доступные идеи. Хорошая книга, для погружения в предмет. И шаги там приводятся правильные и мысли высказываются хорошие. Всё отлично. Но чего-то мне в ней не хватило для начала совершенствования =) Может стимула там не было заложено.

Второй книгой была "Как привести дела в Порядок" Дэвида Аллена. Его методика, известная так же, как Getting Things Done (GTD), довольно известна и популярна в мире. Она породила целый пласт таймМенеджерского сообщества. Эта книга зацепила меня поболе "Тайм Драйва", не смотря на огрехи в переводе.

Третья книга, которую я ещё не дочитал, написал Стивен Кови, называется она "7 навыков высокоэффективных людей". Пока не дочитаю, сказать ничего не могу. Но уже ясно, что она ближе к "Тайм Драйву".

Вообще-то, насколько я пока могу судить =), у таймМенеджмента есть два подхода:

  • Разобраться с мелкими делами, чтобы посмотреть на свою жизнь свысока и всё понять
  • Посмотреть на свою жизнь свысока, всё понять и разобраться с понятными мелкими делами

К первой категории можно отнести GTD, ко второй книги Архангельсокого и Кови. Мне первый подход импонирует больше. Вообще, стоит заметить, что таймМенеджмент штука очень личная. Каждый должен пропустить системы через себя и выбрать то, что подходит ему. Поэтому в нем не должно быть "рецептов", а должны быть методологии. Поэтому к выбору инструментов надо относиться с точки зрения личных предпочтений, а не потому что кто-то посоветовал. Чем более персональной будет система, тем эффективнее она будет работать.

Проникшись высказанной мыслью =) я начал поиск инструмента под себя. И обнаружил их, к счастью, или, к сожалению, великое множество. Сегодня я буду рассуждать об инструментах, имеющих отношение к GTD.

Перво-наперво, займемся классификацией. Инструменты бывают трех типов:

  • Настольные приложения, которые живут в ноутбуке и все.
  • Веб-приложения, которые живут в сети
  • Бумажно-писательные, которые живут в блокнотах =)

Настольные приложения часто можно таскать с собой на флешке. А веб-приложения редко, но имеют клиентов для синхронизации со смартфонами и КПК. Еще одна неприятная деталь заключается в том, что настольные приложения сплошь и рядом написаны под Windows. Так же как и смартфоновские приложения сплошь и рядом пишутсья под Windows CE, реже под Palm и BlackBerry. Иногда вспоминают про Symbian. Я, конечно, этот вопрос не прорабатывал до конца, но картина вырисовывается именно такая.

Не так давно, я писал про интеграцию RememberTheMilk с телефоном. В принципе это выход. Но не достаточно гибкий. Так как списков дел под рукой нет. В принципе можно всегда зайти на мобильную версию rMilk, но это не совсем то, что нужно. rMilk хорош, удобен, но он не поддерживает GTD в естественном виде.

В свете того, что настольные приложения меня интересуют мало, ибо *nix и Motorola A1200, я устрою здесь небольшой смотр web-приложений, которые предлагаются в большом количестве. Далеко не все я попробовал, ещё больше я пробовать не буду, но список может оказаться кому-то полезным.

Позовите Сэнди

Одним из последних тестированных приложений была Сэнди. Сэнди - это персональный напоминатель. Работает до смешного просто. Вы отсылаете на специальный e-mail сообщение, а Сэнди их сортирует, запоминает и высылает уведомления, если что-то надо сделать. Короче, это банальная календарная система с напоминаниями. GTD представлено слабо и возможны лишь банальные toDo-листы. Вычеркнул.

Немного африканской магии в повседневной работе

Речь идет о voo2do. Сервис для "распиливания слонов на бифштексы. Одной из причин отказа от него для меня было то, что он не обновлялся с октября 2006 года. Сервис, в принципе хорош, но он тоже насквозь календарный, зато предоставляет API для использования себя в сторонних приложениях. Если есть желание повозиться с напильником, то можно посмотреть в его сторону и заточить его под себя. Может получиться неплохо. Больше API я нигде не видел. Вычеркнул.

GTD-PHP

Не слишком изобретательное название =) Это уже не сервис, а приложение, которое нужно разворачивать, имея в наличии веб-сервер и базу данных. Не стал бы его упомянать, но он он натолкнул натолкнул меня натолкнул меня на целый класс приложений, называемых WebserverOnStick. Т.е. полноценный сервер на флешке. Правда опять под Windows. Записав про сервер на флешке, вычеркиваю.

Пока неохваченные

Здесь соберу ссылки на пока непросмотренные приложения. А эту запись буду править по мере разбора

Это всё веб-приложения, заточенные под GTD. Из общего числа выбивается только GTDInbox, ибо он является add-on'ом к Firefox и изменяет поведение gMail'а.

Однофайловые приложения

Ещё один полукласс приложений. Они написаны с использованием JS, основаны на TiddlyWiki и живут на флешке или просто в файловой системе. Их, наверное, тоже много ;) но два самых часто упомянаемых это GTDTiddlyWiki и MonkeyGTD. Тоже, в принципе, вариант, но они ничем не лучше настольных приложений. Вообщем, пока не мой выбор

Бумажные версии

Ввиду того, что я не пока не планирую их использовать, приведу здесь только ссылки на проекты.

Их, конечно, больше, а это те, которые у меня осели. Да, ещё надо обязательно купить стильную записную книжку Moleskine, т.к. это сильно повысит эстетичность процесса ;)

среда, 28 ноября 2007 г.

ExtJs. Один запрос, несколько Ext.data.Store.

Не так давно я рассказывал о библиотеке ExtJs, ей же будет посвящена сегодняшняя заметка. Эта заметка расчитана на подготовленного читателя, который уже разобрался с базовыми понятиями. Но и новичку будет полезно взглянуть на то, что предлагает эта библиотека, возможно захочется стать подготовленным =) Комментарии будут подробными.

Стоит заметить, что речь пойдет о второй версии, которая сейчас значиться Release Candidate 1 и доступна для скачивания по ссылке

Сегодня речь пойдет об Ext.data.Store. Объект удачный и используется во множестве виджетов в качестве источника данных. Обычный подход заключается в том, чтобы создать подгружающий себя объект и вызывать метод load(), для его загрузки.

//Инициализируем соединение
var rCon = new Ext.data.Connection({
    //Урл "кормящего" файла =)
    url:    '/data.php',
    //Метод
    method: 'POST',
    //Параметры, которые передадутся в запросе
    extraParams: {'act' : 'get_requests'}
});
//Само хранилище
var rDs = new Ext.data.Store({
    //Прокси с соединением, созданным выше
    proxy: new Ext.data.HttpProxy(rCon),
    //"Читатель" ответов, приходящих в формате JSON
    reader: new Ext.data.JsonReader({
        //Какое свойство читать
        root: 'requests',
        //Какое свойство отвечает за кол-во записей
        totalProperty: 'total_requests',
        //Поля записей
        fields: [
        'requests_key',
        'requests_name'
        ]
    })
});
rDs.load();

Так выглядит обычное создание и загрузка хранилища. При вызове метода load() идет асинхронных запрос к серверу, получаются данные и далее с ними делается то, что нужно. Вcё замечательно. Есть одно "но". Хранилище в силу своей универсальности используется и для ComboBox - выпадающих списков в формах. А этих самых ComboBox в одной форме может быть много. У меня, например 19 =) Таким образом, реализуя приведенную выше схему, мы получим 19 асинхронных вызовов. А это не очень хорошо.

Известно, что у браузеров есть ограничение на количество одновременных вызовов. Благодаря комментариям, мы знаем, что это 3 для FF и 2 для IE. И мы получаем сильное снижение производительности. Это если не брать в расчет проблемы с обработкой 19 вызовов, и синхронизации загрузки с отображением. Ведь если не успеют загрузиться хранилища, а мы уже начнем показывать форму, будет не очень красиво.

Продумав это всё в голове, я пришел к выводу, что надо действовать по-другому. Надо наполнить все 19 хранилищ за один запрос. Поиски на форуме не привели к нахождению решения. Хотя пару идей я получил. В рецепте, приведенном ниже будет использован метод loadData(), вместо load(). Который просто загружает уже пришедшие данные в хранилище, никуда не обращаясь. Я не буду приводить код для 19 хранилищ, приведу для двух.

//Создаем record. Пригодится для "читателя" хранилища.
dsDataRecord = new Ext.data.Record.create([
//Пишем название свойства и мапим его
//на второй элемент массива пришедших данных
{name : 'data_key', mapping : 1},
{name : 'data_name', mapping: 2}
]);
//Хранилище номер раз.
dataStore = new Ext.data.Store({
    //Читатель на этот раз "массивный" а не JSON =)
    reader: new Ext.data.ArrayReader({
        //Первый элемент массива для упорядочивания. Он уникальный.
        id: 0
        //Наш record.
    }, dsDataRecord)
});

//Создаем record. Пригодится для "читателя" хранилища.
dsDigitRecord = new Ext.data.Record.create([
//Пишем название свойства и мапим его
//на второй элемент массива пришедших данных
{name : 'digit_key', mapping : 1},
{name : 'digit_name', mapping : 2}
]);
//Хранилище номер два.
digitStore = new Ext.data.Store({
    //Читатель на этот раз "массивный" а не JSON =)
    reader: new Ext.data.ArrayReader({
        //Первый элемент массива для упорядочивания. Он уникальный.
        id: 0
        //Наш record.
    }, dsDigitRecord)
});
//AJAX-запрос на все данные
comboStoreRequest = Ext.Ajax.request({
    //Урл "кормящего файла"
    url: 'data.php',
    //В случае успешного запроса
    success: function(result){
        //Преобразуем JSON-ответ в объект
        comboStore = Ext.util.JSON.decode(result.responseText);
        //Загрузим массив данных первое хранилище
        dataStore.loadData(comboStore.data);
        //Загрузим массив данных во второе хранилище
        digitStore.loadData(comboStore.digit);
    },
    //Метод
    method: 'POST',
    //Параметры вызова
    params: {act : 'get_data'}
});

Приведенный код тоже не слишком сложен. Самое интересное, для меня, было сформировать теперь выдачу с сервера JSON-данных, чтобы их "прожевал" ArrayReader. И сделал из них массивы, приемлемые для загрузки в хранилище.

На основе документации, можно прийти к выводу, что ArrayReader ожидает данные в виде объектов вида:

[[1, key1, name1],[2, key2, name2],[3, key3, name3]]

Значит в PHP нам необходимо иметь массив, повторяющий приведенную структуру и применить к нему json_encode()

<?php
//Массив с данными
$data_array[] = array(1, "data_key1", "data_name1");
$data_array[] = array(2, "data_key2", "data_name2");
$data_array[] = array(3, "data_key3", "data_name3");
//Выводим JSON-массив
echo json_encode($array);
?>

Первый пункт выполнен. Этими данными вполне можно "накормить" один ArrayReader. А у нас их два. А ответ от сервера один. Значит надо наши массивы упаковать как свойства объекта. И обращаться к ним при загрузке в хранилище. Для этого на сервере нужен следующий PHP-код:

<?php
//Первый массив
$data_array[] = array(1, "data_key1", "data_name1");
$data_array[] = array(2, "data_key2", "data_name2");
$data_array[] = array(3, "data_key3", "data_name3");
//Второй массив
$digit_array[] = array(1, "digit_key1", "digit_name1");
$digit_array[] = array(2, "digit_key2", "digit_name2");
$digit_array[] = array(3, "digit_key3", "digit_name3");
//Собираем всё в один массив.
$data = array('data' => $data_array, 'digit' => $digit_array);
//Выводим окончательный ответ.
echo json_encode($data);
?>

Готово. Теперь мы передаем JSON-объект с двумя свойствами, которые являются массивами данных. И мы можем загрузить их в наши dataStore. Задача выполнена =)

вторник, 27 ноября 2007 г.

Javascript библиотека ExtJs.

Не помню, писал ли я или нет, но в последнее время я плотно использую javascript библиотеку ExtJs. Для начала опробовал её для административной панели небольшого проекта, когда ExtJs была ещё версии 1.x. Потом применял её виджеты в frontEnd проектов покрупнее, тоже в версии 1.x. Теперь перешел на ExtJS 2.0RC1 в основном проекте. И с нетерпением жду релиза второй версии.

Если говорить о возможностях, предоставляемых библиотекой, то они всеобъемлющи. Если начать перечислять по памяти то, что я использую сам то получиться так:

  • AJAX, интегрированный на всех уровнях, контроллируемый с небывалой легкостью.
  • Гриды (продвинутые таблички) для данных разных модификаций и видов
  • Деревья с возможностями drag'n'drop и lazyLoad (загрузка только необходимых узлов с помощью AJAX)
  • Всевозможные Layout'ы для построения как отдельных кусков страниц, так и целых приложений
  • Формы с валидацией на стороне клиента, в которые можно и подгружать данные (AJAX) и сохранять асинхронно (опять AJAX ;)

Это лишь малая часть того, что может и умеет библиотека, на странице с примерами можно всё разглядеть поподробнее. И приступать к обучению

У библиотеки достаточно крутая кривая изучения, но она оправдывает себя в полной мере. На русском языке я знаю три ресурса, которые уделяют ей внимание это:

  • Гугл-группа ru-ExtJs — наиболее объемный источник информации
  • ExtJS по-русски — один из первых сайтов по тематике на русском языке, к сожалению, редко пополняется. В последнее время это статьи из...
  • Alpha-Beta-Release Blog — блог, посвященного веб-разработке во многих её ипостасях. Довольно интересные материалы, рекомендую.

Может быть я что-то упустил, но гугл до сих пор считает, что я искал extys и всё остальное — это единичные статьи и захабренные/бобренные сссылки.

Самым главным источником информации по ExtJs можно считать форум, который, естественно, англоязычный (хотя иногда встречаются китайские треды и русский код ;). Атмосфера на форуме очень хорошая, объясняют очень понятно, код приводят и вообще замечательное сообщество в плане помощи в обучении.

Помимо форума, на том же сайте можно найти раздел с туториалами, из которых можно получить базовые знания. К сожалению, в свете выхода новой версии ExtJs, много информации потеряло актуальность.

Ну а самым продвинутым и полным источником можно считать документацию. Там есть всё, иногда даже примеры реализации =) Она всегда должна быть под рукой во время разработки. Слишком уж много методов и свойств у каждого из объектов ExtJs.

Что касается лицензии, то ExtJs придерживается достаточно распространенной в последнее время двойной политики лицензирования. Есть вариант LGPL и есть коммерческая лицензия, сопровождаемая поддержкой и прочими благами в обмен на деньги =) Выбор — это всегда приятно.

понедельник, 19 ноября 2007 г.

Постраничная разбивка с Oracle.

Ни для кого не секрет, что Oracle - это труЪ =) Но когда я "проапгрэйдился" на проекте до него с MySQL, то я не нашел там привычного сердцу LIMIT 0, 20 и расстроился. Как же так. Самая лучшая БД, а такой полезной функции нет.

Разбираясь с ExtJS, где для грида мне эта постраничность и была нужна, я наткнулся на тред, где приводилось вменяемое решение для моей проблемы и с успехом его применял.

В приведенном решении меня не устраивало 3 вещи:

  1. Для подсчета строк надо делать отдельный запрос
  2. Глючит при хитрых ORDER BY
  3. DBA сказал "мутная весчь этот rownum" =)

Решение было найдено довольно быстро. И оно было избавлено от всех 3х недостатков. Вместо "мутного" rownum была применена функция row_number(), которая дала нужный результат. Плюс доработав запрос, я получил в нем и колличество строк. Правда оно пишется в каждой строке ответа, но нам же оно нужно для постраничной разбивки, поэтому заботиться о количестве данных, передаваемых по сети не стоит. Вот готовый рецепт:
select * from ( select ROW_NUMBER() over(order by req.requests_date desc) as r,
count(tab.id) over() as total,
from table tab,
where tab.column = 'value'
) x
where x.r between '" . ($start + 1) . "' and '" . ($start + $limit) . "'

Ссылка на документацию по Oracle может внести дополнительную ясность, от себя добавлю лишь, что в over() пишем все ORDER BY, $start и $limit это с чего начинать(начинаем с 0) и на чем остановиться (передается количество записей на страницу). count() должен применяться на unique поле (что характерно ;). Вот, в принципе, всё. Если остаются вопросы или предложения по оптимизации — прошу в комменты.

пятница, 16 ноября 2007 г.

Subversion. Установка и настройка. День второй.

Вводная

Сегодня будем заниматься кристаллизацией workflow. Т.е. пытаться понять, как именно врезать svn в процесс разработки. Я уже приводил свои мысли на этот счет. Мои идеи были сформированы под воздействием пары веток форума и нескольких невнятных статей ;). Правда совершенно недавно я наткнулся на статью. в которой есть даже картинка ;) Но в этой статье описана теория (зато есть картинка, очень наглядная). Меня же в силу неМифических сроков сдачи интересует практика. К ней и приступим.

Настраиваем Eclipse 3.3

Первое, что пришлось сделать - установить права на папку /var/www и все её подпапки. На запись права были только у рута, это мы изменили, набрав в терминале chmod -R 777 /var/www. Теперь право на запись есть у всех, и мы можем спокойно с ней работать из Eclipse. Второе, что пришлось сделать, это установить права и на папку /vwr/svn/, набрав ту же команду. На будущее стоит запомнить, что репозитории и папки с проектом лучше держать у себя в домашней папке. Или в той, от имени кого запускается Eclipse. В принципе, можно было сделать и gksudo eclipse, но это как-то совсем против правил =)

Далее — маленький фокус. Нужно настроить папку с workspace Eclipse таким образом, чтобы разработка шла по созданным выше адресам. Т.е. текущий проект Eclipse (в моем случае) должен разрабатываться в папке /var/www/dev/. Для этого меняем workspace: "File->Switch Workspace->Other". А в окошке пишем /var/www.

Теперь надо настроить репозиторий. Переключившись на perspective SVN Repository (доступную после установки subClipse), тыкаем правой кнопкой на левой части окна и выбираем "New->Repository Location". В появившемся окне пишем file:///var/svn/, или где там у вас хранилище. Должно случиться чудо, и отобразиться структура хранилища. У меня, в силу вчерашнего дня отобразилось следующее:

  • file:///var/svn/
    • project_name
      • trunk
        • index.php 1

Checkout

Связь есть, надо делать checkout. Т.е. забирать текущую версию из репозитария себе. На доработку. Правой кнопкой на "папке" trunk и в меню выбираем "Checkout..." В открывшемся окне стоит установить верхний радиоБатон в положение "Checkout as a project in the workspace" и вписать имя проекта "dev". Таким образом, мы получим настроенный ранее в Apache структуру /var/www/dev/, которая будет доступна из браузера по http://localhost/. Отлично.

Commit

После того, как файл появился у нас в workspace, можно его отредактировать. Перейдем на perspective PHP (она пришла вместе с PDT) и отредактируем файл. Напишем что-нибудь веское, чтобы доказать себе, что оно работает ;) Теперь в левой части окна, в PHP Explorer, который отображает нам workspace, кликнем правой кнопкой на этом файле и выберем "Team->Commit..." На что получим предложение написать что-нибудь для истории, выбрать файлы, которые необходимо закоммитить и нажать "OK".

Можно приступать...

Вот, в принципе, и всё, что я хотел узнать за сегодня. Если дойдут руки, надо будет написать внятную и подробную статью где-нибудь на Хабре (и прославиться ;), с картинками красивыми и прочим. Но это будет не раньше, чем я отшлифую навыки пользования этой связкой. Ну и на проектах не будет посвободнее в плане времени. Т.е...видимо не скоро =)