воскресенье, 28 ноября 2010 г.

Подобие многопоточности в AutoIt

AutoIt хорош всем, кроме двух вещей (для меня лично): медленность работы и отсутствие многопоточности. С первой проблемой борются оптимизацией кода (полезно все-таки), со второй каждый своими велосипедами. О своем велосипеде мне и хотелось бы рассказать.
В начале был код. Хитрить не буду - код отрубания около 50 машин по сети, с использование программы из пакета pstools (вещь очень удобная и полезная). Вот для этой программы и была написана на AutoIt графическая оболочка, дабы облегчить её использование. В самой оболочке в цикле вызывалась программа psshutdown.exe с именем отключаемой машины в качестве параметра. Все бы хорошо, но следующая машина не выключалась, пока не проработает программа для предыдущей. И вот эти 50 машин выключались добрых полчаса, а то и больше. Вывод был очевиден - нужна было многопоточность. Но в AutoIt`е её нету. Вывод - пишем велосипед, её имитирующий.
Суть:
Весь пакет состоит из двух exe: первый выполняет работу, в зависимости от переданных ему параметров. Второй взвывает первый с нужными параметрами.

Простой пример: вычислить сумму от 1 до (1000000 + I), где I меняется от 1 до 10.

Runer.au3

;Прога, в которой создается "поток"
For $I = 1 To 10
ShellExecute("get.exe", $I)
Next
MsgBox(0, "Finish", "All call completed.")

Get.au3
;Тело "потока"
#NoTrayIcon
$RESULT = 1
For $I = 2 To $CmdLine[1]
$RESULT = $I + $RESULT
Next
MsgBox(0, $CmdLine[1], $RESULT)

Строем .exe для Get.au3 и запускаем Runer.au3

суббота, 18 сентября 2010 г.

Использование AutoIt

Написал статью про использование AutoIt. Программка получилась забавной, по-моему. Строго не судить =)
ACalc.rar

пятница, 17 сентября 2010 г.

ASM или Что делать?

Нашел вот книжицу занятную: "Язык ассемблера: уроки программирования" П.И. Рудакова и К.Г. Финогенова. И призадумался: а нужен ли мне этот самый ассемблер? И что-то повода его изучать подробно не нашел. Текущих знаний для отладки программ вроде хватает. Со всем нуждами до сих пор справлялся на скриптовых и высокоуровневых языках. Драйвера писать не планирую, asm-вставки для критических областей тоже как-то не особо нужны. Отложил книжицу... и опять призадумался: а чем же время занять - пописать статьи про трейнеры, ковырянее игр и т.п. или кодить что-нибудь интересное и не однодневное (пока таких вариантов нет). Жду советов каких-нибудь =).

пятница, 27 августа 2010 г.

Hamachi

Нашел интересную программку. В первую очередь она будет интересна геймерам. Вот например захотели вы с друзьями поиграть в Diablo 2 по сети, а IP у вас динамический, и подключится к вам будет не возможно. Так эта программка создает виртуальную локальную сеть. Т.е. компьютеры на самом деле подключены только к интернету, а обращаться к ним можно как к локальным. Во общем программа для меня полезная. Вот ссылка:
Hamachi2

четверг, 12 августа 2010 г.

О паролях и лени

Человек существо ленивое. Очень. Вот и пришла мне мысля преинтересная - практически везде (ну или почти) человек вводит один и тот же пароль. Т.е. понятно, как этим можно воспользоваться злоумышленникам. Если на один из двух вопросов "Кто виноват? Что делать?" ответ уже дан, то на второй он понятен: не используйте один и тот же пароль. Если у вас взломали ICQ или почту, то получить доступ к другому не составить труда. Лень - это величайшее зло!

понедельник, 2 августа 2010 г.

О кодерах и кодинге

Навеял конец лета... Может эта записка покажется кому-то близкой. Начну сначала. Собрался, я значит написать вторую версию бота, что бы там всяких приятностей было побольше. Начал писать. За месяц реализовал процентов 70. Бросил.. Через 2 месяца за вечер написал ещё 10% процентов. Бросил.. Через недели 3 начал тестить, а-ля альфа-тестирование. Не работает. За неделю написал заплаток. Работает кое-как. Бета-тестирование... Ещё за неделю написал заплатки. Ядро работает, но не всё так красиво как задумывалось в начале. От альфа-версии осталось 80% процентов. Запустил. Работает. НО! GUI нету вообще, управлять можно только меняя исходный код и ручками писать настройки в INI файле. Итого, реализовано 85%. Теперь ещё прикручивать GUI, иначе управлять ботом одной клавишой старта (F9) (причем только старта, стопа нет - только вырубать и запускать заново) и ковырянием настроек - это какой-то ДZен..
Теперь, к чему это я все веду.
1. Кодеры существа ленивые и без надсмотра менеджера ничего толком не сделают
2. Кодеры существа странные. Они в первую очередь задумываются о ядре, а уже потом в самом конце прикручивают интерфейс, чаще всего убогий. Т.е. без менеджера опять же напишут всякую охинею.
3. Кодеры существа самодовольные. Если вы попросите их написать программу, под тип калькулятора, то как ей управлять будет известно только Избранным, таким как сами кодеры (обычно 2-3 человека, тоже кодера)
4. Кодеры существа эгоистичные, очень сложно двум кодерам вести проект: где первый обзовёт переменную "countINDEX", второй гордо напишет "AUI" или что-то в этом роде

Итак, вывод: Процесс написания проекта нифига не зависит от одного кодера. То, что он напишет - процентов 50%, максимум 60% от того, что нужно на самом деле. А если и напишет, то это ещё надо и заказчику спихнуть, при этом никаких: "Э.. А вы зачем сразу две кнопки нажали? У меня это и не предусмотрено!" или "Главное вот на этом процессе чуть-чуть подождать и ничего не нажимать - идет процесс анализ данных. Ну и что, что он идет 20 минут? Зато это самый красивый метод!" и т.п.

пятница, 30 апреля 2010 г.

Оптимизация кода AutoIt

Все кто пишет на AutoIt`е жалуются на медленность кода. Ну я тоже не исключение=) Вот и решил провести маленькое исследование - какая из функций будет работать быстрее - так, которая вызывается из UDF,  описанная в текущем файле или сразу код функции? До начала самого исследования думалось что по скорости они будут расположены так:

1. Сам код функции

2. Описанная в текущем файле

3. Вызываемая из UDF

Итак, для теста было создано два файла:

головной:


#include <TEST.au3>

;Немного подождём - что бы скрипт нормально загрузился и размялся перед боем
$SUM = 0
For $J = 1 To 1000
$SUM += TEST()
Next

;Здесь - для конкретного кода, а не вызывания функции
$time3 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
$SUM += $RET
Next
$time3 = TimerDiff($time3)
;Здесь будем замерять время для функции вызванной из UDF
$time1 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$SUM += TEST()
Next
$time1 = TimerDiff($time1)
;А здесь - для описанной ниже
$time2 = TimerInit()
$SUM = 0
For $J = 1 To 1000
$SUM += TEST2()
Next
$time2 = TimerDiff($time2)

MsgBox(0,"Результаты", "Из UDF: " & $time1 & Chr(13) & "Внутри: " & $time2 & Chr(13) & "Код: " & $time3)

Func TEST2()
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
Return
EndFunc


TEST.au3 :

Func TEST()
$RET = 0
For $I = 1 To 100
$RET *= $I
Next
Return
EndFunc


Итак, после 10 замеров получили вот такой результат:

1. Сам код функции, а не её вызов

2 и 3 Вызов из UDF и вызов их текущего файла

Причём, влияет порядок следования функций. Например если сначала замерять time1, а потом time2, то time1 будет больше. Если наоборот, т.е. сначала time2, потом time1, то time2 будет больше. 

Итак, резюмирую:

  • На скорость работы скрипта не влияет расположение функции - она может быть описана как в отдельном файле, так и в текущем.
  • Отказ от функций и использование непосредственно кода этой функции даёт существенный прирост скорости.




среда, 28 апреля 2010 г.

Простой навигатор для консоли

Итак, менюшка уже описана, а вот и её применение. Простенький навигатор по диску с помощью меню. Может перемещаться по папкам, запускать любые файлы. Пока всё - это все лишь пример применения меню=)  Но мне вещь показалась полезной при работе в консоле=)

Скачать


суббота, 24 апреля 2010 г.

Меню в BAT

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

  call menu.bat "1 string" "2 string" "3 string" "4 string" "5 string" "6 string" "7 string" etc.

После того как пользователь выбрал пункт меню - пакетный файл вернет результат. Обратится к нему можно через переменную errorlevel.

ПРИМЕР

Создадим BAT файл следующего содержания:

  @echo off

  call menu.bat "ADD" "DEL" "EDIT" "HELP" "EXIT"

  echo You Select: %errorlevel%

Результат его работы (копировано с консоли):


1: ADD
2: DEL
3: EDIT
4: HELP
5: EXIT

Select: 6
Error! Retry input
Select: df
Error! Retry input
Select: 4
You Select: 4

Вообщем вот так =) Сделать более красивую менюшку с управлением клавишами стрелок встроенными средствами BAT -  нельзя, т.к.  нельзя считать нажатие клавиши. 

Скачать

воскресенье, 18 апреля 2010 г.

Вводное

Ну что же, попробуем обосноваться здесь. Вот это мы уберём, облако тегов надо будет добавить, здесь почистим.. Если кратко - идёт процесс обживания блога =)

Давно надоевший вопрос - для чего создан блог? Ну надо же куда-то выкладывать все мысли, идеи о тех проектах, которыми я занимаюсь. Ага, а вот и следующий вопрос - а чем же я занимаюсь? Ну первым делом я пытаюсь программировать (ну если не лень как всегда). В основном на C# и AutoIT. Но не брезгую и другими языками. Надеюсь, что в скорое время выложу, точнее напишу статейку про BAT.  Ну и так как основной уклон сейчас у меня на написание второй версии бота для одной MMORPG (только тсссс.... =) ) то и про это что-нибудь тоже попробую написать.