Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Ищу работу в Москве.   Найти похожие ветки 

 
VID ©   (2004-09-01 09:42) [0]

Новая ветка о старом.
Моё резюме (если есть замечания по существу, рад их услышать, однако, просто выёживаться ненадо):

----------------------------------------------------

31.08.2004 17:49:51 | Должность: Программист  
Город: Москва
Пол: Муж
Возраст: 23
Образование: Высшее
Опыт работы: 2 года
Занятость: Полная
Зарплата от: 1000 $

Профессиональные навыки:

Прикладное программирование, проектирование, разработка компонентов, ООП, английский (технический + общий на среднем уровне). Занимаюсь созданием клиент-серверных приложений БД на основе Interbase. Хорошо знаю SQL. Имею опыт работы с такими продуктами как Borland Delphi 5, Interbase, Yaffil, IBExpert, Visual Basic for Applications(написание кода под приложения из пакета Microsoft Office), Microsoft Visual FoxPro 5, 6, 7, а также с такими технологиями как Client/Server, VCL-сокеты, ActiveX, OLE, WinAPI, HTML. Трудолюбив, ответственен, не конфликтен. Люблю изучать новые области знаний.

Образование:

Высшее. В 2003 году окончил Дагестанский Государственный Университет, факультет управления экономикой, специальность Информационные системы в экономике .

Опыт работы:

В целом, опыт работы с Delphi составляет четыре с половиной года, из них последние полтора года (2003-2004) работаю в должности программист в Дагестанской Медицинской Академии.

----------------------------------------------------

Для контакта со мной, пишите на e-mail: vidsnap#mail.ru, icq#: 132234868.


 
stone ©   (2004-09-01 09:44) [1]

http://delphimaster.net/view/14-1093923774/


 
VID ©   (2004-09-01 09:59) [2]

stone ©   (01.09.04 9:44) [1]
прочитал...

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


 
VID ©   (2004-09-01 10:02) [3]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, AppEvnts, StdCtrls, recvpckt, ScktComp, inifiles, BestTools,
 WinSock, ExtCtrls, ActnList, Menus, rserver_global, RXShell, SocketThreadUnit;

type
 TLogin = String[255];
 TPassword = String[32]; //MD5-compatible size
 TAccount = record
   Login : TLogin;
   Password : TPassword;
   Position : Longint;
 end;
 TPTPPermission = record
   Logins:String;
   PTPEnabled:Boolean;
 end;
 TRServerSocketThread = class(TSocketThread)
   FReceiveBuffer:TBuffer;
   FAccount:TAccount;
   FLastActivity:Cardinal;  //TickCount
   FTargetLogins:String; //Логины клиентов через ListDelimiter
   FPeerToPeer:Boolean;
   FPTPPermission:TPTPPermission;
   Function FormatNetMessage(const Msg:String):String;
   Procedure SendNetMessage(TargetSocketThread:TSocketThread; const Msg:String);
   Procedure SendText(TargetSocketThread:TSocketThread; const Text:String);
 end;
 TSocketThreadArr = array of TRServerSocketThread;
 TfrmMain = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   Stat: TStatusBar;
   AE: TApplicationEvents;
   Log: TMemo;
   Server: TServerSocket;
   MainMenu1: TMainMenu;
   ActionList1: TActionList;
   aStart: TAction;
   aStop: TAction;
   Connection1: TMenuItem;
   Startserver1: TMenuItem;
   Stopserver1: TMenuItem;
   N1: TMenuItem;
   aExit: TAction;
   Exit1: TMenuItem;
   Memo1: TMemo;
   Tray: TRxTrayIcon;
   aGetInfo: TAction;
   N2: TMenuItem;
   Getinfo1: TMenuItem;
   Procedure SetTitle(const S:String);
   procedure FormCreate(Sender: TObject);
   Procedure ShowStat(Column:Integer; const S:String);
   procedure AEMinimize(Sender: TObject);
   procedure AERestore(Sender: TObject);
   Procedure StartServer;
   Procedure StopServer;
   procedure AEIdle(Sender: TObject; var Done: Boolean);
   Function GetAuthCount:Integer;
   Procedure AddLog(LogText:String);
   procedure ServerClientConnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
   procedure FormResize(Sender: TObject);
   Procedure RemoveSilentClients(var RemovedCount:Integer);
   Procedure PingClients(var PingedCount, DisconnectedCount:Integer);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
   procedure aStartExecute(Sender: TObject);
   procedure aStopExecute(Sender: TObject);
   procedure aExitExecute(Sender: TObject);
   procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
   procedure TrayMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   Function CreateSocketThread(Socket:TCustomWinSocket):TRServerSocketThread;
   procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
   procedure ServerClientDisconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure aGetInfoExecute(Sender: TObject);
   Procedure LoadTrayIcon;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 procedure ExecutePacketProc(SocketThread:TSocketThread);

var
 frmMain: TfrmMain;
 WaitBeforeDisconnectValue:Cardinal;
 PingInterval, PingedLastActivityValue:Cardinal;
 CurrentLocalIP:String;
 gTotalInCount:Integer = 0;//Переменная входящего траффика.
 gTotalOutCount:Integer = 0;//Переменная исходящего траффика

implementation

uses ServiceThreadUnit;

 Function GetSocketThreadsByLogins(const Logins:String; var SocketThreadArr:TSocketThreadArr):Integer; forward;
 Procedure ClientAuthentification(SocketThread:TRServerSocketThread; var RServerPacket:TRServerPacket); forward;
 Function WriteAccount(var Account:TAccount):Boolean;forward;
 Function ReWriteAccount(const Account:TAccount):Boolean;forward;
 Function ReadAccount(const Account:TAccount):TAccount;forward;
 Procedure ClearAccount(var Account:TAccount);forward;
 Function Local_SendPacket(const Packet:String; SocketThread:TSocketThread):Integer; forward;

const
 ProjName = "RServer";
 cMaxConnections = -1;
 cDefaultPort = 1026;
 cWaitBeforeDisconnect = 900;//seconds
 cPingInterval = 0;//seconds
 cPingedLastActivityValue = 300;//seconds
 cAutoRegistrationEnabled = True;

Var gMinimized : Boolean = False;
   ShowLogs:Boolean = True;
   MaxConnections:Integer = cMaxConnections;
   ProjVer,Way,IniFName,AccountFName:String;
   AutoRegistrationEnabled:Boolean = cAutoRegistrationEnabled;
   CriticalSection1:TRTLCriticalSection; //Для работы с файлом аккаунтов
   ServiceThread:TServiceThread;

{$R *.DFM}

{ TRServerSocketThread }

Function TfrmMain.CreateSocketThread(Socket:TCustomWinSocket):TRServerSocketThread;
begin
 Result := TRServerSocketThread.Create(False, Socket, ExecutePacketProc, True);
 With Result do
 begin
   ClearBuffer(FReceiveBuffer);
   FAccount.Login := "";
   With FPTPPermission do
   begin
     Logins := "";
     PTPEnabled := True;
   end;
   FTargetLogins := "";
   FLastActivity := GetTickCount;
   FPeerToPeer:=False;
 end;
end;

Function TRServerSocketThread.FormatNetMessage(const Msg:String):String;
begin
 Result := CreatePacket(RServer_Command, RServer_Message+CreateParams([Msg]));
end;

Procedure TRServerSocketThread.SendNetMessage(TargetSocketThread:TSocketThread; const Msg:String);
begin
 SendText(TargetSocketThread, FormatNetMessage(Msg));
end;

Procedure TRServerSocketThread.SendText(TargetSocketThread:TSocketThread; const Text:String);
Var X:Integer;
begin
 X := inherited SendText(TargetSocketThread, Text, -1);
 Inc(gTotalOutCount, X);
end;

{ end TRServerSocketThread }


не до конца естесно, больше скрипт не позволяет.. но и так думаю понятно, а щас второй модуль.


 
VID ©   (2004-09-01 10:03) [4]

хм.. нет думаю ещё с первого есть смысл добавить


Function Local_SendPacket(const Packet:String; SocketThread:TSocketThread):Integer;
begin
 Result := 0;
 try
   IF not SocketThread.FSendingText then
   begin
     Result := SendPacket(Packet, SocketThread.FSocket);
     IF Result>0 then Inc(gTotalOutCount, Result);
   end;
 except end;
end;

//Вызывается из потока
Function WriteAccount(var Account:TAccount):Boolean;
Var FileStream:TFileStream;
begin
 IF FileExists(AccountFName) then
   FileStream := TFileStream.Create(AccountFName, fmOpenReadWrite)
 else FileStream := TFileStream.Create(AccountFName, fmCreate);
 try
   With FileStream do
   begin
     Position := FileStream.Size;
     Account.Position := Position;
     WriteBuffer(Account, SizeOf(Account));
     Result := True;
   end;
 finally
   FileStream.Free;
 end;
end;

//Вызывается из потока
Function ReWriteAccount(const Account:TAccount):Boolean;
Var FileStream:TFileStream;
   TempAccount:TAccount;
begin
 Result := False;
 IF FileExists(AccountFName) then
   FileStream := TFileStream.Create(AccountFName, fmOpenReadWrite)
 else FileStream := TFileStream.Create(AccountFName, fmCreate);
 try
   ClearAccount(TempAccount);
   With FileStream do
   begin
     Position := Account.Position;
     ReadBuffer(TempAccount, SizeOf(TempAccount));
     IF AnsiUpperCase(Account.Login) = AnsiUpperCase(TempAccount.Login) then
     begin
       Position := Account.Position;
       WriteBuffer(Account, SizeOf(Account));
       Result := True;
     end;
   end;
 finally
   FileStream.Free;
 end;
end;

//Вызывается из потока
Procedure ClearAccount(var Account:TAccount);
begin
 With Account do
 begin
   Login := "";
   Password := "";
   Position := -1;
 end;
end;

//Вызывается из потока
Function ReadAccount(const Account:TAccount):TAccount;
Var FileStream:TFileStream;
begin
 ClearAccount(Result);
 IF not FileExists(AccountFName) then exit;
 FileStream := TFileStream.Create(AccountFName, fmOpenRead + fmShareDenyNone);
 try
   With FileStream do
     While Position < Size do
       try
         ReadBuffer(Result, SizeOf(Result));
         IF AnsiUpperCase(Account.Login) = AnsiUpperCase(Result.Login) then exit;
       except Position := Size end;
     ClearAccount(Result);
 finally
   FileStream.Free;
 end;
end;

Procedure TfrmMain.LoadTrayIcon;
Var ResourceStream:TResourceStream;
   S:String;
begin
 IF Server.Active then S := "ICON_C" else S := "ICON_G";
 ResourceStream := TResourceStream.Create(HINSTANCE, S, RT_RCDATA);
 try
   Tray.Icon.LoadFromStream(ResourceStream);
 finally
   ResourceStream.Free;
 end;
end;

//Вызывается из потока
Function TfrmMain.GetAuthCount:Integer;
Var I:Integer;
begin
 Result := 0;
 For I:=Server.Socket.ActiveConnections - 1 downto 0 do
   try
     IF TRServerSocketThread(Server.Socket.Connections[I].Data).FAccount.Login <> "" then Inc(Result);
   except end;
end;

Procedure TfrmMain.AddLog(LogText:String);
Const LinesLimit = 600;
begin
 IF not ShowLogs then Exit;
 Log.Lines.Add(DateTimeToStr(Now)+": "+LogText);
 while Log.Lines.Count > LinesLimit do
   try Log.Lines.Delete(0) except break end;
 IF Log.Lines.Count >= LinesLimit * 2 then Log.Lines.Clear; //Extra situation
end;

Procedure TfrmMain.StartServer;
Var Ini:TIniFile;
begin
 IF Server.Active then exit;
 Ini := TIniFile.Create(INIFNAME);
 try
   IF not Ini.ValueExists("SETTINGS", "PORT") then
     Ini.WriteInteger("SETTINGS", "PORT", cDefaultPort);
   IF not Ini.ValueExists("SETTINGS", "MAX_CONNECTIONS") then
     Ini.WriteInteger("SETTINGS", "MAX_CONNECTIONS", cMaxConnections);
   IF not Ini.ValueExists("SETTINGS", "WAIT_BEFORE_DISCONNECT") then
     Ini.WriteInteger("SETTINGS", "WAIT_BEFORE_DISCONNECT", cWaitBeforeDisconnect);
   IF not Ini.ValueExists("SETTINGS", "PING_INTERVAL") then
     Ini.WriteInteger("SETTINGS", "PING_INTERVAL", cPingInterval);
   IF not Ini.ValueExists("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE") then
     Ini.WriteInteger("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE", cPingedLastActivityValue);
   IF not Ini.ValueExists("SETTINGS", "AUTO_REGISTRATION_ENABLED") then
     Ini.WriteBool("SETTINGS", "AUTO_REGISTRATION_ENABLED", cAutoRegistrationEnabled);

   Server.Port := Ini.ReadInteger("SETTINGS", "PORT", cDefaultPort);
   MaxConnections := Ini.ReadInteger("SETTINGS", "MAX_CONNECTIONS", MaxConnections);
   WaitBeforeDisconnectValue := Ini.ReadInteger("SETTINGS", "WAIT_BEFORE_DISCONNECT", cWaitBeforeDisconnect);
   IF Ini.ReadInteger("SETTINGS", "PING_INTERVAL", cPingInterval) < 0 then
     PingInterval := 0
   else
     PingInterval := Ini.ReadInteger("SETTINGS", "PING_INTERVAL", cPingInterval);
   PingedLastActivityValue := Ini.ReadInteger("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE", cPingedLastActivityValue);
   AutoRegistrationEnabled := Ini.ReadBool("SETTINGS", "AUTO_REGISTRATION_ENABLED", cAutoRegistrationEnabled);
 finally
   Ini.Free;
 end;
 AddLog("Starting server...");
 try
   Server.Open;
   ServiceThread.ResetVariables;
 except
   on E:Exception do AddLog("Error ""+E.Message+""");
 end;
 aStart.Enabled := not Server.Active;
 aStop.Enabled := Server.Active;
 LoadTrayIcon;
 IF Server.Active then
 begin
   gTotalInCount := 0; gTotalOutCount := 0;
   SetTitle("Active");
   CurrentLocalIP := GetLocalIP;
   AddLog("Server started. Local IP: "+CurrentLocalIP+". Port: "+IntToStr(Server.Port));
 end else AddLog("Server not started");
end;

вот теперь наверное хватит с первого


 
VID ©   (2004-09-01 10:04) [5]

теперь второй модуль

unit SocketThreadUnit;

interface

uses
 Classes, SysUtils, ScktComp, Windows, WinSock, SyncObjs;

type
 TSocketThread = class;
 TExecutePacketProc = procedure (SocketThread:TSocketThread);
 TSocketThread = class(TThread)
 private
   FRunExecutePacketProcAtFirstIteration:Boolean;
   FExecutePacketProc:TExecutePacketProc;
   FStringsLock:TCriticalSection;
   FSendTextLock:TRTLCriticalSection;
 public
   FSocket:TCustomWinSocket;
   FFirstIteration:Boolean;
   FStrings:TStringList;
   FSendingText:Boolean;
   Function Enter_CriticalSection(CriticalSection:TRTLCriticalSection):Boolean;
   Procedure Leave_CriticalSection(CriticalSection:TRTLCriticalSection);
   Function IsSocketConnected:Boolean;
   Function IsTerminated:Boolean;
   Function SendText(TargetSocketThread:TSocketThread; const Text:String; Attempts:Integer):Integer;
   Procedure AddReceivedText;
   constructor Create(CreateSuspensed:Boolean; ASocket:TCustomWinSocket;
     AExecutePacketProc:TExecutePacketProc;
     ARunExecutePacketProcAtFirstIteration:Boolean);
   destructor Destroy;override;
 protected
   procedure Execute; override;
 end;

 function WaitForData(Socket:TSocket; Timeout: Longint; IsWriteMode:Boolean): Boolean; forward;
 Function GetSocketThreadsCount:Integer;

implementation

Const SocketThreadsCleaningInterval = 300; //seconds

var SocketThreads:TList;
   SocketThreadsLock:TCriticalSection;
   LastSocketThreadsCleaningTime:Cardinal = 0;

Procedure ClearSocketThreadsFromDeadItems;
Var I:Integer;
begin
 For I:=SocketThreads.Count - 1 downto 0 do
   try
     IF TSocketThread(SocketThreads[I]).Terminated then
       SocketThreads.Delete(I);
   except
     SocketThreads.Delete(I);
   end;
end;

{ TSocketThread }

constructor TSocketThread.Create(CreateSuspensed:Boolean;
 ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
 ARunExecutePacketProcAtFirstIteration:Boolean);
begin
 Inherited Create(CreateSuspensed);
 SocketThreadsLock.Enter;
 try
   IF GetTickCount - LastSocketThreadsCleaningTime >= SocketThreadsCleaningInterval * 1000 then
     try ClearSocketThreadsFromDeadItems except end;
   if SocketThreads.IndexOf(Self)<0 then SocketThreads.Add(Self);
 finally
   SocketThreadsLock.Leave;
 end;
 FStringsLock := TCriticalSection.Create;
 InitializeCriticalSection(FSendTextLock);
 FStrings := TStringList.Create;
 FreeOnTerminate := True;
 FSocket := ASocket;
 FExecutePacketProc := AExecutePacketProc;
 FRunExecutePacketProcAtFirstIteration := ARunExecutePacketProcAtFirstIteration;
 FSendingText:=False;
 FFirstIteration := True;
end;

destructor TSocketThread.Destroy;
begin
 try
   FStrings.Free;
   FStringsLock.Free;
   DeleteCriticalSection(FSendTextLock);
   SocketThreadsLock.Enter;
   try
     SocketThreads.Remove(Self);
   finally
     SocketThreadsLock.Leave;
   end;
 finally
   inherited Destroy
 end;
end;

Function TSocketThread.IsSocketConnected:Boolean;
begin
 try Result := FSocket.Connected except Result := False; end;
end;

Function TSocketThread.IsTerminated:Boolean;
begin
 try Result := Terminated except Result := True end;
end;

Function TSocketThread.SendText(TargetSocketThread:TSocketThread; const Text:String; Attempts:Integer):Integer;
Var SendSize, RemainSize, Attempt:Integer;
begin
 Result := 0; RemainSize := Length(Text);
 Attempt := 0; SendSize := -1;
 try
   if not Enter_CriticalSection(TargetSocketThread.FSendTextLock) then exit;
   TargetSocketThread.FSendingText := True;
 except exit end;
 try
   Repeat
     try
       With TargetSocketThread do //Нужно что бы не проходить код если потока уже нет
         if IsTerminated or (not IsSocketConnected) then exit;
     except exit end;
     IF WaitForData(TargetSocketThread.FSocket.SocketHandle, 1000, True) then
     begin
       Attempt := 0;
       IF Text <> "" then
       begin
         SendSize := TargetSocketThread.FSocket.SendBuf((@Text[Result+1])^, RemainSize);
         IF SendSize > 0 then
         begin
           IF SendSize < RemainSize then Sleep(1);
           Inc(Result, SendSize);
           Dec(RemainSize, SendSize);
         end else
           IF SendSize = 0 then Inc(Result, RemainSize)
           else //При неудачной попытке записи в буффер WinSock инкрементируем номер попытки
             IF SendSize = -1 then begin Inc(Attempt); Sleep(1) end;
       end else SendSize := 0;
     end else begin Inc(Attempt); Sleep(1) end;

     IF Attempts >-1 then
       IF Attempt >= Attempts then
       begin
         Result := -1; //Достигнуто макс. количество разрешённых неудачных попыток подряд
         Exit;
       end;

   Until (SendSize = 0) or Terminated or (not IsSocketConnected);
 finally
   try TargetSocketThread.FSendingText := False except end;
   try Leave_CriticalSection(TargetSocketThread.FSendTextLock) except end;
 end;
end;

Procedure TSocketThread.AddReceivedText;
begin
 FStringsLock.Enter;
 try
   FStrings.Add(FSocket.ReceiveText);
 finally
   FStringsLock.Leave;
 end;
end;

Function TSocketThread.Enter_CriticalSection(CriticalSection:TRTLCriticalSection):Boolean;
Var FirstIteration:Boolean;
begin
 FirstIteration := True;
 Repeat
   IF FirstIteration then FirstIteration := False else Sleep(1);
 Until (TryEnterCriticalSection(CriticalSection)) or Terminated
   or (not IsSocketConnected);
 Result := (not Terminated) and IsSocketConnected;
end;

Procedure TSocketThread.Leave_CriticalSection(CriticalSection:TRTLCriticalSection);
begin
 LeaveCriticalSection(CriticalSection);
end;


 
VID ©   (2004-09-01 10:05) [6]


procedure TSocketThread.Execute;
 Function GetFStringsCount:Integer;
 begin
   FStringsLock.Enter;
   try
     Result := FStrings.Count;
   finally
     FStringsLock.Leave;
   end;
 end;
begin
 While (not Terminated) and IsSocketConnected do
 begin
   IF FFirstIteration then
     try
       IF FRunExecutePacketProcAtFirstIteration and (Assigned(FExecutePacketProc)) then
         try FExecutePacketProc(Self) except end;
     finally
       FFirstIteration := False;
     end;

   Sleep(1);
   IF GetFStringsCount > 0 then
     repeat
       try
         if Assigned(FExecutePacketProc) then
           try FExecutePacketProc(Self) except end;
       finally
         FStringsLock.Enter;
         try
           FStrings.Delete(0);
         finally
           FStringsLock.Leave;
         end;
       end;
     until (GetFStringsCount = 0) or Terminated or (not IsSocketConnected);

   IF GetFStringsCount > 0 then
   begin
     FStringsLock.Enter;
     try
       FStrings.Clear;
     finally
       FStringsLock.Leave;
     end;
   end;
 end;
end;

{ end TSocketThread }

function WaitForData(Socket:TSocket; Timeout: Longint; IsWriteMode:Boolean): Boolean;
var
 FDSet: TFDSet;
 TimeVal: TTimeVal;
begin
 TimeVal.tv_sec := Timeout div 1000;
 TimeVal.tv_usec := (Timeout mod 1000) * 1000;
 FD_ZERO(FDSet);
 FD_SET(Socket, FDSet);
 IF IsWriteMode then
   Result := select(0, nil, @FDSet, nil, @TimeVal) > 0
 else Result := select(0, @FDSet, nil, nil, @TimeVal) > 0
end;

Function GetSocketThreadsCount:Integer;
begin
 Result := SocketThreads.Count;
end;

initialization
 SocketThreadsLock := TCriticalSection.Create;
 SocketThreads := TList.Create;
 LastSocketThreadsCleaningTime := GetTickCount;

finalization
 SocketThreads.Free;
 SocketThreadsLock.Free;

end.


всё...


 
Игорь Шевченко ©   (2004-09-01 10:07) [7]

Я бы придрался к
try .... except end;


 
stone ©   (2004-09-01 10:15) [8]


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

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


 
Ozone ©   (2004-09-01 10:16) [9]

Коментариев мало, ИМХО


 
КаПиБаРа ©   (2004-09-01 10:21) [10]

Игорь Шевченко ©   (01.09.04 10:07) [7]
Я бы придрался к
try .... except end;

К какому именно, их там 4?


 
peypivo ©   (2004-09-01 10:25) [11]

А что там не так с try..except ?


 
Ozone ©   (2004-09-01 10:26) [12]

К какому именно, их там 4?

:-) А я 15 насчитал...


 
WondeRu ©   (2004-09-01 10:33) [13]

ошибки:
1. опыт работы пишется в начале и расписывается чем занимался и в какие сроки, проекты, которые вел!
2. Вторым пунктом пишется образование
3. "Профессиональные навыки:" - смешал все! распиши по отдельным пунктам
4. не указывай версии продуктов
5. ActiveX, OLE замени на СОМ/DCOM-технологии
6. "Visual Basic for Applications(написание кода под приложения из пакета Microsoft Office)" и ежу понятно, пиши "VBA"
7. знание языков, водительские права - в отдельные пункты


 
WondeRu ©   (2004-09-01 10:37) [14]

поверь мне, твои исходники нафиг никому не нужны!) Это просто дурь! Ты не на олимпиаде по программированию.
Судят готовые проекты.


 
КаПиБаРа ©   (2004-09-01 10:38) [15]

stone ©   (01.09.04 10:15) [8]
Если принимают на путевую работу, то исходники посмотрят. На это и надо расчитывать. Конечно же и про резюме не забывать, что бы в случае с девочкой тоже шансы были.


 
Думкин ©   (2004-09-01 10:42) [16]

> [11] peypivo ©   (01.09.04 10:25)

Часть вписано для подавления каких-то проблем, это не обработка исключений, а их заглушка. Например:
try
  IF not SocketThread.FSendingText then
  begin
    Result := SendPacket(Packet, SocketThread.FSocket);
    IF Result>0 then Inc(gTotalOutCount, Result);
  end;
except end;


Взяли и задавили.


 
Layner ©   (2004-09-01 10:46) [17]

Исходники впечатляют. Только лучше бы выложил где нибудь в zip архиве проект. Как свою не бритую фотку :)


 
КаПиБаРа ©   (2004-09-01 11:00) [18]

Думкин ©   (01.09.04 10:42) [16]
Часть вписано для подавления каких-то проблем, это не обработка исключений, а их заглушка

Ну что в этом плохого. Мне например не нравится когда программа выдает кучу окон с SocetError если вытащить сетевой шнур. А в данном случае после проверки возвращаемого результата на 0 можно выдать аккуратное и не навязчивое сообщение о том что сообщение не было отправлено.


 
Dok_3D ©   (2004-09-01 11:04) [19]

Нормальное резюме. И исходники в норме. Рассылай работодателям и вперед на собеседование. Шансы, на мой взгляд, неплохие. На испытательный срок, конечно, 1000$ я бы не дал, но в будущем - в случае большой отдачи - очень вероятно.


 
peypivo ©   (2004-09-01 11:06) [20]

Все таки к [13] прислушайся. Открой в ворде мастер построения резюме.


 
VID ©   (2004-09-01 11:28) [21]

stone ©   (01.09.04 10:15) [8]
Да, конечно. Я это понимаю, но здесь просто встал вопрос о моей неопытности. При всём уважении к тебе, я не могу назвать себя неопытным, и поэтому я привёл здесь этот код. Ну и заодно хочется услышать конструктивной критики, ведь я только рад, если кто-то мне укажет "как не надо делать".
Ozone ©   (01.09.04 10:16) [9]
ну... это такое дело... я конечно понимаю что коменты должны занимать 30% общего текста, но я писал проект исключительно для себя, и не видел смысла в коментировании банальный процедур...
WondeRu ©   (01.09.04 10:33) [13]
Я уже говори. У меня есть подробное резюме в doc-формате, именно его я высылаю потенциальным работодалетям, а то, что я привёл здесь - есть моё резюме на job.ru а там, во-первых своя форма представления резюме, а во-вторых, значительные ограничения на объём резюме, и особо не распишешься...
В целом твои замечания 4,5,6 существенны. Исправлю. А вот про водительские права я говорить не буду - я ж не водилой для любовницы шефа устраиваюсь. А то ведь если следовать в таком духе то можно написать что яичницу готовить умею, Unreal Tournament и NFSU неплохо играю.... кому это нужно ?
Dok_3D ©   (01.09.04 11:04) [19]
Спасибо за поддержку. Такие слова мне нужны, для собственной уверенности...


 
stone ©   (2004-09-01 11:46) [22]


> но здесь просто встал вопрос о моей неопытности

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

> Ну и заодно хочется услышать конструктивной критики, ведь
> я только рад, если кто-то мне укажет "как не надо делать".
>

http://www.rsdn.ru/summary/674.xml
http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.resume


 
Mim1 ©   (2004-09-01 13:25) [23]

По коду:
мне кажется конструкторо вашего класса потока сделан некрасиво. Нужно было заменить конструктор и resume"ить его работу после инициализации его полей.
Глобальных переменных море, некоторые используются в приведенных отрезках (без роверки), но там же не создаются.

Хотя прилично, конструкции try ... filnally end используются верно. оперторов goto невидно, with не злоупотребляете.


 
VID ©   (2004-09-01 13:33) [24]


> Глобальных переменных море

Каждая глобальная переменная имеет свой глобальный смысл :)


> Нужно было заменить конструктор и resume"ить его
> работу после инициализации его полей.

А зачем ? Вдруг не хочет человек, что бы поток работал сразу после создания ? Класс TSocketThread я вообще то делал так что бы свободно использовать его в других проектах.

Вообще, это конечно всё мелочи... ньюансы конкретной реализации, так сказать...


 
Mim1 ©   (2004-09-01 16:52) [25]

Человек то захочет ,только что произойдет если он начнет работать до того как поля не инициализированы?  

constructor TSocketThread.Create(CreateSuspensed:Boolean;
ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
ARunExecutePacketProcAtFirstIteration:Boolean);
begin
Inherited Create(CreateSuspensed); //  тут он начинает работать если в параметрах пришло true
// а дальше в вызывающем потоке идет инициализация
SocketThreadsLock.Enter;
try
  IF GetTickCount - LastSocketThreadsCleaningTime >= SocketThreadsCleaningInterval * 1000 then
    try ClearSocketThreadsFromDeadItems except end;
  if SocketThreads.IndexOf(Self)<0 then SocketThreads.Add(Self);
finally
  SocketThreadsLock.Leave;
end;
FStringsLock := TCriticalSection.Create;
InitializeCriticalSection(FSendTextLock);
FStrings := TStringList.Create;
FreeOnTerminate := True;
FSocket := ASocket;
FExecutePacketProc := AExecutePacketProc;
FRunExecutePacketProcAtFirstIteration := ARunExecutePacketProcAtFirstIteration;
FSendingText:=False;
FFirstIteration := True;
end;


Не лучше ли было?

constructor TSocketThread.Create(CreateSuspensed:Boolean;
ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
ARunExecutePacketProcAtFirstIteration:Boolean);
begin
Inherited Create(true);
// а дальше в вызывающем потоке идет инициализация
 ...
if not CreateSuspensed then resulme;
end;


 
VID ©   (2004-09-01 18:55) [26]

нет, так не лучше.
вот проверь этот код.


type
 tmythread = class(tthread)
 fx1, fx2:integer;
 constructor Create(Susp:Boolean);
 protected
   procedure execute; override;
 end;

var
 thrd:tmythread;

constructor tmythread.Create(Susp:Boolean);
begin
 Inherited Create(susp); //(1)
 FX1 := 5;
 FX2 := 6;
end;

procedure tmythread.execute;
begin
 while not terminated do
   sleep(100);//(2)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 thrd := tmythread.Create(false);
end;



Расставь брейкпоинты на строке (1) и (2).
Нажми button1.

И пошагово (нажимая f8) отслеживай ход выполнения кодового потока.


 
nikkie ©   (2004-09-01 19:20) [27]

>И пошагово (нажимая f8) отслеживай ход выполнения кодового потока.
более убедительно было предложить заглянуть в исходники VCL.
и неплохо бы было бы задуматься, что реализация в другой версии может отличаться. сравниваем.

D6:
constructor TThread.Create(CreateSuspended: Boolean);
{$IFDEF LINUX}
var
 ErrCode: Integer;
{$ENDIF}
begin
 inherited Create;
 AddThread;
 FSuspended := CreateSuspended;
 FCreateSuspended := CreateSuspended;
{$IFDEF MSWINDOWS}
 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
 if FHandle = 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ENDIF}
{$IFDEF LINUX}
 sem_init(FCreateSuspendedSem, False, 0);
 ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
 if ErrCode <> 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF}

procedure TThread.AfterConstruction;
begin
 if not FCreateSuspended then
   Resume;
end;


D5:
constructor TThread.Create(CreateSuspended: Boolean);
var
 Flags: DWORD;
begin
 inherited Create;
 AddThread;
 FSuspended := CreateSuspended;
 Flags := 0;
 if CreateSuspended then Flags := CREATE_SUSPENDED;
 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;


 
paul_k ©   (2004-09-01 22:21) [28]

VID ©  
1. Ты ищешь работы в Москве, значит, то о чем я уже писал, - должен придти на собеседование когда пригласят
и при этом, крайне желательно принести с собой паспорт с гражданством России и свидетельство о регистрации.
Отсутствие этого сильно занижает твою стоимость и закрывает большую долю вакансий.
Я не говорю о том что я предлагал. Показал твое резюме шефу. ответ был:
- Не в Москве, из Дагестана, первое место в  Москве - на ...
  нам ещё его проблем с ментами не хватало

Для работодателя, потенциального, очень много значит когда ты в резюме кроме данных о том какой ты специалист указываеш адрес и телефон в том городе, где работу ищешь.


 
VID ©   (2004-09-01 22:35) [29]

Да я же ещё не в Москве! Вот приеду на квартиру, будет у меня  и адрес и телефон, сделаю себе прописку, хотя бы на три месяца...

блин, твоего шефа тоже можно понять :(( ну возможно мне попадётся работодатель, который будет менее разборчив и которому будет более необходим новый работник, чем твоему шефу...


 
VID ©   (2004-09-01 22:38) [30]

А вообще вся эта хрень с пропиской/регистрацией меня очень огрочает... И главное-то: мнения диаметрально противоположные!
Одни говорят, что при приёме на работу почти нигде не просят  регистрации (разве что если я стану материально ответственным лицом - тогда да..), другие что без регистрации не то что на работу - даже в туалет общественный не пустят!....

Да уж, настолько большой город, что в разных районах разные традиции...


 
VID ©   (2004-09-02 09:04) [31]

up, работодатели :)


 
Алхимик ©   (2004-09-02 09:11) [32]

Проверка регистрации работодателем - его личная инициатива.
По закону они не обязаны это делать.


 
data ©   (2004-09-02 09:27) [33]

VID ©   (01.09.04 22:38) [30]
По собственному опыту сделала такие выводы: требование о регистрации часто зависит от политики бухгалтерии и всей фирмы - если все работают вчерную, значит по барабану и регистрация. Если КЗОТ, белый оклад, и оформление по трудовой и как следует, то наверняка регистрация будет необходима. Есть и промежуточные
варианты. Смотри сам какие условия тебе подходят.
От себя скажу - черное оформление почти всегда подразумевает какие-то минусы, которые с первого взгляда может и не видны.


 
Sergey_Masloff   (2004-09-02 09:33) [34]

data ©   (02.09.04 09:27) [33]
>От себя скажу - черное оформление почти всегда подразумевает >какие-то минусы
Белое же всегда подразумевает как минимум один минус - я каждый месяц когда вижу сумму налогов которые с меня вычли - мне плохо становится.


 
data ©   (2004-09-02 09:49) [35]

>Sergey_Masloff   (02.09.04 09:33) [34]

можно не смотреть:)))
а если серьезно, то на самом деле работая в черную воруем не только у государства, а больше у себя: лишаемся пенсии, больничных, прав на кредиты и других законных прав. Зато работодатели чувствуют себя хозяевами ситуации: могут крутить с вашей черной зп как хотят: штрафы, задержки, невыплаты больничных и отпусков, снижая положение работников до рабского. Поэтому ИМХО можно считать, что та страшная сумма идет на оплату вашего достоинства, свобод и получение в случае необходимости хоть какой-то защиты от гос-ва по КЗОТУ, что на мой взгляд не маловажно.


 
Sergey_Masloff   (2004-09-02 10:00) [36]

data ©   (02.09.04 09:49) [35]
да я все понимаю ;-) это так...
Не всегда в конторах в которых платят "вчерную" все так мрачно. И руководители попадаются приличные люди и больничные с отпусками оплачиваются и вообще по-разному бывает.


 
paul_k ©   (2004-09-02 14:01) [37]

А ещё - наличие у тебя регистрации - это свидетельство для нанимателя о том, что свои жилищные проблемы ты решил и не будеш ими голову морочить...


 
data ©   (2004-09-02 14:18) [38]

>А ещё - наличие у тебя регистрации - это свидетельство для
>нанимателя о том, что свои жилищные проблемы ты решил

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


 
Mim1 ©   (2004-09-02 18:37) [39]

Господа и что в здравом уме работодатель берет студента с регистрацией вмето опытного професионала без регистрации? Цирк какой то.


 
Sergey_Masloff   (2004-09-02 18:44) [40]

Mim1 ©   (02.09.04 18:37) [39]
Нет берет опытного профессионала с регистрацией.


 
VID ©   (2004-09-02 18:47) [41]

Sergey_Masloff   (02.09.04 18:44) [40]
оши на каждом шагу не валяются...


 
Mim1 ©   (2004-09-02 18:50) [42]


> [40] Sergey_Masloff   (02.09.04 18:44)

А нет у него соблазна взять профи без регистрации и платить ему меньше?


 
Sergey_Masloff   (2004-09-02 18:56) [43]

VID ©   (02.09.04 18:47) [41]
согласен. Но факты остаются фактами. Это не мое отношение  это факты.

Mim1 ©   (02.09.04 18:50) [42]
>А нет у него соблазна взять профи без регистрации и платить ему >меньше?
Нет. Если это нормальный профи то его зарплата это ничтожные суммы по сравнению с отдачей от него (и с потерями которые могут возникнуть в случае возникновения проблем прямо или косвенно связаных с отсутствием регистрации - ну кончился срок аренды квартиры надо новую искать и он целыми днями сидит на телефоне а не работает. Например.). Я не хочу сказать что наличие регистрации от таких проблем спасает. Нет. Но мнение кадровых служб несколько иное.


 
paul_k ©   (2004-09-03 10:40) [44]

Mim1 ©   (02.09.04 18:50) [42]
А смысл?
поработав пару месяцев он становится опытним и с регистрацией, и скалывает в другое место


 
Mim1 ©   (2004-09-03 17:48) [45]


> А смысл?
> поработав пару месяцев он становится опытним и с регистрацией,
> и скалывает в другое место


Думается через пару месяцев можно ему ЗП поднять, и никуда он не уйдет.

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



Страницы: 1 2 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.292 c
6-1089807438
AlexA
2004-07-14 16:17
2004.09.26
Пытаюсь при помощи TNMPOP3 сохранить вложения


14-1094805509
Holy
2004-09-10 12:38
2004.09.26
По мотивам Ночного дозора...


1-1094463431
Gear
2004-09-06 13:37
2004.09.26
Как отобразить ListBox в уже прокрученном вниз виде?


14-1094494209
wl
2004-09-06 22:10
2004.09.26
улучшение интерфейса форума


1-1095139121
_newver_
2004-09-14 09:18
2004.09.26
преобразование типов при подключении DLL