Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Другой взгляд на javascript (https://javascript.ru/forum/css-html/8257-drugojj-vzglyad-na-javascript.html)

Дубров Олег 17.03.2010 11:06

Другой взгляд на javascript
 
Здравствуйте Илья!
Хочу поделиться с вами своим дерзким другим взглядом на javascript.
Долго выбирал на каком форуме написать, решил написать на форуме javascript.ru - он, на мой взгляд самый демократичный, а автор не предвзятый.

Меня зовут Олег, я занимаюсь интеграцией системных функций и javascript. Мы с вами виделись (я вас видел) на прошлогодней конференции PHPConf, и я смотрю сайт ваш стал заметно лучше с тех пор!

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

Допустим вы программист хорошо знающий javascript и хотите написать свой winamp? Я говорю - нет проблем.

Перечислим, какие мы можем видеть преимущества javascript, перед другими интерпретируемыми языками:
* javascript исполнится на любой windows платформе, не требуя дополнительной закрузки каких-либо компонентов.
* javascript активно развивается и программирование на javascript просто преобразилось благодаря библиотекам-помошникам, таким как jquery
* разработка пользовательского интерфейса на javascript в связке с HTML+CSS превращается в приятную детскую забаву. А ведь именно эта часть разработки зачастую отнимает большую часть времени "не веб-программиста".

Хотелось бы иметь обсуждения этой темы. Моя реализация идеи системного javascripta находится здесь - http://samosat.ru/muml/agentshell.exe.zip.
Я попытался сразу предложить писать на javascript программу-агент, живущую в трее. Но есть и опции по отключению этого режима. Не вижу смысла не ставить этот режим по-умолчанию. При запуске приложения можно выбрать демонстрацию возможностей.

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

Интерпретатор всего этого вышел довольно легкий, около 150кб, что есть мелочь, но приятная :)

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

Спасибо за внимание, жду критики от вас

Kolyaj 17.03.2010 11:15

Зачем ограничиваться Windows?
http://gluescript.sourceforge.net/ -- порт wxWidget на JavaScript
https://developer.mozilla.org/en/Get...with_XULRunner -- движок от Mozilla для создания кроссплатформенных приложений, на котором, в частности, написаны Firefox, Thunderbird, KomodoIDE.

Дубров Олег 17.03.2010 11:44

Да, тут вы правы, ограничиваться не стоит.
Я долго ходил вокруг XULRunner и облизывался - уж очень мне полюбился XUL. Именно мои эксперименты с ним меня сподвигли сделать то, что сделал.
В перспективе поддержка XUL. Но на данный момент ограничивает внушительный размер библиотеки.
В настоящее время довольно внункциональное приложение может занимать 500кб вместе(!) с интерпретатором. А в случае с xul-runnero-ом оно бы весило около 6 мб. Впрочем как и мозилла, и зендербёрд.

Ведутся работы по поиску решений для linux-подобных ОС

Kolyaj 17.03.2010 11:54

Цитата:

Сообщение от Дубров Олег
В настоящее время довольно внункциональное приложение может занимать 500кб вместе(!) с интерпретатором.

А функциональность интерпретатора?

Кстати, если в системе установлен Firefox 3, то xulrunner не нужен.

Kolyaj 17.03.2010 11:59

Цитата:

Сообщение от Дубров Олег
кроссдоменных запросах

Что такое кроссдоменный запрос в терминах локального приложения?

И интересней всё же исходники, а не exe'шник.

Дубров Олег 17.03.2010 12:07

Цитата:

Сообщение от Kolyaj (Сообщение 47978)
А функциональность интерпретатора?

Функциональность интерпретатора ограничивается функциональностью Internet Explorer-a, установленного в системе, т.к. используется ole-компонент от создателей windows.
И, также, набором системных функций самой связующей системы (через специальный JavaScript объект "exe"). Последний не велик, только самое необходимое - работа с фалами, окнами, треем, меню. Пока только то, что понадобилось.
В планах драг-энд-дроп.

Еще раз повторю, исполнением javascript и обработкой HTML+CSS занимается компонент IE - он установлен на большем числе компьютеров, именно поэтому был сделан выбор в его пользу.

Kolyaj 17.03.2010 12:15

С интерпретатором IE замучаешься ошибки отлаживать.

Вот если бы движок Gecko, да JavaScript'овый какой-нибудь нормальный, вроде TraceMonkey или V8, да асинхронный ввод/вывод, цены бы не было :)

Riim 17.03.2010 12:53

А зачем этот exe-шник запрашивает исходящее соединение и пытается прослушивать порт?

subzey 17.03.2010 14:12

Цитата:

Сообщение от Дубров Олег
исполнением javascript и обработкой HTML+CSS занимается компонент IE

Тогда чем все это разительно отличается от HTA?

Дубров Олег 17.03.2010 14:28

Да, я услышал, Вас, отвечу чуть позже.

Насколько мне известно, подобных реализаций существует несколько:

1. HTA и WSH — HTML Applications и Windows Script Host — это, вероятно, самые известные технологии. HTA фактически представляет собой HTML страницу с расширенными правами в системе — возможностью лазить в сеть, гадить в реестр, файловую систему и подключать к этим делам ActiveX. С использованием HTA сделаны многие компоненты самой Windows.
2. .NET Framework — этому вообще по барабану, на чем вы пишете, лишь бы итогом был MSIL. Возможно, JScript.NET вместе с Windows.Forms могут вызвать у кого-то ощущение родного виндового интерфейса. Лично меня они совсем не радуют — ни визуально, ни скоростью.
3. XULRunner — framework от Mozilla предлагает Gecko вместо IE, XpCOM вместо COM/ActiveX. Это всего за 20 мегабайт оверхеда.
4. wxJavascript — известная кросс-платформенная библиотека wxWidgets теперь и для JavaScript. Все это благодаря JS-движку SpiderMonkey от Mozilla и стараниям одного бельгийца. Кстати, этот же уважаемый — автор mod_js для Apache.
5. WindowSystemObject (WSO) — это универсальный программный комплекс для обеспечения доступа к оконной подсистеме Windows на базе архитектуры COM, для создания оконных интерфейсов в программах, написанных на сценарных (скриптовых) языках, а также в программах, написанных на других языках и в других системах программирования. С помощью WSO можно легко создавать оконные интерфейсы на JScript, VBScript, Perl, Python. Российский автор.

Источник: http://habrahabr.ru/blogs/javascript/52027/

Интересно было бы услышать реальных пользователей этих систем. Обсудить недостатки и достоинства. И, в последствии, выяснить, чем может быть действительно полезна 7-ая реализация.


По поводу порта - программа слушает порт, это используется внутренним компонентом для обработки данных, полученных через интернет или с локального диска. Это позволяет добавить в HTML специальные команды перепроцессора. Например
<#include http://yandex.ru#> - загрузит и включит страницу яндекса в вашу


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

В папке local находятся папки доменов. Какждое имя папки - это виртуальный домен.

допустим если вам нужно подключить файл
c:\program files\samosat\local\example.com\ooo.html
то он будет доступен по адресу http://example.com/ooo.html

Естественно, только для программы samosat будет работать такая подмена домена (но вы можете и в браузере прописать прокси-сервер localhost:1520, тогда и обычный баузере пойдет через обработчик samosat и в нем тоже будут работать команды перепроцессора)

При запуске приложения впервые, открывается "Галерея приложений". Это страничка расположенная на samosat.ru/muml/. На данный момент туда может добавить свое приложение любой желающий, пройдя предварительно регистрацию.

Дубров Олег 17.03.2010 15:18

Цитата:

С интерпретатором IE замучаешься ошибки отлаживать.
Если вы говорите о IE6, да согласен, ошибок у него хватает. В современных же версиях IE все уже по-человечески. Я надеюсь, пройдет время и не останется больше пользователей IE6

Kolyaj 17.03.2010 15:23

Цитата:

Сообщение от Дубров Олег
Если вы говорите о IE6, да согласен, ошибок у него хватает.

Я имею в виду не ошибки самого IE, а то, как он сообщает об ошибках в пользовательских скриптах.
И зависимость от движка, установленного в системе, никак не может быть плюсом. Это получается в любом случае нужно ориентироваться на IE6, т.к. неизвестно, когда он исчезнет с подавляющего числа машин.

Дубров Олег 17.03.2010 15:52

Я сам не большой поклонник продуктов Microsoft, но если мы говорим о разработчике, то для отладки ему разумно пользоваться ИЕ8. Он обладает довольно мощными средствами отладки. Сейчас, кстати, ведутся работы по интеграции отладчика в samosat. Цель - получить те же инструменты, что и в полнорежимном браузере IE8.

Для большей совместимости с другими браузерами рекомендуем использовать кроссбраузерные библиотеки. Конечно это не может решить всех проблем, в частности различное понимание стилей CSS разными версиями IE, но все же заметно облегчит разработку.

Kolyaj 17.03.2010 16:19

Цитата:

Сообщение от Дубров Олег
Я сам не большой поклонник продуктов Microsoft, но если мы говорим о разработчике, то для отладки ему разумно пользоваться ИЕ8.

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

Дубров Олег 17.03.2010 17:56

Пользователи пользуются разными браузерами, и Мозиллой, и ИЕ, и Оперой. Для прогрммы samosat имеет значение лишь версия IE в системе. С windows 7 в комплекте сразу идет ИЕ8. Это в каком-то смысле обнадеживает. Севен набирает обороты и это приятно.

Если вы говорите, что есть проблема для обладателей ИЕ6 и возможных ошибках приложения в нем - да, такая проблема есть. Выхода два: либо разработчику тестировать свое приложение на ИЕ6, либо пользователю обновлять свой браузер.
Впрочем как и при разработке сайта.
Это решение должен принимать разработчик приложения, в зависимости от целей и предполагаемой аудитории его пользователей.

Если вы спросите мое личное мнение, то я убежден то те миллионы человеко-часов потраченные программистами всего мира на оптимизацию под ИЕ6 можно было бы потратить на что-нибудь более полезное.

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

subzey 17.03.2010 20:14

Цитата:

Сообщение от Дубров Олег
Я для себя выработал такое правило: в ие6 сайт обязан работать, но не обязан быть красивым, не обязан корректно отображаться и не обязан быть удобным.

Ну, как сказать. Сайт всегда должен быть юзабельным, иначе зачем он?

Дубров Олег 23.03.2010 23:56

вот, уже кое что готово, первая рабочая ревизия
путь сменился:
http://samosat.ru/muml/agentshell.exe.zip

работает вызов вин-апи функций из ява-скрипта. Путем вызова метода объекта
exe.winapi("имя_dll:имя_апи_function", [ аргумент1,аргумет2,.... ]).

вот пример функции, убивающей просесс
function kill_process(pname) {
		var memheap = exe.winapi("kernel32:GetProcessHeap");
		if (memheap == 0) {
			alert('ERROR:' + ash_last_error);
			return;
		}
		var MAX_PATH = 260;
		var TH32CS_SNAPPROCESS = 2;
		var PROCESS_TERMINATE = 1;

		var hSnapshot = exe.winapi("kernel32:CreateToolhelp32Snapshot",[TH32CS_SNAPPROCESS,0]);
		var PROCESSENTRY32_size = 9*4 + MAX_PATH*2;
		if (PROCESSENTRY32_size%4 != 0) {
			PROCESSENTRY32_size /= 4;
			PROCESSENTRY32_size *= 4;
		}
		var pe32 = exe.winapi("kernel32:HeapAlloc",[memheap,8,PROCESSENTRY32_size]);
		exe.send("mem-set-dword",[pe32,0,PROCESSENTRY32_size]);
		
		var ok = exe.winapi("kernel32:Process32FirstW",[hSnapshot, pe32]);
		while (ok) {
			var exe_name = exe.send("mem-string-from",[9*4 + pe32]);
			if (exe_name == pname) {
				var pid = parseInt(exe.send("mem-get-dword",[pe32,8]));
				if (pid != 0) {
					var hPr = exe.winapi("kernel32:OpenProcess",[PROCESS_TERMINATE,0,pid]);
					if (hPr != 0) {
						exe.winapi("kernel32:TerminateProcess",[hPr,0]);
						exe.winapi("kernel32:CloseHandle",[hPr]);
					}
				}
			}
			ok = exe.winapi("kernel32:Process32NextW",[hSnapshot, pe32]);
		}

		exe.winapi("kernel32:CloseHandle",[hSnapshot]);
		exe.winapi("kernel32:HeapFree",[memheap,0,pe32]);
}

Octane 24.03.2010 00:03

Как-то все сложно. В скриптовом языке должно быть что-то типа:
killProcess: function(pName) {
    var pm = new ProcessManager();
    pm.killProcess(pName);
}

Дубров Олег 24.03.2010 00:05

и кое-какие комманды.
Вызываются так:
exe.send(комманда, {param1:value1, param2:value2,...});


А вот сами команды:
win-set-style
	caption-btn-img         URL
	color-caption-active
	color-caption-active-gradient
	color-caption-active-text
	color-border-active
	color-caption-inactive
	color-caption-inactive-gradient
	color-caption-inactive-text
	color-border-inactive
	caption-gradient-mode   0..4
	mode                    [system|default]
	border-width            0..20
	round-size              0..50
	caption-height          0..50
	caption-font-size       6..48
	caption-font-name       string

var-local-get            [file] [section] key [default] [crypt(bool)]
var-global-get           [file] [section] key [default] [crypt(bool)]
var-local-set            [file] [section] key [value]   [crypt(bool)]
var-global-set           [file] [section] key [value]   [crypt(bool)]
var-local-sections       [file]
var-global-sections      [file]
var-local-get-section    [file] section
var-global-get-section   [file] section
var-local-set-section    [file] section [text]
var-global-set-section   [file] section [text]

clipboard-set  [text]
clipboard-get
panel-name-set [name]
panel-name-get
win-name-set   [name]
win-name-get
win-close
win-clear

set-start-page  [url]
get-exe-version
cache-remove    [path]
windows-version
popup-menu      items
shell-exec      file
win-set-icon    [small] [normal] [tray]

refresh   [window] [panel]
home      [window] [panel]
navigate  [window] [panel] [url] [text] [post]
close     [window] [panel]

win-new   [name] [url] [post] [text] [position] [origin]
panel-new [name] [url] [post] [text] [position]
win-alert [name] [url]        [text] [position] [alpha] [time]

parent-navigate [url] [post] [text]
parent-refresh
parent-home

url-read        url [post] [callback] [param]

winapi [...]

mem-string-to      string  ptr
mem-string-to-a    string  ptr
mem-string-add     string  ptr
mem-string-add-a   string  ptr
mem-string-from    ptr
mem-string-from-a  ptr


mem-set-char       ptr  offset  value
mem-set-byte       ptr  offset  value
mem-set-short      ptr  offset  value
mem-set-ushort     ptr  offset  value
mem-set-word       ptr  offset  value
mem-set-int        ptr  offset  value
mem-set-uint       ptr  offset  value
mem-set-dword      ptr  offset  value

mem-get-char       ptr  offset
mem-get-byte       ptr  offset
mem-get-short      ptr  offset
mem-get-ushort     ptr  offset
mem-get-word       ptr  offset
mem-get-int        ptr  offset
mem-get-uint       ptr  offset
mem-get-dword      ptr  offset



Параметры, указанные в квадратных скобках - необязательные. (для win-set-style - все необязательные).
win-set-style - задает стиль главному окну. От него же стили копируются дочерним, по умолчанию. Но каждое дочернее может задать свои стили.

Описание по-позже выложу, руки не доходят, да и меняется все постоянно. Я думаю можно и так догадаться пока, что к чему

Дубров Олег 24.03.2010 00:13

Цитата:

Сообщение от Octane (Сообщение 48839)
Как-то все сложно. В скриптовом языке должно быть что-то типа:
killProcess: function(pName) {
    var pm = new ProcessManager();
    pm.killProcess(pName);
}

Да да, конечно. В итоге так и будет :) . Мы сделаем библиотечку, чтото-типа winapi.js и там все человеку понятные методы. Будете писать как король!

Я просто показываю что можно вызывать сишные функции

Дубров Олег 26.05.2010 17:01

Сегодня опять обратился к этому сайту за справкой по JavaScript, все никак не могу запомнить как писать функцию match. Все время тянет написать /[a-z]/.match(str) вместо str.match(/[a-z]).
Может кто подскажет как вбить это непослушную конструкцию мне в мозг? :))) О боги, убейте меня ап стену...

Поделюсь что у нас нового.

Итак версия 50 :)
* появилась возможность запускать одноврененно несколько приложений
* исправлена куча багов в Windows XP SP2
* добавлены команды
exe.send("win-restore"); //команда вызжания главного окна
exe.send("is-window-visible"); //определение состояния видимости окна
* добавился параметр в config.ini под названием cache, для возможность отключить кеширование. Такое вот удобство для разработчика.
* запуск приложения теперь начинается с открытия специально манифест файла, например http://samosat.ru/muml/manifest.ash, в котором содержится информация о версии приложения и папках кеша, ктороые будут зачищатсья при выходе новой версии.
* Проверка версии приложения просиходит в момент запуска приложения (как и проверка обновления для ядра)
* Устранены проблемы совместимости в Windows 7
* Теперь нельзя создавать два окна с одним именем
* Переделан принцип вызова функций из ядра в JavaScript и обратно. Теперь это происходит мгновенно, а не по таймеру, как раньше
* Появилась возможность создавать системное меню командой popup-menu
* появился веб-конструктор установочного файла http://samosat.ru/agent/constructor.php , в котором можно задавать параметры config.ini, сгенерированные установочником по умолчанию. В частности можно задать стартовый url, для того чтобы сразу после запуска исполнялость необходимое приложение, без нужды заходить в "галерею приложений".

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

Размер agentshell.exe по прежнему 300 кб.

Тестирование с визуальными эффектами jquery прошло на ура, тоже все обалденно, мне нравится это чертов конструктор! Прога вышла супер, я забил вообще на все другие виды программирования, клепаю агентов для разных фирм. От моей скорости разработки у них отваливается челюсти, а папки с бумагами неумалимо падают из рук. Даешь маил-ру агента за 2 недели? :))))
Всем приятного яваскрипа! Пока-пока

Kolyaj 26.05.2010 17:27

Дубров Олег,
сделайте нормальное описание вашей среды, нормальный мануал, как ею пользоваться, выложите исходники (на github, например), тогда и люди потянутся.

Gvozd 26.05.2010 17:46

схоронил
позже ознакомлюсь подробнее

Дубров Олег 02.06.2010 19:21

Да, обязательно сделаем хороший манулал. Сейчас времени нет, нужно писать-писать-писать. Жаль не все что сделано на базе агентшела могу показать, проекты в основном закрытые.
Но вот в свободное время сделал плеер для вконтакта. Буквально два вечера потратил. Можете приколосться:
http://samosat.ru/muml/download.php?...e=vkplayer.exe
Сидит в трее - не напрягает. По клику выезжает. Поиск по музыке в контакте, мои аудиозаписи.. Файлы сразу в кэше сохраняет. И глваное все на ЯваСкрипте! Смена скина - всего лишь подмена css файла. Проигрывание музыки - плагин от jquery.
p.s. авторизацию берет из ИЕ. То есть если вы авторизованы в браузере - то плеер сразу тоже авторизован. :)

mc-black 27.05.2017 09:15

Цитата:

Сообщение от Дубров Олег (Сообщение 47973)
Интерпретатор всего этого вышел довольно легкий, около 150кб, что есть мелочь, но приятная :)

150кб это включая сам интерпретатор js, или только интерфейс от js на api? Если последнее, то можно обойтись минимально 8кб, так как для winapi минимально нужны LoadLibrary+GetProcAddress+враппер stdcall. Безопасность вызовов нужно обеспечивать из js. На какой платформе работает Ваша программа: x86 или 64b?


Часовой пояс GMT +3, время: 14:22.