Log plugin

Discuss and announce AkelPad plugins
Post Reply
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

DV wrote:Но это же страшно сложно! :shock:
Для кого сложно даю пример:

Code: Select all

AddOutputWindowText("My text");

function AddOutputWindowText(pText)
{
  var hMainWnd=AkelPad.GetMainWnd();
  var lpWnd;
  var hWnd=0;

  if (lpWnd=AkelPad.MemAlloc(_X64?8:4 /*sizeof(HWND)*/))
  {
    AkelPad.Call("Log::Output", 2, lpWnd);
    if (hWnd=AkelPad.MemRead(lpWnd, 2 /*DT_QWORD*/))
    {
      AkelPad.SendMessage(hWnd, 0xB1 /*EM_SETSEL*/, -1, -1);
      AkelPad.SendMessage(hMainWnd, 1193 /*AKD_REPLACESELW*/, hWnd, AkelPad.MemStrPtr(pText));
    }
    AkelPad.MemFree(lpWnd);
  }
  return hWnd;
}

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Instructor wrote:AddOutputWindowText.js
Ну да,

Code: Select all

if (IsTrue(true)) WScript.Echo("true");

function IsTrue(b)
{
  return (((b ? true : false).toString().length == 4) ? true : false);
}
Зачем же делать проще? :)

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Я нипонял, а разве AkelPad.Include() кто-то отменял?

А вот насчет примера с "IsTrue" - уточните ка стандарт, и озвучьте ТЗ. Что именно должен сделать IsTrue ?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

FeyFre wrote:Я нипонял, а разве AkelPad.Include() кто-то отменял?
Нет. Но давайте посмотрим на это дело так: почему какой-то скрипт должен по сути иметь дело со "внутренностями" плагина Log? Зачем скрипту об этом знать? Как же насчёт инкапсуляции? Разве вывод заданной строки - это не прямая и логичная функция для Log::Output?
А что будет, к примеру, в случае, если окно Output ещё не показано? Как скрипт обработает это - и что он вообще должен ожидать в качестве хендла окна Output в данном случае? (При реализации внутри плагина, плагин сам может создать/открыть окно Output.)
А если параллельно с желанием вывести какую-то строку в окне Output уже будет работать какой-то процесс, активно выводящий строку за строкой? Как скрипт синхронизирует вывод своей строки со строками работающего процесса? (При реализации внутри плагина, можно, к примеру, использовать критическую секцию.)
FeyFre wrote:А вот насчет примера с "IsTrue" - уточните ка стандарт, и озвучьте ТЗ. Что именно должен сделать IsTrue ?
А есть варианты? :) В данном случае я просто хотел продемонстрировать избыточность и ненужность кода, которого можно избежать.

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

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

DV
100%!
Не вижу ни одной причины, чтобы этого не сделать.
Хотя есть одна причина - все, кто захочет, без лишних телодвижений смогут писать в консоль лога...

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

Ну и всё-таки старая идея о том, что сделать бы один плаг для работы с консолью (с вкладками), а все остальные плаги, типа Log, Clipboard и т.п. его бы пользовали.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Мне кажется, всем стало было бы лучше, если бы Инструктор прямо озвучил свое мнение по данной проблеме:
1) Категорически против - все печалятся и юзают предложенные скриптовые функции
2) Уговорили, сделаю - все радуются и с нетерпением ждут обновлений
3) Так ли сильно нужно? Голосуем - все собирают голоса в поддержку фичи
4) Лениво делать, но если кто-то напишет патч, встрою - выбирается знающий товарищ, который, поплевав на руки, берётся сам реализовать фичу.

На мой взгляд, куда продуктивней, чем разводить канитель на десяти страницах

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Fr0sT,
согласен.

Но всё же хотелось бы донести до всех заинтересованных ещё одну мысль.
Итак, я, как скриптописатель, хочу вывести свою строку в Log::Output. Это как бы высокоуровненвая задача: вывести строку. Точка. Зачем мне, с точки зрения скриптописателя, знать, что у Log::Output есть какой-то хендл окна, который нужно вначале узнать, а затем ещё посылать ему какие-то магические (с точки зрения скриптописателя) сообщения?
Пойдём чуть далее. Рассмотрим запуск команды в Log::Output из скрипта. То, что плагин для этого создаёт какой-то вспомогательный поток, то, что для выполнения команды создаётся какой-то процесс - это только личное дело плагина Log, а скрипт такие подробности вообще не должны волновать. С точки зрения скрипта, ему не то что не нужно знать таких деталей, он их не должен знать. Это касается исключительно внутренней реализации плагина Log. (Хотелось бы, чтобы вы хорошо обдумали вышенаписанное, прежде чем начнёте плеваться ;))
Вот к чему я веду. Сейчас AkelPad.Call("Log::Output", 3) возвращает скрипту несколько переменных, касающихся внутренней реализации плагина. Давайте обсудим, это ли нужно скрипту. Давайте предположим, что мы немного изменили документацию плагина Log примерно так:

Code: Select all

Call("Log::Output", 1, "PROGRAM", ...)
Параметры:
    1
      Запустить приложение и захватить вывод.
    "PROGRAM"
      Запускаемый файл.
    ...

Примечание: этот метод не запускает приложение немедленно, поскольку выполняет некоторые действия для подготовки запуска. Для того, чтобы узнать о состоянии плагина, используйте метод "Log::Output", 3.

...

Call("Log::Output", 3, *STATE, *PLUGINTHREAD, *PROCESSHANDLE, *PROCESSID)
  Параметры:
  Параметры:
    3
      Получить информацию о текущем запущенном приложении. Использовать с помощью Scripts плагина.
    *STATE
      Указатель на переменную, содержащую состояние плагина:
        1 - получил команду/подготавливаюсь к выполнению команды
             (примечание для программистов: поток PLUGINTHREAD уже создан, процесс PROCESSHANDLE ещё не создан)
        2 - команда выполняется
             (примечание для программистов: процесс PROCESSHANDLE уже выполняется в потоке PLUGINTHREAD)
        0 - ничего не делаю (команда либо уже выполнена, либо нет команды)
             (примечание для программистов: нет ни PLUGINTHREAD, ни PROCESSHANDLE)
    ...


На мой взгляд, вызов Call("Log::Output", 3, *STATE) покрыл бы нужды 90% скриптов. Потому что, фактически, дополнительные детали по *PLUGINTHREAD, *PROCESSHANDLE, *PROCESSID нужны только для очень продвинутых вещей.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Зачем мне, с точки зрения скриптописателя, знать, что у Log::Output есть какой-то хендл окна, который нужно вначале узнать, а затем ещё посылать ему какие-то магические (с точки зрения скриптописателя) сообщения?
[Контр]Потому что у нас в скриптовом интерфейсе такая объектная модель: модель низкоуровневых объектов, в том числе WINAPI. Эта модель не обязывает её участнокв предоставлять красивые врапперы. Есть враппер - хорошо, нету враппера - тоже не плохо, быть никто не будет.[/Контр]

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

+1024 to DV.
FeyFre
эта "объектная модель" у нас не по надобности, а от безысходности. Потому как оборачивать весь Винапи - редкостный маразм. А функционал требуется, одними куцыми методами WSH не обойдешься. Но, знаешь ли, если так рассуждать, то можно покоцать и все методы объекта AkelPad, оставить один SendMessage, и колупайтесь с ним.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Fr0sT, а что мешает new ActiveXObject() или CreateObject()?
И да, я что-то не слышу что-бы народ особо возмущался что реализация JavaScript в обозревателях ограниченна практически нулевым габором прикладных функций. Люде дописывают функции себе сами, а пишут их сами.
эта "объектная модель" у нас не по надобности, а от безысходности.
что-то не видно что этой "безысходностью" кто-то особо не доволен. Раз молчат значит довольны. Тему об альтернативном скриптовом плагине, а значит и реализации всех хотелок, кто-то развивает?

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Fr0sT wrote:эта "объектная модель" у нас не по надобности, а от безысходности.
+2048)
FeyFre wrote:что-то не видно что этой "безысходностью" кто-то особо не доволен. Раз молчат значит довольны. Тему об альтернативном скриптовом плагине, а значит и реализации всех хотелок, кто-то развивает?
1+2, 3; это что нашлось не сильно напрягаясь.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

FeyFre
а что мешает new ActiveXObject() или CreateObject()?
Этот объект должен быть зарегистрирован.
И да, я что-то не слышу что-бы народ особо возмущался что реализация JavaScript в обозревателях ограниченна практически нулевым габором прикладных функций. Люде дописывают функции себе сами, а пишут их сами.
В браузерах есть DOM, который покрывает большинство веб-специфичных потребностей. Ну а чего нету - дописывается в родном JS стиле, без попыток скрестить ежа с ужом (это я про WinAPI через JS).
Нет, я ни в коем случае не против существующей реализации, и всячески приветствую огромную проделанную работу и тот факт, что функциональность практически не уступает native языкам, просто надо сознавать, что эти ковыряния со смещениями в структурах и вызовами api функций задирают порог вхождения в скриптописание до безоблачных высот.
что-то не видно что этой "безысходностью" кто-то особо не доволен. Раз молчат значит довольны. Тему об альтернативном скриптовом плагине, а значит и реализации всех хотелок, кто-то развивает?
Не молчат, но теребить Инструктора, который и так тащит практически все плагины, неудобно. Тем более что в принципе-то всё работает.
А кто ее будет развивать? Сишников вас трое на весь форум. А на других языках есть опасность, что размер плага будет на целых 50 Кб больше, что, конечно же, катастрофически приблизит мировой коллапс :lol:

Кстати, интересный факт. Ни одного довода против Log::Output высказано не было.
А довод за (помимо очевидного сравнения одного элементарного вызова функции и многострочной шаманской абракадабры) - это инкапсуляция. Если вдруг внутренняя реализация окна изменится, не нужно будет переделывать тонну скриптов, поскольку интерфейс останется прежним.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Не молчат, но теребить Инструктора, который и так тащит практически все плагины, неудобно
А кто требует требовать от Инструктора? А когда последняя запись? Почти пол года назад. Что тему в личках обсуждают, а я не в курсе?
А на других языках есть опасность, что размер плага будет на целых 50 Кб больше, что, конечно же, катастрофически приблизит мировой коллапс
А можно перечислить "другие языки" при которых размер будет всего на 50Кб больше? А то мне как-то в голову не приходит ни один.
И не в языке проблема, а в идиотизме рантайма. Борлад С рантайм тоже не маленький.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

А можно перечислить "другие языки" при которых размер будет всего на 50Кб больше?
Да любой. Что Борланд, что VC, да хоть дотнет, если отмести фреймворк как системную библиотеку, будет очень минималистичен.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Fr0sT, да не фреймворк, а рантайм(runtime) - инструментарий языка а не среды. То что в стандарте языка прописано.
Post Reply