Development using different platforms, languages, etc: links, thoughts, experience, articles.
Thursday, December 10, 2009
Google Public DNS
Что дальше?
GWT 2.0 is out
Свершилось! Google таки зарелизили. По ссылке коротое видео с основными изменениями.
Самые яркие и ожидаемые:
- Дебаг в любом броузере (в т.ч. на удаленных компах с другими ОС)
- Декларативный UI (используется концепция MVP)
- “сплит поинты”, позволяющие разделить код на куски, которые будут до-загружатся по мере необходимости. Обещают что компилятор сам разбеертся в какой последовательности и какие “куски” загружать. Звучит слишком круто чтоб быть правдой :)
- “пачки ресурсов”. Раньше можно было автоматизировать упаковку картинок в один запрос к серверу. Теперь можно “упаковывать” и текст, и даже CSS-стили, которые будут автоматически собиратся, оптимизироватся и отдаватся по мере необходимости.
Ссылка на шоукейс.
Что-ж… ура, товарищи )
Sunday, October 11, 2009
Повышение продуктивности: средство само-контроля
После того, как начал замечать что иногда сам с собой начинаю спорить о том, много ли я времени потратил на чтение новостей, на какую-то программу не связанную с работой.
И чтоб поставить все точки над “i” решил именно для себя поставить какую-то систему контроля какое приложение активно.
Быстрое гугление вывело на утилиту, на 80% выполняющую необходимые функции: ManicTime
Чем она удобна:
- Минималистический интерфейс, в то же время вполне eye-candy.
- Бесплатна
- Отслеживает не только сколько времени было проведено в той или иной программе, а и на каких сайтах (по доменам)
- Есть автоматическое отслеживание бездействия (отошел от компа)
- Возможность помечать “тагами” некоторые участки времени (“работаю”, “отдыхаю”) с различными отчетами по тагам.
Скриншотик с офф сайта:
В целом это одна из таких прог, которую, как мне кажется, необходимо иметь каждому, кто работает на дому.
Минус пока вижу в том, что недостаточно возможностей по просмотру результатов за неделю, месяц и автоматической расстановки “тегов”. Но выглядит очень привлекательно и потенциально.
Во всяком случае хороший шанс “посмотреть в глаза” реальности и увидеть сколько реально времени трачу на совершенно ненужные вещи. Вот в реальности бы…
ПС. Я никаким образом не связан с создателями программы.
Wednesday, September 16, 2009
Отдых: Ради этого стоит работать
Вернулся с отдыха в Анталии. “Честные” 5*. Понял, что стоит таки год работать чтоб так отдохнуть – отличное питание, отличное море, минимум кричащих детей и пьяных компаний (не хочу явно “пиарить” отель, хотя он стоит того. Кому интересно – пишите в комментарии)
Оказалось что в Турции закрыто очень много ресурсов – твиттер, частично блоггер, ютуб. Хорошо, что работал скайп.
По приезде гугл-ридер радостно сообщил о “1000+” непрочитанных.
Снова таки начали приходить о выборе – что лучше: продолжать фрилансить (пару более или менее постоянных клиентов есть), или все-таки вернутся на “регулярную” работу… С одной стороны “свобода” фриланса, с другой – работа в коллективе, обмен опытом. Навеяно "Подготовка к собеседованию на должность программиста".
ПС. Никогда не понимал как люди могут работать без хорошего отдыха :)
Friday, August 28, 2009
Google Apps Engine: все еще слишком экспериментальный
Недавно пришлось таки отказаться от GAE по ряду причин. Все-таки не стоило насколько легко игнорировать все предупреждения о том, что он имеет пока только экспериментальную поддержку.
Основные причины отказа:
- Достаточно низкие лимиты на процессорное время, при этом довольно низкая производительность (то что на локальной машине выполняется 1секунду, в “реальном” окружении может выходить за пределы лимита в 30 секунд)
- Наличие серьезных открытых issues, которые фактически сильно усложняют разработку
- Невозможно очистить хранилище (только кодом, но если классы не совместимы, то полная очистка невозможно вообще)
- Невозможно удалить приложение (что в совокупности с предидущим пунктом и наличием лимита в 10 приложений дает серьёзную “ложку дёгтя”)
- Ошибки при построении индексов и невозможность управлять ими при ошибках (например, если индекс находится в состоянии построения, и возникла ошибка, только работники Гугл могут помочь очистить индексы)
- Позднее оповещение об неподдерживаемых библиотеках (фактически можно довольно долго разрабатывать локально, задеплоить, и только при какой-то операции получить сообщение что какая-то библиотека юзает “запрещенный” класс, что заставляет фактически полностью переписывать некоторые блоки). Мне кажется, что зная список разрешенных JRE классов, могли бы написать небольшой анализатор, который скажет есть ли использование плохих классов).
- Отсутствие агрегационных функций при работе с хранилищем. Конечно, это не проблема для некоторых проектов, но в том, над которым я работал, анализ данных был чуть ли не основной задачей. И если у Амазона есть их Amazon Elastic MapReduce, то у Google нет адекватной альтернативы.
Сейчас прорабатываем вариант перехода на Amazon Web Services. Пока выглядит очень и очень привлекательно.
P.S.: Небольшая анти-статья про Amazon SimpleDB и чуток GAE - тут
Wednesday, August 12, 2009
MS Office 2007: Необходимое место без компонент
Monday, March 16, 2009
Новая работа: поиск во время кризиса
Вот и случилось то, что, в принципе, должно случится было уже довольно давно- решился сменить место работы. Как говорят, работу надо менять каждые 4 года, иначе начинаешь застаиваться. И хотя я работаю уже достаточно для того, чтоб иметь желание сменить, но особо не хотелось.
Не буду особо сильно раскрывать причины моего решения, но после беседы с “начальством” мы пришли к выводу, что нам будет лучше разойтись. Основная причина – это нежелание или невозможность дать нормальные условия работы в офисе. Хотя лично для меня это очень тяжелое решение – все-таки сблизился с командой, с проектами.
Таким образом, похоже, начиная со следующей недели начну смотреть как сейчас на рынке труда. Насколько я слышал, спад есть. Надеюсь все-таки найдутся хорошие предложения, а пока можно и по-фрилансить :)
Так что, если кто может порекомендовать хорошую компанию, которая может заинтересоваться вот таким вот резюме, и лояльно относится к своим сотрудникам – прошу писать.
К сожалению к проблеме с поиском работы добавилась проблема с получением своего же депозита в банке “Надра” (это отдельная тема, про которую тоже можно было бы написать – вдруг есть те, кто тоже наступил на те же грабли). Если кого интересует – пишите, обменяемся опытом.
Tuesday, February 3, 2009
Функциональное программирование в “не функциональных” языках: ленивые вычисления
Сейчас модно говорить о ФП – что это такое, зачем и как его используют. Мне же хотелось бы рассматривать ФП как некоторый способ более эффективно реализовывать поставленную задачу. Т.е. не как просто новомодный (хотя ФП уже старо как мир) финт ушами, а как реальное практическое средство.
Один из элементов ФП, позволяющих эффективно его использовать являются “ленивые вычисления”. Принцип такой – зачем вычислять то, что возможно нам не понадобится.
Для того, чтоб лучше понять чем же это может быть удобно, я для себя составил вот такой иллюстрирующий пример:
Допустим у нас есть задача: написать функцию, принимающую три числовых параметра (a, b, c), и возвращающую сумму a+b если a>0 и a+c если a<0.
Простейшая реализация (C#):
int function(int a, int b, int c)
{
return a+a>0?b:c;
}
Но при вызове этой функции нам понадобится передать все три параметра. Но ведь реально нужны только 2 (в зависимости от значения первого или второго параметра). А если вычисление значений каждого из параметров является трудоёмка задача (выполнение запросов к базе данных, вычитка из большого документа или просто тяжело-вычисляемое значение), то нет смысла его делать.
Вот тут то и приходит на помощь идея ФП. А точнее то, что основным объектов является функция. Можно просто передать как параметр не значение, а функцию, которая возвращает это значение.
Таким образом, если мы перепишем эту функцию так, чтоб она оперировала не с цифрами, а с функциями, то получим, что при получении результата, будут вычисляться только те аргументы, которые реально нужны.
Теперь небольшой пример из совсем почти не функционального языка – C# 2.0:
Для начала перепишем функцию так, чтоб она оперировала с функциями (“делегатами”):
private delegate int IntFunction();
private static IntFunction funct(IntFunction a, IntFunction b, IntFunction c)
{
return delegate
{
int aValue = a(); return aValue > 0 ? aValue + b() : aValue + c();
};
}
Далее, допустим есть функция, которая очень долго работает. Для примера, пусть она возвращает число, переданное в качестве параметра:
private static IntFunction CreateInt(int a)
{
return delegate
{
Console.WriteLine("Computing for long..long time, resulting "+a);
return a;
};
}
Ну а теперь сам вызов:
Console.WriteLine("Result is {0}",funct(CreateInt(1), CreateInt(2), CreateInt(3))());
В результате получим:
Computing for long..long time, resulting 1
Computing for long..long time, resulting 2
Result is 3
Как видно, функция, возвращающая “3” даже не была запущенна.
Ну и само-собой, можно передавать результат выполнения функции как параметр для самой же функции, что позволяет выстраивать конструкции по типу:
Console.WriteLine("Result is {0}", funct(funct(CreateInt(1), CreateInt(2), CreateInt(3)), CreateInt(4), CreateInt(5))());
В результате которых будет реально толь3о 3 раза вызвана наша “долгая” функция, вместо 5, как было бы при обычном подходе.
Вот такой простой и имхо понятный пример того, как можно понять смысл использования “ленивых вычислений”, и использовать в “не функциональных” языках.