12/31/2009

IE: change the value of a text input box on focus

IE has a strange behavior of setting the cursor to the beginning of the input box if you change the value of a text input on focus like this (using jQuery in this example):

$('#inputbox').focus(function() {$(this).val('somevalue')})

The way around this is to use event bubbling. You can use this script to allow jQuery live function to work with focus event: http://stackoverflow.com/questions/1199293/simulating-focus-and-blur-in-jquery-live-method (jQuery 1.4 and above should have this built in). So the correct code will look like:

$('#inputbox').live('focus', function() {$(this).val('somevalue')})

IE will not put the cursor in the exact position where user would expect it to be.

12/12/2009

Установка прошивки DD-WRT на маршрутизатор ASUS WL-520GC

Недавно приобрел себе маршрутизатор ASUS WL520GC для того, чтобы раздавать Wi-Fi интернет дома. Стандартная прошивка этого рутера облавает весьма скудными возможностями, например, поскольку подключен я к провайдеру через VPN, приходилось переподключать интернет каждое утро, поскольку соединение закрывалось по истесение некоторого периода неактивности. После не очень продолжительных поисков набрел на прошивку DD-WRT (http://dd-wrt.com/site/index). Прошивка (особенно в полной ее версии) предоставляет море полезного функционала, в том чиле поддержка соединения, удобный просмотр подключенных к ней клиентов, в том числе и беспроводным подключением (для беспроводных клиентов также показывается сила сигнала), позволяет мониторить трафик во всех подробностях и многое другое. К сожалению, объем флэш памяти в рутере 520GC всего 2Мб, поэтому поставить на него можно всего лишь микро версию прошивки. В этой версии, к большому моему разочарованию, отсутствуют многие полезные функции, а самое главное - PPTP клиент (передо мной стояла задача заставить рутер работать одновременно в локальной сети интернет провайдера и непосредсвтенно в интернет через VPN).

Итак, собственно установка:

1. Рутер не даст заменить прошивку, если в нем утановлена версия стандартной прошивки 2.0.1.0 или выше. Т.е. прежде, чем поставить прошивку DD-WRT, необходимо поставить в рутер более старую версию прошивки, например 2.0.0.8. Такая прошивка может быть скачана с официального сайта Asus (http://dlsvr04.asus.com/pub/ASUS/wireless/WL-520GC/FW_WL520gc_2008_EN.zip). Но для того, чтобы установить эту прошивку, нужно заставить рутер "думать", что эта версия прошивки новее, чем та которая уже установлена. Для этого нужно 2.0.0.8 в имени файла прошивки (.trx) заменить, например, на 2.0.1.2 (версия прошивки, которвя была установлена в моем рутере - 2.0.1.1). Теперь можно подгрзуить файл с прошивкой, через интерфейс обновления.

2. После всего этого можно наконец установить DD-WRT. На сайте программы есть достаточно удобный поиск (http://dd-wrt.com/site/support/router-database), который по модели рутера подскажет какую версию прошивки нужно установить. В поле поиска следует ввести 520GC. Странно, но для 520GC, среди предложенных прошивок, поиск предложил и версию мини, которая занимает больше 2 Мб. Не обрашая на версию мини внимания, выбираем версию микро (на сегодняшний день dd-wrt.v24_micro_generic.bin) и скачиваем. Этот файл заливаем в качестве новой прошивки через интерфейс обновления рутера.

3. После того, как прошивка закается на маршрутизатор и маршрутизатор перезапустится следует дать ему поработать пару минут, после чего можно приступить к настройке. Для этого в браудере вбиваем адрес маршрутизатора (по умолчанию 192.168.1.1). первым делом прошивка попросит вас создать логин и пароль для администратора. Вводим желаемый логин и пароль, и после этого переходим собственно к настройке. На закладке Setup > Basic setup в разделе WAN connection type вводим настройки подключения к провайдеру. Там в принципе все достаточно интуитивно. Остальные настройки можно смело оставить по умолчанию.

4. На закладке Wireless > Dasic settings вводим SSID - имя беспроводной сети. На закладке Wireless security вводим настройки безопасности. (проще всего на мой взгляд настроить WEP шифрование: просто вводим ключевую фразу и по ней генерируем ключи). Эти же ключи вводим в качестве ключей шифрования для WEP доступа на локальных компьютерах.

5. Все, маршрутизатор работает. Подробнее про установку прошивки можно также почитать здесь: http://www.dd-wrt.com/wiki/index.php/Installation

12/06/2009

Custom Tags in TinyMCE

One of the applications that I work with uses custom HTML-like tags to implement some of its functions. For example:

<review>Some text here</review>

The task was to create a plugin form TinyMCE that with a single click of a button would allow the user to wrap of portion of text ot HTML in such <review> tag. The task seems fairly simple and I was able to make it work pretty fast in all browsers, except IE. The problem is that TinyMCE uses DOM for processing HTML, however IE does not recognize any custom tags in DOM, thus it would simply ignore the custom tag that I put in. However, after a couple of days I've been able to solve that task as well. So let me start shwoing how the custom tag plugin is created and works.

To create new plugin in the plugins folder of the TinyMCE I create a new folder called KSReviewTag (this will be the name of the plugin). In this folder I have created a file called plugin_src.js: this will be the code for my plugin. TinyMCE comes with a bunch of plugins, so it is easy to see what the code of the plugin should be and what the interfaces are like. 

To allow the user wrapping HTML into the custom tag, a new TinyMCE command will need to be created. Since there will be only one button, the same command will be used to wrap the HTML and unwrap it, if it was already wrapped in the tag. Also, since TinyMCE and the browser do not know how to display this tag in the TinyMCE I am using SPAN with a class, so that user will be able to distinguish the text wrapped in the <review> tag. 

Adding a command looks like this:




ed.addCommand('mceKSReviewTag', function() {
var elm = ed.dom.getParent(ed.selection.getNode(), "SPAN.ksreview");
if (elm && elm.nodeName.toUpperCase() == "SPAN") {
tinyMCE.execCommand('mceRemoveNode', false, elm);
}
else {
ed.selection.setNode(ed.dom.create('span', {title: 'Review link', 'class': "ksreview"}, ed.selection.getContent()));
}
});

If the parent node of the current selection is <SPAN class="ksreview"> I remove it, otherwise I add it to the selection.

Assigning a command to a button is also really simple:



ed.addButton('KSReview', {
title : 'Review link',
cmd : 'mceKSReviewTag',
label: 'Review Link'
});


Now, when the user switches to the View Soucre mode of TinyMCE, or when the user saves the edited content I want him to see the custom tag, not the <SPAN> one. To achieve this I add a cusom handler to the PreProcess event:



ed.onPreProcess.add(function(ed, o) {
tinymce.each(ed.dom.select('span.ksreview', o.node), function(n) {
ed.dom.replace(ed.dom.create('review', null, n.innerHTML), n);
});
});


This code replaces all <SPAN class="ksreview"> tags with the custom < review> tag

Similarly, I want the custom tag to be replaced with SPAN tag when the user saves HTML content or when the editor first renders what has been previously saved in the TextArea.And this is where the Internet Explorer problem comes into play. Since IE does not understand custom tags, the TinyMCE would just drop it. However, it is not quite true to say that IE cannot work with custom tags: it can, but only in case id the custom tags have their own namespace. In other words the tag described here, if defined under the custom KS namespace would look like <ks:review>. But in order for IE to know that the KS namespace is valid it has to be mentioned at the definition of the HTML document. This is where I decided to modify the source code in the tinymce_src.js a little to make it able to support custom namespaces. In the tinymce_src.js I found where this HTML tag is defined for the editor's IFRAME and replaced it with the following:



var nsString = '';
if (s.customNS && s.customNS.length != 0) nsString = ' xmlns:' + s.customNS;
t.iframeHTML = s.doctype + '<html'+nsString+'><head xmlns="http://www.w3.org/1999/xhtml">';

So now I can add a custom namespace as a customNS configuration setting for the TinyMCE. In this case, I need to add custonNS: "ks" to the configuration settings of the editor.

So for internet explorer, bofre processing any content we need to replace <review> with <ks:review>. This is done with the following processing on the BeforeSetContent event:



ed.onBeforeSetContent.add( function(ed, o) {
if (tinymce.isIE) {
o.content = o.content.replace(new RegExp("<review>", "gi"),"<ks:review>");
o.content = o.content.replace(new RegExp("</review>", "gi"),"</ks:review>");
}
});


So the last thing left is to replace the custon tags with SPAN to display properly in the editor:



ed.onSetContent.add(function(ed, o) {
tinymce.each(ed.getDoc().getElementsByTagName("review"), function(n) {
ed.dom.replace(ed.dom.create('span', {title: 'Review link', 'class': "ksreview"}, n.innerHTML), n);
});
});


After all processing is done, all that's left to do is add some cosmetics: highlight the plugin button if the current selection is within the custom tag and display the custom tag in the DOM path properly:



ed.onNodeChange.add(function(ed, cm, n, co) {
n = ed.dom.getParent(n, 'SPAN.ksreview');

cm.setDisabled('KSReview', co);
cm.setActive('KSReview', 0);

// Activate all
if (n) {
do {
cm.setDisabled('KSReview', 0);
cm.setActive('KSReview', 1);
} while (n = n.parentNode);
}
});

if (ed.theme.onResolveName) {
ed.theme.onResolveName.add(function(th, o) {
var n = ed.dom.getParent(o.node, 'SPAN.ksreview');
if (n && n.nodeName.toUpperCase() == 'SPAN' && n.className.toUpperCase() == 'KSREVIEW') {
o.name = 'Review';
o.title = 'Review';
return false;
}
});
});

11/28/2009

Зачем фотографировать?

Так получилось, что повледние несколько лет я увлекаюсь фотографией. Я считаю это свое увлечение достаточно серьезным и постоянно стараюсь работать над навыкми фотографии и совершнствовать мастерство. Хотя до хорошщих снимков и настоящего профессионального уровня мне наверное все еще довольно далеко. В последнее время я задался вопросом, а зачем вобще заниматься фотографией?

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

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

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

Кстати, вот ссылка на мой фотоальбом: http://picasaweb.google.com/alex.zagvazdin . Там пока немного всего, т.к. я завел его недавно и проейдет еще какое-то время, пржде чем все достойные снимки перекочуют с компьютера в альбом, но все же кое-что там можно увидеть и сейчас.

11/22/2009

Владение долей в предприятии - первый шаг к коллективной собственности на средства производства

В некоторыых зарубежных компаниях (а также и в некоторых отечественных) практикуется так называетмя програма владения долей в предприятии для сотрудников - Employee Stock Ownership Plan. По-моему - коллектинре владние средствами производства чистой воды, при этом гораздо более эффективное, чем при государственном владении предприяттием. Ведь при ощутимой доле в предприятии, каждый сотрудник непосредственно заинтересован в эффективности работы всего предприятия, имея при этом стимул к эффективной работе гораздо более сильный, чем зарплата. Доля во владении предприятием может и должна передаваться всем сотрудникам предприятия, и быть при этом значительной и зависеть от вклада сотрудника в работу предприятия, а не от его должностного положения. При этом такая доля не должна быть предметом продажи сторонним лицам.

Поздка в Осло. Апрель-Май 2008

В конце апреля-начале мая 2008 года мне довелось побывать в Осло, столице Норвегии. К сожалению, поездка получилась довольно короткой (фактически у меня было всего несколько часов, чтобы побродить по городу), но несколько фотографий сделать удалось. Среди прочего, королевский дворец, центральная улица Осло, здание парламента, национальный театр, офис Opera Software и другое.

Летел в Осло из Киева я через Ригу, полет в общей сложности занял около 4 часов. Поскольку Латвия является Шенгенской страной, паспортный контроль я прошел еще в Риге (при пересадке я не придал этому значения), а по прибытию в Осло недоумевал, почему на выходе из аэропорта никого не интересует мой паспорт. 

С обменом валют, мобильной связью и транспортом в аэропорту Осло все просто и понятно. С транспортом особенно. Из аєропорта в город идет скоростной поезд Flytoget, который доставит вас в город за 15-20 минут. Билет на поезд в то время стоил около 100 крон (точно правда уже не помню), что составляло приблизительно 100 гривен. Поезди прибывает на центральный вокзал Осло, откуда можно пересеть на метро, автобус или трамвай. Стоимость проезда, впрочем как практически и все остальное в Осло, достаточно высоки. Так разовая поездка на метро или автобусе обойдется в 30 крон. 

Осло как город обладает уникальной атмосферой. Я был там в рабочий день, и ожидал от столичного города шума и суеты. Но даже в часы пик, на улицах Осло было тихо и свободно, на пробки даже не было и намека, а автобусы были полупустыми. И приэтом прохожие совершенно никуда не спешат. Говоря о транспорте и пробках, следует отметить, что стоимость владения автомобилем в Норвегии высока, бензин к примеру стоил на 2008 год в 2.5 раза дороже, чем в Киеве. Но с общественным транспортом никаких проблем нет, на каждой остановке размещена подробная карта маршрутов, а информацию о расписании движения и точную информацию о том, движется ли автобус, который вы ждете по графику или опаздывает, можно просмотреть в Интернет с мобильного телефона, а также на табло, размещенном на каждой автобусной остановке. Кроме того, в людных местах размещены автоматические пункты проката велосипедов. Т.е. за симолическую месячную платы, Вы можете при помощи специальной карты брать велосипед и в одном из таких пунктов проката и возвращать в другом таком пункте, которых в городе довольно много. 

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

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

Фотоотчет о поездке ниже.