Thank You, Steve
Steve Jobs, 1955 – 2011
Explain to me what JavaScript is…
Одно из самых литературных объяснений – “что такое JavaScript и причем тут Java”.
Here is something else you should know about Javascript that seems like it was almost designed to be confusing as possible:
- There is a programming language called Javascript.
- There is a programming language called Java.
- There is an interpreter (‘thing that makes it go’) for the programming language Javascript built into most web browsers
- There is an interpreter for the programming language Java that is sort of built in to most web browsers, or was.
- THESE TWO PROGRAMMING LANGUAGES HAVE ALMOST NOTHING TO DO WITH EACH OTHER
Кратко и ёмко. Затрагивается даже история создания JavaScript…
So Netscape said to a guy named Brendan, who worked at Netscape, “Please make us a programming language.
Also, you have to call it Javascript.
Also, if you can make some of it kind-of sort-of look a bit like Java, that would be even better.
Also, you have only 10 days to do this so get cracking!”
В общем почитайте.
ɹoןoɔןıu
ColorPicker.app за 5 секунд
- Запускаем AppleScript Editor.
- Открываем новый скрипт (⌘+N (Command+N))
- Пишем
choose color - Сохраняем как приложение (например ColorPicker.app)
Все. Теперь у нас есть отличное приложение, которое помогает получить цвет чего-то, что видно на экране! Чумовая штука. Если туда еще добавить Developer Color Picker – получим хорошее подспорье для разработки на Objective-C.
TODO/FIXME метки в Xcode 4
В TextMate (хотя и не только в нем, в Emacs например тоже) есть возможность визуально выделить строки наподобии этих:
// TODO: Надо не забыть что-то не забыть сделать...
Также есть хорошие плагины, которые могут такие вот метки собрать [по проекту] и показать в одном месте. И даже сделать их ссылками на файлы с кодом… В общем штука удобная.
Некоторое время назад, я решил попробовать пописать немного на Objective-C и, само-собой, делать это удобно в Xcode. Но вот только с бандлами и прочими расширениями там не очень… Да, можно делать так, как выше и использовать глобальный поиск. Можно даже делать так:
#warning TODO: сделать то-то...
И оно даже ничего так будет работать. Если не считать того, что эти ворнинги часто двоятся и с отступами у них не все так хорошо… А можно сделать так:
Т.е., нужно в Targets -> Build Phases добавить новую фазу Run Script и поместить туда следующий скрипт:
KEYWORDS="TODO:|FIXME:|\?\?\?:|\!\!\!:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | perl -p -e "s/($KEYWORDS)/ warning: \$1/"
Скрипт сработает, как бы это не показалось странным, в время билда приложения. И добавить warning’ов по кол-ву TODO:/FIXME: меток. Ворнинги эти кликабельны. и ведут на себя же. Что есть очень удобно. Также удобно то, что “всегда” видно кол-во этих меток. Это при условии, что у вас нет других ворнингов ;).
ȵ
OS X Lion и ~/Library
Исчезла эта папочка… Вернее не исчезла, а спряталась. Наверно это и правильно — нечего там с немытыми руками делать.
Но если она вам таки нужна, вот волшебные слова:
chflags nohidden ~/Library/
Ну либо можно туда разок другой сходить через ⇧ + ⌘ +G
либо с помощью Terminal’а – [open|cd] ~/Library
ȵ
`!` в имени события
Следующий код довольно часто можно видеть, если используется библиотека jQuery:
$('#foo')
.bind('click', function(){ console.log('click event') })
.bind('click.my', function(){ console.log('click.my event') }); //namespaced event
//потом это обработчики могут вызываться...
console.log('step 1');
$('#foo').trigger('click');
console.log('step 2');
$('#foo').trigger('click.my');
Результатом этих вызовов будет вывод в консоль следующего:
step 1
click event
click.my event
step 2
click.my event
Это хорошо известно, про это написано в доках по jQuery и это понятно. А вот про что там не написано, это про то, что можно написать так:
console.log('step 3');
$('#foo').trigger('click!');
(обратите внимание на восклицательный знак в имени ивента). И вот тогда в консоле мы увидем такое:
step 2
click event
И все. Т.е. вывода click.my event мы не увидим. Если посмотерть в исходники jQuery, то там это выглядит так:
...
if ( type.indexOf("!") >= 0 ) {
event.type = type = type.slice(0, -1);
event.exclusive = true;
}
...
т.е. это некий вариант exclusive событий. И этим, в частности, пользуется плагин DataLink, изучение исходников которого (на предмет “переделать для себя”) и всплыло это странное exclusive.
MacIrssi – убираем join/quit сообщения
Короткая заметка для себя:
/ignore -channels #channel_name * JOINS PARTS QUITS NICKS
Убирает вошел/вышел/сменил ник/и т.п. сообщения в канале #channel_name. Если канал живой, то читать будет сильно легче.
Шаблон Node.js сервера
Если сейчас пойти в поисковик и поискать там что-то типа “как сделать приложение на Node.js”, то там будет много чего… И практически везде будет что-то типа этого: “…ставим Express/Connect, пишем лиснеры…”. Да, можно и так. Но если вам нужно что-то маленькое, простое. Где не хочется подключать лишнего. Или хочется сделать все с нуля… В общем вот простой серверочек, который реагирует на урл http://server/- отвечая “Thanks!”. На остальные урлы он просто отвечает кодом 200.
Глядеть тут, на guthub’е
P.S.
Надо как-то побороть markdown… а то не дает эмбедить gist’ы сюда.
Очевидное – книги в iTunes
Нет, очевидное – это не то, что книжки некоторое время как уже можно и удобно хранить тоже в библиотеке iTunes, как и музыку с фильмами. А очевидно это то, что можно положить папку ~/Music/iTunes/iTunes Music/Books в DropBox, а на ее место, в ~/Music/iTunes/iTunes Music/ положить symlink.
Что это дает? Это дает то, что книжки теперь также лежат и в дропбоксе, доступны везде, в том числе в разного рода ReaddleDocs или ReadMe на iPad. И не нужно “не забыть” эту книжку туда положить. Если что – ее можно просто скачать. Благо что все нормальные читалки уже давно или умеют лазать по DropBox или, на крайний случай, просто зайти туда с помощью встроенного браузера и скачать книгу.
Кстати, если у кого-то еще нет DropBox’а – рекомендую
(:
jQueryUI custom widget
Куда ж еще записать, как не сюда?
Итак, есть идея – сделать свой виджет для jQueryUI. Почему именно эта библиотека? А не важно. Просто мне она нравится. Итак, виджет. Вот “скелет” для виджета плюс несколько забавностей, на которые я набрел:
(function($, window, document, undefined){
//handy log function
window.log = function(){
log.history = log.history || [];
log.history.push(arguments);
if(this.console)
console.log( Array.prototype.slice.call(arguments) );
};
$.extend($.expr[':'], {
lookup: function(a){return a.getAttribute('t2-ui-role') === 'lookup';}
});
var Lookup = {
options: {
version: '0',
icon: 'search'
},
currentlyActiveLookup: null,
_create: function(){
var self = this,
el = self.element;
self.options.icons.primary = self.icon;
//log('element IS'+(el.jquery?'':' NOT')+' jQuery object');
$.ui.button.prototype._create.apply(self);
self._setOption('icons', {
primary:'ui-icon-'+self.options.icon,
secondary:null
});
el.bind('click', function(e){
e.preventDefault();
e.stopPropagation();
$(e.target).trigger('lookup.t2', {lookup:this});
self._trigger('activated', null, {lookup:this});
return false;
});
},
_init: function(){ log('_init'); },
boom: function(){ log('nice, you boom me!'); }
};
$.widget('t2.lookup', $.ui.button, Lookup);//NS doesn't mean something yet
//====================== RUN CODE HERE ======================
$('#id_ref_button').button({icons:{primary: "ui-icon-search"}});
var l1 = $(':lookup').lookup({
activated: function(e, data){ //tightly coupled
log('activated callback fired');
log(' '+data, data.lookup);
}
});
// a-la Observer Pattern
$('body').bind('lookup.t2', function(e, data){ //loosely coupled v.1
log('lookup.t2 event catched');
log(' '+data, data ? data.lookup : 'nope');
});
$('body').bind('lookupactivated', function(e, data){ //loosely coupled v.2
log('lookupactivated event catched'); //why not activated.lookup?
log(' '+data, data.lookup);
});
l1.lookup('boom');
})(jQuery, window, window.document)
Самое странное – это то, как виджет может общаться с внешним миром… Итак, есть конечно стандартный (для пользователей jQuery) способ .trigger(). Ловить такие события можно тоже стандартным способом – .bind(). Тут вроде все просто и все понятно. Далее, jQueryUI предлагает свой способ: this._trigger(type, event, data). Где первый параметр это имя события, второй – это jQuery.Even object. Третий – это что-то, что вы еще хотите передать в это событие. Учтите, что третий параметр передается используя .apply(), так что если там будет массив — он развернется в список аргументов. Это влияет на то, как писать сигнатуру колбэка и обсервера событий
А вот такие события уже можно ловить 2мя способами:
- callback —
.lookup({ activated: function(){} }) - observer —
.bind('lookupactivated', function(){} )
Мне больше нравится второй вариант. Во-первых, Event Bubbling позволяет навесить обработчик на контейнер, где эти виджеты появляются и убрать код из инициализации этих виджетов при получении данных с помощью AJAX. Во-вторых это просто красиво.
Единственный тут минус – это название этого события… Оно строится самим jQueryUI и представляет собой widget_name + event_nameбез точек и пробелов… Ну… зато плюсы хороши и приятны. Среди плюсов также то, что третий параметр для данного способа не развернется (в случае, если это массив) в аргументы.
Кстати, в данном примере я “наследовался” от уже существующего виджета $.ui.button, но если без этого – просто не указывайте второй параметр при регистрации виджета $.widget('t2.lookup', $.ui.button, Lookup);. Кстати, namespace, указываемый при регистрации ничего не значит. По крайней мере пока ничего. Так что можно делать свой или использовать тот, что использует сама jQueryUI ($.widget('ui.lookup', Lookup);) — выбирайте сами.
Как это все работает и вообще попробовать самому можно на мега полезном ресурсе JSBin.
P.S.
Надо бы кстати написать про мега удобный кусок кода… В след. раз.
(function($, window, document, undefined){
//code goes here
})(jQuery, window, window.document)
(:



