Текстовый редактор для Nokia 5800
Я уже писал, что у Nokia 5800 наблюдается некоторый дефицит офисных программ. Странно, но даже обычный текстовый редактор для мобильника найти не так то просто, хотя создать некое подобие notepad'a проще простого.
Немного поколдовав с Sun Java Wireless Toolkit, сделал небольшой текстовый редактор для своего мобильника который умеет читать, редактировать и сохранять текстовые UTF-8 файлы.
Отсюда можно скачать TextEditor.jar. Исходники редактора можно скачать здесь.
В принципе, программа должна запуститься на любом мобильнике с Java и файловой системой к коим относятся практически все Symbian и Windows Mobile устройства.
К сожалению, jar не подписан, поэтому при работе приложение выдает кучу дурацких предупреждений, как с этим справиться я пока не придумал, в крайнем случае придется покупать сертификат, а это довольно дорого Может кто знает более дешевый способ? Он должен, должен быть это способ, его не может не быть.
UPD: Для установки - скачиваем TextEditor.jar, кладем на флешку телефона, предаварительно подключив телефон к компьютеру, можно сразу скачать jar через встроенный браузер телефона. Запускаем jar через встроенный файловый менеджер телефона. Соглашаемся со всеми варнингами - после установки в телефоне в списке приложений появится значёк запускающий текстовый редактор.
Скрипт для генерации снега
Сегодня один из заказчиков попросил поставить на сайт снежинки - да да старые добрые снежинки которые вот уже которые год падают на сайтах в новогоднюю ночь.
Сначало было откопали один из старых скриптов для создания эффекта падающих снежинок, долго его настраивали потом выкинули нафиг и за полчаса написали свой, с классами, минифицированная версия весит 6K - можно еще уменьшить, но я не особо старался удалить все неиспользуемые функции - это ведь только на новогодние праздники - потом уберем до следующего года.
Отсюда можно скачать наш скрипт для генерации снежинок. Если кликнуть на ссылку то можно посмотреть скрипт в действии. Скрипт очень простой, если захотите использовать нужно будет изменить путь к файлам со снежинками, ну и коничество и форму снежинок можно подобрать по вкусу.
Ограничение области видимости в JavaScript
Иногда в JavaScript нужно создать пару методов которые должны быть видны только изнутри определенного куска кода. Для этого достаточно внести эти методы внутрь анонимной функции и сразу ее выполнить:
(function(){ //наша анонимная функция function func1(){ //первая функция видимость которой нужно ограничить alert('!'); } function func2(){ //вторая функция видимость которой нужно ограничить func1(); } func2(); //внутри блока func1 и func2 "видят" друг друга и могут быть вызваны! })(); //выполнить //при этом вне блока func1 и func2 оказываются невидны!
Этот принцип может быть также использован для создания приватных методов и свойств при программировании объектов.
Корректный способ итерации сквозь объекты
JavaScript удивительно мощный язык и, пожалуй самой мощным его свойством является возможность динамического конструирования объектов. Одной из часто встречающихся задач возникающих при работе с JavaScript является итерация по всем элементам объекта.
Допустим, у нас есть объект созданный вот таким образом:
var obj = {property1:"свойство 1",property2:"свойство 2"};
вот самый распространенный НЕПРАВИЛЬНЫЙ способ показать все свойства объекта:
for(key in obj){ alert(key); }
Вроде все работает правильно и на экране действительно последовательно покажутся все свойства объекта. Почему такой способ является неправильным?
Добавим перед циклом вот такую строчку:
Object.prototype['test1'] = "test1 value";
При запуске скрипта еще раз оказывается, что наш объект волшебным образом приобретает еще одно свойство - test1, хотя мы его не создавали! Это значит что любая сторонняя библиотека которая таким способом расширяет функциональность стандартных классов JavaScript, например prototype.js способна непредсказуем образом изменить логику работы ваших программ. В данном случае хорошим тоном является сравнение текущего свойства и свойства прототипа при каждой итерации, если они равны, значит ничего не делаем:
for(key in obj){ if (obj.constructor.prototype[key]!==obj[key]){ alert(obj[key]); } }
Обратите внимание, что здесь использовано строгое сравнение !==. Все просто, все логично, вот только набирать это каждый раз довольно утомительно, поэтому создадим вот такую функцию:
function forEach(obj,fn){ for(key in obj){ if (obj.constructor.prototype[key]!==obj[key]){ if (fn(key)===false) break; } } }
В этом случае итерация запишется совсем просто:
forEach(obj,function(key){ alert(obj['key']); });
Обратите внимание, что в функции forEach есть возможность остановить итерацию досрочно, что бывает полезно например при поиске элемента, для этого достаточно возвратить false:
forEach(obj,function(key){ alert(obj['key']); if (key=='property1') return false; });