LinkedIn in Action Video
Рубрика: LinkedIn | 4 July 2008, 16:28 |
Vadim Voituk
3-х минутное видео, представленное в блоге LinkedIn, рассказывает Success Story некоего мнимого владельца бизнеса, которому LinkedIn помог в поиске партнеров и развитии собственного дела.
Очень просто и доходчиво – если сжать длительность вдвое – можно и как рекламу на ТВ пускать.
P.S. Кстати за свое текущее место работы я тоже должен благодарить LinkedIn.
Groovy @Bindable and @Vetoable annotations
Рубрика: Groovy | 2 July 2008, 22:48 |
Vadim Voituk
Начиная с первых “бэт” версии 1.6 в Groovy были добавлены 2 встроенные аннотации (да-да! Groovy наконец-то полностью поддержирживает все возможности Java5!) : groovy.beans.Bindable и groovy.beans.Vetoable
Обе аннотации содержат в себе функионал который призван заменить стандартные Java-интерфейсы java.beans.PropertyChangeListener и java.beans.VetoableChangeListener и избавить разработчика от обилия классов-слушателей (listeners) и декларации дополнительных интерфейсов для бина.
Об этих нововведениях и их назначении было напечатано/перепечатано в каждом обзоре новых “фич” версии 1.6, но при этом нигде не встречалось описания как же все-таки “повесить” свой обработчик событий (listener).
Немного поковырявшись в исходниках Groovy удалось узнать такое: [Далее...]
Самый простой генератор паролей
Рубрика: Development, Юмор | 25 June 2008, 22:39 |
Vadim Voituk
Цитата:
Работаю в вебконторе, сижу смотрю на девочку-программиста напротив -
она смотрит на монитор и бьёт кулаками по клавиатуре. Нежно так, но кулаками :)
- Че, грю, делаешь?! Альтернативные методы разработок?
- Да грит не, я пароль на фтп для пользователей генерирую %)
Источник: http://bash.org.ru/quote/393171
Самое смешное в том, что до недавнего времени я делал точно также. Пока сегодня не прийшлось сгенерировать порядка 50 паролей подряд.
Выручил меня такой вот примитивный генератор паролей:
base64 /dev/urandom | head -n1 -c6
Grails at LinkedIn
Рубрика: Development, Groovy, LinkedIn | 12 June 2008, 18:03 |
Vadim Voituk
Когда-то, во время моего доклада на киевской встрече developers.org.ua, кто-то (кажется Алексей Колупаев) спросил где на реальных действующих проектах используется Groovy и Grails.
Первое, что я ответил – это LinkedIn. Но вот конкретнее рассказать, где там Grails а где Java, в силу непричастности к разработке этой соц-сети – не смог.
Теперь же инженеры LinkedIn сами поведали нам “где”, “как” и главное “зачем” у них используется Grails. Смотрим презентацию: [Далее...]
Аналог jQuery.ready() в Prototype.js
Рубрика: JavaScript/Ajax | 10 June 2008, 23:55 |
Vadim Voituk
Недавно впервые удалось попробовать использовать JavaScript-библиотеку jQuery.
Из того, что понравилось сразу – это возможность выполнять JavaScript-код не по событию полной загрузки страницы (window.onLoad), а сразу после загрузки и инициализации DOM-дерева. Т.е. можно уже выполнять манипуляции с DOM-деревом не дожидаясь загрузки стилей, изображений и остальных медиа-компонентов.
В jQuery реализуется это 2-мя способами:
$(document).ready(function(){...})
и в сокращенной нотации
$((function(){...})
Но так как я являюсь давним пользователем prototype.js – сразу же захотелось такую же возможность и в нем. Как оказалось в версии 1.6 она уже есть, и использовать её можно таким образом:
document.observe('dom:loaded', function(){ ... })
или
Event.observe(document, 'dom:loaded', function(){ ... })
Работоспособность проверял на Prototype 1.6.0.2 в Firefox3, Internet Explorer 6 и Safari (Win+Mac).
PHP, MySQL и FOUND_ROWS() bug
Рубрика: Development, MySQL | 5 June 2008, 11:53 |
Vadim Voituk
“Словил” сегодня пренеприятнейший баг, который стоил мне более часа потерянного времени.
Выполняем в консольном mysql-клиенте такой запрос:
SELECT SQL_CALC_FOUND_ROWS FROM tablename LIMIT 5;
Получем resultset из 5ти результатов (предполагается, что в таблице tablename больше 5ти записей)
Теперь в этом же соединении выполняем:
SELECT FOUND_ROWS();
Получаем значение, равное количеству строк в tablename – ничего сверхъестественного, все как и ожидалось.
Самое интересное начинается если повторить выполнить эти SQL-запросы из PHP-скрипта (при определенных условиях, но о оних ниже) – второй запрос будет всегда возвращать 0.
Причиной всему – , которая наблюдается при включенной опции
mysql.trace_mode=true
Дабы не поулчить подобную неприятность в своих проектах рекомендую пока установить в false.
При тестировании использовался PHP 5.2.1 и с модулем mysql client API 5.1.16-beta.
Groovy Classpath & Dynamic class loading
Рубрика: Development, Groovy | 4 June 2008, 11:55 |
Vadim Voituk
В Groovy подключить дополнительные Java-библиотеки и классы можно 3-мя способами:
- Дописыванием пути к jar-у или директории с классами в глобальную переменную CLASSPATH
- Указанием значение параметра -classpath (он же -cp) при запуске groovy, groovysh, и тд.
- Размещением необходимых jar-ов в директории ~/.groovy/lib
При разработке небольшой утилиты парсинга и анализа лог-файлов мне необходимо было выбирать нужный jar-файл в зависимости от некоторых условий.
Потому ни один из приведенных способов мне не подошел.
К тому же мне необходимо было искать jar-файлы в директории, в которой находился сам скрипт, в то время как запускаться он мог из любой директории.
Вспомнив про черновик заметки о ClassLoader-ах, которую Юра все никак не соберется дописать и опубликовать, получилось что-то вроде:
Простой прием, демонстрирующий определение местополжения класса и загрузку дополнительных JAR-ов
[java]
def codebase = this.getClass().getProtectionDomain().getCodeSource().getLocation()
def f = new File(codebase as String)
def url = new URL(f.getParent()+"/commons-lang-2.3.jar")
this.getClass().getClassLoader().getRootLoader().addURL(url)
Class au = Class.forName("org.apache.commons.lang.StringUtils")
assert au.isEmpty(null) && au.isEmpty("")
[/java]
P.S. Кстати запускать groovy-скрипт в UNIX-среде можно точно так же, как и sh, perl, php, python скрипты – указанием в первой строке:
#!/usr/bin/env groovy
Заметил за собой…
Рубрика: Groovy | 29 May 2008, 11:40 |
Vadim Voituk
Только что заметил за собой что в случае, когда нужно быстро выполнить какой-либо код, перестал писать его на PHP, отдавая предпочтение Groovy.
Т.е. если раньше писал что-то вроде:
$ php -r 'echo strlen("0bed4ce7b082e0f1ca05")."\n";'
или
echo "0bed4ce7b082e0f1ca05" | wc -c
то теперь первое, что приходит в голову, это:
groovy -e 'println "0bed4ce7b082e0f1ca05".size()'
P.S. Пример, конечно же, получился не очень показательный, но жизненный – проверял длину идентификатора для выделения для него поля в БД.
P.S.S. Это только у меня echo "0bed4ce7b082e0f1ca05" | wc -c выдает 21, в то время как PHP и Groovy – 20?
Java Deployment Toolkit
Рубрика: Development, Java, JavaScript/Ajax | 28 May 2008, 10:55 |
Vadim Voituk
Вместе с выходом беты Java Development Kit 6u10, Sun анонсировали и выход вспомогательной, но IMHO очень полезной JavaScript-библиотеки Java Deployment Toolkit.
Назначение библиотеки – сделать развертывание и запуск Java-приложений в среде Web (апплетов, WebStart-приложений) более простой и комфортной.
При этом библиотека берет на себя задачи по определению установленных JRE, проверки соответствия их версий минимальным требуемым приложением, установке обновлений (если необходимо) и конечно же кроссбраузерного добавления обьектов на страницу.
Получается такой себе аналог SWFObject для Java.
Использовать Java Deployment Toolkit очень просто – достаточно подключить на web-страницу единственный JavaScript-файл:
[javascript]<script src=”http://java.com/js/deployJava.js”></script>[/javascript]
Пример добавления аплета на страницу будет выглядеть так:
deployJava.runApplet({codebase:"http://voituk.kiev.ua/demo/",
archive:"TumbleItemProject.jar", code:"components/TumbleItem.class",
width:"600", Height:"95"},
{maxwidth:120, nimgs:17, offset:-57, img:"images/tumble"}, "1.5")
где первый параметр метода runApplet() – параметры тэга <APPLET>,
второй – параметры, передаваемые самому апплету (значения <PARAM>),
третий – минимальная версия JRE необходимая для запуска апплета.
Что по cути отличается от использования старого доброго тега <APPLET> только формой нотации (JSON вместо HTML).
При этом, при попытке зайти на страницу с апплетом с помощью браузера, без установленного (или с устаревшим) Java Plugin, будет предложено установить последнюю версию оного.
Embedded fever
Рубрика: Java | 26 May 2008, 08:46 | juriy
Не все веб приложения одинаковые: одни большие, даже монстроидные: работают на кластерах веб-серверов и общаются с ордами баз данных и сервисов. Другие поменьше и поскромнее – работают, как правило на одном выделенном сервере, иногда ненавязчиво беседуя с сервером баз данных. Есть еще и третьи – совсем маленькие странички, которые выполняют очень узкий круг задач и обслуживают небольшое количество пользователей: они зачастую запущены на той же машине что и СУБД.
В этой заметке я уделю внимание третьему типу приложений – совсем маленьким системам. Их функционал ограничен небольшим набором вспомогательных функций, которые, к примеру, могут поддерживать основное приложение. Давайте на секунду представим, что нам потребовалось написать такое приложение. Какие будут первые действия? Конечно, установка Tomcat и MySQL. Вам не кажется неправильным, что ради запуска пары сервлетов вам нужно установить две достаточно больших и тяжеловесных системы? Что уж говорить о поставке такого “монстра” пользователям.
[Далее...]
