No public Twitter messages.


Этот блог устарел и, скорее всего, больше не будет обновляться. В ближайшем будущем он переедет сюда.
24 Август 2013 // Программинг

Производительность простых парсеров for fun

Сегодня в скайп-конфе попросили написать простой парсер удаляющий из большого файла все строки содержащие определённое ключевое слово. Быстро набросал достаточно грубый скрипт на Node.JS, который разбивал все 550мб на массив по переносу строки и проверял каждый элемент в цикле и изумился — файл в 530мб и ~1.7млн строк нода умудрилась преобразовать всего за 3 секунды.

Вот его код:

fs = require('fs')

fs.readFile 'data.txt', 'utf8', (err, data) ->
  file = data.split '\n'
  out = ''

  for string in file
    if string.search('/partner/') is -1
      out += string + '\n'

  fs.appendFile 'node_out.txt', out, (err) -> console.error err

Время исполнения — 2,9 секунды.

Стало интересно, как с такой задачкой справятся другие языки и я попросил друга написать такой же парсер на Perl, а затем подтянулись спецы по другим языкам появились и варианты на Python, Bash и Java. Примеры кода и время исполнения следуют дальше: Дальше →

теги: , , , , , ,

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


1 Апрель 2013 // Веб-разработка

Элемент <nsfw>

Среди новых семантических элементов для секции, футера, хедера и т. д. HTML 5 также предлагает элемент, который может содержать в себе любой другой элемент. Он описан как Не Безопасный Для Работы (Not Safe For Work – аббревиатура nsfw).

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

Это не сугубо презентационный элемент, хоть и выполняет эту функцию по умолчанию и выглядит так:

nsfw { display: none }

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

Это работает следующим образом:

<nsfw>
<figure>
<video src="chickens.ogv" autoplay>
</video>
<figcaption>Непристойное содержимое.</figcaption>
</figure>
</nsfw>

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

Новый элемент был предложен Айеном Хиксоном, редактором спецификации HTML 5 и сотрудником Google: «Google создает специальный индекс для тех, кто при поиске использует Google SafeSearch. Учитывая то, что 72,3% веб-контента представляет собой угрозу для работы, нам необходимо это анализировать с помощью машин. Семантическая маркировка порнографии и нецензурной лексики может значительно сократить время, необходимое для создания и увеличения точности нашего индекса, и, что наиболее важно, – обеспечения защиты маленьких детей».

На текущий момент это не внедрено ни в одном браузере, хотя в последнем объявлении об IE10 компания Microsoft подтвердила, что IE10 и его поисковик Bing будут использовать для этих целей свой собственный тег вместо стандартного .

теги: ,

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


9 Ноябрь 2012 // Веб-разработка

Динамическое изменение CSS-expression через JS

Привет.

Всем давно известно, что IE до 7 версии не поддердживал CSS-свойство position: fixed; и всем также давно известно, как осуществляется совместимость — через JS внутри CSS-expression: position: absolute; top: expression(document.getElementsByTagName("body")[0].scrollTop + "px");. Казалось бы, что сейчас такие дремучие версии IE уже никому не нужны, однако, как опять же всем давно известно, существует и некий Quirks Mode, который используют некоторые крупные сервисы (Amazon, например) и при создании браузерных плагинов, которые вставляют свой код в страницу, приходится учитывать. А поскольку взаимодействие с сайтом происходит через JS, то и применять CSS-свойства приходится динамически.

Итак, столкнулся я со следующей проблемой: IE не хочет корректно обрабатывать

  1. строку с CSS-expression отправленную в св-во так:
    obj.style.top = 'expression(document.getElementsByTagName("body")[0].scrollTop + "px")';
  2. так (хотя здесь проблема в ином, IE просто не применяет ничего аттрибуту style через setAttribute):
    obj.setAttribute('style', 'top: expression(document.getElementsByTagName("body")[0].scrollTop + "px")');
  3. так:
    obj.cssText = 'top: expression(document.getElementsByTagName("body")[0].scrollTop + "px");';
  4. и даже так:
    obj.className = 'pew';
    $("<style>.pew{top: expression(document.getElementsByTagName("body")[0].scrollTop + "px";}</style>").prependTo('body');

Но потом наткнулся на гайд по экспрешнам в MSDN и нашёл там решение:

Для работы с CSS-expression у IE в объекте style есть три метода (+1 для document):

  1. setExpression(property, "expression"); — присваивание экспрешна (условие пишется в кавычках);
  2. getExpression(property); — получение строки с экспрешном;
  3. removeExpression(property); — удаление экспрешна;
  4. document.recalc(true); — перерасчёт всех динамических CSS-значений текущего документа.

Таким образом спасла меня строка obj.setExpression('top', 'document.getElementsByTagName("body")[0].scrollTop + "px"');. Пользуйтесь.

теги: , , , , , ,

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


9 Июнь 2012 // Стартап

Основная идея стартапа

Идея несколько хулиганская и основана на весёлом кураже. Представьте ситуацию, когда вы собираетесь весёлой компанией в баре выпить пива, поесть, поговорить. Как водится — чекинитесь, а через полчаса-час, когда все уже на веселе, кому-то одному приходит сообщение с предложением выполнить небольшое задание, например «сфотографировать официантку под юбкой» или «сделать лук в женском туалете (для мальчиков)», etc. Никто не требует обязательного выполнения, но ведь это же весело! Выполнил — приложил фотографию, получил очки, расшарил в твиттер/фэйсбук (как же иначе?:]). Разумеется, всё это не привязано к пьянкам — квест может быть в любом месте: «поставь машину на место для инвалидов», «сфотографируйся на футбольном поле во время матча», «купи бутылку водки в 3 часа ночи». Вот такое интересное дополнение к жизни.

Всё это планируется как небольшая телефонная приложенька, с 1) лентой событий, 2) топами, 3) бэджиками, 4) поиском мест со списком квестов, 5) формой отправки квеста.

Сразу возникают вопросы:
Q: Как подтверждать выполнение квеста? Модерация?
A: Никакой модерации. Вы же пользуетесь Foursquare? Вы станете своим чекином обманывать друзей? А поверят они вам, если вы зачекинитесь там, где, скорее всего, вас нет? Никто не поверит вам, что вы сфотографировали официантку под юбкой, если нет фотографии:)

Q: Кто придумывает квесты?
A: Вот тут сложный вопрос. Куда веселее выполнять живые квесты, действительно привязанные к местам, чем набор стандартных. Возможно это будет сделано в виде набора стандартных + пользовательских квестов с модерацией (методом простого голосования другими пользователями).

Q: Монетизация?
A: Партнёрскими квестами. Например, «закажи 10 кружек пива в нашем заведении», или «скажи продавцу, что он сегодня душка и получи скидку».


мимими

теги: , ,

1 комментарий.


24 Май 2012 // Стартап

Вот и я, надеюсь, созрел

А дозрел я до создания собственного стартапа (ололо).

Появилась идея, над которой интересно работать и которая захватывает других, в процессе работы в стартапе (Glomper) появилось примерное видение того как и что необходимо делать. Завёл в блоге соответствующий раздел, в котором буду рассказывать о занимательном процессе. Полностью распишу идею, буду рассказывать об архитектуре, команде, собственно обо всём, что будет интересно. Стартап будет геосоциальный, на основе Форскверика и со всякими квестами.)

Как-то так :)

картинка для привлечения внимания

теги:

1 комментарий.


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]-->

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

теги: , , ,

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


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';
}

теги: ,

1 комментарий.


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

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

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

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

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

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

теги: , , , ,

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


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;
}

теги: , , , , ,

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



  • twitter
  • rss
  • хабр
  • жежека
  • ластфм