Aug 21

Преди 2 дни видях в Ajaxian - A simple solution to the “other” problem with select boxes, което представлява решение на “другия” проблем, както би се превело буквално. Всъщносто там е представен jquery код с който когато от даден html select избереш “друг(other)” ти се появява input поленце където да кажеш какво точно е това другото. Вижте демо-то, защото май не го обясних добре.

Като идея е добре, но нещо jquery кода не ми се вижда много читав:


$(document).ready( function () {
	$('.leader').each( function () {
		var name = $(this).attr('name');
		if ($(this).val()!='other') {
			$(this).next().removeAttr('name').hide();
		 }
	});

	$('.leader').change(onChange);

	function onChange(){
		var desiredName = $(this).attr('name');
		if ($('#'+desiredName).val()=='other') {
			$('#'+desiredName).next().attr('name',desiredName).fadeIn('fast');
		} else {
			$('#'+desiredName).next().removeAttr('name').fadeOut('fast');
		}
	}
});

Много бях изненадан, че това стигна до Ajaxian (въпреки че доста са свалили летвата напоследък). В този код има няколко неща, които не ми харесват:

  1. 2 пъти прави почти едно и също,  избира всичките елементи с клас “leader” и проверява дали е избрана като стойност “other”, за да покаже/скрие следващия елемент.
  2. 2 пъти прави $(’.leader’), като явно е забравил, че едно от най-яките неща в jquery e changing-a. Спокойно е можел да направи просто $(’.leader).each( … ).change( … )
  3. на 3тия ред ( var name = $(this).attr(’name’) ), защо го има това и какво прави така и не разбрах, никъде в този scope не ползва name променливата, а и аз лично бих ползвал getAttribute за извличане на атрибута.
  4. в each-a се вика 3 пъти $() за един и същ елемент ( this в случая), по-добре е добре да се вземе jQuery инстанцията и да се запише в променлива - ще бъде доста по-бързо, когато се ползва.
  5. аз лично нямаше да сложа скобите на if-a в each-a, защото когато се пише javascript всеки байт е важен
  6. така и не ми стана ясно защо декларира функция onChange като може да ползва директно анонимна функция при $(’.leader’).change( … ).
  7. тук добре е направил, че е взел desiredName и го сложил в променлива, но ако някой ми каже защо при положение, че има this му трябва цели 3 пъти да вика jquery css selector с #id (и даже да не го записва в поменлива) ?!?
  8. малко ме подразниха и излишните празни редове и разстояния

Това са горе долу лошите неща, които видях, въпреки че не пиша много jquery код ми се струва че ако напише кода по този начин ще е доста по-добре:


$(document).ready(function(){
	$('.leader').change(function(
		var select = $(this);
		if(select.val() == 'other')
			select.next().attr('name', select.getAttribute('name')).fadeIn('fast');
		else
			select.next().removeAttr('name').fadeOut('fast');
	)).triggerHandler('change');
});

естествено и моята версия не е перфектна, даже davecardwell е написал доста по-добра версия.  Даже John-David Dalton е направил и Prototype версия : http://pastie.org/255119, от която най-много ми хареса допълнението на Element.fire, която я очаквам в новата версия на Prototype :)

п.п. Някои хора виждат и проблем, че само при стойност “other” се появява полето “други” и ако имаш два или повече езика би било проблем. Обаче аз виждам нещата така - това би бил селекта за български език например:


<select name="language">
	<option>Български</option>
	<option>Английски</option>
	<option value="other">Друг ...</option>
</select>

т.е. value може и да е “other” но за потребителя да е всеки избран език ;)

Jul 20

Тук http://shootout.alioth.debian.org/ има интересни сравнения на това как се държат различните програмни езици, кои е по-бърз и кои използва по-малко памет и други такива.

Jul 12

JRuby представлява JAVA имплементация на езика Ruby. Някои друг път ще пиша по-подробно защо хората правят такива неща и дали има смисъл от тях.

Как се инсталира JRuby за  Windows XP, много лесно :) . Въпреки че за хората който са свикнали да е само next -> next -> ok! няма да е толкова лесно.

  1. Слагате системната променлива JAVA_HOME, ако  я нямате дефинирана вече. Това става като дадете:
    My Computer -> Properties -> Advanced -> Environment Variables
    Давате New (като решите дали искате тази променлива да я има само за вашия акаунт или да я има за всичките възможни)
    Variable name: JAVA_HOME
    Variable value: пътя до JDK -a ви ( в моя случай е C:\Program Files\Java\jdk1.5.0_14 )
    ( не затваряйте
    Environment Variables панела, защото пак ще имаме работа в него)
  2. Изтегляте си от http://dist.codehaus.org/jruby/ последната версия на JRUBY ( за момента е тази http://dist.codehaus.org/jruby/jruby-bin-1.1.2.zip.
  3. Разахивирате съдържанието на изтегления архив в избрана от вас директория. Примерно C:\JRuby.
  4. Отворете Environment Variables панела (или се върнете от него ако не се го затворили при стъпка 1):
    My Computer -> Properties -> Advanced -> Environment Variables
  5. Добавете нова променлива:
    Variable name: JRUBY_HOME
    Variable value: директорията в която разархивирахте JRuby ( Примерната
    C:\JRuby)
  6. Променете вече съществуващата променлива PATH като добавите в нея пътя до папката bin на JRuby(C:\JRuby\bin). (пътищата там се разделят с ‘;’)
  7. Записвайте и затваряйте Environment Variables.

Това е!

Сега един бърз тест. Направете един файл което се казва test.rb в C: и напишете в него това:


include Java

import javax.swing.JFrame
import javax.swing.JLabel

frame = JFrame.new 'My first application';
frame.get_content_pane.add JLabel.new('JRuby works!')
frame.set_default_close_operation JFrame::EXIT_ON_CLOSE
frame.pack
frame.visible = true

Стартирайте cmd-то и напишете:
>jruby C:\test.rb

Jul 07

Днес реших да споделя 3 снимки, който ми се видяха доста интересни:

Рекламна торбичка на Шуменско:

IPhone timeline или пътя на IPhone до сега:

И накрая, callstack на JAVA приложение което е изградено чрез Spring и Hibernate в JBoss ApplicationServer.

(за повече информация има в този пост, а това е pdf с повече детайли.)

Jun 24

Днес чистейки старите си bookmark-oве, попаднах на тази интересна статия от 09 Май 2008 (малко старичка):

http://www.infoq.com/news/2008/05/should-you-learn-languages

В нея се задава въпросът дали има смисъл и дали е добре да владеем повече програмни езици. Там попадам на следния цитат (няма да го превеждам, че да не се загуби смисъла):

The programming languages, or rather language types, you understand (not necessary is most fluent in), tends to steer your thinking. According to natural language researchers, if there is a word missing (or a category of words) from a language, people have a hard time thinking about the concepts that the missing words represents. Paul Graham states approximately the same thing about programming languages.

Това ми напомня че преди години ми разказваха една книга (която така и не можах да прочета :( ). В нея се разправяло за държава (или остров беше май), където хората, които го управлявали контролирали населението като махали думи от речниците. Основната идея е че като не знаеш нещо или по точно като не знаеш как се казва е много трудно (а за доста хора и невъзможно) да си помислиш за него. Като например ако не знам, че има дума за “сладолед”, как мога въобще да си помисля, че искам сладолед. Или във контекста на книгата, като не знаят какво е бунт и свобода как могат хората да си помислят за тях.

Ако се върнем в IT света. Знанията който придобих при работата с JavaScript или Ruby  ми помогнаха страшно много с PHP, като прилагам (до колкото е възможно) част от семантиката в тези езици. Напоследък като се заглеждам по Python, гледам по малко по-различен начин на организацията на кода и други такива. А знанията от предишни езици страшно много ми помогнаха да оценя някои добри неща (да, даже и такива неща има) в Java. А и все пак всеки средно статистически developer му се налага да работи поне с 2-3 езика на куп (PHP/ASP.NET/JAVA/Ruby/Python , JavaScript, ActionScript 2/3, …).

И както чух от една лекция на Светлин Наков:

След 7-8 мия програмен език, останалите се учат за 1-2 дена :D .