No public Twitter messages.


24 Август 2011 // Веб-разработка

IE Conditional comments

Просто положу здесь эту ссылку. Не так часто требуется, но когда требуется – всегда заминка. Надоело :)

<!--[if IE]>
According to the conditional comment this is Internet Explorer<br />
<![endif]-->
<!--[if IE 5]>
According to the conditional comment this is Internet Explorer 5<br />
<![endif]-->
<!--[if IE 5.0]>
According to the conditional comment this is Internet Explorer 5.0<br />
<![endif]-->
<!--[if IE 5.5]>
According to the conditional comment this is Internet Explorer 5.5<br />
<![endif]-->
<!--[if IE 6]>
According to the conditional comment this is Internet Explorer 6<br />
<![endif]-->
<!--[if IE 7]>
According to the conditional comment this is Internet Explorer 7<br />
<![endif]-->
<!--[if gte IE 5]>
According to the conditional comment this is Internet Explorer 5 and up<br />
<![endif]-->
<!--[if lt IE 6]>
According to the conditional comment this is Internet Explorer lower than 6<br />
<![endif]-->
<!--[if lte IE 5.5]>
According to the conditional comment this is Internet Explorer lower or equal to 5.5<br />
<![endif]-->
<!--[if gt IE 6]>
According to the conditional comment this is Internet Explorer greater than 6<br />
<![endif]-->

Всем спасибо.

теги: , , ,

нет коммаентариев.


8 Август 2011 // Идеи

Магазин подарков со своей внутренней валютой

Что даёт: человек получает возможность выбрать в подарок только то, что он хочет, при этом, средства на подарок приходят из тех источников, откуда они обычно не приходят :)

Суть – магазин подарков со своей виртуальной валютой. Каждый пользователь может сделать небольшой подарок (пользуясь любой электронной валютой пополнить счёт) любому человеку. Магазин заранее имеет привязку к социальным сетям и для работы с магазином не требуется регистрация, вследствие чего сделать подарок реально можно каждому.

Пользователи

В интернете у каждого более-менее социального пользователя, например твиттера или ЖЖ, есть сотни друзей с которыми практически каждый день идёт общение. Когда случается какое-то положительное событие или День Рождения, то, как правило, поздравление ограничивается поздравлением. Но зная себя – я могу сказать, что мне было бы не сложно для таких хороших людей, как мои друзья отправить 100-200 рублей в качестве маленького подарка. Мне было бы не жалко, но практического смысла это не имеет. Суть – создать копилку для реализации этого «не жалко».

Обоснование внутренней валюты

Любая подаренная сумма обладает некоторым психологическим подтекстом. Например, 100 рублей это мало и для кого-то, возможно, даже унизительно. Поскольку подразумевается, что подарки будут небольшими, имеет смысл избавиться от этого подтекста. Точно так же можно избавится от очевидности наценки на товар в магазине (наценка – не упор:).

Обоснование привязки к соц.сетям

а) Поскольку потенциально к сервису уже привязан каждый пользователь соц.сети, то деньги могут копиться на счёте того человека, который не сильно и собирается пользоваться сервисом. Также, в качестве рекламной акции виртуальную валюту на счёт может пополнять и рекламодатели.

б) Люди любят чем-то делиться с друзьями. По этой причине они постоянно залипают в социалках. А если отправил кому-то такой подарок, то как же не поделиться этим с остальными?

Простой пример

У друга наступил День Рождения и хочется как-то его поздравить, но он далеко. Открываешь его виш-лист на сайте магазина и напротив каждого пункта видишь сколько виртуальных денег ему нужно чтобы купить какой-то пункт. Например осталось 500 «ништяков» для покупки айфона о котором он всегда мечтал. Выбираешь способ оплаты и кидаешь ему на счёт денег на 100 единиц валюты с пометкой, например, «на айфон» и, возможно, с каким-то поздравлением. В социальной сети появляется: «я подарил другу 100 ништяков на покупку айфона, ему осталось совсем немного – подари праздник другу!». Таким образом друг получает что-то из своего виш-листа в подарок. Разве не чудесно? :)

теги: , ,

нет коммаентариев.


8 Август 2011 // Веб-разработка

Функции для работы с Cookie на javascript

Себе на заметку, чтоб было откуда их взять по-быстрому.

function getCookie( name ) {
var start = document.cookie.indexOf( name + "=" );
var len = start + name.length + 1;
if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
return null;
}
if ( start == -1 ) return null;
var end = document.cookie.indexOf( ';', len );
if ( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
var today = new Date();
today.setTime( today.getTime() );
if ( expires ) {
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );
document.cookie = name+'='+escape( value ) +
( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
( ( path ) ? ';path=' + path : '' ) +
( ( domain ) ? ';domain=' + domain : '' ) +
( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
if ( getCookie( name ) ) document.cookie = name + '=' +
( ( path ) ? ';path=' + path : '') +
( ( domain ) ? ';domain=' + domain : '' ) +
';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

теги: ,

нет коммаентариев.


4 Август 2011 // Портфолио

Декодер шрифта Брайля (шрифтбрайля.рф)

Шрифт Брайля был разработан для чтения книг слепыми людьми посредством тактильного контакта с поверхностью (кому интересно – можете почитать в Википедии), и из-за своего непохожего на обычный текст вида стал популярен для различного рода шифровок, вследствие чего его часто называют «шифром Брайля».

Достаточно долгое время играю в разного рода логические игры, где используются подобные шифровки и для оптимизации времени, а также для упращения самого процесса приходится писать всякие скриптики. Совсем недавно пришла идея, а за ней (на редкость) не заржавела и реализация декодера шрифта Брайля.

Собственно он :)

И поскольку многое я сделал исключительно для саморазвития – могу отметить несколько интересных функций, например все изменения введённых символов сохраняются в адресной строке, т.е. ссылку на набранную строку можно отправить кому угодно. Ещё, например, Помимо прямого дешифра используется и обратный, т.е. когда введены точки 1,2 и 3 отдельным столбиком выводится результат дешифровки 4, 5 и 6, т.к. в задании может не быть чёткой ясности о том что есть пустая точка, а что заполненная.

теги: , , , ,

нет коммаентариев.


1 Август 2011 // Веб-разработка

Клонирование объекта в javascript

Разрабатываю тут на работе шаблонизатор (эпопея, реально) на js и в одной из рекурсий столкнулся с проблемой – создаваемый объект не является совершенно новым, а лишь является ссылкой оригинального, что приводило к некоторым косякам.

var obj = { a: 1 };
var obj1 = obj;
obj1.a = 0; // при этом obj.a также становится равным 0.

Соответственно потребовалось нечто, что смогло бы создавать копию объекта без ссылки на оригинальный. После недолгого поиска было найдено решение – волшебная функция uneval (обратное от функции eval). Выглядит оно потрясающе элегантно:

function clone(o) {
return eval(uneval(o));
}

Радость была бы абсолютной не узнай я, что функция uneval не работает не только в IE, но и в Опере, и даже в WebKit. Печаль была безгранична. В замен этому решению было придумано собственное, не сильно сложнее:

function clone(o) {
var obj = {};
for(var i in o){
obj[i] = o[i];
}
return obj;
}

Очевидно – немного криво, поскольку не учитывается тип входящего объекта (вдруг это массив или строка?). Протестил и опечалился, в рекурсии оно почему-то опять портит воздух. Даже после всего этого я не стал унывать и спустя выходные решение нашлось внезапно в начале рабочего дня:

function clone(o) {
return eval("("+JSON.stringify(o)+")");
}

Честно говоря плохо понимаю, что это за глобальный объект JSON и откуда он взялся (вероятно какая-то дыра в моём убогом самообразовании), но его замечательный метод stringify выполняет примерно то же, что и print_r в php. При этом этот способ вполне кроссбраузерен – протестил в IE9, FF5, Opera 11 и Chrome 11 (более ранние версии проверять лень). Придётся убить заготовку поста про мой самописный скрипт print_r для js.

P.S. Коллега подсказал функцию которую он использовал сам (с учётом всякого), может пригодиться:

function clone(obj)
{
if(obj == null || typeof(obj) != 'object')
{
return obj;
}
var temp = {};
for(var key in obj)
{
temp[key] = clone(obj[key]);
}
return temp;
}

теги: , , , , ,

нет коммаентариев.


21 Январь 2011 // Идеи

Идея для гео-локационного сервиса

А вот вам отличная идея рождённая @golovlev, когда я ему рассказывал про возможности Google Локатора.

Суть идеи – автоматизация чекинов в гео-локационных сервисах посредством Google Локатора.

Механика такая:

На телефон в фон вешается Google Локатор. Серверная часть принимает координаты и когда в течение некоторого времени человек находится на одном месте, при этом не относящемся к категориям «работа» или «дом» отправляет на телефон сообщение с предложением зачекиниться. Можно предложить, например, место в котором человек чекинился находясь в этом самом месте или открыть настроенное гео-локационное приложение.

Для решении задачи существуют все необходимые API. Фактически готовая к реализации идея не имеющая готовой реализации.

Хорошая идея, но всё ровно не реализую, наверное.

теги: ,

нет коммаентариев.


19 Январь 2011 // Веб-разработка

position:fixed в ie6

Как известно, ie6 не поддерживает css-правило position: fixed, для иммитации существует вот такой несложный хак:

#some {
    position: fixed;
    top: 10px;
    left: 10px;
    width: 100px;
    height: 100px;
}
/* эмуляция position: fixed */
* html #some {
    position: absolute;
    top: expression(document.getElementsByTagName( 'body' )[0].scrollTop + "px");
    left: expression(document.getElementsByTagName( 'body' )[0].scrollLeft + "px");
    margin-left: 10px; /* эмуляция top: 10px; */
    margin-top: 10px; /* эмуляция left: 10px; */
}

У этого хака известен один досадный баг – из-за постоянного и очень неспешного пересчёта координат див будет постоянно дёргаться. Решается эта проблема полным сносом доктайпа со страницы. В некоторых случаях, кстати, этот костыль вообще не работает при наличии доктайпа на странице. Падений браузера и прочих критических проблем при использовании костыля не замечено.

Присутствует также ещё один минус – свойства bottom и right реализовать получится только дополнительным js-кодом. Для проектов использую jQuery, по-этому для имитации, например, bottom: 10px; вполне прокатывает конструкция $("#some").css("margin-top", ($(window).height() - 10) + "px");.

теги: , , ,

нет коммаентариев.


17 Январь 2011 // Всякое

Объективные и субъективные минусы iPhone

Уже несколько лет пользуюсь iPhone и уже около 3-х месяцев как владею iPhone 4. Любой, купивший сей аппарат – в лице общественности автоматически становится особенным человеком, самым цензурным словом – «маколюбом», а также объектом тысячи выпадов против iPhone, Apple и прочих Стивов Джобсов от людей иного вероисповедания. Не каждый человек готов спорить и устойчив к вызовам на священные войны, а значит начинает нести невразумительную пургу в защиту аппарата, тем самым подтверждая в умах иных гепотизу о «сектантстве». Чтобы отфильтровать весь спам, флуд и оффтоп, я решил выписать полный перечень претензий к данному устройству, как объективных, так и субъективных. В помощь при выборе устройства.

Объективные минусы iPhone:

  • Привязка к одной конкретной библиотеке iTunes (т.е. к одному компьютеру), в то время как всё файловое взаимодействие с аппаратом происходит только через синхронизацию iTunes, а значит:
  • Нельзя использовать телефон как флешку, т.е. с любого компа просто закинуть на него любой файл, песню, картинку, точно также:
  • Нельзя скопировать файл из телефона на компьютер, за исключением фотографий и видео – их можно.
  • Нельзя отправлять и принимать файлы по Bluetooth.
  • Батарейка не выдерживает натиска опытного гика и сутки прожить ей достаточно тяжко, так что приходится носить с собой как минимум проводок. Проблему усугубляет:
  • Отсутствие сменной батареи. Ну, точнее, сменить её можно, но это нелёгкая хирургическая и не сказать что дешевая операция.
  • Проблема потери сети при захвате левой части корпуса на iPhone 4 (антена-гейт) действительно имеет место и напрягает, а бампер который лечит эту проблему превращает отличный дизайн корпуса как внешне, так и тактильно в бюджетную пластмассовую нокию.
  • С компасом беда – иногда очень долго настраивается, а иногда просто не правильно показывает.
  • Чтобы зимой тыкать в экран приходится снимать перчатки, тыкать носом или, как некоторые, языком).
  • Нельзя использовать телефон как хот-спот (точка доступа Wi-Fi) чтобы раздавать интернет на другие устройства, как с определённых версий Android. Между тем функция анонсирована к мартовскому апдейту.
  • iPhone игрушка труднодоступная. Или много денег, или много мозголомства с покупкой и доставкой аппарата из другой страны.

Можно тыщу лет спорить про то что это вовсе и не минусы, но для многих людей это действительно объективные минусы.

Спорные, глупые, придирочные, решаемые и прочие субъективные минусы:

  • Сразу же при покупке – микро-сим! Не сказать что беда серьёзная, но небольшой элемент паники присутствует.
  • Для пользователей Windows – iTunes. Последнее время он стал чуть менее тормозным, но тем не менее остаётся чрезвычайно ненативным и не менее чрезвычайно медлительным.
  • Отсутствие Flash-плеера.
  • Отсутствие поддержки карт памяти.
  • Нельзя ставить полный трек из медиатеки на звонок или будильник. Только 30-секундный сэмпл.
  • Нет синхронизации через Wi-Fi.
  • Если iPhone 4 – покупайте защитную плёнку на заднюю панель, иначе вся исцарапанная будет.
  • В России нельзя покупать медиа-контент из iTunes Store, для этого приходится покупать подарочные сертификаты по завышенным ценам (впрочем к iPhone это относится весьма отдалённо).
  • Многим не нравится маленький экран и отсутствие Super AMOLED.
  • Хороший, грамотный и адекватный софт в AppStore бесплатен только если его сделал Google :P
  • Для многих людей сложно сразу и без проблем привязать карту к AppStore, а иногда, по непонятным причинам карты и не привязываются, после чего приходится заказывать выпуск дополнительных виртуальных карт, помимо этого:
  • Отсутствует возможность расплачиваться за приложения прямо со счёта мобильного (как в Ovi) или другими платёжными системами, например, Google Checkout (как в Android).
  • Воистину корявая автокоррекция текста сама заменяющая слова, при этом сложно отменить вариант предложенный телефоном, отключил сразу.
  • Многозадачности нет, есть быстрый запуск программы в то же состояние, в котором она была закрыта. Многозадачность имитируется Push-уведомлениями. С одной стороны для многих очевидный минус, с другой стороны от части гениальное решение переносящее фоновую работу приложений в облако, от чего не убивается батарейка и не тормозит телефон.
  • Почему-то недоведены до ума нативные приложения «Диктофон», «Погода» и «Часы». Первый хоть и выглядит красиво работает действительно глючно и пользоваться неудобно, каким-то образом умудрялся записывать звук в разных форматах. «Погода» предлагает очень небольшой список городов, названия которых ни разу не локализованы. В приложении «Часы» очень мало городов для выбора времени и, особенно последнее время, много глючащий будильник и иногда не звонящий таймер.
  • Ну и классическое: нет радио, нет тв, нет Java-приложений, нет Wi-Max 4G Professional Enterprise Edition 2000 Yota 2.0 beta, а ведь даже на китайских поделках есть!

Но стоит помнить, что не одними минусами славен iPhone. Он, вообще-то, отличный :)

теги: , ,

5 комментарий(ев).


13 Январь 2011 // Веб-разработка

Определяем iPad с помощью JavaScript

Поскольку моя работа в данный момент связана с проектами для московского правительства, то вполне очевидно, что без особенной поддержки таких устройств как iPad не обойтись. Нанотехнологии, инновации, Россия вперёд! Все дела, в общем. У нас на работе проблема обнаружения iPad до недавнего времени решалась грустным костылём – if($.browser.safari). Не дело.

Разумеется самый простой и адекватный способ – распарсить строку юзерагента. Выглядит она у iPad примерно так:

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10

Для определения же, создаём переменную isiPad:

var isiPad = navigator.userAgent.match(/iPad/i) != null;

Далее просто используем условие if(isiPad) или if(!isiPad).

теги: , ,

нет коммаентариев.


20 Декабрь 2010 // Веб-разработка

Определение наличия тега на странице с помощью jquery

По-скольку логичное с точки зрения кодинга if($("#id")) не катит. Делается так: if($("#id").length). Соответственно с любым другим селектором тоже катит.

Спасибо за внимание.

теги: ,

нет коммаентариев.



  • twitter
  • rss
  • del.icio.us
  • хабр
  • жежека
  • ластфм