Webitable 2005 -> 2012

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Что-же делать простому юзеру? Держать несколько броузеров?
Меня два - Опера и ИЕ рядом напрягают... Один одно не может,
другой - другое...
Решился я их уволить. И поставить Гугель-Хром. А мне сказали -
"Ат винта! Фсё, что кроме Оперы - это не для вас!" :roll:

Отсюда мне совершенно непонятна всплывающая (даже мешающая)
релама некоторых сайтов:"У Вас устаревший броузер! Поставьте себе..."

Вот решился поставить... Обломили накорню. :(
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

Lynx. Самый не глючный! :D
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:Это почему это? Операмини идет на гаджетах. Альтернативы нет. Или гаджеты юзают только русские?
Что есть "гаджеты"? В америгах все смарт устройства имеют в себе полноценные браузеры на основе WebKit (в iPhone/iPod, webOS и Android) либо Gecko (Mozilla FireFox) - так что опера никому нафиг не упала. См. статистику:
http://www.w3schools.com/browsers/browsers_stats.asp
February 2012:
IE 19.5% (половина из которых IE8, а четверть - IE9)
FireFox 36.6% (половина из которых FF10)
Chrome 36.3%
Safari 4.5%
Opera 2.3% (из которых опера-мини составляет только пятую часть)
Вот более разнообразная статистика по браузерам, но тенденция таже (IE постепенно сливает, а Opera никому ненужна):
http://en.wikipedia.org/wiki/Usage_shar ... b_browsers

К тому же Webitable-странички как read-only будут доступны во всех браузерах (даже текстовых lynx и links), а вот редактировать и динамически подгружать контент можно будет только в нормальных браузерах
Я тут за главного - если что шлите мыло на me собака shaos точка net
Different
Doomed
Posts: 408
Joined: 18 Feb 2007 11:40

Post by Different »

Lavr wrote:У Вас устаревший броузер! Поставьте себе...
... Linux и любую венду в виртуалке :lol:

А вообще, когда пишешь что-нибудь под веб, приходится учитывать весь зоопарк: IE 7-10, Chrome, Firefox, Opera... Так что от костылей никуда не уйти пока, Shaos. Браузеры еще подобны микроконтроллерам самой первой ревизии кристалла - сплошные Errata.
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:Подбираюсь к программной манипуляции HTML-таблицами - выяснилась интероесная особенность - оказывается браузер (как минимум Firefox - на других пока не пробовал) добавляет после тэга table тэг tbody, если его там нет!
вот собственно говоря функция, которая строит таблицу требуемого размера:

Code: Select all

$W.table = function(p,h,w,s) {
  var d = arguments[4];
  var ts = s+"~";
  if($(p)==null) return 0;
  $(p).innerHTML = "";
  if($(s)!=null) return 0;
  if($(ts)!=null) return 0;
  if($$(s+'.*').lendth > 0) return 0;
  var r = this.create(p,"table",ts);
  var t = $(ts);
  t.setAttribute("cellpadding","0");
  t.setAttribute("cellspacing","0");
  t.setAttribute("border","0");
  r += this.create(ts,"tbody",s);
  var i,j;
  for(j=0;j<h;j++) {
    var tr = s+"."+j;
    r += this.create(s,"tr",tr);
    for(i=0;i<w;i++) {
      var td = tr+"."+i;
      r += this.create(tr,"td",td);
      if(d!=null) $_(td,d);
      else $_(td," ");
    }
  }
  return r;
}
для работы функции нужна функция create, создающая HTML-объект внутри существующего объекта, и до кучи функция remove, удаляющий объект по имени (идентификатору):

Code: Select all

$W.create = function(p,t,s) {
  if($(s)!=null) return 0;
  var e = $(p);
  if(e==null) return 0;
  var n = document.createElement(t);
  if(n==null) return 0;
  n.id = s;
  e.appendChild(n);
  this.clear();
  return 1;
}

$W.remove = function(s) {
  var e = $(s);
  if(e==null) return 0;
  var p = e.parentNode;
  p.removeChild(e);
  this.clear();
  return 1;
}
пример вызова:

Code: Select all

$W.table('tut',43,80,'tab','<img src=8x8.gif>');
где 'tut' является идентификатором тега, в который будет вставлена таблица, например:

Code: Select all

<p id='tut'> </p>
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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

Code: Select all

function $__(s,u) {
  var r = null;
  var p = arguments[2];
  try {
    r = new XMLHttpRequest();
  } catch(e) {
    r = null;
  }
  if(r!=null)
  {
    r.onreadystatechange = function() {
      if(r.readyState==4 && r.status==200) {
        if(typeof s == 'string') {
          $_(s,r.responseText);
        }
        if(typeof s == 'function') {
          s(r.responseText);
        }
      }
    }
    if(p==null) {
      r.open("GET",u,true);
      r.send(null);
    } else {
      r.open("POST",u,true);
      r.send(p);
    }
  }
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Пришло время добавлять в Webitable виртуальную машину :)

Предположим, что мы хотим иметь несколько "тредов", которые необязательно эмулируют одну и туже систему команд. Запуск интерпретатора будет осуществляться через setInterval(function,0), а остановка - через clearInterval(id). Теперь непосредственно о "тредах" - каждый тред будет представлять из себя массив указателей на функции, перебираемые при интерпретации. Каждому треду можно дать "приоритет" - количество "циклов", которые тред должен "прошагать", до того как отдаст управление следующему треду (приоритет 0 означает, что тред остановлен).

$W.threads = []; // сначала список тредов пуст

Чтобы узнать количество тредов в любой момент времени, просто берём $W.threads.length

Каждый тред будет представлять из себя объект с четырьмя полями - неким абстрактным объектом эмуляции o, массивом эмулирующих функций f (которым передаётся объект эмуляции o), адресом следующей команды a и приоритетом треда p: {o:{},f:[],a:0,p:1}

Code: Select all

threads = [];
started = 0;
....
$W.add = function(obj) {
 var m = this.threads.length;
 this.threads[m] = {o:obj,f:[],a:0,p:0};
 return m;
}

$W.del = function(i) {
 this.threads[m] = null;
}

$W.fun = function(i,j,f) {
 this.threads[i].f[j] = f;
}

$W.pri = function(i,p) {
 this.threads[i].p = p;
}

$W.stop = function() {
 if(this.started!=0) {
   clearInterval(this.started);
   this.started = 0;
 }
}

$W.start = function() {
 var p = arguments[0];
 if(p==null) p=16; // 0.8 duty
 else p=p/5; // for 20 ms
 this.stop();
 this.started = setInterval(
  function() {
   var t0 = Date.now();
   while(Date.now()-t0 < p) {
    for(var j=0;j<1000;j++) {
     for(var t in $W.threads) {
      var th = $W.threads[t];
      for(var i=0;i<th.p;i++) {
       th.a = th.f[th.a](th.o);
      }
     }
    }
   }
  }, 20);
}
P.S. Потом сделаю генерацию анонимной функции в $W.start() через eval - будет чуток быстрее...

P.P.S. Подкорректировал функцию start, чтобы подстраивалась под быстродействие компьютера, но не забирала более 80% времени работы - на своём рабочем ноуте получил около полумиллиона вызовов в секунду :kruto:

P.P.P.S. На другом компьютере получилось более миллиона вызовов в секунду...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:P.S. Потом сделаю генерацию анонимной функции в $W.start() через eval - будет чуток быстрее...
Сделал, но через Function (eval не работал в IE8):

Code: Select all

$W.start = function() {
 var p = arguments[0]; // percentage
 if(p==null) p=16; // 0.8 duty
 else p=p/5; // for 20 ms
 this.stop();
 var sf = "var t=+new Date;";
 for(var t in $W.threads) {
  sf += "var t"+t+"=$W.threads["+t+"];";
 }
 sf += "while(+new Date-t<"+p+"){";
 var i,j=0;
 while(j<100) {
  for(var t in $W.threads) {
   for(i=0;i<$W.threads[t].p;i++) {
    sf += "t"+t+".a=t"+t+".f[t"+t+".a](t"+t+".o);";
    j++;
   }
  }
 }
 sf += "}";
 this.started = setInterval(Function(sf),20);
}
На линуксовых машинах FireFox делает 7 миллинов вызовов в секунду.
На виндовой машине - только 4 миллиона, а вот Chrome - все 14 (а через eval было аж 17 :o )
Opera - 7 миллионов
Safari - 3 миллиона
IE8 - только 200 тысяч...

P.S. На рабочем линуксовом компьютере около 8 миллионов FireFox делает, WebKit-браузер Epiphany делает 5 миллионов, а Konqueror только 750 тысяч

P.P.S. Предыдущий метод при больших приоритетах тоже даёт неплохие результаты, но трюковый метод всё-равно чуть быстрее...

P.P.P.S. Так как это у нас Threaded Code (шитый код), я решил переименовать новые функции Webitable:

$W.add -> $W.threaded_new
$W.del -> $W.threaded_delete
$W.fun -> $W.threaded_code
$W.pri -> $W.threaded_priority
$W.start -> $W.threaded_start
$W.stop -> $W.threaded_stop
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote: Каждый тред будет представлять из себя объект с четырьмя полями - неким абстрактным объектом эмуляции o, массивом эмулирующих функций f (которым передаётся объект эмуляции o), адресом следующей команды a и приоритетом треда p: {o:{},f:[],a:0,p:1}
Вот думаю не добавить ли пятое поле - указатель на функцию, которая будет вызываться один раз за фрейм (50 раз в секунду)? Скажем назвать его f, а массив функций f переименовать в c (code).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:
Shaos wrote: Каждый тред будет представлять из себя объект с четырьмя полями - неким абстрактным объектом эмуляции o, массивом эмулирующих функций f (которым передаётся объект эмуляции o), адресом следующей команды a и приоритетом треда p: {o:{},f:[],a:0,p:1}
Вот думаю не добавить ли пятое поле - указатель на функцию, которая будет вызываться один раз за фрейм (50 раз в секунду)? Скажем назвать его f, а массив функций f переименовать в c (code).
Добавил пятое необязательное поле, произвёл переименования и выложил на SourceForge CVS:

http://webitable.cvs.sourceforge.net/vi ... webitable/
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote: $W.add -> $W.threaded_new
$W.del -> $W.threaded_delete
$W.fun -> $W.threaded_code
$W.pri -> $W.threaded_priority
$W.start -> $W.threaded_start
$W.stop -> $W.threaded_stop
Чего-то я думаю, что простые функции (del,fun,pri) надо убрать совсем - проще обращаться напрямую к $W.threads - тогда и короткие имена start и stop можно сохранить (а add переименовать в thread):

$W.threaded_delete -> threads[t] = null;
$W.threaded_code -> threads[t].c[j] = function(){...};
$W.threaded_priority -> threads[t].p = N;
$W.threaded_frame -> threads[t].f = function(){...};
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote: На линуксовых машинах FireFox делает 7 миллинов вызовов в секунду.
На виндовой машине - только 4 миллиона, а вот Chrome - все 14 (а через eval было аж 17 :o )
Opera - 7 миллионов
Safari - 3 миллиона
IE8 - только 200 тысяч...
У меня опечаточка закралась в код - массив кодов почему-то был объектом - исправил на массив, перемерял:

Линуксовый FireFox - 12 миллионов
Линуксовая Opera 12.11 - 17 миллионов
Линуксовая Opera 11.52 - 16 миллионов
Линуксовая Opera 10.63 - 16 миллионов
Линуксовая Opera 9.64 - 0.8 миллиона
Виндовый FireFox - 7 миллионов
Виндовый Chrome - 24 миллиона
Виндовый Safari - 7 миллионов
Виндовая Opera 12.12 - 7 миллионов
Internet Explorer 8 - 0.2 миллиона

P.S. в 2018 году Webitable объединилось с виртуальной машиной Robby и превратилось в Rgrid.js
Я тут за главного - если что шлите мыло на me собака shaos точка net