Как стать автором
Обновить

Комментарии 135

>>Замечательная особенность window.name в том, что это значение сохраняется между загрузками страниц
Млин, век живи, век учись :-)
Спасибо за перевод.
оригинально, но имхо, хранить на клиенте или постоянно передавать под 2 мб данных - это бессовестно. Максимум хранить пару-тройку флагов, с чем прекрасно справляются и куки.
Фишка в том, что эти данные не передаются никуда - они хранятся локально для использования клиентскими скриптами и никогда не будут переданы серверу, поэтому в трафик вопрос не упирается.
А занять 2 Мб памяти при нынешних ее объемах вполне допустимо при необходимости, и это лучше, чем занимать ее на сервере.
Прелесть кук как раз в точ, что они на сервер отправляются и тем самым можно проверять авторизацию и прочее...
У вас просто не было такой объективной задачи никогда.
например? и что означает термин "объективная задача"?
Интересно. Нажмука +! авось пригодится.
2МБ это конечно хорошо, но как эти данные получить на стороне сервера? Это что получается куки "только для клиента"? Доступ к ним имеет только джаваскрипт, где это пригодится, для чего это применяется?
Случаи из практики:
- Админка интернет магазина реализована без полной перезагрузки страниц (все подгружается асинхронными запросами, или в скрытый фрейм, если передаются файлы). Вот тут интересно хранить последнее состояние развернутого дерева заказов, состояние предыдущих вкладок и т.п., что бы пользователь вернувшись обратно видел все как и было раньше...
Если полной перезагрузки нет, то эта штука как бы и не нужна. Она позволяет сохранять данные между полными перезагрузками, а без перезагрузки и так все прекрасно сохраняется.
согласен, абсолютно верно :)
сорри, забыл упомянуть, многие пользователи, наверное рефлекторно уже, любят иногда жать F5, тогда и может пригодится...
Это решение не для простых утилитарных скриптов, а для яваскрипт-приложений. Там обмен осуществляется асинхронно каким угодно образом, и куки далеко не самый удобный вариант обмена.

По сути, куки объединяет в себе 2 цели, которые по уму надо разделять - данные состояния и данные обмена. Вот для хранения состояния и предназначены sessvars, а обменом скрипт должен заниматься самостоятельно, передавай аяксом то, что нужно передать - а не целиком все данные состояния.
я применил данный подход в реализации алгоритма прямых АЯКС ссылок
Послать на сервер аяксом?
1) Один приличный минус - браузер закрыли и привет.
2) Согласен с тем что в куках и не надо хранить столько. В 90% случаях там весит пару строк или вообще одна - ид сессии, а все остальное уже хранится на сервере.

Но идея оригинальная, жаль еще нуб для плюсования =)
>> Один приличный минус - браузер закрыли и привет

это не минус, т.к. сессии на то и сессии чтобы хранится до закрытия браузера (в большинстве случаев)
не совсем так, имхо, не зря ж в куках есть время жизни. Кроме того нужен механизм восстановления сессии.
Ну а вообще я высказался, имхо, на клиенте нужно хранить миниум инфы.
Если уж 2 мб, то хранить их и пригодилось бы, но в большинстве случаев - большОе время. А тут до закрытия. Интересно, но не практично имхо.
НЛО прилетело и опубликовало эту надпись здесь
А как? Сессионные переменные?
Все было правильно, не обращай внимания на глупости.
НЛО прилетело и опубликовало эту надпись здесь
Не въехал в камент.

Что есть кастрированное хранение переменных? Мне кажется, вариант Томаса Франка самый что ни на есть полноценный - полноценнее кук это уж точно, потому что используется для хранения (для чего и предназначаются сессии), а не для обмена.
НЛО прилетело и опубликовало эту надпись здесь
Что в вашем понятии переменные сессии, сессия и для чего она нужна? Если вы эти понятия нормально усвоили, то никаких проблем с пониманием текста, смысла и заголовка не возникло бы.
Так вот хранить! Значит не только до закрытия браузера... =(
"Сессия" для начала не по-русски . "Сеанс" лучше.
Я надеюсь, вы не употребляете в речи слова "шампунь", "индустрия", "прогресс", "пиджак", не говоря уже о "компьютер" и "файл"?
«Индустрия» употребляю редко, предпочитаю «промышленность. Речь шла не о происхождении слова, а об осмысленном переводе в противоположность кальке, каковой является слово „сессия“ в данном контексте.

СЕССИЯ, ж:

  • Заседания представительного органа или коллегиального учреждения, происходящие периодически. // Период таких заседаний.
  • Экзамены в высших и средних учебных заведениях. // Период таких экзаменов.
А как насчет компьютера с файлами? Это же ужасно! Ведь есть ЭВМ и записи?
Мы же тут ИТ-шники, зачем вам правильный литературный перевод с русскими аналогами?
Как по мне, то "кальки" в переводах программерских статей (да и остальных относящихся к ИТ) позволяет многим людям думать одинаково, и потом не приходится догадываться что же автор нам как бы хотел сказать этим.
Мы же тут ИТ-шники, зачем вам правильный литературный перевод с русскими аналогами?

Хорошо, что айтишники, а не экологи, например, а то бы "pollution" переводили как "поллюция".

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

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

То, что для вас слово "сессия" применительно к программированию ничего общего со словом session не имеет - исключительно ваша личная проблема. Поищите в интернете слово "сессия" - добрую половину будет занимать именно различный материал по работе с теми самими session из топика. Если бы я переводил как "сеанс", то меня бы просто не поняли.

ЗЫ Не стоит всегда и везде махать при любой возможности словарями. Люди называют это фарисейством.
> Специалист должен владеть терминологией на своём языке.
Я когда-то ставил себе русскую версию Photoshop и видел 3dsmax. Это просто жопа (да, не литературное слово). Но переведено было все вроде бы и правильно. Поэтому с терминологией на родном языке в области IT я с вами не согласен.
НЛО прилетело и опубликовало эту надпись здесь
Насчет пиратских полностью согласен, просто интересно было.
А вообще официальная стала намного понятнее? :)
НЛО прилетело и опубликовало эту надпись здесь
критикуя предлагай
увидел 4 eval в коде — закрыл и больше не открывал
К сожалению, при таком подходе вам придется "закрыть и больше не открыть" такие вещи как prototype, jquery и даже json.
:) на 93Кб кода в jQuery eval встречается только 2 раза. Я не думаю, что Ваш довод при таком раскладе можно считать уместным.

Если кто-то может мне компетентно пояснить, почему eval стал считаться признаком хорошего программирования — я с радостью прооппонирую
Как в яваскрипте установить, скажем, значение произвольному ключу в хэше, не используя eval?
:) я бы начал с того, зачем вам менять "произвольный" ключ в хеше — почему нельзя обратиться по определенному?

Потом можно попробовать перебрать массив и собрать обратно, затем сравнить с eval

Потом можно поискать, что придумало прогрессивное человечество на эту тему, например, почитав John Resig про "замену и поиск без использования RegExp"
http://ejohn.org/blog/search-and-dont-re…

В общем, если у Вас есть конкретная задача — я готов обеспечить benchmark'и для различных ее решений
Код на php:
$key = 'somekey';
$hash[$key] = $someval;

Зачем придумывать потрясающие ноухау, чтобы сделать это на яваскрипте, когда можно просто:
var key = 'someval';
var hash = Object();
eval('hash.'+key+' = someval;');
потому что на клиенте это будет несколько тормозить :) Если это несколько помножить на число вызовов, то можно получить вполне реальная мс и с. Не более того.

Я не знаю реализации php, но на JavaScript этот код тормозит. Достаточно просто использовать другую структуру, например:
var hash = new Object();
var hash.keys = new Array();
hash.keys{key} = someval;
Эм, а вы с перлом не спутали? Что это за конструкция "hash.keys{key}"? Нет в яваскрипте адресуемых хэшей. Если бы была возможна такая запись, то не было миллиона эмуляций хэшей с произвольным ключом.
бесконечно извиняюсь, что не проверил:
var hash=new Object(),val='mykey';
hash.keys=new Array();
hash.keys[val]='myval';
alert(hash.keys[val]);
Такой подход плох вот этим:

var hash=new Object(),val='mykey';
hash.keys=new Array();
hash.keys[val]='myval';
alert(hash.keys.length); // 0?
Во-первых, зачем вообще нужен массив hash.keys, если в JS можно обращаться к свойствам объекта как к элементам массива?
var hash = { index: 100 };
alert( hash['index'] ); // 100
i=100 && alert( hash[i] ); // 100

Во-вторых, почему hash.keys.length==0?
length - динамическое свойство, меняется по мере добавления/удаления свойств.
хэш это как раз объект.
Не хэш вообще, а переменная под именем hash из примера выше.
именно.
{} - объект. У него нет свойства length
Верно, опечатался.
Не hash, а hash.keys, который Array. Length у него смотрим.
я не понял. При чем тут длина? И зачем нужен отдельно массив? У массива, кстати, длина не растет совершенно обоснованно. Потому что массив это массив. Он не хэш. Он не умеет включать в себя произвольные ключи.

аналогом вашего кода

var key = 'someval';
var hash = Object();
eval('hash.'+key+' = someval;');

будет следующий код:

var key = 'someval';
var hash = Object();
hash[key] = someval;

При чем тут длина массивов? и зачем они вообще нужны?
+1
В данном случае перловый термин "хэш" и JS-ный термин "объект" имеют один смысл. А "массив" реализован по-другому. И кстати имхо такая реализация намного грамотнее и логичнее, чем у того же РНР, где всё в одну кучу.
Задайте этот вопрос тов. sunnybear, это был его комментарий
Бред, зачем создавать объект типа Array, если ты потом пытаешься использовать его как обычный Object? Array на то и Array, что бы индексы целочисленные были, твой же пример, только если по логике:

var hash=new Object(), val=1;
hash.keys=new Array();
hash.keys[val]='myval';
alert(hash.keys.length); // 2!!
alert(hash.keys.length); // 2!!
Хм? :)

С объектами такое возможно, но зато нельзя использовать вещи типа every, map, filter и т.д.
Читай внимательнее, я использовал не Object вместо Array, а нормальный для Array, целочисленный ключ val=1. Свойство массива length, как и методы map, filter, и пр. учитывают только целочисленные ключи. А в твоем первом примере eval не нужен ну вообще никак. Последняя строчка заменяется на нормальную
hash[key] = someval;
и при этом, так же как и твоя, не работает, т.к. переменная someval не определена. В общем учи матчасть ;)
Ну раз уже мы с тобой чокнулись и поцеловались, то покури, братан, вот эту ссылку http://blog.mootools.net/2007/10/8/what-…
Ну и?.. Я неплохо знаю библиотеку MooTools, т.к. она моя предпочитаемая. Я отлично знаю что в ней реализован объект Hash - обёртка над классом Object, который, как там и написано, организует сходные с объектом Array методы, только для ключей произвольного типа. Так вот там (в случае использования MooTools), в это сложно поверить, но тоже можно без eval обойтись:
var key = 'hash_key';
var hash = new Hash();
hash.set(key, value);
//или опять же
hash[key] = value;

Так когда же девушка из торта вылезет?

Ну а коль обращение к Вам на "Вы" поднимает Вашу самооценку, без проблем, я в любой момент готов принести свои извенения за моё панибратство. Меня, в свою очередь, можете продолжать называть на "ты", это ни коим образом не ущимляет мою гордость.
Да ну?
Это Вы так считаете или у Вас есть доказательства?
У ЛЮБОГО объекта в JS есть свойство length.

2 artch:
var hash=new Object() - это вы Array-ем называете?
(Сорри, раз в 5 минут ответы писать ОЧЕНЬ неудобно.)
var hash=new Object()
alert(hash.length) //undefined

как прокомментируем?
Прокомментируем так, что маразм заразителен =)
Я выше уже сказал что описался. Речь шла не про hash и hash.length, а про hash.keys и hash.keys.length из примера sunnybear (заметьте, это не мой пример)
Конечно евал тормозит. Вообще давно пора в браузерах писать на АссемблерСкрипте. Или на смеси непонятно чего непонятно с каким перлом.
>> var hash.keys = new Array();
В JS нельзя объявить var Object.variable !!! только var variable.

Зачем писать
>> var hash = new Object();
>> var array = new Array();
если можно писать:
var a = {};
var b = [];
Ведь первое тоже тормозит! =)))
>> Зачем придумывать потрясающие ноухау, чтобы сделать это на яваскрипте, когда можно просто:
А зачем Вы придумали евал? :)
var key = 'someval';
var hash = { 'someval' : 10 };
alert( hash[key] );
// output: 10
Здорово! Только проблема заключается в том, что мы вообще-то не знаем значения key.
в вашем-же примере у key значение есть
Абстрагируйтесь. Это значение для примера, в реальном скрипте оно может быть получено как угодно.
OK.
var hash = { key1: 'value1', key2: 'value2' .... };
var x = window.prompt("Введите ЛЮБОЕ значение.");
try
{
alert( hash[x] );
}
catch(e)
{
alert( "Нет такого значения в хэше" );
}
Я не про это. Я про эмуляцию адресуемых итерируемых хэшей, где практически всегда используется eval, как например это сделано в MooTools.
hash[key]
эээ... а чем вариант с hash[key]=key не подходит?
В вашем примере не нужен eval.
var x = {};
var mem = 'member_name';
x[mem] = 'string';
В своем проекте использовал евал только в одном особо извращенном случае, когда мне надо было вызвать функцию, о которой известно только ее имя в текстовом виде, плюс еще вернуть ее значение.

сделал так потому что спешил, потом переделал нормально, чтобы последователи не сломали себе моск и мне руки =)
вызвать функцию, имя которой известно только в текстовом виде можно так:
res = window['my_func_name'](param1, param2);
Код на php:
$key = 'somekey';
$hash[$key] = $someval;

А что вам мешает написать то же самое на js?
Вы можете сказать когда он стал достаточным признаком плохого программирования?
Вы немного перевираете. Он не является признаком плохого программирования. Его отсутствие является признаком хорошего :)

Про eval можно почитать, например, Lecompte
http://www.julienlecomte.net/blog/
http://webo.in/articles/habrahabr/23-hig…

команду из Yahoo!
http://developer.yahoo.com/performance/r…

и даже Dean Edwards
http://clientside.cnet.com/best-practice…
Я не нуб :)
Кстати, вы тоже перевираете. Отсутствие eval является необходимым или достаточным признаком хорошего программирования?

По мне — не тем и не другим.
признак не может быть ни необходимым, ни достаточным. Это только условия таковыми являются. Я предельно четко все сформулировал :)
Да, позабыл, что признак — достаточное условие. Тем не менее. Наличие и отсутствие eval ни о чём однозначно не говорит. И уж тем более, отсутствие eval не является признаком (достаточным условием) для хорошего программирования. Это не так.
Это не критично, если не делается упор на производительности...
Если же делается, то отсутствие eval-ов значительно "ускоряет" код...
Особенно это касается IE
а как json разбирать без eval()?
какая интересная точка зрения. вы знаете что такое javascript?
боюсь, что меня сейчас съедят с потрохами :)

Если название ресурса webo.in Вам ни о чем не говорит, советую сходить на него и почитать статьи про клиентскую оптимизацию.

Большинство задач, которые решают обычно с помощью eval замечательно реализуются без него
Давайте посмотрим как вы решите задачу декодирования JSON без eval (нет, я не говорю, что невозможно, но это будет сильно и, главное, неоправданно сложнее).
var json="{'test1':'1','test2':'2'}"
var obj = new Function("","return " + json);
var result = obj();

почти без евала :Р
Это равнозначно евалу, если верить спецификации ECMAScript
спецификация и браузерные реализации немного все же различаются. Совсем чуть-чуть.

Специалисты говорят, что анонимные функции немного быстрее :)
поэтому я и говорю - почти
obj здесь не нужно :)
Расскажите мне почему это оправдано? Данные поступают с сервера, с которого приходит frontend. Значит — дружественного по-умолчанию. Безопасность данных можно гарантировать функцией на сервере.
Это частный случай. В общем случае данные приходят откуда угодно. Даже создатель JSON-а так считает.
У меня есть что вам возразить, но я не буду, давайте закроем спор, я начинаю раздражаться, это плохо для меня.
О! Начали минусовать. Ребят, eval — это не какой-то признак плохого программирования, просто часто использование eval неоправданно, но есть вещи, где он нужен. В JavaScript самый сильный пример — декодированние JSON.
я бы сказал, что это единственный сильный пример. Только в этом случае я с Вами соглашусь :)
Это единственный пример, который сразу приходит в голову. Но бывают ограничения языка, где применить eval проще и не менее безопасно (например, в случаях, когда внешние данные туда попасть не могут).

За 10 лет занятия вебом я видел несколько разных оправданных случаев использования eval в JS и PHP (в Perl не видел, кстати).
я, собственно, и хотел сказать, что оправданных случаев его использования бесконечно мало. В данной библиотеке, по моему скромному мнению, ему не место.
Не могу ничего сказать, пока не изучу код.
В Perl через eval реализуется поддержка исключений. Дело в том, что в Perl eval не обязательно используется для выполнения текстовой строки как код, он отлично выполняет обычные блоки кода - что нужно и для исключений, и для таймаутов, etc.

А выполнение текстовых строк через eval - это обычно используется или для реализации shell на perl, или для восстановления структур данных после Data::Dumper (а-ля пример с JSON). Больше ничего в голову действительно не приходит.
Да, точно, надо же как позабыл язык. Eval там очень широко использовался :)
Вы имеете в виду eval c аргументом в виде строки (который как раз вызывает парсер и интерпретатор). eval с блочным аргументом — это как раз да, аналог try/catch.

строчный eval используется при низкоуровневом метапрограммировании. Я использовал, но не могу вспомнить точно задачу.
Метод интересный, но с практической стороны, ИМХО, непрактичный: закрытие окна или открытие любой ссылки в новой закладке приведут к потере данных.
Вобщем есть над чем поработать...
Ну кстати да. Ссылка должна работать как ссылка — т.е. открываться в новом табе без потери функциональности, иначе это не ссылка, а унылое говно.
Работать такой метод будет только там, где нет ссылок — сплошные кнопки. Т.е. AJAX-админка — отличный пример.
Цитата:
sessvars.$.prefs.memlimit
По умолчанию - 2000
Указывает объем данных в Кб, разрешенный для хранения в sessvars. По умолчанию 2000 Кб, так как Opera 9.25 имеет ограничение чуть выше этого числа. У остальных браузеров (IE7.0, Firefox 1.5/2.0 и Safari 3.0) ограничение намного выше - 10 Мб не представляют сложности для этих браузеров.
Вопрос: А в Opera 9.5 какое ограничение этого параметра?
А вы проверьте и нам расскажите.
дык проверь и расскажи нам :)
если ты в Опере, то прямо в адресной строке и проверь, делов-то :)
Нам написали о хорошей идеи. Реализацию можете писать сами, я например
на mootols использовал бы Json.toString и Json.evaluate.

По поводу ограничений, в Oper-е - указанного Вами ограничения нет,
(может в каких-то старых версиях есть, но мне про это не известно).
Поэтому значение видимо ограничивается размером ОЗУ клиента :).
НЛО прилетело и опубликовало эту надпись здесь
Кук :)
Ну вообщем прикольно, но все же я отделяю данные на сервер и минимальную информацию клиенту ))) Это более надежно на мой взгляд. Но тот кому надо сохранить большие данные, которые не требуют особой безопасности например, настрйки интрефейса и т.д., им в самый раз )))
НЛО прилетело и опубликовало эту надпись здесь
Костыль — да, есть недостатки — да, но чем вы можете это заменить, чтобы работало везде? User storage пока работает очень мало где.
Практически везде. Только по-разному. IE 5.0+ - behaviors, IE8 - globalStorage, FF 2+ - globalStorage, Safari 2+ - интерфейс к SQLite.
Opera? FF 1.5?
1. Поддержка FF 1.5 была прекращена производителем 29 мая 2007 года. Если кто-то за год поленился обновить версию — это исключительно его личные проблемы. Пользователи FF ведь считаются существами разумными?
2. Opera действительно ничего из этого не поддерживает. В зависимости от важности функционала, реализуемого через storage, можно либо не делать ничего, либо, например, реализовать хранение данных на сервере.

Ну и главное:

3. "Работает очень мало где" — это, мягко говоря, преувеличение.
Я понимаю что не полноценный но кому-то так легче, иногда бывают случаи что блин надо хранить какие-то данные которые не влазиют в куки, тут спорный вопрос, но можно воспользоватся ))) Пускай юзают ведь кому-то от этого приятно )))
Что касается безопасности — не вижу никакой проблемы, всё тривиально: шифруйте top.name ключём, который будет прописан в javascript-е конкретного сайта. Тогда другой сайт доступ к сессионным данным чужого сайта не получит. Странно, что автор реализовал множество гибких настроек но не сделал эту простую и полезную фичу.
Придётся реализовать что-то довольно надёжно, ничего не мешает стянуть эти данные себе на сайт и расшифровать, тем более мы знаем характер данных — это JSON-строка.
а если у пользователя отключен ява скрипт в браузере???
работать то не будет ((((

Да и ваще изварат имхо. Зачем изобретать велосипед, когда есть все готовое?
и сколько таких пользователей в процентах, а? 1%?
Спасибо за отличную идею!
НЛО прилетело и опубликовало эту надпись здесь
новый таб = новая сессия. типа нового процесса. но у них есть общие кукесы, вот через них пускай и обмениваются данными :)
Сам пока не использовал, но кажется к месту (просто сейчас с доджо разбираюсь и запомнилось)

Imagine if web applications could store megabytes of data on the client-side, in the browser, both persistently and securely. No server needed.These are the goals of Dojo Storage

- (представьте что вы можете сохранять мегабайты данных безопасно и надолго. Для этого есть Dojo Storage)

http://dojotoolkit.org/book/dojo-book-0-…
Огромное спасибо! Не столько за библиотеку, сколько за идею. Настолько в тему попало, что даже представить сложно. У меня именно тот случай когда уперся в объем, при этом условия хранения данных в пределах одного окна/таба до закрытия с головой достаточно. В общем спасибо!
Действительно оригинальный способ. Таким макаром можно обойти тех у кого куки отключены. Но такие "куки" не увидит PHP но это тоже поправимо :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации