• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Lotus Analyzer V1.6

H

hosm

а на какой версии проверял? - так, для чистоты экперимента ;)

Добавлено: кстати, это вообще в рамках темы про анализатор - может, обсуждение в тему особенностей лотусскрипт перенести?
 
N

nvyush

а на какой версии проверял? - так, для чистоты экперимента ;)
Клиент 8.0.1, база локальная.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код агента</div></div><div class="sp-body"><div class="sp-content">
Код:
Option Public
Option Declare
Sub Initialize
'	test_doc_GetItemValue
'	test_doc_ReplaceItemValue
'	test_sub_or_function
'	test_forall
'	test_Appen_and_Remove_Item
'	test_doc_CreateNew
'	test_RTItem_CreateNew
test_NotesDateTime_CreateNew
End Sub
Function test_doc_GetItemValue
'данный тест сравнивает doc.GetItemValue("Field") и doc.Field
Const count = 100000
Print "___"
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = New NotesDocument(db)
Call doc.ReplaceItemValue("Field", "")
Call test_doc_GetItemValue_DocGet(count, doc)
Call test_doc_GetItemValue_DocFld(count, doc)
End Function
Function test_doc_GetItemValue_DocGet(count As Long, doc As NotesDocument)
Dim v As Variant
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
v = doc.GetItemValue("Field")
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_doc_GetItemValue_DocFld(count As Long, doc As NotesDocument)
Dim v As Variant
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
v = doc.Field
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_doc_ReplaceItemValue
'данный тест сравнивает doc.ReplaceItemValue("Field", value) и doc.Field = value
Const count = 100000
Print "___"
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = New NotesDocument(db)
Call doc.ReplaceItemValue("Field", "")
Call test_doc_ReplaceItemValue_DocFld(count, doc)
Call test_doc_ReplaceItemValue_DocRepl(count, doc)
End Function
Function test_doc_ReplaceItemValue_DocRepl(count As Long, doc As NotesDocument)
Dim v As Variant
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Call doc.ReplaceItemValue("Field", i)
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_doc_ReplaceItemValue_DocFld(count As Long, doc As NotesDocument)
Dim v As Variant
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
doc.Field = i
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_sub_or_function()
'данный тест сравнивает вызов функции и процедуры
Const count = 2000000
Print "___"
Call test_sub_or_function_F(count)
Call test_sub_or_function_S(count)
Call test_sub_or_function_F(count)
Call test_sub_or_function_S(count)
Call test_sub_or_function_F(count)
Call test_sub_or_function_S(count)
Call test_sub_or_function_F(count)
End Function
Function test_sub_or_function_F(count As Long)
Dim s As String
Dim startTime As Single
Dim endTime As Single
Dim i As Long
s = ""
startTime = Timer()
For i = 0 To count
Call test_sub_or_function_function
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_sub_or_function_S(count As Long)
Dim s As String
Dim startTime As Single
Dim endTime As Single
Dim i As Long
s = ""
startTime = Timer()
For i = 0 To count
Call test_sub_or_function_sub
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Function
Function test_sub_or_function_function() As Integer
Dim i As Long
i = 0
End Function
Sub test_sub_or_function_sub()
Dim i As Long
i = 0
End Sub
Sub test_forall
'данный тест сравнивает forall, for i = 0 To count, for i = 0 To Ubound()
Const count = 100 '2000
Print "___"
Call test_forall_forall(count)
Call test_forall_for_i_to_count(count)
Call test_forall_for_i_to_ubound(count)
End Sub
Sub test_forall_forall(count As Long)
Redim m(32767) As Long
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Forall mm In m
mm = 1
End Forall
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_forall_for_i_to_count(count As Long)
Redim m(32767) As Long
Dim i As Long, j As Long
Dim startTime As Single
Dim endTime As Single
startTime = Timer()
For i = 0 To count
For j = 0 To 32767
m(j) = 1
Next
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_forall_for_i_to_ubound(count As Long)
Redim m(32767) As Long
Dim i As Long, j As Long
Dim startTime As Single
Dim endTime As Single
startTime = Timer()
For i = 0 To count
For j = 0 To Ubound(m)
m(j) = 1
Next
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_Appen_and_Remove_Item
Print "--------------"
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As New NotesDocument(db)
Dim item As NotesItem
Const itemName = "i1"
Call doc.AppendItemValue(itemName, "1")
Call doc.AppendItemValue(itemName, "2")
Call doc.AppendItemValue(itemName, "3")
Set item = doc.GetFirstItem(itemName)
Do Until item Is Nothing
Print {item.Text = } + Item.Text
Set item = doc.GetNextItem(item)		
Loop
Do While doc.HasItem(itemName)
Print {item.Text = } '+ doc.GetFirstItem(itemName).Text 'если здесь закомментировать от плюса, цикл выполнится один раз
Call doc.GetFirstItem(itemName).remove()
Loop
End Sub
Sub test_doc_CreateNew
'данный тест сравнивает db.CreateDocument и New NotesDocument(db)
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase	
Const count =100000
Print "___"
Call test_doc_CreateNew_Cre(count, db) 'первый всегда медленно
Call test_doc_CreateNew_New(count, db)
Call test_doc_CreateNew_Cre(count, db)
End Sub
Sub test_doc_CreateNew_Cre(count As Long, db As NotesDatabase)
Dim doc As NotesDocument
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set doc = db.CreateDocument
'		Delete doc
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_doc_CreateNew_New(count As Long, db As NotesDatabase)
Dim doc As NotesDocument
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set doc = New NotesDocument(db)
'		Delete doc
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_RTItem_CreateNew
'данный тест сравнивает doc.CreateRichTextItem("Body") и New NotesRichTextItem(doc, "Body")
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = db.CreateDocument	
Const count = 100000
Print "___"
Call test_RTItem_CreateNew_Cre(count, doc) 'первый всегда медленно
Call test_RTItem_CreateNew_New(count, doc)
Call test_RTItem_CreateNew_Cre(count, doc)
Call test_RTItem_CreateNew_New(count, doc)
Call test_RTItem_CreateNew_Cre(count, doc)
End Sub
Sub test_RTItem_CreateNew_Cre(count, doc As NotesDocument)
Dim rti As NotesRichTextItem
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set rti = doc.CreateRichTextItem("Body")
Call rti.remove()
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_RTItem_CreateNew_New(count, doc As NotesDocument)
Dim rti As NotesRichTextItem
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set rti = New NotesRichTextItem(doc, "Body")
Call rti.remove()
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_NotesDateTime_CreateNew
'данный тест сравнивает session.CreateDateTime("") и New NotesDateTime("")
Dim s As New NotesSession
Const count = 500000
Print "___"
Call test_NotesDateTime_CreateNew_Cre(count, s) 'первый всегда медленно
Call test_NotesDateTime_CreateNew_New(count, s)
Call test_NotesDateTime_CreateNew_Cre(count, s)
Call test_NotesDateTime_CreateNew_New(count, s)
Call test_NotesDateTime_CreateNew_Cre(count, s)
End Sub
Sub test_NotesDateTime_CreateNew_Cre(count As Long, s As NotesSession)
Dim dt As NotesDateTime
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set dt = s.CreateDateTime("")
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
Sub test_NotesDateTime_CreateNew_New(count As Long, s As NotesSession)
Dim dt As NotesDateTime
Dim startTime As Single
Dim endTime As Single
Dim i As Long
startTime = Timer()
For i = 0 To count
Set dt = New NotesDateTime("")
Next
endTime = Timer()
Print Cstr(Getthreadinfo(1)) & ". Timer = " & Format(endTime - startTime, "0.00000000") & " sec."
End Sub
P.S. Если кто захочет повторить — советую число испытаний сначала уменьшить на пару порядков и постепенно увеличивать.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Версия 1.5 - 06.08.2010
- исправлен подсчёт статистики когда анализ обрабатывается сервером
- исправлено ложное срабатывание на неиспользованную переменную Source в кнопках, хотспотах и т.д.
- исправлен алгоритм поиска переменных (byval)
- начат анализ @-Formula:
1) view select - если встречается два и более пробела/таба в view select и длинна view select больше 256 символов
2) hide when - если встречается два и более пробела/таба, если в формуле скрытия встречаелся @dblookup или @dbcolumn или длинна формулы скрытия больше 512 символов
 
N

nvyush

ToxaRat
Попробовал... Ошибки:
1. form: someform: field "somefield": onchange - contains unnecessary variables: source (а как же обещанное - исправлено ложное срабатывание на неиспользованную переменную Source в кнопках, хотспотах и т.д.).
2. form: someform onsubmit - contains unnecessary variables: source, continue (см. п. 1).
3. view: someview - unnecessary sub/fun: onselect (об этой ошибке сообщаю уже не первый раз. Обработчик события не может быть unnecessary sub по определению).
4. not effective use Notes Items: doc ( doc.someitem = 0). Категорически не согласен. Мои и не только тесты показывают, что doc.someitem = 0 исполняется быстрее, чем doc.ReplaceItemValue("someitem", 0). C doc.GetItemValue ситуация обратная. Может хоть галку проверять/нет для ReplaceItemValue сделать?
5. view: someview: selection: ( Form = "SomeForm") - too much spaces (сообщение об ошибке справедливое, но зачем же его выводить подряд два раза?)
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
nvy
5. view: someview: selection: ( Form = "SomeForm") - too much spaces (сообщение об ошибке справедливое, но зачем же его выводить подряд два раза?) /quote]
не совсем понял, где тут два раза?
 
N

nvyush

не совсем понял, где тут два раза?
Ну, я не стал дублировать в посте. А в отчёте выводятся две одинаковых строки с сообщением о данной ошибке).

П.С. Кстати, а нельзя ли в отчет выводить информацию с группировкой по формам, представлениям и др. видам элементов дизайна? Я так понимаю, при экспорте в ДХЛ всей базы всё свалено в кучу, но можно же экспортировать "по частям". Ну, или сортирующий xsl наложить.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
П.С. Кстати, а нельзя ли в отчет выводить информацию с группировкой по формам, представлениям и др. видам элементов дизайна? Я так понимаю, при экспорте в ДХЛ всей базы всё свалено в кучу, но можно же экспортировать "по частям". Ну, или сортирующий xsl наложить.
ну РТ отчет я могу хоть секциями сделать, это не проблема
проблема только в нехватке времени
могу хоть в XML сделать, который потом екселем открыть
 
N

nvyush

Родилась идея по доработке (не сочтите за наглость): после анализа жмём спецкнопочку — выводится диалог со списком тривиальных в плане исправления ошибок. Ставим напротив нужных ошибок галочки, жмём кнопку "Fix it!" и дальше ждём, пока супер-модуль обновит дизайн. Кандидаты в тривиальные ошибки: "Missing Option Declare", "Doubled spaces", "Invisible hotspot".
Кстати, а такое возможно: выделяем в журнале элемент дизайна с ошибкой, жмём спецкнопку и данный элемент дизайна открывается в дизайнере?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
жмём кнопку "Fix it!" и дальше ждём, пока супер-модуль обновит дизайн. Кандидаты в тривиальные ошибки: "Missing Option Declare", "Doubled spaces", "Invisible hotspot".
думаю об этом, боюсь только что обратный импорт DXML может накосячить что-то

Кстати, а такое возможно: выделяем в журнале элемент дизайна с ошибкой, жмём спецкнопку и данный элемент дизайна открывается в дизайнере?
в 8-ке это легко сделать плагином, другое дело что я не хочу уходить с 6ки :rolleyes:
 
N

nvyush

думаю об этом, боюсь только что обратный импорт DXML может накосячить что-то
Можно предложить на выбор — импорт в анализируемую базу (на свой страх и риск), либо в новую.
в 8-ке это легко сделать плагином, другое дело что я не хочу уходить с 6ки
А через url/hotspot в отчёте не получится? Я просто не в курсе, можно ли написать такую урлу, чтоб документ открывался не в простом клиенте, а в дизайнере.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Я просто не в курсе, можно ли написать такую урлу, чтоб документ открывался не в простом клиенте, а в дизайнере.
найдёте маякуйте, я тоже не в курсе как открыть дизайнером
 
N

nvyush

найдёте маякуйте, я тоже не в курсе как открыть дизайнером
При открытом клиенте выполнить в командной строке
C:\>"C:\Program Files\IBM\Lotus\Notes\designer.exe" "Notes:///ReplicaID/0/DesignDocumentUNID"
или
C:\>"C:\Program Files\IBM\Lotus\Notes\notes.exe" /DESIGN "Notes:///ReplicaID/0/DesignDocumentUNID"

Информация почерпнута здесь:

P.S. Думаю, аналогично можно через Shell(...)
P.P.S. Создал в почтовой базе черновик с Action Hotspot с формулой типа:
@Command([Execute]; "C:/Program Files/IBM/Lotus/Notes/designer.exe"; "Notes:///ReplicaID/0/DesignDocumentUNID")
Работает ;)
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Версия 1.6 - 05.01.2011
- исправлено ложное срабатывание на неиспользованную переменную
- исправлена некоректная обработка переменных содержащих в конце % $
- добавлены действия: DELETE LSOBJECT позволяет удалить откомпилированный Lotus Script, после данного действия необходимо сделать рекомпиляцию всей базы Tools\Recompile All LotusScript, данное действие необходимо периодически делать, так как если вы переписываете LS на @ то откомпилированный код не пропадает а продолжает висеть мёртвым грузом в элементах дизайна
- добавлены действия: DELETE $Fields позволяет удалять поле в форме/подформе в котором содержится список всех полей что есть и были в данной форме/подформе
- добавлен новый цвет для РТтекста: действия выделяются синим цветом
- добавлен итог сколько Kb освобождено при удалении LSOBJECT
- добавлен итог сколько Kb освобождено при удалении $Fields
- доработана проверка неиспользованных функций/процедур в библиотеках по всей базе данных
- добавлен алгоритм обработки констант по аналогии с переменными
- добавлена проверка на зря использованную библиотеку, когда её процедуры и переменные не использованы
 
N

nvyush

ToxaRat
Попробовал 1.6. К имевшимся ошибкам ( link removed ):
2. form: someform onsubmit - contains unnecessary variables: source, continue.
3. view: someview - unnecessary sub/fun: onselect.
добавилось:
Unnecessary var/const or sub/fun from Script Library: <SomeLibrary> in <SomeForm>: form: <SomeForm>
В указанной форме есть LS-экшн, в котором используются функции и константы из библиотеки SomeLibrary, так что она совсем не лишняя.

Добавлено
Насколько я понял, ошибки типа "unnecessary sub/fun: onselect" вызваны тем, что утилита ориентируется на Lotus версии 6. Элементы дизайна содержат в поле $DesignerVersion версию дизайнера, под которым они разрабатывались. Может добавить проверку допустимых событий в зависимости от версии?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Unnecessary var/const or sub/fun from Script Library: <SomeLibrary> in <SomeForm>: form: <SomeForm>
В указанной форме есть LS-экшн, в котором используются функции и константы из библиотеки SomeLibrary, так что она совсем не лишняя.
значит деклалируй єту библиотеку не глобально а в конкретном єкшене, зачем тебе глобальный деклар?

Насколько я понял, ошибки типа "unnecessary sub/fun: onselect" вызваны тем, что утилита ориентируется на Lotus версии 6. Элементы дизайна содержат в поле $DesignerVersion версию дизайнера, под которым они разрабатывались. Может добавить проверку допустимых событий в зависимости от версии?
покажи в каком месте onselect у тебя вылез,
возможно я его и не указал в списке обязательных событий
 
N

nvyush

значит деклалируй єту библиотеку не глобально а в конкретном єкшене, зачем тебе глобальный деклар?
Библиотека со стандартными действиями над документами, содержит в том числе глобальные переменные CurrentUIDoc, CurrentDoc (инициализируются в PostOpen), потом используются в экшенах и кнопках, так что глобальный use тут совсем не лишний. Извиняюсь за неточность, в данном случае использовалась кнопка, а не экшн, в аналогичных формах с экшенами ошибок не выводилось.

покажи в каком месте onselect у тебя вылез,
возможно я его и не указал в списке обязательных событий
Для представлений с непустым обработчиком события OnSelect выдаёт:
09:23:31 - view: ИМЯ_ПРЕДСТАВЛЕНИЯ
view: ИМЯ_ПРЕДСТАВЛЕНИЯ - unnecessary sub/fun: onselect
view: ИМЯ_ПРЕДСТАВЛЕНИЯ - unnecessary sub/fun: onselect
09:23:31 - view: ИМЯ_ПРЕДСТАВЛЕНИЯ
onselect - contains unnecessary var/const: source

Также из старых болячек:
09:23:27 - form: ИМЯ_ФОРМЫ
onsubmit - contains unnecessary var/const: source
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Также из старых болячек:
09:23:27 - form: ИМЯ_ФОРМЫ
onsubmit - contains unnecessary var/const: source
спасибо, исправил

Для представлений с непустым обработчиком события OnSelect выдаёт:
09:23:31 - view: ИМЯ_ПРЕДСТАВЛЕНИЯ
view: ИМЯ_ПРЕДСТАВЛЕНИЯ - unnecessary sub/fun: onselect
view: ИМЯ_ПРЕДСТАВЛЕНИЯ - unnecessary sub/fun: onselect
09:23:31 - view: ИМЯ_ПРЕДСТАВЛЕНИЯ
onselect - contains unnecessary var/const: source
вау, а про OnSelect я даже и не знал, проверил в 8ке он есть - спасибо, исправлено!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!