понедельник, 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".

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

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

четверг, 15 ноября 2007 г.

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

Допивая крепкий чай, глядя на снег за окном, я занимаюсь тем, до чего руки не доходили уже...наверное год. Разворачиваю репозиторий и учусь с ним обращаться. Откопав где-то в закромах "Pragmatic Version Control using Subversion", понимаю, что без этой книги было бы намного сложнее ;)

Install

До того, как установить svn, я установил Apache2.2, PHP5 и MySQL5. Вопреки всем своим привычкам, просто не захотев долго возиться, я устанавливал их через apt-get install и понял, что больше этого делать не буду. Очень уж сложно искать по системе где спрятались конфигурационные файлы, как они разбиты и что вообще происходит.

После этого, через тот же apt-get install subversion, установил svn. С ним проще, svn из исходников я не собирал и мне под него подстраиваться не надо =). Ну а чтобы subverion'у не было скучно и, просто из любопытства, я установил следующие пакеты:

  • nautilus-script-collection-svn - скрипты для правой кнопки мыши в Nautilus, что-то вроде TortoiseSVN для *nix
  • python-svn - просто ещё один визуальный клиент для svn написанный на Python
  • rapidsvn - очередной визульный клиент
  • subversion-helper-scripts - набор shell-скриптов, упрощающий жизнь хранителя хранилища =)
  • subversion-tools - ещё один набор вспомогательных скриптов
  • svn-workbench - ещё один визуальный клиент
  • websvn - модуль для web-представления репозитария, написанный на PHP, быстро заработавший после короткой настройки. Показал мне пустое хранилище ;)

Как видно из набора пакетов, я ещё не определился с чем буду работать. Надо сказать, что как латентный виндузятник, я надеялся на средство визуального ухода за репозитарием. И не нашел его. Я думаю, что это отпугивает многих, приходиться читать маны. И на это не всегда хватает терпения.

Setup

Я не буду описывать процедуру создания двух папок для Production и Development версий проекта, настройки виртуальных хостов на разных портах. Скажу только, что у меня есть две папки /var/www/dev/ и /var/www/prod/ с вполне говорящими названиями. А доступ к ним идет через http://localhost/ и http://localhost:8080/ соответственно.

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

Для начала хранилище надо создать. Где угодно. Я предпочёл /var/svn/, чтобы поближе к ServerRoot Apache2, чтобы, в свою очередь, не запоминать слишком много ;). Смело пишем в терминале от рута:
cd /var
mkdir svn
svnadmin create /var/svn
Заодно запоминаем, что хранилищем руководит команда svnadmin.

Репозиторий есть. Теперь надо туда положить что-нибудь временное, чтобы потом оттуда это забрать и сделать рабочей копией ;). Сейчас стане понятней.

Создаем временную папку. Где угодно. Допустим, mkdir /home/svn_tmp. Кладем в неё файлик, допустим, index.php, в котором пишем:
<?php
echo "dev workin'";
?>
Теперь, находясь в этой папке импортим файлик в хранилище, создавая проект:
svn import -m "Creation" . file:///var/svn/project_name/trunk
Здесь "-m" - это добавление комментария, "." - это все файлы текущей директории, ну а далее идет путь к хранилищу и проект, куда надо импортировать файл.

По рекомендации умной книги (и пока еще не осознав, зачем), в папке с проектом (которая project_name) существуют три поддиректории: trunk, branches, tags. О назначении каждой из них я ещё расскажу. Кстати, неверно думать, что пойдя в /var/svn/, вы увидите там поддиректорию с проектом ;) всё хранится в псевдоБазе данных. Поэтому искать там не стоит.

Хранилище у нас есть. Проект тоже. Теперь надо сделать рабочую копию, с которой и будем работать впредь, периодически коммитя результаты в хранилище и синхронизируя с продуктивной версией. Рабочую копию я буду держать в /var/www/dev/, чтобы отлаживать было просто. И чтобы коммитить пакетами, а не после каждого сохранения. "Стоя" в папке /var/www, пишем:
svn co file:///var/svn/project_name/trunk dev
Сдесь у нас "co" - это checkout (синхронизировать с хранилищем), дальше путь и в конце название папки, где будет храниться рабочая копия. Если все прошло хорошо, то теперь у нас в папке /var/www/dev/ живет файлик index.php и скрытая папка .svn, в которой лежит мета-информация Subverion.

Это было начало пути. И, в принципе, насколько я понимаю, checkout можно было не делать. Можно было его сделать в subClipse, указав ему на репозиторий. Но это я буду проверять завтра

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

Обживаем Ubuntu 7.10 - Жжем диски.

В плане дискоЖжения, я человек развращенный Nero. Сильно развращенный. Мне нравится таскать мышкой папки. Мне нравится видеть сколько осталось места на болванке. Мне нравится Nero. Но раз уж я ушел в глубокий free-as-a-beer-софт, то сидеть дальше на Nero было бы как-то...некошерно =)

Значит надо искать что-то такое же ненапрягающее. Из разряда don't make me think. Как всегда, видимо в свете поверхностного поиска (надеюсь) и очередного обращения к подшивке LinuxFormat, было выбрано два приложения:

Судя по обзорам и статьям, эти приложения были ближе всего к Nero по духу и наиболее наполнены функционально. Конечно, сначала я поставил GnomeBaker, потому что мне совсем не улыбалось устанавливать кучу библиотек KDE, да ещё и грузить их в память при желании записать диск. И, конечно, он не оправдал моих ожиданий. Ну не совсем, конечно, не оправдал. Мне разочаровало только одно. У меня не получилось перетащить папку для записи. Файлики таскались отлично, а вот вместо папок он мне ярлычки создавал. То ли пункт меню далеко спрятали, то ли я латентный виндузятнег, то ли меня в гугле забанили, но, вобщем, я установил K3b.

И он почти не заставил меня думать. Правда он пугает сообщениями о форматировании диска...а потом говорит, что у него что-то там не получилось отформатировать, но по-крайней мере, он пишет диски. И они читаются даже под виндой. Если выбрать правильный пункт меню. У меня получилось с 3-го раза. Режим doc-совместимости мне очень понравился. 8ми-буквенные названия файлов - это сила ;)

Обживаем Ubuntu 7.10 - Домашние финансы.

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

Под Windows существует великое разнообразие подобных программ, начиная с простых и примитивных, и заканчивая серьёзными и всеобъемлющими. Под *nix я такого разнообразия не заметил. А если выбирать особо не из чего, надо брать лучшее ;) или хотя бы проверенное временем.

Потратив некоторое время на поиски, и перелопатив подшивку LinuxFormat'а, я остановил свой выбор на двух программах:

Для начала установил Grisbi. И почти сразу же удалил. Потому что он предложил мне вести бухгалтерию в евро. И не предложил альтернатив

Поэтому, отступать было некуда ;) и я установил GnuCash. Сразу могу сказать, что программа не самая дружелюбная, но как известно друзей в *nix выбирают придирчиво (с). Поэтому, пришлось читать документацию, чтобы хоть что-то понять. Зато после прочтения, всё встало на свои места. И ещё один пункт из программы перехода под *nix, можно считать выполненным

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

Обживаем Ubuntu 7.10 - Повышаем комфорт существования.

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

Такое вот изысканное вступление предваряет настройку клавиатурных сочетаний и мышиных кнопок в Ubuntu.

Учитывая, что мы имеем дело с рабочим столом Gnome, который славится скрытностью настроек, копать нам придется. Но не слишком глубоко.

Клавиатурные сокращения

Если ваши предпочтения по запуску приложений совпадают с предпочтениями создателей Gnome, то вас вполне удовлетворит пункт меню "Система->Параметры->Комбинация клавиш клавиатуры". Мне повезло меньше =) поэтому мой путь был более тернист и проходил он через терминал gksudo gconf-editor
Далее, имщем пункт меню "apps->metacity" и в нем нас интересуют два подпункта "global_keybindings" и "keybindings-conmmands". Первый отвечает за то к какому клавиатурному сочетанию будет забиндино что. А второй предоставляет возможность назначения произвольных 12 команд для выполнения клавиатурными сочетаниями. Вот, в принципе и вся премудрость.

Мышиные кнопки

Всё нижесказанное будет относится конкретно к мыше Logitech MX400. Но принцип достаточно универсален. Поэтому можно приладить к любой мышЕ.

Инсталлим evdev sudo apt-get install xserver-xorg-input-evdev

Открываем терминал cat /proc/bus/input/devices. Это заклинание выведет нам все устройства, используемые для ввода. Нас будет интересовать блок информации примерно такого вида
I: Bus=0003 Vendor=046d Product=c043 Version=0110
N: Name="Logitech USB-PS/2 Optical Mouse"
P: Phys=usb-0000:00:0b.0-3/input0
S: Sysfs=/class/input/input9
U: Uniq=
H: Handlers=mouse1 event3
B: EV=7
B: KEY=ff0000 0 0 0 0 0 0 0 0
B: REL=143
Нас здесь интересует только имя, которое присвоили нашей мышке. Далее, не отходя далеко от терминала пишем sudo gedit /etc/X11/xorg.conf. И, конечно, не забываем делать бэкапы перед тем, как правим конфигурационные файлы под рутом ;)

Пробегаем глазами до секции с мышами и закоментировав то, что уже было написано #, вписываем своё:
Section "InputDevice"
Identifier "Configured Mouse"
Driver "evdev"
Option "CorePointer"
Option "Name" "Logitech USB-PS/2 Optical Mouse"
EndSection
Вместо подсвеченного, необходимо вставить имя мышки, которое мы получили на предыдущем шаге.

Предподготовка закончилась, нас ожидает sudo /etc/init.d/udev restart для железной части и <Ctrl>+<Alt>+<BackSpace> для софтверной.

Пошли кнопочки. Для начала sudo apt-get install xvkbd xbindkeys, это те програмки, которые будут за нами следить и нам помогать. Теперь gedit ~/.xbindkeysrc, здесь мы расскажем програмке зачем конкретно нам нужно слежение, и в этот файл мы впишем:
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Left]""
m:0x0 + b:8
"/usr/bin/xvkbd -xsendevent -text "\[Alt_L]\[Right]""
m:0x0 + b:9
Теперь программа всё знает. Осталось её запустить, пишем в терминале xbindkeys и проверяем, работают ли кнопки там, где нам нужно. Если всё отлично, то идем в "Система->Параметры->Сеансы", жмахаем "Добавить" и вписываем xbindkeys в поле "Команда". Теперь програмка будет стартовать вместе с гномовой сессией.

Если что-то пошло не так. Или мышь другая. Или кнопок больше, то запускаем в терминале xev и нажимаем кнопки, послеживая какие значения получаем. Примерно так:
ButtonPress event, serial 30, synthetic NO, window 0x3a00001,
root 0x1a5, subw 0x3a00002, time 818838515, (41,36), root:(46,94),
state 0x10, button 1, same_screen YES
Вот этот "button 1" и есть наша кнопка. Значит её-то и надо биндить. Всё.

Nautilus

Нашел ещё один способ для повышения комфорта. Скрипты гномовского файлового менеджера Nautilus. Искал я, кажется, как открыть консоль ровно в том месте, где сейчас находишься в файловом менеджере. А нашел намного больше. Правда не всё мне пригодилось ;)

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

Вторая ссылка ведет нас...опять в документацию к ubuntu, на этой страничке приведены примеры скриптов, которые мне и пригодились. Придётся создавать файлы...но это не страшно.

Закончить можно было бы ссылкой на Advanced Bash Scripting =), но это уже другая тема.

воскресенье, 11 ноября 2007 г.

Обживаем Ubuntu 7.10 - Клиент torrent-сетей.

Ещё один тип программ, который всегда был, о котором не задумывался, и к которому привыкаешь достаточно сильно, чтобы всё другое чуть-чуть, да напрягало.

Клиентов torrent-сетей под Linux, наверное, больше чем под Windows. Существуют как кроссплатформенные монстры на java (Azureus), которые много умеют, но и много кушают ресурсов, существуют "кроссплатформенные" поделия на GTK+ (Transmission), которые в силу небольшой конкуренции под Mac могу себе позволить уметь не слишком много. Можно в конце концов гонять uTorrent, для которого Wine позиционируется, как одна из возможных платформ.

Учитывая, что консольных изысков curve (rTorrent) и веб-нитерфейсов для серверов под FreeBSD на толстом канале (torrentFlux) мне не надобно, мне нужен простеньгий, гибкий и мощный клиент. С мыше-клавиатурным управлением.

Именно такой найти и сложнее всего. Пока гоняем uTorrent, который мне абсолютно всем устраивал под Windows. Правда, под Linux он страшноват =)

На очереди:

  1. Azureus
  2. Transmission
  3. Deluge

Не факт, что протестирую все, но первые два - точно. О результатах отпишу.

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

Обживаем Ubuntu 7.10 - Клиент видео-чата.

Причем, кроссплатформенный. До недавнего момента, эта проблема стояла достаточно остро, единственное решение я нашёл в Ekiga, но оно было мягко говоря небезглючным. Поэтому тот факт, что новая версия Skype поддерживает видео, пришелся очень кстати. И хотя, скайп печально знаменит троянскими наклонностями...и в ЛОР-кругах уже вовсю шуткуют на эту тему...всё равно его не брошу, потому что конкурентов не вижу.

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

Проект-мечта. Осуществляем.

Итак. Пути обратно нет. Полечимся от латентной виндузятности и забудем на пару секунд про ZS. У нас есть Eclipse! (афигеть...) Будем работать с ним. Как всегда, при работе с Eclipse, сначала нужно подобрать плагины. Установить. Попытаться поработать. ... Надеюсь, получится.

Проект будет обычно-учебный, php+html+css+js+framework(codeIgniter, для разнообразия)+svn(для освоения). При таком раскладе, всё, что мне может потребоваться это:

  1. Eclipse 3.3 aka Europe с плагинами:
  2. SVN (и какая-нибудь gui-тулза, чтобы в консоли не пропасть ;)
  3. ER-Modelling Tool
  4. Syncrhonizer с удаленным ftp

Как видно, почти со всем я определился. Есть проблема с ER-диаграммами. Пока, единственное решение я нашёл в виде запуска под wine DBDesinger, почему-то их *nix-версия у меня работать не захотела. Видимо, она старовата. А коварный MySQL AB, который на основе неё собирался сделать свою тулзу MySQL WorkBench всё никак не соберется. Во-первых она "вечная альфа", а во-второых нет порта пол *nix.

Касательно синхронизации, я думаю проблем не будет, *nix. всё ж таки...

Рабочий процесс у меня в голове уже, вроде, сформировался. Действовать будем примерно, как я описывал давно-давно, придумал только пару уточнений к тому, что там было написано:

  1. На нашем девелоперском веб-сервере (локальном) делаем две папки. Production и Development.
  2. Обе делаем доступными в качестве VirtualHost. Например http://localhost/prod и http://localhost/dev
  3. Папка Production будет являться у нас по совместительству svn-хранилищем. А заодно точной копией internet-сервера.
  4. Все правки тестируются в папке Development, обкатываются и коммитятся.
  5. После чего, синхронизируем папку Production с удаленным сервером.

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

Обживаем Ubuntu 7.10 - Проигрыватели audio.

Вот никогда не мог подумать, что с аудио будут проблемы. Так много плееров, они такие красивые. И, вроде, всё должны уметь. Есть только одна проблема...оказывается, формат .ape закрытый. И не очень хорош с лицензионной точки зрения. И официального порта под linux авторы не делают. Соответственно, люди выкручиваются, как могут

У меня, например, достаточно много музыки в .ape, и для меня возможность проигрывать файлы этого формата являлась критичной. Длительное гугление привело к некоторым решениям, одно, другого страшнее ;), включая какие-то предложения о сборке самостоятельно и правке исходного кода, накладывании патчей и прочем шаманстве, которое не совместимо с моим желанием сделать всё простейшим образом. После нескольких тупиковых путей (wxMusik (извилистый ад зависимостей), xmms(gtk1 и русский не очень дружат)), наткнулся на Audacious. На нем и остановился. Вот последовательный рецепт:

  • Устанавливаем сам плеер apt-get install audacious. Он принесет с собой, всё, что ему нужно. Из "коробки" он умеет многое. Мне не хватало только .ape, flac и mp3, он подхватил сразу.
  • Открываем файл /etc/apt/sources.list, добавляем туда строчки:
    ## BackPort for MAC
    deb http://morgoth.free.fr/ubuntu gutsy-backports main
    deb-src http://morgoth.free.fr/ubuntu gutsy-backports main
    Это позволит нам забрать пакеты, не входящие в официальные репозитарии. Ещё необходимо прописать в консоли:
    wget -O - http://morgoth.free.fr/files/morgoth-signkey.gpg.asc | sudo apt-key add -
    А это нужно для того, чтобы APT не пугался незнакомых репозиториев =)
  • Теперь можно смело инсталлировать саму библиотеку Monkey Audio Codec и плагин для Audacious
    sudo apt-get install monkeys-audio audacious-mac
    Если чего-то не хватает, можно доставить. Самое главное у нас есть.
  • После установки, я столкнулся только с одной проблемой - кривые тэги в mp3 файлах. Но исправить это оказалось очень просто:
    Ctrl+P приводит нас в настройки, далее "Список воспроизведения", в выпадающем списке "Автоматическое определение кодировки для:", выбираем "Russian" и всё становится ок.

Такой вот беспроблемный плеер. Учитывая, что под виндами я всегда предпочитал winamp classic, мне его вполне хватит.

В настоящее время у меня под рукой нет ни одного wavPack, поэтому проверить проигрывается ли этот формат, я не могу. Но, учитывая, что на сайте на сайте wavPack заявлена поддержка Audacious, проблм возникнуть не должно.

суббота, 3 ноября 2007 г.

Обживаем Ubuntu 7.10 - Проигрыватели video.

Есть под Windows один замечательный плеер, называется Gom. Тем, кто любит просто смотреть кино и не заморачиваться вообще ни по чему, настоятельно рекомендую. Открывает всё, что содержит видео. И скачивает кодеки по мере необходимости. Вообщем беспроблемный софт - это приятно.

Чего-то подобного я ищу и под Linux. Пока кандидатов трое:

  • MPlayer
  • VLC
  • Totem

Каждый из них представлен своим движком, MPlayer и его множественные GUI сами по себе, Totem, вроде использует под собой Xine (могу ошибаться), а VLC тоже сам по себе =)

Из всех троих, все трое не без проблем. Все установились (Totem уже был, правда), все притащили с собой необходимые кодеки (кроме Totem, но он их беспроблемно загрузил) и, в принципе, все работают. И только с одной проблемой я столкнулся, причем у всех троих. Они не воспроизводили субтитры. На русском языке. Это расстраивало. Путь решения у каждого плеера свой.

MPlayer

Находим файлик ~/.mplayer/config и вписываем в него следующее:
font = "/home/user/.mplayer/tahoma.ttf" #кириллический шрифт
subcp = "cp1251" #кодировка сабов
subfont-text-scale = "3" #размер сабов
subfont-blur = "1" #небольшой блюр, чтобы не резало глаза
subfont-outline = "1" #черный контур вокруг букв
Перед этим было бы неплохо разжиться кириллическим шрифтом. И положить его куда-нибудь. А потом указать на него из config.

VLC

Находим файлик ~/.vlc/vlcrc, в котором есть такая строчка:
subsdec-encoding=default
Меняем "default" на "WINDOWS-1251" и получаем результат

Totem

У тотема тоже есть файлик:
/home/user/.gconf/apps/totem/%gconf.xml
Можено править его. А можно запустить gconf-editor и исправить там.

Можно сказать, что траблшутинг окончен, теперь осталось определиться с тем, что мне больше подходит

Прошло три дня...

Нет, Ubuntu я ещё не снёс ;) Вообщем из этих плееров, больше всего мне пока нравится VLC, за то что и интерфейс у него вменяемый, и проигрывает он всё без проблем. Надо только DVD на нем потестить, hotkeys настроить под себя и всё будет в порядке. MPlayer оставлен для резерва...А вот тотем пришлось пристрелить ;) он какой-то совсем бесполезный. Для меня.

Обживаем Ubuntu 7.10 - План действий.

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

Я начал с того, что составил небольшой список программ, необходимых мне для комфортного существования в свободной системе:

  1. Проигрыватель аудио (flac, ape, wv)
  2. Проигрыватель видео (DVD, divX, xVid)
  3. Запись дисков
  4. Синхронизатор/бэкапер всего со всем.
  5. Вменяемый клиент Torrent
  6. Skype или аналогичная прога с трансляцией видео.
  7. Домашние финансы
  8. Словарь (англ).

Это программы. Ещё есть некоторый список пожеланий, которые тоже хотелось бы видеть исполненными, например:

  1. Настроить на мышЕ кнопки вперед/назад
  2. Найти приличные шрифты для системы и браузера
  3. Синхронизировать телефон с компом
  4. Настроить клавиатурные сочетания для комфортной работы с системой

Можно заметить, что здесь ни слова о работе, редакторах, отладчиках и прочих тулзах, необходимых девелоперу. Это тема отдельная и смешивать её с пользовательской частью я не хочу. Хотя поиск программы для моделирования ER-диаграмм, пока не принес результатов, что грустно.

По мере решения проблем, буду постить рецепты и критерии выбора того или иного решения

среда, 31 октября 2007 г.

Assertion failed: LDAP_VALID( ld ), file getentry.c, line 35.

Вот такими неприличными строками встретил меня мой сервер после перезагрузки. Ошибка из разряда "Ничего не менял. Только перезагрузил!"

После продолжительных поисков в гугле и нахождения ответов "Мы не знаем что это, но физическая перезагрузка сервера нам помогла", пришел к выводу, что это очень печально. Мне сервер перегрузить ну совсем никак. Это делается через RFC, а их выполняют долго.

Ошибка кроется в модуле ldap для php. Ошибка возникает, вроде, только под 64-битными SPARC'ами. На соляре. Вообщем редкая штука ;)

Решения проблемы я не нашел. Перекомпиляция с флагами оптимизации мне не помогла. Пришлось отрубать модуль ldap из конфигурации. Это мне ещё аукнется. Но в свете предстоящего на выходных внедрения, это малая кровь.

суббота, 27 октября 2007 г.

Синхронизация Google Calendar.

Вот буквально сегодня обнаружил ещё одну связку приложений, состоящую из GoogleCalendar (календарь on-line), Mozilla Thunderbird(с плагином) или Sunbird(календарь дома) и сервиса GooSync, который синхронизирует GoogleCalendar с мобильным телефоном с помощью протокола SyncML.

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

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

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

Продолжая копать в направлении всеобщей связанности мне удалось связать Молоко с ГКалендарем. Пришлось правда сделать доступными ежедневники на Молоке...но если вы криминалом не помышляете и паранойя вам не ведома, то в принципе это не критично.

А вот синхронизировать эти дополнительные календари (ради чего всё и затевалось...) мне не удалось, потому что на gooSync эта услуга стоит 30 euro в год. И платить пока не хочется

В надежде на чудо, была испробована программа, написанная на javaME, которая устанавливается на телефон и обещает синхронизацию с ГКалендарем. Называется GCalSyn. Но чуда не свершилось. И она тоже синхронизирует 1 календарь. И давно не развивается. Жаль.

четверг, 11 октября 2007 г.

Как не забыть про молоко?

Я очень не люблю ежедневники. У меня мало воли. И мне вообще лень вставать по утрам. Но периодически я ищу silver bullet, которая поможет мне хоть чуть-чуть упорядочить свою жизнь.

Ежедневник...забываешь в него смотреть. Особенно, когда мотаешься. Или погружен в работу. Напоминания на телефоне...не удобно заполнять. Даже стилусом. А учитывая, что к Windows Mobile я питаю некоторую ...ммм... нелюбовь, и на моей моторолле установлен Linux, то нормальной синхронизации не получится. Всякие прочие методы так же не приносили результатов.

Идеальный с моей точки зрения инструмент, способный сделать хаос чуть упорядоченей должен

  1. Позволять с легкостью заносить новые записи, желательно с компа
  2. Быть доступным всегда
  3. Уметь о себе напоминать достаточно навязчиво
  4. Быть достаточно geek'анутым

И вот у какого-то блоггера (которых я почерпнул немало из Конкурса Конкурентов, но уже порядком просеял), я наткнулся на упоминание сайта ПомниПроМолоко!, который преподносился, как неплохой ежедневник. Зарегистрировавшись и покопавшись на этом сайте, я понял, что он мне нравится. И решил попробовать там пожить. Таким образом пункт 1, 2 и 4 выполнялись, потому что интернет почти всегда под рукой. Не с компа, так с мобильного.

Остался пункт о напоминаниях. Создатели сайта предлагают купить у них подарок за 25 $ в год и получить возможность работать с сайтом с КПК. Но опять всё упирается в WM или Palm. Ни тем, ни другим, обзаводиться мне не особо хочется. Поэтому надо было реализовать напоминания при существующем раскладе. Одной из услуг, является как раз служба напоминаний, и вроде бы есть возможность получать напоминания на мобильный, различные IM-клиенты и по e-mail. Я настроил ICQ, мобильный и почту. Напоминания приходят только на почту. Почему - не знаю. Может дальше будет лучше. Нет, я понимаю ещё почему не приходят на мобильник. Всё ж таки сайт не российский, но почему не приходят на ICQ...Я-то думал, установить Jimm и радоваться. А пришлось возиться с почтой.

Итак. Надо было реализовать получение писем на телефон. Никогда у меня небыло необходимости в получении e-mail на телефон. Не так уж это и сложно ;). Зарегистрировал новый ящик на mail.ru, чтобы не мешать деловую переписку с напоминаниями. Настроил её на мобильном. Одна беда, не получилось у меня на мобиле выставить проверку сообщений каждые n минут. Снова полез на mail.ru. Нашел там "уведомления sms о новых письмах". Настроил. И теперь всё отлично. Уведомления от неЗабудьПроМолоко падают в ящик, ящик шлет их sms, открываем ящик и смотрим, что там дальше в планах.

Всё отлично. Поулыбался только на mail.ru, который требует активации только через WAP. И настойчиво предлагает читать через него же почту. А так я доволен.

среда, 10 октября 2007 г.

Изящный баг. Или как я чуть не сменил шаблонный движок.

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

В своем проекте я использую Smarty. Проверенный временем шаблонный движок, который при наличие прямых рук и склонности к чтению документации, способен выдать неплохую производительность и гибкость. И мы с ним хорошо ладили. Пока сегодня утром, Smarty не начал мне компилировать пустые страницы. Одну за одной. Если я заходил на одну страницу, то все остальные, на которые я пытался попасть по ссылкам, были пустые. Я удалял скомпилированные страницы, заходил снова и всё повторялось. Потом у страниц отвалился подвал, который жил в отдельном шаблоне. Вообщем сайт исчезал на глазах. У меня началась паника и я начал подумывать о смене шаблонного движка. Потом вспомнил, что можно накатить ночной backUp (все ведь делают бэкапы. Я УЖЕ делаю бэкапы.) и посмотреть что будет с ним. Для этого надо было сохранить то, что было сделано за утро и раскатать ночную версию.

Бэкап отказался создаваться, сославшись на то, что на сервере закончилось место. И тогда все встало на свои места. Просто за ночь кто-то что-то сделал с сервером. И место закончилось. И бедный Smarty не мог записывать свои скомпилированные шаблоны. И создавал их пустыми. Место расчистили и всё вернулось на круги своя.

Вот такой вот полезный опыт разработки в многокритериальных системах.

среда, 26 сентября 2007 г.

Украшательства кода.

Задумал я написать несколько примеров-туториалов по активно используемой мной сейчас библиотеке Ext. Но столкнулся с проблемой. Не красив JavaScript код в текстовом представлении. Попытался найти украшатели. Но все они какие-то ущербные. Либо сделанные по правилам htlm 4 без использования css, либо просто криво работающие и убивающие code indent там, где они считают его ненужным.

Поэтому будут примеры просто с отступами. Без украшательств. Либо посмотрю в Zend, да заберу оттуда цвета красивые. А уж скриптик-то написать можно и самому, чтобы устраивал полностью.

четверг, 20 сентября 2007 г.

И снова Eclipse. Теперь PDT.

Вступление

Давно не трогал Eclipse. Писал себе спокойно в ZDS. И, вдруг, прошел слух, что вышел PDT 1.0 Release. Надо попробовать, решил я.

И попробовал. К счастью, на сайте разработчиков есть собранная версия, и разбираться с зависимостями не пришлось. Всё заработало с первого раза. Но в любом случае, с выходом Eclipse 3.3 aka Europe, ситуация стала получше.

Основная часть

Для меня ZDS идеален. Кроме мелких огрехов и стоимости, меня всё устраивает. Да даже стоимость у него вполне вменяемая с учетом студенческих скидок. И без учета возможности украсть. Он помнит имена переменных. Он знает все (почти) основные функции. Он поддреживает ZF. Он знает что такое JavaScript. Он выдает прекрасные описания функций. Он хорошо работает с SVN...да много чего ещё.

Что же из этого можно обнаружить в PDT...Он слышал о функциях и способен напомнить порядок следования переменных, что для PHP важно. Ибо порядок часто сильно разниться. Haystack и Needle часто меняются местами. Он знает SVN благодаря plug-in'у. Если пересесть на Aptana и добавить Spket IDE, он будет знать что есть JavaScript и даже сможет подсказывать названия функций ExtJs (об этой библиотеке мы ешё поговорим). Да, можно настроить debugger. Да, помнит названия переменных. Но блин! Учитывая, что его создавали программисты из Zend, понятно, что они не будут создавать конкурента ZDS. И он не конкурент.

Заключение

Я не принадлежу к джедаям. Я не освоил Vi(m) или Emacs. Мне нравится легкость с которой можно писать в ZDS. Это та легкость, которая присуща самому PHP. И, к сожалению, пока я не вижу реальных альтернатив ZDS без потери удобства написания кода. Даже не смотря на то, что мне приходится часто обращаться к мануалу по ExtJs на сайте. Просто ZDS удобней. И всё.

П.С. Кто-то может сказать "Сделай лучше". И будет прав =) Может это достаточная причина, чтобы учить Java. Время покажет.

четверг, 23 августа 2007 г.

Прозрачная авторизация LDAP.

В продолжение поста про авторизацию LDAP, опишу своё решение этой проблемы. Если сервер крутится на Win, то существует mod_auth_sspi.so для Apache, который позволяет делать прозрачный вход для пользователя, авторизованного в домене. Но у меня сервер под Solaris 9, следовательно этот модуль мне не подошёл.

Остается 2 варианта:

  1. mod_auth_ntlm_winbind
  2. mod_ntlm

Причем mod_auth_ntlm_winbind считается намного лучше, чем mod_ntlm, который особо и не развивается и не поддерживается. А mod_auth_ntlm_winbind вышел из проекта Samba, и соответственно он жив. Т.е. по логике вещей надо ставить его. Есть только одно "НО"...зависимости. И список их впечатляет:

  • Samba 3 с Winbind
  • Kerberos
  • SSL

Вот этот список с моими неАдминскими правами и отсутствием времени мне и не захотелось поднимать. Причем это всё надо не просто установить...но и настроить. Соответственно, разбираться в этом пришлось бы. А времени не было. Поэтому было принято решение устанавливать mod_ntlm

С mod_ntlm тоже были проблемы. Он не хотел собираться и инсталлироваться. Никак не хотел. Длительный поиск по инету привел меня вот на эту страницу, где я прочёл что надо поправить в source, чтобы всё нормально собиралось. Рекомендую.

Дальше, подключаем mod_ntlm в httpd.conf, и пишем в дирректории, где у нас будет происходить авторизация в .htaccess (ну или прямо в httpd.conf прописываем):

AuthType NTLM
AuthName "NTLM authentication"
NTLMAuth On
NTLMAuthoritative Off
NTLMDomain DOMAIN_NAME
NTLMServer SERVER_ALIAS
require valid-user

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

$login = preg_replace('/[\x00-\x0d]/i', '', $login);

то получим читабельный логин. И под FireFox (который правда не отсылает заголовки по умолчанию, так что с ним прозрачности нет) и под IE.

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

Правда есть один неприятный момент, который я не решил. Баг. Он проявляется, если несколько раз подряд пытаться выполнить релогин. То в логах Apache появится вот такая ошибка:

[error] 11762 - SMB_Logon_Server: SMB_SessSetupAndX failed; errorclass = 1, Error Code = 5\n
2905896 12224 /login/tmp.php - PDC connection already closed
[notice] child pid 11762 exit signal Segmentation fault (11)

А вот если делать его аккуратно и не часто, то всё ок. Мне кажется это проблема самого модуля, и способа её устранить я не нашел.

вторник, 14 августа 2007 г.

Сага про Solaris 5.9, Oracle 10 и PHP 5.2.3.

Эта история является продолжением работы над славным и большим проектом. В честь которого я уже копал LDAP.

Поняв, что окончательно приложение будет крутиться на Solaris'е, я пришел к выводу, что и разработку лучще вести под этой славной операционной системой о чем смело заявил вышестоящим. С меня спросили конфигурацию сервера и количество свободного места. Долго раздумывая, я перечислил все модули для Apache и PHP, которые мне необходимы и привел примерную цифру всего этого софта в установленном виде плюс сам проект.

Решив, что скоро у меня будет свой серер под Solaris'ом, я продолжил ковырять LDAP и успел реализовать неплохую авторизацию. Правда с использованием mod_auth_sspi.so, который умеет крутиться только на виндовых серверах. А у меня будет Solaris. Но простота реализации мне очень понравилась.

Ждать пришлось не очень долго, и скоро мне прислали логин, пароль, имя сервера и имя папки. Подобное письмо вызвало у меня ряд вопросов. И меня отправили к специалисту. Специалист объяснил мне, чем коннектиться к серверу по SFTP (WinSCP) и показал как пользоваться PuTTY. Он же сказал мне, что root мне никогда не дадут, свой сервер тоже, и что он поднимал Apache с PHP под простой (не рутовой) учетной записью, и всё было номрально.

Так мне пришлось заняться чрезвычайно интересной задачей по поднятию сервера в маленькой локальной папочке на сервере под Solaris 5.9, где нет вообще ничего. Если искать в инете книги по Solaris, то вы нигде не найдете в них способ установки софта без прав админа. Я знаю про сырцы, но у меня не было binutils, g++ и кучи библиотек.

Зато мне рассказали про команду pkgtrans. После прочтения по ней manа, лично мне понятнее не стало. Рассказы о ленте и других потоковых накопитилях совершенно меня расстроили. Но команда оказалась единственной полезной, и если бы не она, мне не удалось бы осуществить задуманное.

Установка софта без прав root

Идем на www.sunfreeware.com (пакеты вообще без расширений) или на www.blastwave.org (пакеты с расширением pkg). Там лежат большие архивы собранного софта. Для кучи версий Solaris'а. Качаем то, что нам нужно, копируем себе в дирректорию (обозначим её для краткости $HOME), распаковываем командой gunzip pack_name распаковываем его. А дальше вступает pkgtrans. В той же дирректории пишем pkgtrans pack_name pack/ Эта комманда распакует наш пакет в поддиректорию $HOME/pack/SMCpack_name или pack/CSWpack_name, в зависимости от того, откуда качали файл. Теперь у нас есть автомат. Т.е. скомпилированный софт. Т.е. хотя бы gcc =).

Сборка софта для сборки сервера.

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

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

Итак, у меня есть работающий GCC, т.е. оба компилятора и для C и для C++. Это уже хорошо. Теперь можно собрать binutils, в которых присутствуют необходимые для сборки инструменты. Единственный параметр, с которым я собирал был --prefix=/u01/users/php/tools. Т.е. я просил установить всё в папку tools, где у меня со временем образовалось почти полное дерево системы. Таким образом, собирая все инструменты в эту папку, я избавил себя от необходимости прописывать десятки путей в свой .profile. Важно прописать пути к этой папке до основных путей системы. Т.е. при задании переменных окружения надо писать export PATH=/u01/users/php/tools:$PATH.

После binutils, установим пакеты bison, flex, gawk, m4, make (все есть на gnu.org, кроме flex, он живет на flex.sourceforge.net). Эти пакеты необходимо собирать с тем же префиксом, что и binutils. Они собираются без проблем, насколько я помню. Чтобы понять что использует ваша система, когды вы говорите ей, допустим make, стоит набрать which make, и получите путь, откуда этот make запускается. Так стоит проверять, чтобы использовались нужные инструменты.

Сборка Apache 2.0.59

Собрать, как я уже говорил, мне необходимо работающий сервер Apache+PHP и связать его с Oracle. Я начал с Apache. Как с наиболее простого. По каким-то причинам Apache ветки 2.2 у меня собираться отказался. Поэтому я собирал проверенный Apache 2.0.59. Создаем простой файлик, куда пишем полный конфиг, делаем файлику chmod +x, или каждый раз пишем sh apache2_config. Вот содержимое файлика:

cd /u01/users/php/src/httpd-2.0.59
./configure \
--prefix=/u01/users/php/apache2 \
--enable-so \
--enable-mods-shared='rewrite mime-magic ssl vhost-alias' \
--disable-cgi \
--disable-autoindex \
--with-mpm=prefork \
--with-ssl=/u01/users/php/openssl \

Модулей не очень много. Для сборки Apache мне пришлось установить только собранный из сырцов OpenSSL. Хотя для сборки PHP, мне пришлось использовать скомпилированный openssl 0.9.7, потому что при сборке с текущим 0.9.8 выпадал ld, который под Solaris не очень стабилен. А заставить ПСС использовать GNU ld мне не удалось. Для этого пришлось бы пересобирать компилятор. Это мне не удалось. Вообщем, с Apache проблем особо не возникло.

Сборка PHP 5.2.3

Вот здесь начались танцы с бубном. Для начала приведу конфиг:

cd /u01/users/php/src/php-5.2.3/
./configure \
--prefix=/u01/users/php/php5 \
--with-apxs2=/u01/users/php/apache2/bin/apxs \
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-mbstring \
--enable-soap \
--enable-sockets \
--with-gd=/u01/users/php/tools \
--with-jpeg-dir=/u01/users/php/tools \
--with-png-dir=/u01/users/php/libpng \
--with-iconv \
--with-libxml-dir=/u01/users/php/tools \
--with-xsl=/u01/users/php/tools \
--enable-zip \
--with-zlib \
--with-ldap=/u01/users/php/tools \
--with-openssl=/u01/users/php/pack/SMCosslg/reloc \
--enable-soap \
--with-mcrypt=/u01/users/php/libmcrypt \
--disable-ipv6 \
--with-oci8=instantclient,/u01/users/php/instantclient_10_2 \
--enable-pdo \
--with-pdo-oci=instantclient,/u01/users/php/instantclient_10_2,10.2.0.3 \
--without-pdo-sqlite \
--without-sqlite

В принципе из конфига видно, где я использовал собранные руками библиотеки, а где пакеты. Пробегусь быстро по интересным пунктам конфигурации.

Первые две строчки говорят куда собирать (предпочитаю отдельную папку и для Apache и для PHP, т.к их приходится пересобирать по много раз, и вычищать каждый раз папку tools было бы маразмом), и где лежит прежде собранный Apache. Всё просто. Дальнейшие несколько строк ничего интересного не представляют, эти модули включены в поставку PHP и собираются без проблем

Дальше начинается GD. Для сборки GD, надо сначала собрать libpng (без проблем) и libjpeg. Собрав libjpeg командой ./configure --prefix=/u01/users/php/tools, самое главное на забыть после команды make install, скомандовать make install-lib. Без этого, GD будет конфигурироваться, но не будет собираться (отняло примерно день, решение нашлось на каком-то форуме).Если нужна поддержка ttf или xpm, их тоже надо собирать. Мне они нужны не были. После этого сборка GD проходит гладко, и в конфиге мы указываем его, и пути к библиотекам jpeg и png.

Дальше идет iconv, xml и xslt, для них необходимо собрать библиотеки, соответственно iconv, libxml2 и libxslt. Здесь проблем нет. Не забываем про prefix, иначе make install не пройдет.

Теперь ldap, openssl и mcrypt. LDAP собирается (правда, он у меня попросил Berkeley DB, но это проблемой не считается =)), а вот openssl, как я уже говорил, мне пришлось использовать готовый. Т.к. PHP отказывался делать make, вызывая панику у ld. Это проблема новой версии 0.9.8 и архитектуры SPARC. С mcrypt проблем не было.

И вот начинается самое интересное. Oracle. Достаем мануал The Underground PHP and Oracle® Manual с оракловского сайта. Читаем. Идем на тот же оракловский сайт и качаем instant client под Solaris Sparc. Почему он в zip, я не знаю. Разкатываем архив в нашу папочку. Теперь у нас есть оракловый клиент. С ним-то мы и будем собирать PHP. Это стоило мне где-то трех дней. PHP спокойно конфигурировался с OCI8, но отказывлся конфигурировать PDO_OCI. А он мне был очень нужен. Проблема скрывалась в Sun'овском SH (шелле), который немного отлично ведет себя от обычных. Я решил проблему, прописав в конфигурационном файле #!bin/bash вместо #!bin/sh. У меня всё собралось. Эту проблему обещали исправить в PHP 5.2.4 (Тред по этой проблеме на phpClub).

Соединяемся с Oracle

В принципе на этом проблемы со сборкой закончились. Всё собралось, запустилось и заработало. Не хватало только соединиться с Oracle. Здесь меня тоже ожидали сюрпризы (дня два). Не смотря на всё, что написано в Подземелье ПХП и Оракла, они никак не соединялись. У меня в наличие было два файлика sqlnet.ora и ldap.ora, которые объясняли Ораклу где искать сервер, но не смотря на всякие TNS_ADMIN, Oracke Instant Client не видел сервер. И файлики, видимо тоже. Всё решилось довольно хитро. Обычно, если устанавливать на компьютер обычный оракловый клиент, эти файлики лежат в папочке $ORACLE_HOME/network/admin/. Это и есть ключ. Пришлось в папке instantclietn_10_2, которая жила у меня, сделать эту структуру подпапок. И уже в подпапку admin положить два файлика. И он их нашёл. Я не знаю, зачем так всё сложно. Но мне кажется, что без программерской лени тут не обошлось.

Первый этап саги окончен. Сервер работает. Связь с БД есть. Но что-то мне подсказывает, что пересобирать я буду и Apache и PHP. Тогда, если будет о чем написать - буду дописывать сюда.

пятница, 3 августа 2007 г.

Zend Framework 1.0 и Oracle.

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

Ну так вот. Соединился я с базой. И всё, вроде, нормально, если писать запросы руками. Т.е. "SELECT * FROM USER". Но это не очень интересно. Так как ZF предоставляет достаточно классов для работы с базой в более прозрачном режиме. НО! При попытке создать запрос его средствами, я получал ошибку. 942 ORA-00942: table or view does not exist. И дальше шёл странный такой SQL-запрос. Слабо похожий на то, что любит Oracle.

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

В документации я решения проблемы не нашёл. Долго бродил по исходному коду. Безысходно. Спросил у умных. Те объяснили мне, что эти кавычки появляются автоматически и отвечает за это переменная $_autoQuoteIdentifiers в классе Zend_Db_Adapter_Abstract.

Поначалу я на радостях просто выставил ей false, но потом понял, что модификация фреймворка не есть гуд. Потому что проблемы с обновлениями не заставят себя ждать. И тогда мне очередные умные люди объяснили, что надо просто при инициализации подключения надо указать в параметрах опцию 'options' => array(Zend_Db::AUTO_QUOTE_IDENTIFIERS => false). И всё будет ок.

вторник, 24 июля 2007 г.

Разбираемся с LDAP

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

Одной из текущих задач является разобраться с LDAP, т.к. проект будет крутится внутри локальной сети, а она использует домены для авторизации. Попадание извне на этот портал пока не предусмотрено.

На данный моменты было найдено несколько средств работы с этой службой каталогов.

  • Во-первых сам php довольно хорошо о ней осведомлён (мануал), если его предусмотрительно скомпилировать с поддержкой LDAP.
  • Во-вторых, есть модуль для Apache, mod_ntlm, который, вроде, поддерживает авторизацию по LDAP, но он для меня ещё тёмный лес. И преимущества, предоставляемые им для меня не очевидны. Кроме того, что он позволяет проводить авторизацию самостоятельно, т.е. без участия php, как Basic http authorization (или как-то так)
  • В-третьих есть обертка (wrapper) в виде класса, которая позволяет удобно и не нудно работать с LDAP

Однако, при поиске способов извлечения данных об авторизации пользователем в сети, я пришел к выводу, что сделать это можно только для IE. Т.к. он тесно интегрирован в Windows и умеет сам посылать заголовки о том, что он авторизован. Заодно, можно и имя пользователя извлекать (топик, faq). Не уверен, что этот способ приемлем, но всё же это лучше, чем ничего.

Пока вывод такой: сделать авторизацию, запрашивая LDAP можно. Выдрать имя пользователя, если используется не IE - нельзя.

понедельник, 2 июля 2007 г.

Временная победа.

Мне удалось подружиться с Eclipse. По-крайней мере он собрался. Что уже неплохо. Причиной успеха назначается выход Europe. Консолидированного update'а основных пакетов.

Всё теперь просто. И будет просто, пока проекты опять не разъедутся. Моей целью была установка AJAX Toolkit Framework. Вот какие шаги мне пришлось предпринять.

  1. Скачать Eclipse версии 3.3
  2. Скачать ATF 0.2.2
  3. Добавить ATF в список архивных файлов в модуле обновления Eclipse
  4. Отметить его галочкой и нажать кнопку "Select Required"
  5. Обрадоваться, что всё так просто и больше не надо отслеживать зависимости =)

После того, как всё заработало, пришло время настроить ATF, чтобы он знал DoJo (ради чего я всё это и затеял) и Script.aculo.us. Отмечу, что все шаги, которые я предпринимаю дальше подробно описаны в разделе проекта ATF.

  1. Качаем валидатор JS
  2. Качаем DoJo
  3. Качаем Script.aculo.us
  4. Прописываем все эти пакеты в разделе ATF настроек Eclipse
  5. Думаем. Удаляем ненужные.

четверг, 28 июня 2007 г.

Очередная попытка подружиться с Eclipse.

Попытки подружиться с этой замечательной средой разработки происходили давно. Каждый раз я пытался поставить Eclipse в результате обнаружения очередной фичи, которая в нём реализована. Это были три проекта IDE для php на основе Eclipse:

  1. PHP IDE
  2. PDT Project
  3. PHP Eclipse

Но ни один даже близко не подошел к Zend Studio. А именно этот редактор можно рассматривать как идеал. Хотя он заставляет лениться.

Есть ещё Aptana, но она больше подходит для HTML/JavaScript, что не является моим основным профилем.

Но вот начав изучать DoJo, я решил опробовать активно продвигаемый AJAX Toolkit Framework (ATF), который был создан всем миром для продвижения AJAX. И начались мучения со сборкой. В принципе, насколько я помню, я всегда собирал Eclipse по кускам где-то в течение дня, а потом забивал, и качал откуда-нибудь готовый проект. Уже собраный.

Но вот беда. Для ATF нет такого проекта. Поэтому надо все собирать самому. Не смотря на все Callisto и прочие фенечки обновлений, установить ATF спокойно не получилось. Он зависел от WTP, который совсем не WTS. Что характерно. Потом после чистки всего Eclipse, когда я уже запутался, что устанавливал, а что нет, оказалось, что я снес больше, чем надо, поэтому пришлось по кускам выковыривать URL фабрик обновлений для.

Пожалуй, хватит.

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

Однако, я не собираюсь расставаться с Eclipse. Потому что на главном сайте тикают часики до выхода новой версии, которая будет включать в себя 21 пакет. Они будут аккуратно подогнаны друг к другу. Может быть с Eclipse Europe мне повезёт больше ;)

пятница, 22 июня 2007 г.

Разработка сайта с использованием Subversion

Давно уже я хотел освоить svn и применить его в своих проектах. Да все не было идеи как же это сделать. Цикл разработки софта с использованием subversion был мне понятен. Однако четкого осознания как применять его в вебе не было. Однако, всё постижимо, и теперь я имею представление о цикле разработки.

Вот что получилось:

  1. Предположим, что хостинг у нас есть. И доступ к нему тоже есть, хотя бы и по FTP.
  2. Создаем репозиторий на любом компе. Если веб-сервера свои, то можно рядышком поставить ещё svn-сервер, а можно и на веб-сервере его развернуть. Но это будет ещё не скоро, поэтому сгодится любой комп, хоть даже и тот, на котором кодим. Не суть важно.
  3. Импортируем репозиторий на разработческую машину. Причем на этом же компе стоит весь необходимый софт, типа Apache, MySQL, PHP. Желательно версиями совпадающий с теми, что на хостинге.
  4. Вносим правки, тестируем. Тестировать надо не копию в репозитории, а локальную, чтобы правки вносить пачками, а не по одной строчке.
  5. Импортируем нашу протестированную и отлаженную копию в репозиторий, сопроводив её комментариями.
  6. Заливаем на веб-сервер.

Есть в этом сценарии ряд нюансов. С которыми я ещё до конца не определился.

  1. В какой среде будем разрабатывать. Есть Eclipse. В нём реализована поддержка svn. Если привыкну к нему, он и будет. Если не привыкну, тогда придётся подыскивать какое-нибудь средство для общения с репозиторием. Можно и из bash.
  2. Как заливать на веб-сервер. В идеале, должно быть инкрементальное копирование файлов. Но для этого, заливку надо запускать на веб-сервере. Т.е. на нем давать команду svn update. А для этого, нужен внешний IP для svn-сервера. А это расходы, которые пока хочется нивелировать. Следовательно, придется делать полное копирование. Для эти целей надо будет написать скрипт, который будет:
    • заходить на хостинг
    • скачивать все файлы
    • складывать их в архив на локальной машине
    • удалять их с хостинга
    • заливать на него копию из репозитория посредством svn export.

Вот такие пироги. Буду держать этот пост в тонусе при осуществлении изложенных здесь замыслов. Возможно, всё изменится ;)

четверг, 21 июня 2007 г.

Мои "must have" расширения для FireFox

Для работы

  • Web developer - первый и главный. Без него разработка html+css двигалась медленнее (project page).
  • FireBug - второй, но не менее главный. Без него отладка ajax-приложений и всего, что завязано на javaScript была труднее (project page).
  • Html Validator - проверка валидности страниц (project page)
  • IE Tab - если работать в Windows, то очень полезен (project page).
  • Tamper Data - просмотр отсылаемых запросов и заголовков в реально времени. С возможностью подмены ;) (project page)
  • YSlow - расширение для FireBug (именно), позволяющее контролировать выполнение 13 правил разработки JS от Yahoo (project page)
  • Firecookie - ещё один плагин для FireBug, позволяющий отслеживать и менять печеньки. В принципе, ту же функциональность предоставляет Web Developer, но здесь чуть удобнее реализовано (project page).

Не для работы

  • Gmail Manager - проверять гмэйл (project page).
  • Google Reader Wathcer - проверять ленту от Google (project page)
  • del.icio.us - закладки с одноименного сайта (project page).
  • Session Manager - сохранение всех вкладок, открытых в FF и прочие удобства.

Первая запись, или зачем я завел себе блог.

Долгое время я не не поддавался эпидемии блоггерства и лайвЖорналства, считая их производной формой графоманства.

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

А этот блог я завел исключительно для себя. Точнее для своего склероза, чтобы ему было сложнее жить.

Дело в том, что довольно часто, почитывая какую-то литературу, приходишь к мысли, что неплохо было бы задокументировать полученную информацию. Делать это на листочках TomBoy'я или заводить себе локальную wiki не хочется.

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

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