Programlama yapalım ve Öğrenelim. - Delphi Eğitim130
  Ana Sayfa
  .NET Eğitim Notları
  Visual C# .NET Örnek Kodları
  VisualBasic.NET Örnek Kodları
  J# Örnekleri
  ASP.NET Örnek Kodları
  Delphi Eğitim
  => Delphi Eğitim1
  => Delphi Eğitim2
  => Delphi Eğitim3
  => Delphi Eğitim4
  => Delphi Eğitim5
  => Delphi Eğitim6
  => Delphi Eğitim7
  => Delphi Eğitim8
  => Delphi Eğitim9
  => Delphi Eğitim10
  => Delphi Eğitim11
  => Delphi Eğitim13
  => Delphi Eğitim14
  => Delphi Eğitim15
  => Delphi Eğitim16
  => Delphi Eğitim17
  => Delphi Eğitim18
  => Delphi Eğitim19
  => Delphi Eğitim20
  => Delphi Eğitim21
  => Delphi Eğitim22
  => Delphi Eğitim23
  => Delphi Eğitim24
  => Delphi Eğitim25
  => Delphi Eğitim26
  => Delphi Eğitim27
  => Delphi Eğitim28
  => Delphi Eğitim29
  => Delphi Eğitim30
  => Delphi Eğtim31
  => Delphi Eğitim32
  => Delphi Eğitim33
  => Delphi Eğitim34
  => Delphi Eğitim35
  => Delphi Eğitim36
  => Delphi Eğitim37
  => Delphi Eğitim38
  => Delphi Eğitim39
  => Delphi Eğitim40
  => Delphi Eğitim41
  => Delphi Eğitim42
  => Delphi Eğitim43
  => Delphi Eğitim44
  => Delphi Eğitim45
  => Delphi Eğitim46
  => Delphi Eğitim47
  => Delphi Eğitim48
  => Delphi Eğitim49
  => Delphi Eğitim50
  => Delphi Eğitim51
  => Delphi Eğitim52
  => Delphi Eğitim53
  => Delphi Eğitim54
  => Delphi Eğitim55
  => Delphi Eğitim56
  => Delphi Eğitim57
  => Delphi Eğitim58
  => Delphi Eğitim59
  => Delphi Eğitim60
  => Delphi Eğitim61
  => Delphi Eğitim62
  => Delphi Eğitim63
  => Delphi Eğitim64
  => Delphi Eğitim65
  => Delphi Eğitim66
  => Delphi Eğitim67
  => Delphi Eğitim68
  => Delphi Eğitim69
  => Delphi Eğitim70
  => Delphi Eğitim71
  => Delphi Eğitim72
  => Delphi Eğitim73
  => Delphi Eğitim74
  => Delphi Eğitim75
  => Delphi Eğitim76
  => Delphi Eğitim77
  => Delphi Eğitim78
  => Delphi Eğitim79
  => Delphi Eğitim80
  => Delphi Eğitim81
  => Delphi Eğitim82
  => Delphi Eğitim83
  => Delphi Eğitim84
  => Delphi Eğitim85
  => Delphi Eğitim86
  => Delphi Eğitim87
  => Delphi Eğitim88
  => Delphi Eğitim89
  => Delphi Eğitim90
  => Delphi Eğitim91
  => Delphi Eğitim92
  => Delphi Eğitim93
  => Delphi Eğitim94
  => Delphi Eğitim95
  => Delphi Eğitim96
  => Delphi Eğitim97
  => Delphi Eğitim98
  => Delphi Eğitim99
  => Delphi Eğitim100
  => Delphi Eğitim101
  => Delphi Eğitim102
  => Delphi Eğitim103
  => Delphi Eğitim104
  => Delphi Eğitim105
  => Delphi Eğitim106
  => Delphi Eğitim107
  => Delphi Eğitim108
  => Delphi Eğitim109
  => Delphi Eğitim110
  => Delphi Eğitim111
  => Delphi Eğitim112
  => Delphi Eğitim113
  => Delphi Eğitim114
  => Delphi Eğitim115
  => Delphi Eğitim116
  => Delphi Eğitim117
  => Delphi Eğitim118
  => Delphi Eğitim119
  => Delphi Eğitim120
  => Delphi Eğitim121
  => Delphi Eğitim122
  => Delphi Eğitim123
  => Delphi Eğitim124
  => Delphi Eğitim125
  => Delphi Eğitim126
  => Delphi Eğitim127
  => Delphi Eğitim128
  => Delphi Eğitim129
  => Delphi Eğitim130
  => Delphi Eğitim131
  => Delphi Eğitim132
  => Delphi Eğitim133
  => Delphi Eğitim134
  => Delphi Eğitim135
  => Delphi Eğitim136
  => Delphi Eğitim137
  => Delphi Eğitim138
  => Delphi Eğitim139
  => Delphi Eğitim140
  => Delphi Eğitim141
  => Delphi Eğitim142
  => Delphi Eğitim143
  => Delphi Eğitim144
  => Delphi Eğitim145
  => Delphi Eğitim146
  => Delphi eğitim147
  => Delphi Eğitim148
  => Delphi Eğitim149
  => Delphi Eğitim150
  => Delphi Eğitim151
  => Delphi Eğitim152
  => Delphi Eğitim153
  => Delphi Eğitim154
  => Delphi Eğitim155
  => Delphi Eğitim156
  => Delphi Eğitim157
  => Delphi Eğitim158
  => Delphi Eğitim159
  => Delphi Eğitim160
  => Delphi Eğitim161
  => Delphi Eğitim162
  => Delphi Eğitim164
  => Delphi Eğitim165
  => Delphi Eğitim166
  => Delphi Eğitim167
  => Delphi Eğitim168
  => Delphi Eğitim169
  => Delphi Eğitim170
  => Delphi Eğitim171
  => Delphi Eğitim172
  => Delphi Eğitim173
  => Delphi Eğitim174
  => Delphi Eğitim175
  => Delphi Eğitim176
  => Delphi Eğitim177
  => Delphi Eğitim178
  => Delphi Eğitim179
  => Delphi Eğitim180
  => Delphi Eğitim181
  => Delphi Eğitim182
  => Delphi Eğitim183
  => Delphi Eğitim184
  => Delphi Eğitim185
  => Delphi Eğitim186
  => Delphi Eğitim187
  => Delphi Eğitim188
  => Delphi Eğitim189
  => Delphi Eğitim190
  => Delphi Eğitim191
  => Delphi Eğitim192
  => Delphi Eğitim193
  => Delphi Eğitim194
  => Delphi Eğitim195
  => Delphi Eğitim196
  => Delphi Eğitim197
  => Delphi Eğitim198
  => Delphi Eğitim199
  => Delphi Eğitim200
  => Delphi Eğitim201
  => Delphi Eğitim202
  => Delphi Eğitim203
  => Delphi Eğitim204
  => Delphi Eğitim205
  => Delphi Eğitim206
  => Delphi Eğitim207
  => Delphi Eğitim208
  => Delphi Eğitim209
  => Delphi Eğitim210
  => Delphi Eğitim211
  => Delphi Eğitim212
  => Delphi Eğitim213
  => Delphi Eğitim214
  => Delphi Eğitim215
  => Delphi Eğitim216
  => Delphi Eğitim217
  => Delphi Eğitim218
  => Delphi Eğitim219
  => Delphi Eğitim220
  => Delphi Eğitim221
  => Delphi Eğitim222
  => Delphi Eğitim223
  => Delphi Eğitim224
  => Delphi Eğitim225
  => Delphi Eğitim226
  => Delphi Eğitim227
  => Delphi Eğitim228
  => Delphi Eğitim229
  => Delphi Eğitim230
  => Delphi Eğitim231
  => Delphi Eğitim232
  => Delphi Eğitim233
  => Delphi Eğitim234
  => Delphi Eğitim235
  => Delphi Eğitim236
  => Delphi Eğitim237
  => Delphi Eğitim238
  => Delphi Eğitim239
  => Delphi Eğitim240
  => Delphi Eğitim241
  => Delphi Eğitim242
  İletişim

TImage nesnesine Resource dan resim yükleme

Image Editör ile bir Resorce dosyası oluşturun ve buna ihtiyacınıza göre bitmap ekleyin

     Kullanacağınız formun koduna {$R RES.RES}   (benim Resource dosyamın adı RES.RES idi) ekleyin.

     forma bir adet TImage ekleyin. Ben programda pagecontrol kullandım ve tabsheet değiştiğinde

     TImage üzerindeki resmin değişmesini istiyordum bu yüzden aşağıdaki kodu ekledim

    

    

     Image1.Picture.Bitmap.LoadFromResourceID(Hinstance,PageControl1.ActivePageIndex);

    

    

     PageControl1.ActivePageIndex RES dosyası içindeki Bitmap in ID si ile eşitlenmekte ve ID ye karşılık

     Bitmap TImage nesnesinde gösterilmektedir.

    

     Umarım işinize yarar :)

 

Delphi - .....................................

 

TImage nesnesine Resource dan resim yükleme

Image Editör ile bir Resorce dosyası oluşturun ve buna ihtiyacınıza göre bitmap ekleyin

     Kullanacağınız formun koduna {$R RES.RES}   (benim Resource dosyamın adı RES.RES idi) ekleyin.

     forma bir adet TImage ekleyin. Ben programda pagecontrol kullandım ve tabsheet değiştiğinde

     TImage üzerindeki resmin değişmesini istiyordum bu yüzden aşağıdaki kodu ekledim

    

    

     Image1.Picture.Bitmap.LoadFromResourceID(Hinstance,PageControl1.ActivePageIndex);

    

    

     PageControl1.ActivePageIndex RES dosyası içindeki Bitmap in ID si ile eşitlenmekte ve ID ye karşılık

     Bitmap TImage nesnesinde gösterilmektedir.

    

     Umarım işinize yarar :)

 

Delphi - .....................................

 

BitButtona Resim atayın

type

  TKindImage=(kiNone,kiOk,kiCancel,kiHelp,kiYes,kiNo,kiClose,kiAbort,kiRetry,

  kiIgnore,kiAll);

 

function BitBtnResimle(const BitBtn:TBitBtn;const KindImage:TKindImage):Boolean;

{BitBtn'a Kind vermeden resim vermeye yarar....................................}

const

  BitBtnResNames: array[kiNone..kiAll] of PChar = (

    nil, 'BBOK', 'BBCANCEL', 'BBHELP', 'BBYES', 'BBNO', 'BBCLOSE',

    'BBABORT', 'BBRETRY', 'BBIGNORE', 'BBALL');

begin

  Result:=True;

  try

    if (KindImage in [kiOk..kiAll]) then begin

      if BitBtn.Glyph=nil then BitBtn.Glyph:=TBitmap.Create;

      BitBtn.Glyph.LoadFromResourceName(HInstance,BitBtnResNames[KindImage]);

      BitBtn.NumGlyphs := 2;

    end else begin

      if Assigned(BitBtn.Glyph) then BitBtn.Glyph:=nil;

    end;

    BitBtn.Refresh;

  except

    Result:=False;

  end;

end;

//Hobi kodlama, ilk görenler için kısa ve ilgi çekici. En Büyük Ortak Bölen...

function EBOB(const a,b:LongWord):LongWord;

begin

  if b=0 then Result:=0

  else if a mod b = 0 then Result:=b

  else Result:=EBOB(b, a mod b);

end;

//En Küçük Ortak Kat

function EKOK(const a,b:LongWord):LongWord;

begin

  if (a=0) or (b=0) then Result:=0

  else Result:=(a * b) div EBOB(b, a mod b);

end;//<- Bunlar artık her ne kadar oyuncak olsa da tekrar hatırlatmak istedim.

 

//Güçbirliği yapmak gücü artırır, yakın gelecekte buna fazlasıyla ihtiyacımız olacak.

 

Delphi - .....................................

 

BitButtona Resim atayın

type

  TKindImage=(kiNone,kiOk,kiCancel,kiHelp,kiYes,kiNo,kiClose,kiAbort,kiRetry,

  kiIgnore,kiAll);

 

function BitBtnResimle(const BitBtn:TBitBtn;const KindImage:TKindImage):Boolean;

{BitBtn'a Kind vermeden resim vermeye yarar....................................}

const

  BitBtnResNames: array[kiNone..kiAll] of PChar = (

    nil, 'BBOK', 'BBCANCEL', 'BBHELP', 'BBYES', 'BBNO', 'BBCLOSE',

    'BBABORT', 'BBRETRY', 'BBIGNORE', 'BBALL');

begin

  Result:=True;

  try

    if (KindImage in [kiOk..kiAll]) then begin

      if BitBtn.Glyph=nil then BitBtn.Glyph:=TBitmap.Create;

      BitBtn.Glyph.LoadFromResourceName(HInstance,BitBtnResNames[KindImage]);

      BitBtn.NumGlyphs := 2;

    end else begin

      if Assigned(BitBtn.Glyph) then BitBtn.Glyph:=nil;

    end;

    BitBtn.Refresh;

  except

    Result:=False;

  end;

end;

//Hobi kodlama, ilk görenler için kısa ve ilgi çekici. En Büyük Ortak Bölen...

function EBOB(const a,b:LongWord):LongWord;

begin

  if b=0 then Result:=0

  else if a mod b = 0 then Result:=b

  else Result:=EBOB(b, a mod b);

end;

//En Küçük Ortak Kat

function EKOK(const a,b:LongWord):LongWord;

begin

  if (a=0) or (b=0) then Result:=0

  else Result:=(a * b) div EBOB(b, a mod b);

end;//<- Bunlar artık her ne kadar oyuncak olsa da tekrar hatırlatmak istedim.

 

//Güçbirliği yapmak gücü artırır, yakın gelecekte buna fazlasıyla ihtiyacımız olacak.

 

Delphi - .....................................

 

.tif Dosyalarını image panelde gösterme

Bilgisayarımda bir klasörde kayıtlı .TİF uzantılı

resimlerim var bunları formda image panel içinde göstermek

istiyorum ne yapabilirim. Resimleri database in içini gömmek

istemiyorum çünkü bu dosyalar devamlı kullanılan ve güncellenen

çizimler içeriyor.

birde bir resmin

abc.2145 benim stok kodum ve databasede (abc.2145) kodu ile kayıtlı

formda girdde bu kodları listeleyip üzerine çift tıklayınca

klasörden .TİF uzantılı resmi image panele alsın istiyorum.

Ancak  abc.2145 kodlu stoğun duruma göre;

abc.2145@-.tif

abc.2145@1.tif

abc.2145@2.tif  gibi yapılan değişikliği gösteren birden fazla

resmi olabilir. bu durumda birde fazla resmi varsa yeni bir

form açıp bunları listelesin   veya    abc.2145 stok kodunu

getirmek için kullandığım gridde bu resim adlarını

sıralamak  istiyorum

 

Yardımcı Olursanız Sevinirim.

AyGüMüŞ

 

Delphi - .....................................

 

.tif Dosyalarını image panelde gösterme

Bilgisayarımda bir klasörde kayıtlı .TİF uzantılı

resimlerim var bunları formda image panel içinde göstermek

istiyorum ne yapabilirim. Resimleri database in içini gömmek

istemiyorum çünkü bu dosyalar devamlı kullanılan ve güncellenen

çizimler içeriyor.

birde bir resmin

abc.2145 benim stok kodum ve databasede (abc.2145) kodu ile kayıtlı

formda girdde bu kodları listeleyip üzerine çift tıklayınca

klasörden .TİF uzantılı resmi image panele alsın istiyorum.

Ancak  abc.2145 kodlu stoğun duruma göre;

abc.2145@-.tif

abc.2145@1.tif

abc.2145@2.tif  gibi yapılan değişikliği gösteren birden fazla

resmi olabilir. bu durumda birde fazla resmi varsa yeni bir

form açıp bunları listelesin   veya    abc.2145 stok kodunu

getirmek için kullandığım gridde bu resim adlarını

sıralamak  istiyorum

 

Yardımcı Olursanız Sevinirim.

AyGüMüŞ

 

Delphi - .....................................

 

DNS değiştir2

In article #4388 Radikal Q3 demonstrates how to set the IP Address,Subnet and Gateway of a network card by EXECUTING NETSH.EXE with parameters. This example shows how to do it via the WMI API OLE Classes. If IP ADDRESS is NULLSTR or 'DHCP' then the IP Address is set by DHCP else a STATIC IP Address is set.

 

Parameters are ..

 

AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED     else STATIC IP is set.

 

AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged.

 

SubnetMask - [Optional] If Omited then default = '255.255.255.0'.

 

Examples

 

if SetIpConfig('196.11.175.221') = 0 then ... // Set STATIC IP

if SetIpConfig('') = 0 then ..    // Set to DHCP

if SetupConfig('dhcp') = 0 then ... // Same as above

if SetIpConfig('196.11.175.221','196.11.175.1') = 0 then ..  // STATIC + GATEWAY

 

**** THERE IS HOWEVER ONE PROBLEM I HAVE ******

**** AND HOPE SOMEONE OUT THERE CAN HELP ******

 

When setting the adapter to DHCP ALL Mapped drives and printers work correctly as expected.

 

When setting the adapter to STATIC IP, the IP changes successfully but any mapped devices (drives,printers etc.) won't work. Trying to access a mapped drives gives error saying the "local device is already in use'. I don't know if you have to call some sort of network mapping refresh call or something to notify that a static IP address has changed ? Anyone out there have any ideas ?

 

Also shown is SetDnsServers() whereby the DNS Primary and Alternate Servsers may be specified. If the function is called with Null String for APrimaryDNS then the DNS list is cleared.

 

There are many things you can do once you get the oNetAdapter Object. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp for the help on the SDK.

Answer:

 

 

uses ComObj, ActiveX, UrlMon;

 

// ======================================================================

// SetIpConfig()

// Set IPAddress, Gateway and Subnetmask via WMI

// Arguments ...

// AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED

//              else STATIC IP is set.

// AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged.

// SubnetMask - [Optional] If Omited then default = '255.255.255.0'.

//

// SetDnsServers()

// Set  DNS Servers via WMI

// Arguments ...

// APrimaryDNS   - If Null String then DNS Server List is CLEARED.

// AAlternateDNS - [Optional]

//

// Return Values ...

//   0 Successful completion, no reboot required.

//   1 Successful completion, reboot required.

//  -1 Unknown OLE Error

//  64 Method not supported on this platform.

//  65 Unknown failure.

//  66 Invalid subnet mask.

//  67 An error occurred while processing an instance that was returned.

//  68 Invalid input parameter.

//  69 More than five gateways specified.

//  70 Invalid IP address.

//  71 Invalid gateway IP address.

//  72 An error occurred while accessing the registry for the info.

//  73 Invalid domain name.

//  74 Invalid host name.

//  75 No primary or secondary WINS server defined.

//  76 Invalid file.

//  77 Invalid system path.

//  78 File copy failed.

//  79 Invalid security parameter.

//  80 Unable to configure TCP/IP service.

//  81 Unable to configure DHCP service.

//  82 Unable to renew DHCP lease.

//  83 Unable to release DHCP lease.

//  84 IP not enabled on adapter.

//  85 IPX not enabled on adapter.

//  86 Frame/network number bounds error.

//  87 Invalid frame type.

//  88 Invalid network number.

//  89 Duplicate network number.

//  90 Parameter out of bounds.

//  91 Access denied.

//  92 Out of memory.

//  93 Already exists.

//  94 Path, file, or object not found.

//  95 Unable to notify service.

//  96 Unable to notify DNS service.

//  97 Interface not configurable.

//  98 Not all DHCP leases could be released or renewed.

//  100 DHCP not enabled on adapter.

// ======================================================================

 

 

// ==================================================================

// IP Address,Gateway and Subnet Mask

// EnableStatic takes array of string as a parameter

// for the Addresses. You may wish to rewrite this using

// array of string as parameter for multiple IP Addresses.

// I only have use for 1 IP address and Gateway in our application

// but it's nice to be able to expand it for other users.

// ==================================================================

 

function SetIpConfig(const AIpAddress : string;

                     const AGateWay : string = '';

                     const ASubnetMask : string = '') : integer;

var Retvar : integer;

    oBindObj : IDispatch;

    oNetAdapters,oNetAdapter,

    oIpAddress,oGateWay,

    oWMIService,oSubnetMask : OleVariant;

    i,iValue : longword;

    oEnum : IEnumvariant;

    oCtx : IBindCtx;

    oMk : IMoniker;

    sFileObj : widestring;

begin

  Retvar := 0;

  sFileObj := 'winmgmts:.rootcimv2';

 

  // Create OLE [IN} Parameters

  oIpAddress := VarArrayCreate([1,1],varOleStr);

  oIpAddress[1] := AIpAddress;

  oGateWay := VarArrayCreate([1,1],varOleStr);

  oGateWay[1] := AGateWay;

  oSubnetMask := VarArrayCreate([1,1],varOleStr);

  if ASubnetMask = '' then

    oSubnetMask[1] := '255.255.255.0'

  else

    oSubnetMask[1] := ASubnetMask;

 

  // Connect to WMI - Emulate API GetObject()

  OleCheck(CreateBindCtx(0,oCtx));

  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));

  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));

  oWMIService := oBindObj;

 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +

                                        'Win32_NetworkAdapterConfiguration ' +

                                        'where IPEnabled=TRUE');

  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin

    try

      // Set by DHCP ? (Gateway and Subnet ignored)

      if (AIpAddress = '') or SameText(AIpAddress,'DHCP') then

        Retvar := oNetAdapter.EnableDHCP

      // Set via STATIC ?

      else begin

        Retvar := oNetAdapter.EnableStatic(oIpAddress,oSubnetMask);

        // Change Gateway ?

        if (Retvar = 0) and (AGateWay <> '') then

          Retvar := oNetAdapter.SetGateways(oGateway);

 

        // *** This is where we need some sort of ***

        // *** Network Mapped Resource Refresh    ***

      end;

    except

      Retvar := -1;

    end;

 

    oNetAdapter := Unassigned;

  end;

 

  oGateWay := Unassigned;

  oSubnetMask := Unassigned;

  oIpAddress := Unassigned;

  oNetAdapters := Unassigned;

  oWMIService := Unassigned;

  Result := Retvar;

end;

 

 

// ====================================================

// Set DNS Servers

// Instead of Primary and Alternate you may wish

// to rewrite this using array of string as the

// parameters as SetDNSServerSearchOrder will take

// a list of many DNS addresses. I only have use for

// Primary and Alternate.

// ====================================================

 

function SetDnsServers(const APrimaryDNS : string;

                       const AAlternateDNS : string = '') : integer;

var Retvar : integer;

    oBindObj : IDispatch;

    oNetAdapters,oNetAdapter,

    oDnsAddr,oWMIService : OleVariant;

    i,iValue,iSize : longword;

    oEnum : IEnumvariant;

    oCtx : IBindCtx;

    oMk : IMoniker;

    sFileObj : widestring;

begin

  Retvar := 0;

  sFileObj := 'winmgmts:.rootcimv2';

  iSize := 0;

  if APrimaryDNS <> '' then inc(iSize);

  if AAlternateDNS <> '' then inc(iSize);

 

  // Create OLE [IN} Parameters

  if iSize > 0 then begin

   oDnsAddr := VarArrayCreate([1,iSize],varOleStr);

   oDnsAddr[1] := APrimaryDNS;

   if iSize > 1 then oDnsAddr[2] := AAlternateDNS;

  end;

 

  // Connect to WMI - Emulate API GetObject()

  OleCheck(CreateBindCtx(0,oCtx));

  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));

  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));

  oWMIService := oBindObj;

 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +

                                        'Win32_NetworkAdapterConfiguration ' +

                                        'where IPEnabled=TRUE');

  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin

    try

      if iSize > 0 then

        Retvar := oNetAdapter.SetDNSServerSearchOrder(oDnsAddr)

      else

        Retvar := oNetAdapter.SetDNSServerSearchOrder();

    except

      Retvar := -1;

    end;

 

    oNetAdapter := Unassigned;

  end;

 

  oDnsAddr := Unassigned;

  oNetAdapters := Unassigned;

  oWMIService := Unassigned;

  Result := Retvar;

end;

 

 

 

(* ----------------------------------------------------

See the Miscrosoft MSDN Documentation for the

Win32_NetworkAdapterConfiguration Class

(implemented as oNetAdatper in my examples),

There are many more calls besides EnableStatic,

EnableDHCP and SetDNBSServerSearchOrder.

 

Some of them are ...

 

DisableIPSec

EnableDHCP

EnableDNS

EnableIPFilterSec

EnableIPSec

EnableStatic

EnableWINS

ReleaseDHCPLease

ReleaseDHCPLeaseAll

RenewDHCPLease

RenewDHCPLeaseAll

SetArpAlwaysSourceRoute

SetArpUseEtherSNAP

SetDatabasePath

SetDeadGWDetect

SetDefaultTTL

SetDNSDomain

SetDNSServerSearchOrder

SetDNSSuffixSearchOrder

SetDynamicDNSRegistration

SetForwardBufferMemory Specifies

SetGateways

SetIGMPLevel

SetIPConnectionMetric

SetIPUseZeroBroadcast

SetIPXFrameTypeNetworkPairs

SetIPXVirtualNetworkNumber

SetKeepAliveInterval

SetKeepAliveTime

SetNumForwardPackets

SetPMTUBHDetect

SetPMTUDiscovery

SetTcpipNetbios

SetTcpMaxConnectRetransmissions

SetTcpMaxDataRetransmissions

SetTcpNumConnections

SetTcpUseRFC1122UrgentPointer

SetTcpWindowSize

SetWINSServer

------------------------------------------------ *)

 

RE: Select the adapter...

Mike Heydon (Aug 12 2005 10:51AM)

 

I suppose you could interrogate the name during the loop of oNetAdapter. Try properties oNetAdapter.Caption or oNetAdapter.Description. Here is a list of some of properties that should be available to the object .....

 

class Win32_NetworkAdapterConfiguration : CIM_Setting

{

  boolean ArpAlwaysSourceRoute;

  boolean ArpUseEtherSNAP;

  string Caption;

  string DatabasePath;

  boolean DeadGWDetectEnabled;

  string DefaultIPGateway[];

  uint8 DefaultTOS;

  uint8 DefaultTTL;

  string Description;

  boolean DHCPEnabled;

  datetime DHCPLeaseExpires;

  datetime DHCPLeaseObtained;

  string DHCPServer;

  string DNSDomain;

  string DNSDomainSuffixSearchOrder[];

  boolean DNSEnabledForWINSResolution;

  string DNSHostName;

  string DNSServerSearchOrder[];

  boolean DomainDNSRegistrationEnabled;

  uint32 ForwardBufferMemory;

  boolean FullDNSRegistrationEnabled;

  uint16 GatewayCostMetric[];

  uint8 IGMPLevel;

  uint32 Index;

  uint32 InterfaceIndex;

  string IPAddress[];

  uint32 IPConnectionMetric;

  boolean IPEnabled;

  boolean IPFilterSecurityEnabled;

  boolean IPPortSecurityEnabled;

  string IPSecPermitIPProtocols[];

  string IPSecPermitTCPPorts[];

  string IPSecPermitUDPPorts[];

  string IPSubnet[];

  boolean IPUseZeroBroadcast;

  string IPXAddress;

  boolean IPXEnabled;

  uint32 IPXFrameType[];

  uint32 IPXMediaType;

  string IPXNetworkNumber[];

  string IPXVirtualNetNumber;

  uint32 KeepAliveInterval;

  uint32 KeepAliveTime;

  string MACAddress;

  uint32 MTU;

  uint32 NumForwardPackets;

  boolean PMTUBHDetectEnabled;

  boolean PMTUDiscoveryEnabled;

  string ServiceName;

  string SettingID;

  ...

  string WINSScopeID;

  string WINSSecondaryServer;

};

 

Delphi - .....................................

 

DNS değiştir2

In article #4388 Radikal Q3 demonstrates how to set the IP Address,Subnet and Gateway of a network card by EXECUTING NETSH.EXE with parameters. This example shows how to do it via the WMI API OLE Classes. If IP ADDRESS is NULLSTR or 'DHCP' then the IP Address is set by DHCP else a STATIC IP Address is set.

 

Parameters are ..

 

AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED     else STATIC IP is set.

 

AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged.

 

SubnetMask - [Optional] If Omited then default = '255.255.255.0'.

 

Examples

 

if SetIpConfig('196.11.175.221') = 0 then ... // Set STATIC IP

if SetIpConfig('') = 0 then ..    // Set to DHCP

if SetupConfig('dhcp') = 0 then ... // Same as above

if SetIpConfig('196.11.175.221','196.11.175.1') = 0 then ..  // STATIC + GATEWAY

 

**** THERE IS HOWEVER ONE PROBLEM I HAVE ******

**** AND HOPE SOMEONE OUT THERE CAN HELP ******

 

When setting the adapter to DHCP ALL Mapped drives and printers work correctly as expected.

 

When setting the adapter to STATIC IP, the IP changes successfully but any mapped devices (drives,printers etc.) won't work. Trying to access a mapped drives gives error saying the "local device is already in use'. I don't know if you have to call some sort of network mapping refresh call or something to notify that a static IP address has changed ? Anyone out there have any ideas ?

 

Also shown is SetDnsServers() whereby the DNS Primary and Alternate Servsers may be specified. If the function is called with Null String for APrimaryDNS then the DNS list is cleared.

 

There are many things you can do once you get the oNetAdapter Object. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp for the help on the SDK.

Answer:

 

 

uses ComObj, ActiveX, UrlMon;

 

// ======================================================================

// SetIpConfig()

// Set IPAddress, Gateway and Subnetmask via WMI

// Arguments ...

// AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED

//              else STATIC IP is set.

// AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged.

// SubnetMask - [Optional] If Omited then default = '255.255.255.0'.

//

// SetDnsServers()

// Set  DNS Servers via WMI

// Arguments ...

// APrimaryDNS   - If Null String then DNS Server List is CLEARED.

// AAlternateDNS - [Optional]

//

// Return Values ...

//   0 Successful completion, no reboot required.

//   1 Successful completion, reboot required.

//  -1 Unknown OLE Error

//  64 Method not supported on this platform.

//  65 Unknown failure.

//  66 Invalid subnet mask.

//  67 An error occurred while processing an instance that was returned.

//  68 Invalid input parameter.

//  69 More than five gateways specified.

//  70 Invalid IP address.

//  71 Invalid gateway IP address.

//  72 An error occurred while accessing the registry for the info.

//  73 Invalid domain name.

//  74 Invalid host name.

//  75 No primary or secondary WINS server defined.

//  76 Invalid file.

//  77 Invalid system path.

//  78 File copy failed.

//  79 Invalid security parameter.

//  80 Unable to configure TCP/IP service.

//  81 Unable to configure DHCP service.

//  82 Unable to renew DHCP lease.

//  83 Unable to release DHCP lease.

//  84 IP not enabled on adapter.

//  85 IPX not enabled on adapter.

//  86 Frame/network number bounds error.

//  87 Invalid frame type.

//  88 Invalid network number.

//  89 Duplicate network number.

//  90 Parameter out of bounds.

//  91 Access denied.

//  92 Out of memory.

//  93 Already exists.

//  94 Path, file, or object not found.

//  95 Unable to notify service.

//  96 Unable to notify DNS service.

//  97 Interface not configurable.

//  98 Not all DHCP leases could be released or renewed.

//  100 DHCP not enabled on adapter.

// ======================================================================

 

 

// ==================================================================

// IP Address,Gateway and Subnet Mask

// EnableStatic takes array of string as a parameter

// for the Addresses. You may wish to rewrite this using

// array of string as parameter for multiple IP Addresses.

// I only have use for 1 IP address and Gateway in our application

// but it's nice to be able to expand it for other users.

// ==================================================================

 

function SetIpConfig(const AIpAddress : string;

                     const AGateWay : string = '';

                     const ASubnetMask : string = '') : integer;

var Retvar : integer;

    oBindObj : IDispatch;

    oNetAdapters,oNetAdapter,

    oIpAddress,oGateWay,

    oWMIService,oSubnetMask : OleVariant;

    i,iValue : longword;

    oEnum : IEnumvariant;

    oCtx : IBindCtx;

    oMk : IMoniker;

    sFileObj : widestring;

begin

  Retvar := 0;

  sFileObj := 'winmgmts:.rootcimv2';

 

  // Create OLE [IN} Parameters

  oIpAddress := VarArrayCreate([1,1],varOleStr);

  oIpAddress[1] := AIpAddress;

  oGateWay := VarArrayCreate([1,1],varOleStr);

  oGateWay[1] := AGateWay;

  oSubnetMask := VarArrayCreate([1,1],varOleStr);

  if ASubnetMask = '' then

    oSubnetMask[1] := '255.255.255.0'

  else

    oSubnetMask[1] := ASubnetMask;

 

  // Connect to WMI - Emulate API GetObject()

  OleCheck(CreateBindCtx(0,oCtx));

  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));

  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));

  oWMIService := oBindObj;

 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +

                                        'Win32_NetworkAdapterConfiguration ' +

                                        'where IPEnabled=TRUE');

  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin

    try

      // Set by DHCP ? (Gateway and Subnet ignored)

      if (AIpAddress = '') or SameText(AIpAddress,'DHCP') then

        Retvar := oNetAdapter.EnableDHCP

      // Set via STATIC ?

      else begin

        Retvar := oNetAdapter.EnableStatic(oIpAddress,oSubnetMask);

        // Change Gateway ?

        if (Retvar = 0) and (AGateWay <> '') then

          Retvar := oNetAdapter.SetGateways(oGateway);

 

        // *** This is where we need some sort of ***

        // *** Network Mapped Resource Refresh    ***

      end;

    except

      Retvar := -1;

    end;

 

    oNetAdapter := Unassigned;

  end;

 

  oGateWay := Unassigned;

  oSubnetMask := Unassigned;

  oIpAddress := Unassigned;

  oNetAdapters := Unassigned;

  oWMIService := Unassigned;

  Result := Retvar;

end;

 

 

// ====================================================

// Set DNS Servers

// Instead of Primary and Alternate you may wish

// to rewrite this using array of string as the

// parameters as SetDNSServerSearchOrder will take

// a list of many DNS addresses. I only have use for

// Primary and Alternate.

// ====================================================

 

function SetDnsServers(const APrimaryDNS : string;

                       const AAlternateDNS : string = '') : integer;

var Retvar : integer;

    oBindObj : IDispatch;

    oNetAdapters,oNetAdapter,

    oDnsAddr,oWMIService : OleVariant;

    i,iValue,iSize : longword;

    oEnum : IEnumvariant;

    oCtx : IBindCtx;

    oMk : IMoniker;

    sFileObj : widestring;

begin

  Retvar := 0;

  sFileObj := 'winmgmts:.rootcimv2';

  iSize := 0;

  if APrimaryDNS <> '' then inc(iSize);

  if AAlternateDNS <> '' then inc(iSize);

 

  // Create OLE [IN} Parameters

  if iSize > 0 then begin

   oDnsAddr := VarArrayCreate([1,iSize],varOleStr);

   oDnsAddr[1] := APrimaryDNS;

   if iSize > 1 then oDnsAddr[2] := AAlternateDNS;

  end;

 

  // Connect to WMI - Emulate API GetObject()

  OleCheck(CreateBindCtx(0,oCtx));

  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk));

  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj));

  oWMIService := oBindObj;

 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' +

                                        'Win32_NetworkAdapterConfiguration ' +

                                        'where IPEnabled=TRUE');

  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant;

 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin

    try

      if iSize > 0 then

        Retvar := oNetAdapter.SetDNSServerSearchOrder(oDnsAddr)

      else

        Retvar := oNetAdapter.SetDNSServerSearchOrder();

    except

      Retvar := -1;

    end;

 

    oNetAdapter := Unassigned;

  end;

 

  oDnsAddr := Unassigned;

  oNetAdapters := Unassigned;

  oWMIService := Unassigned;

  Result := Retvar;

end;

 

 

 

(* ----------------------------------------------------

See the Miscrosoft MSDN Documentation for the

Win32_NetworkAdapterConfiguration Class

(implemented as oNetAdatper in my examples),

There are many more calls besides EnableStatic,

EnableDHCP and SetDNBSServerSearchOrder.

 

Some of them are ...

 

DisableIPSec

EnableDHCP

EnableDNS

EnableIPFilterSec

EnableIPSec

EnableStatic

EnableWINS

ReleaseDHCPLease

ReleaseDHCPLeaseAll

RenewDHCPLease

RenewDHCPLeaseAll

SetArpAlwaysSourceRoute

SetArpUseEtherSNAP

SetDatabasePath

SetDeadGWDetect

SetDefaultTTL

SetDNSDomain

SetDNSServerSearchOrder

SetDNSSuffixSearchOrder

SetDynamicDNSRegistration

SetForwardBufferMemory Specifies

SetGateways

SetIGMPLevel

SetIPConnectionMetric

SetIPUseZeroBroadcast

SetIPXFrameTypeNetworkPairs

SetIPXVirtualNetworkNumber

SetKeepAliveInterval

SetKeepAliveTime

SetNumForwardPackets

SetPMTUBHDetect

SetPMTUDiscovery

SetTcpipNetbios

SetTcpMaxConnectRetransmissions

SetTcpMaxDataRetransmissions

SetTcpNumConnections

SetTcpUseRFC1122UrgentPointer

SetTcpWindowSize

SetWINSServer

------------------------------------------------ *)

 

RE: Select the adapter...

Mike Heydon (Aug 12 2005 10:51AM)

 

I suppose you could interrogate the name during the loop of oNetAdapter. Try properties oNetAdapter.Caption or oNetAdapter.Description. Here is a list of some of properties that should be available to the object .....

 

class Win32_NetworkAdapterConfiguration : CIM_Setting

{

  boolean ArpAlwaysSourceRoute;

  boolean ArpUseEtherSNAP;

  string Caption;

  string DatabasePath;

  boolean DeadGWDetectEnabled;

  string DefaultIPGateway[];

  uint8 DefaultTOS;

  uint8 DefaultTTL;

  string Description;

  boolean DHCPEnabled;

  datetime DHCPLeaseExpires;

  datetime DHCPLeaseObtained;

  string DHCPServer;

  string DNSDomain;

  string DNSDomainSuffixSearchOrder[];

  boolean DNSEnabledForWINSResolution;

  string DNSHostName;

  string DNSServerSearchOrder[];

  boolean DomainDNSRegistrationEnabled;

  uint32 ForwardBufferMemory;

  boolean FullDNSRegistrationEnabled;

  uint16 GatewayCostMetric[];

  uint8 IGMPLevel;

  uint32 Index;

  uint32 InterfaceIndex;

  string IPAddress[];

  uint32 IPConnectionMetric;

  boolean IPEnabled;

  boolean IPFilterSecurityEnabled;

  boolean IPPortSecurityEnabled;

  string IPSecPermitIPProtocols[];

  string IPSecPermitTCPPorts[];

  string IPSecPermitUDPPorts[];

  string IPSubnet[];

  boolean IPUseZeroBroadcast;

  string IPXAddress;

  boolean IPXEnabled;

  uint32 IPXFrameType[];

  uint32 IPXMediaType;

  string IPXNetworkNumber[];

  string IPXVirtualNetNumber;

  uint32 KeepAliveInterval;

  uint32 KeepAliveTime;

  string MACAddress;

  uint32 MTU;

  uint32 NumForwardPackets;

  boolean PMTUBHDetectEnabled;

  boolean PMTUDiscoveryEnabled;

  string ServiceName;

  string SettingID;

  ...

  string WINSScopeID;

  string WINSSecondaryServer;

};

 

Delphi - .....................................

 

Proxy ayarlarının tespit edilmesi

unit fProxy;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics,

  Controls, Forms, Dialogs, Registry;

 

type

  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

  private

    { private declarations }

  public

    { public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

function GetProxy(var Host : string;

                  var Port : integer;

                  var ProxyEnabled : boolean) : boolean;

const

  sProxyEnable = 'ProxyEnable';

var

  s : string;

  p : integer;

begin

  with TRegistry.Create do

  begin

    RootKey := HKEY_CURRENT_USER;

    ProxyEnabled := false;

    s := '';

    OpenKey ('SoftwareMicrosoftWindowsCurrentVersionInternet Settings',

             True);

    if ValueExists('ProxyServer') then

      s := ReadString('ProxyServer');

 

    if s <> '' then

    begin

      p := pos(':', s);

      if p=0 then

        p := length(s)+1;

      Host := copy(s, 1, p-1);

      try

        Port := StrToInt(copy (s,p+1,999));

      except

        Port := 80;

      end;

 

      ProxyEnabled := true;

    end;

 

    if ValueExists('ProxyEnable') then

    begin

        case GetDataType(sProxyEnable) of

        rdString,

        rdExpandString:

        begin

          sPortTmp := AnsiLowerCase(ReadString(sProxyEnable));

          ProxyEnabled := true;

          if pos(' '+sPortTmp+' ', ' yes true t enabled 1 ') > 0 then

            ProxyEnabled := true

          else

          if pos(' '+sPortTmp+' ', ' no false f none disabled 0 ') > 0 then

            ProxyEnabled := false

        end;

        rdInteger:

        begin

          ProxyEnabled := ReadBool(sProxyEnable);

        end;

        rdBinary:

        begin

          ProxyEnabled := true;

          ReadBinaryData(sProxyEnable, ProxyEnabled, 1);

        end;

        end;

    end;

 

    Free;

  end;

 

  Result := s<>'';

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

  Host : string;

  Port : integer;

  ProxyEnabled : boolean;

const

  YesNo : array [false..true] of string = (' not ', '');

begin

  // get proxy information

  if GetProxy(Host, Port, ProxyEnabled) then

    ShowMessage(Format('Your proxy is %s on port %d, it is%s enabled.',

                [Host, Port, YesNo[ProxyEnabled]]))

  else

    ShowMessage('No proxy detected');

end;

 

end.

 

Delphi - .....................................

 

Proxy ayarlarının tespit edilmesi

unit fProxy;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics,

  Controls, Forms, Dialogs, Registry;

 

type

  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

  private

    { private declarations }

  public

    { public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

function GetProxy(var Host : string;

                  var Port : integer;

                  var ProxyEnabled : boolean) : boolean;

const

  sProxyEnable = 'ProxyEnable';

var

  s : string;

  p : integer;

begin

  with TRegistry.Create do

  begin

    RootKey := HKEY_CURRENT_USER;

    ProxyEnabled := false;

    s := '';

    OpenKey ('SoftwareMicrosoftWindowsCurrentVersionInternet Settings',

             True);

    if ValueExists('ProxyServer') then

      s := ReadString('ProxyServer');

 

    if s <> '' then

    begin

      p := pos(':', s);

      if p=0 then

        p := length(s)+1;

      Host := copy(s, 1, p-1);

      try

        Port := StrToInt(copy (s,p+1,999));

      except

        Port := 80;

      end;

 

      ProxyEnabled := true;

    end;

 

    if ValueExists('ProxyEnable') then

    begin

        case GetDataType(sProxyEnable) of

        rdString,

        rdExpandString:

        begin

          sPortTmp := AnsiLowerCase(ReadString(sProxyEnable));

          ProxyEnabled := true;

          if pos(' '+sPortTmp+' ', ' yes true t enabled 1 ') > 0 then

            ProxyEnabled := true

          else

          if pos(' '+sPortTmp+' ', ' no false f none disabled 0 ') > 0 then

            ProxyEnabled := false

        end;

        rdInteger:

        begin

          ProxyEnabled := ReadBool(sProxyEnable);

        end;

        rdBinary:

        begin

          ProxyEnabled := true;

          ReadBinaryData(sProxyEnable, ProxyEnabled, 1);

        end;

        end;

    end;

 

    Free;

  end;

 

  Result := s<>'';

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var

  Host : string;

  Port : integer;

  ProxyEnabled : boolean;

const

  YesNo : array [false..true] of string = (' not ', '');

begin

  // get proxy information

  if GetProxy(Host, Port, ProxyEnabled) then

    ShowMessage(Format('Your proxy is %s on port %d, it is%s enabled.',

                [Host, Port, YesNo[ProxyEnabled]]))

  else

    ShowMessage('No proxy detected');

end;

 

end.

 

Delphi - .....................................

 

DNS adresinin değiştirilmesi

uses

  Registry;

 

procedure SaveStringToRegistry_LOCAL_MACHINE (sKey, sItem, sVal: string);

var

  Reg : TRegIniFile;

begin

  Reg := TRegIniFile.create ('');

  Reg.RootKey := HKEY_LOCAL_MACHINE;

  Reg.WriteString (sKey, sItem, sVal + #0);

  Reg.Free

end;

 

 

procedure SetTCPIPDNSAddresses (sIPs: string);

begin

  if RunningWinNT then

  begin

    //

    // if using Windows NT

    //

    SaveStringToRegistry_LOCAL_MACHINE (

      'SYSTEMCurrentControlSetServicesTcpipParameters',

      'NameServer', sIPs)

  end

  else

  begin

    //

    // if using Windows 95

    //

    SaveStringToRegistry_LOCAL_MACHINE (

      'SYSTEMCurrentControlSetServicesVxDMSTCP',

      'NameServer', sIPs)

  end

end;

 

 

For example, if you want to set two DNS servers -- "1.2.3.4" and "5.6.7.8"

-- here's how your function call would look like:

 

SetTCPIPDNSAddresses('1.2.3.4 5.6.7.8' );

 

"SetTCPIPDNSAddresses()" function with a list of IPs separated by a

single space.

 

Delphi - .....................................

 

DNS adresinin değiştirilmesi

uses

  Registry;

 

procedure SaveStringToRegistry_LOCAL_MACHINE (sKey, sItem, sVal: string);

var

  Reg : TRegIniFile;

begin

  Reg := TRegIniFile.create ('');

  Reg.RootKey := HKEY_LOCAL_MACHINE;

  Reg.WriteString (sKey, sItem, sVal + #0);

  Reg.Free

end;

 

 

procedure SetTCPIPDNSAddresses (sIPs: string);

begin

  if RunningWinNT then

  begin

    //

    // if using Windows NT

    //

    SaveStringToRegistry_LOCAL_MACHINE (

      'SYSTEMCurrentControlSetServicesTcpipParameters',

      'NameServer', sIPs)

  end

  else

  begin

    //

    // if using Windows 95

    //

    SaveStringToRegistry_LOCAL_MACHINE (

      'SYSTEMCurrentControlSetServicesVxDMSTCP',

      'NameServer', sIPs)

  end

end;

 

 

For example, if you want to set two DNS servers -- "1.2.3.4" and "5.6.7.8"

-- here's how your function call would look like:

 

SetTCPIPDNSAddresses('1.2.3.4 5.6.7.8' );

 

"SetTCPIPDNSAddresses()" function with a list of IPs separated by a

single space.

 

Delphi - .....................................

 

bilgisayar adi ve ip listesi

Question/Problem/Abstract:

 

How do I get the local internet machine name and IP address?

 

 

Answer:

 

 

Getting the local machine name and IP address is a straight

forward process that is most easily accomplished using the TCP

component. Simply drop a TCP component from the internet page

of the component palette on to a form, and access the following

members of the TCP component:

 

  Memo1.Lines.Add(TCP1.LocalHostName);

  Memo1.Lines.Add(TCP1.LocalIp);

 

If you prefer not to use the TCP component, here is an example

that interfaces directly with your winsock layer:

 

uses Winsock;

 

procedure TForm1.FormCreate(Sender: TObject);

var

  wVersionRequested : WORD;

  wsaData : TWSAData;

begin

{Start up WinSock}

  wVersionRequested := MAKEWORD(1, 1);

  WSAStartup(wVersionRequested, wsaData);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  p : PHostEnt;

  s : array[0..128] of char;

  p2 : pchar;

begin

{Get the computer name}

  GetHostName(@s, 128);

  p := GetHostByName(@s);

  Memo1.Lines.Add(p^.h_Name);

{Get the IpAddress}

  p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);

  Memo1.Lines.Add(p2);

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

{Shut down WinSock}

  WSACleanup;

end;

 

Delphi - .....................................

 

bilgisayar adi ve ip listesi

Question/Problem/Abstract:

 

How do I get the local internet machine name and IP address?

 

 

Answer:

 

 

Getting the local machine name and IP address is a straight

forward process that is most easily accomplished using the TCP

component. Simply drop a TCP component from the internet page

of the component palette on to a form, and access the following

members of the TCP component:

 

  Memo1.Lines.Add(TCP1.LocalHostName);

  Memo1.Lines.Add(TCP1.LocalIp);

 

If you prefer not to use the TCP component, here is an example

that interfaces directly with your winsock layer:

 

uses Winsock;

 

procedure TForm1.FormCreate(Sender: TObject);

var

  wVersionRequested : WORD;

  wsaData : TWSAData;

begin

{Start up WinSock}

  wVersionRequested := MAKEWORD(1, 1);

  WSAStartup(wVersionRequested, wsaData);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  p : PHostEnt;

  s : array[0..128] of char;

  p2 : pchar;

begin

{Get the computer name}

  GetHostName(@s, 128);

  p := GetHostByName(@s);

  Memo1.Lines.Add(p^.h_Name);

{Get the IpAddress}

  p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);

  Memo1.Lines.Add(p2);

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

{Shut down WinSock}

  WSACleanup;

end;

 

Delphi - .....................................

 

network printerlerinin bulunmasi

Find the printers for a server specific on the network

Answer:

 

 

First: insert on uses the unit name "winspool" and "printers". After this you can write this code using the windows API EnumPrinters: The parameter psName is the server in the network and the result is TStrings. You can use this in a combo or a listbox.

 

function TForm1.GetPrintServers(psName: string): TStrings;

var

  lpBuffer,lpPrinterInfo: PChar;

  lcCount,lcNumCount : DWord ;

  liCount,liAux:integer;

  lsAuxNome:TStrings;

 

  function GetContexts ( pctipo : cardinal; ppName : PChar ):TStringlist;

  var

    liCont : integer;

    lsNome:string;

    lbPode:boolean;

 

  begin

    lbPode:=false;

    Result:=TStringlist.Create;

    case pcTipo of

      8: lbPode :=

        EnumPrinters(pctipo,ppName,1,PByte(lpBuffer),lcCount,lcCount,

          lcNumCount);

      16: lbPode :=

        EnumPrinters(pctipo,nil,1,PByte(lpBuffer),lcCount,lcCount,

          lcNumCount);

    end;

    if not lbPode then

      Exit;

    lpPrinterInfo := lpBuffer;

    for licont := 0 to lcNumCount - 1 do

    begin

      with PPrinterInfo1(lpPrinterInfo)^ do

      begin

        if pcTipo = 8 then

        begin

          liAux:=Pos(',',pDescription);

          lsNome := copy(pDescription,liAux+1,Length(pDescription));

          Result.Add(lsNome);

        end

        else

        begin

          liAux  := Pos(ppName,pName);

          lsNome := copy(pName,liAux,Length(pName));

          if lsNome = ppName then

          begin

            Result.Add(string(pName));

            Exit;

          end;

        end;

      end;

      Inc(lpPrinterInfo, sizeof(TPrinterInfo1));

    end;

  end;

begin

  lsAuxNome:=TStrings.Create;

  lcCount := 0;

  EnumPrinters(PRINTER_ENUM_REMOTE,nil,1,nil,0,lcCount,lcNumCount);

  GetMem(lpBuffer,lcCount);

  lsAuxNome := GetContexts(16,PChar(psName));

  if lsAuxNome.Count <> 0   then

    Result:=GetContexts(8,PChar(lsAuxNome.Strings[0]))

  else

  begin

    lsAuxNome.Add('Não Encontrada');

    Result:=lsAuxNome;

  end;

end;

 

Delphi - .....................................

 

network printerlerinin bulunmasi

Find the printers for a server specific on the network

Answer:

 

 

First: insert on uses the unit name "winspool" and "printers". After this you can write this code using the windows API EnumPrinters: The parameter psName is the server in the network and the result is TStrings. You can use this in a combo or a listbox.

 

function TForm1.GetPrintServers(psName: string): TStrings;

var

  lpBuffer,lpPrinterInfo: PChar;

  lcCount,lcNumCount : DWord ;

  liCount,liAux:integer;

  lsAuxNome:TStrings;

 

  function GetContexts ( pctipo : cardinal; ppName : PChar ):TStringlist;

  var

    liCont : integer;

    lsNome:string;

    lbPode:boolean;

 

  begin

    lbPode:=false;

    Result:=TStringlist.Create;

    case pcTipo of

      8: lbPode :=

        EnumPrinters(pctipo,ppName,1,PByte(lpBuffer),lcCount,lcCount,

          lcNumCount);

      16: lbPode :=

        EnumPrinters(pctipo,nil,1,PByte(lpBuffer),lcCount,lcCount,

          lcNumCount);

    end;

    if not lbPode then

      Exit;

    lpPrinterInfo := lpBuffer;

    for licont := 0 to lcNumCount - 1 do

    begin

      with PPrinterInfo1(lpPrinterInfo)^ do

      begin

        if pcTipo = 8 then

        begin

          liAux:=Pos(',',pDescription);

          lsNome := copy(pDescription,liAux+1,Length(pDescription));

          Result.Add(lsNome);

        end

        else

        begin

          liAux  := Pos(ppName,pName);

          lsNome := copy(pName,liAux,Length(pName));

          if lsNome = ppName then

          begin

            Result.Add(string(pName));

            Exit;

          end;

        end;

      end;

      Inc(lpPrinterInfo, sizeof(TPrinterInfo1));

    end;

  end;

begin

  lsAuxNome:=TStrings.Create;

  lcCount := 0;

  EnumPrinters(PRINTER_ENUM_REMOTE,nil,1,nil,0,lcCount,lcNumCount);

  GetMem(lpBuffer,lcCount);

  lsAuxNome := GetContexts(16,PChar(psName));

  if lsAuxNome.Count <> 0   then

    Result:=GetContexts(8,PChar(lsAuxNome.Strings[0]))

  else

  begin

    lsAuxNome.Add('Não Encontrada');

    Result:=lsAuxNome;

  end;

end;

 

Delphi - .....................................

 

sistem güç durumunun öğrenilmesi

function GetSystemPowerInfo(var PowerInfo : TSystemPowerStatus) : boolean;

begin

result := GetSystemPowerStatus(PowerInfo);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var PowerInfo : TSystemPowerStatus;

begin

FillChar(PowerInfo,SizeOf(TSystemPowerStatus),0);

if GetSystemPowerInfo(PowerInfo) then begin

  Case PowerInfo.ACLineStatus of

   0: Label1.Caption := 'Offline';

   1: Label1.Caption := 'Online';

  else

   Label1.Caption := 'Unknown status.';

  end;

  Case PowerInfo.BatteryFlag of

   1: Label2.Caption := 'High';

   2: Label2.Caption := 'Low';

   4: Label2.Caption := 'Critical';

   8: Label2.Caption := 'Charging';

   128: Label2.Caption := 'No system battery';

  else

   Label2.Caption := 'Unknown status';

  end;

  if PowerInfo.BatteryLifePercent <= 100 then begin

   Label3.Caption := inttostr(PowerInfo.BatteryLifePercent )+'%';

  end else Label3.Caption := 'No system battery';

  if PowerInfo.BatteryLifeTime < MAXDWORD then begin

   Label4.Caption := inttostr(PowerInfo.BatteryLifeTime div 60) + ' min';

  end else Label4.Caption := 'No system battery';

  if PowerInfo.BatteryFullLifeTime < MAXDWORD then begin

   Label5.Caption := inttostr(PowerInfo.BatteryFullLifeTime div 60) + ' min';

  end else Label5.Caption := 'No system battery';

end else Label1.Caption := 'Failed to get power status';

end;

 

Delphi - .....................................

 

sistem güç durumunun öğrenilmesi

function GetSystemPowerInfo(var PowerInfo : TSystemPowerStatus) : boolean;

begin

result := GetSystemPowerStatus(PowerInfo);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var PowerInfo : TSystemPowerStatus;

begin

FillChar(PowerInfo,SizeOf(TSystemPowerStatus),0);

if GetSystemPowerInfo(PowerInfo) then begin

  Case PowerInfo.ACLineStatus of

   0: Label1.Caption := 'Offline';

   1: Label1.Caption := 'Online';

  else

   Label1.Caption := 'Unknown status.';

  end;

  Case PowerInfo.BatteryFlag of

   1: Label2.Caption := 'High';

   2: Label2.Caption := 'Low';

   4: Label2.Caption := 'Critical';

   8: Label2.Caption := 'Charging';

   128: Label2.Caption := 'No system battery';

  else

   Label2.Caption := 'Unknown status';

  end;

  if PowerInfo.BatteryLifePercent <= 100 then begin

   Label3.Caption := inttostr(PowerInfo.BatteryLifePercent )+'%';

  end else Label3.Caption := 'No system battery';

  if PowerInfo.BatteryLifeTime < MAXDWORD then begin

   Label4.Caption := inttostr(PowerInfo.BatteryLifeTime div 60) + ' min';

  end else Label4.Caption := 'No system battery';

  if PowerInfo.BatteryFullLifeTime < MAXDWORD then begin

   Label5.Caption := inttostr(PowerInfo.BatteryFullLifeTime div 60) + ' min';

  end else Label5.Caption := 'No system battery';

end else Label1.Caption := 'Failed to get power status';

end;

 

Delphi - .....................................

 

LowLevel Format atmak

procedure LowLevelFormat;

var

Disk: THandle;

Buffer: array [1..512] of Byte;

WroteOK: Boolean;

BufWrote: DWORD;

begin

Disk := CreateFile('.A:',GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);

  if Disk = 0 then

   begin

    ShowMessage('Error - Could not open device.');

    Exit;

   end;

FillChar(Buffer,SizeOf(Buffer),$00);

WroteOK := True;

BufWrote := 1;

  while (WroteOK = True) and (BufWrote <> 0) do

   begin

    WroteOK := WriteFile(Disk,Buffer,SizeOf(Buffer),BufWrote,nil);

   end;

CloseHandle(Disk);

end;

 

Delphi - .....................................

 

LowLevel Format atmak

procedure LowLevelFormat;

var

Disk: THandle;

Buffer: array [1..512] of Byte;

WroteOK: Boolean;

BufWrote: DWORD;

begin

Disk := CreateFile('.A:',GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);

  if Disk = 0 then

   begin

    ShowMessage('Error - Could not open device.');

    Exit;

   end;

FillChar(Buffer,SizeOf(Buffer),$00);

WroteOK := True;

BufWrote := 1;

  while (WroteOK = True) and (BufWrote <> 0) do

   begin

    WroteOK := WriteFile(Disk,Buffer,SizeOf(Buffer),BufWrote,nil);

   end;

CloseHandle(Disk);

end;

 

Delphi - .....................................

 

neoturk: Re: Bulmaca Veri Tabanı Sözlüğü

"

Dostum Neoturk;

 

Son yazdıkların bu databasei göndermeme vesile oldu. Nedenini belki tahmin

edemezsin ama dediğin gibi Delphiturk'e bunca kod (500 ü aşkın -bunların

çok az bir kısmı tartışma içerikli de olsa o kadar mühim değil-) göndermene

karşılık şu ana kadar tek bir yardım isteğinde bulunmamışsın. Bu siteye çok

hizemet verdiğini anlamış bulunmaktayım. Böylesine hiçbir şey talep etmeden

uzun süre bu yardımseverliğin karşısında bu siteden(veya aracılığı ile)

tek bir rican olmuş onu da geriçevirmekten şahsen suçluluk duydum ve

vicdanımın sesine uyarak databasei göndermenin şart olduğunu düşündüm.

 

Ayrıca databasei nasıl elde ettiğim konusuna gelince;

ayhan03 rumuzlu bir arkadaşımız scannerdan tek tek sözlüğün sayfalarını

tarattırıp sonra OCR ile database oluşturduğumu düşünmüş!!!

Ben de onu kendi tarzımla kutlamıştım!

 

Mantık olarak senin mantığına çok yakın bir mantığımın olduğunu düşünmekteyim

(Bey ruhlu da denilebilir: Neden öyle dediğime birazdan hak vereceksin).

Benim öyle sözlüğün sayfalarını tek tek scannerden taratacağım kadar beyhude

işlerle uğraşacak sabrım yoktur. Senin yaklaşımınla ortada yapılacak bir iş

varsa bunu en kısa ve hızlı bir şekilde halletmek lazım. Ben bu sözlüğü

Türk Dil Kurumunun sitesinden (http://tdk.org.tr/yazim/default.asp)

öncelikle  A...Z ye kadar olan kelimeleri for next döngüsünden oluşan bir

program parçası ile yazım klavuzunu, elde ettim. Daha sonra kelimelerin

eklerini rneğin acemilik,-ği kelimesi "," ile ayrılmış bu türden olan

kelimelerin) çekim eklerini atıp yalın hallerini elde ettim...

Daha sonra 63 bin küsür kelimeyi yine bir for next döngüsüne sokarak

yine aynı sitenin http://tdk.org.tr/tdksozluk/sozara.htm sayfasına

post yaptım. Sonuçlarını HTML olarak kaydettim. Döngü tam 22 saat sürdü.

(Bilgileri siteden indirdi) Beni esas uğraştıran kısım işte bu HTML

parser  yapmam oldu. Piyasadaki HTML yi Parser yapan kod veya componentler

istediğim ayrıştırmayı yapamadılar.. Ben de kendimce kodlarla ayıkladım...

Daha sonra da 6000 küsür kelimeden oluşan başka bir bulmaca programının

verilerini tdk nin sayfasında yer almayanları tespit edip ekledim.

Dolayısıyla 64bin küsür kelimeden oluşan ve 94bin küsür anlam taşıyan bir

sözlük veritabanına kavuşmuş oldum. Biraz bu noktada yoruldum.

Databasei elde ettiğimin haftasında sen databasei istemiş oldun...

O zamanlar kıymetli idi..:)

 

Al! verdiklerinin karşılığında tepe tepe kullan....Helal olsun.

Ama benden sana bir dost tavsiyesi:

Projelelerinin önüne geçerek kendini heba etme...

Bırak projelerin veya kodların seni anlatsın. Naçizane bir tavsiye...

Karar sana kalmış.

 

Selamlarımla ve yine senin deyimlinle saygılarımla...

 

(Messenger kullanıyorsan adresimi eklersen görüşürüz)

S.Y - MALATYA

"

 

*******************************************************

 

mailini aldım Dostum Cisko,

 

Gönderdiğin mail için sana yürekten teşekkür ederim,

 

Ve inan bana beni mahçup ettin, nedenini soracak olur isen,

bunun algoritması üzerine sidik yarışına girdik,

sen bana yaz da göreyim dedin, ben de sana yazarım inat etme dedim,

ben de program oluştu, sende veri tabanı vardı...

 

bunları birleştirme fikrime olumsuz cevap vermeni anlayışla karşılamıştım,

ama biraz da gücenmiştim, ve daha sonra düşündüm ki, cisko bana veritabanını

vermekten vazgeçti, yaptığım program da boşu boşuna bende kaldı diye düşündüm.

 

Vicdan azabı çektiğim konu ise şu oldu,

programı yazdıktan sonra senin üstüne çok geldim, yeri geldi sert

cümleler kullanarak kalbini de kırdım, hepsinin farkındaydım,

daha sonra bana yazdığın açıklama metninde kullandığın bir cümle

beni duygulandırmıştı,

 

"... 6 aydır bu olayın mantığı üzerinde çalışıyorum, ama bir gün yapacağım,

sen bunu yapmışsın, ve 6 gün gibi kısa bir sürede yapmışsın, helal olsun,

ikimiz de aynı hedefe doğru koşuyoruz, sende program var, ben de veritabanı

dosyası var, nasıl bir kodlama yaptın bilmiyorum ama nesnelerin hiyerarşik

düzenlerini kullanarak bu işi yapabileceğimi sanıyorum..."

 

şunu düşündüm bir an,

demek 6 aydır üzerinde bu kadar çalışıyor... programını yazmaya çalışıyor,

elinde veritabanı da var, ve bahsettiği üzere bu veritabanı ne kadar bir

güzelliğe sahip acaba?.. eğer bu programı yazarsa ve bunu veritabanı ile

birleştirirse gerçekten güzel bir çalışma ortaya çıkartacak... ben de

bunu takdirle karşılarım, ama bahsettiği mantıkta nesnelerin hiyerarşik

yapıları veya bu türden ütopik hiç bir mantığı veya nesneyi veya komponenti

ben kullanmamıştım, olağan, sıradan delphi komutlarıyla bunu yapmıştım,

benden kodları isterse hemen verecektim, çünkü ortada yapılmış güzel bir emek

ve çalışma görüyordum, veritabanı sözlük dbsini oluşturmak herkesin harcı

değildi, ben de bir ara düşündüm, aklıma sözlük kitabı alıp scannerdan

taratmak bile geçti, kitapçıdan az daha alacaktım sırf böyle bir veri tabanı

dosyası oluşturmak için, gerekirse elimle tek tek yazacaktım...

bir yandan da, onun açısından düşünmüştüm, böyle aylarını belki de yıllarını

bir veritabanı dosyasını hazırlamaya vermiş birisinden sırf bir programı

yazdım diye ve üzerine ezici cümleler kullanarak gitmek bana yakışmayan

bir tavır ve davranıştı.

 

İyi dostluklar kavgayla başlar...

Biz kavga etmedik, birazcık inatlaştık o kadar..

gereksizdi tabi ki...

çocukça bir davranıştı ( kendi adıma konuşuyorum )

 

ve açıkçası sormuş olduğun bu soruyu programlamadan ne kadar zevk aldın

diye soracak olur isen, inan bana hiç zevk almadım, ve hiç de

zafer kazanmış edasını gütmedim.. güdemem de zaten..

 

gönderdiğin maildeki sozluk.db dosyasını aldım,

ve tekrar takdir ettim seni, çünkü her ihtimale karşı ne olur ne olmaz

diyerekten hem zip formatında göndermişsin, hem rar formatında göndermişsin.

bunun da bir anlamı var tabi ki....

içtenlikle gönderilmişliğin bir işaretiydi bu.

 

bahsettiğin üzere dosyayı accessde açtım ve inceledim, ve gerçekten

itina ile hazırlanmış olduğunu gördüm. iki tabloyu da birbiri ile ilişkilendirmişsin

hatta üşenmeyip kendi programınla sözcüklerin uzunluklarını da girdirmişsin,

birbirine çok güzel bağlamışsın.

 

şimdi kalkıp da böyle bir dosyayı hazırlamış olmanı mı takdir edeyim,

yoksa güzel türkçemize ait toparlamış olduğun tüm sözcük ve anlamları içeren

veritabanını hazırlamış olmanı mı takdir edeyim,

yoksa üşenmeyip bu sözcük ve anlamlarını ( diğer anlamları ile beraber )

birbiri ile ilişkilendirmiş olmanı mı takdir edeyim,

yoksa bu emeğini benimle paylaşmış olmanı mı takdir edeyim?....

 

Bunların da ötesinde, ben seni gerçek bir "feedback coder"(geri planda araştırıcı programcı)

olarak takdir ettim, ve ediyorum.

 

Sana yazdığım bulmaca programının full source kodunu mailine gönderdim.

Bunu hak ettiğinden değil, SENİ TAKDİR ETTİĞİMDEN DOLAYI gönderdim.

Bana veri tabanı dosyasını göndermeseydin, direkt programı sen benden isteseydin bile

ben sana göndecektim... dikkatini çekti mi bilmiyorum, sen benden karşılıksız olarak

programın kaynak kodunu istemedin  ve şu şekilde bir cümle kullandın,

"ben sana db dosyasını vermediğim sürece sen bana programı göndermezsin, dolayısıyla

program sende, db dosyası bende.." şeklinde belirsiz bir bekleyiş oluşmuştu..

halbuki benden direkt olarak isteseydin ben sana gönderirdim, benden bu kodu

istemeni bekledim ama istememiştin...

 

programı incelersin bakarsın, ucube kodlama kullanmadım, herhangi bir nesne

hiyerarşişi ya da thread da kullanmadım, komponent de kullanmadım,

sadece basit mantıksal kurgulara ilişkin kodlama kullandım.

 

Şimdi sana şu sözü veriyorum cisko,

 

Bu programı şimdi, sil-baştan senin gönderdiğin db ye göre kurgulayacağım.

Hemen bulmaca programına geçiş yapmayacağım. Öncelikle bir db explorer ve analiz

arayüz programı yazacağım. kelimeleri sorgulattırıp anlam cümlelerini gösterttireceğim.

 

daha sonra bunlar içerisinden kullanıcı istediği kriterlere göre kelime gruplarını

seçip daha sonra bulmaca hazırlama karesine sıçrattıracağım.

Bunu da en ince detay ayrıntısına kadar yapacağım. Enerjimin %30 luk bir kısmını

bu projeye ayıracağım şu saatten itibaren ( boş vaktim oldukça )

 

ve her türlü fikrimi ve senin fikirlerini seninle paylaşacağım.

Projenin her adımını, yazdığım her değişikliği sana göndereceğim,

ve bu projeyi beraber inşallah tamamlayacağız cisko.

nasip olursa bu işten emeğimizin hakkını da alacağız.

 

Asla şunu aklından geçirme,

sana danışmadan, seninle ortak kararlar almadan kendi başıma asla hareket

etmem. Nankör bir kişilik yapısına sahip değilim.

Bu projeyi inşallah beraber tamamlayacağız, ve inşallah nasip olursa

emeğinin ve emeğimin karşılığını alacağız.

 

sen bana fikirsel bazda yardımcı ol, ben programı yazarım.

programı zaman içerisinde test etme işlemi sana ait olsun.

ne zamanki "tamamdır" dersen, piyasaya icraata geçeceğiz.

 

Senin de belirttiğin gibi,

böyle bir projeden voleyi vurmamak içten bile değil.

Tüm il ve ilçelerdeki yerel gazetelere 50 YTL den verdiğini düşün,

rakam komik(!), kim olsa 50 YTL yi verir gazete veya mecmua-dergi olarak.

bunu da 500 ile çarparsan bizi ihya edebilir diye düşünüyorum.

 

benim de paraya ihtiyacım var, senin de paraya ihtiyacın var.

dertsiz veya zengin olanın buralarda işi olmaz diye düşünüyorum.

 

açıkçası benim maddi durumum zayıf, benim parasal desteğe ihtiyacım var,

bunu belirtiyorum.

 

senin de belirttiğin üzere muhasebeymiş-stokmuş-raporlamaymış bu tür

programlara piyasa doydu zaten. zamanında ben de sayısız bu türden program

yazdım sattım para kazandım, ama şimdi eskisi kadar potansiyel bulamıyorum.

 

sabit bir maaşım var, ama yetmiyor... herneyse, konuyu saptırmayayım...

 

benim dertlerim kimseyi ilgilendirmiyor, şu anda bu yazdığım yazıyla zaten

bir HATA işliyorum, amacından farklı olarak burayı kullanıyorum...

( herkesten özür ! )

 

bunları mailine de atmak isterdim, ama biraz da ibret-i alem olsun diyerekten

böyle bir örneği burada vurgulamak istedim...

 

Burada kodlarını ve bilgilerini paylaşan bir çok arkadaşımız var,

hepsine ayrı ayrı teşekkür ediyorum,

 

her ne kadar tartışsam da polemiğe girsem de (!) kimseye kin gütmüyorum,

 

Burada bilgilerinden ve kodlarından yararlandığım,

Muharrem Yıldız, Genius, Kemal, Yavuz (!), Cisko (!), Korsan, Debugger,

Hakan Sayın, Knoppix, Ersin Kecis, Barracudas, İskender (!), Unreachableboy(!)

delpiİbo, delphinin ustası, Ice (!)

ve ismini yazmadığım tüm arkadaşlara en içten samimiyetimle teşekkür ediyorum.

 

Ne kadar tartışsak da polemiklere girsek de,

birbirimize olan SAYGIMIZI kaybetmeyiz.

 

Şimdi tekrar bulmaca algoritmasına döneceğim,

 

Bana soruyu sorduğun ilk günün akşamı eve gittiğimde

masanın başına oturdum ve boş kağıt üzerine hazır olan bir puzzle çizdim.

(ingilizce kurs kitabından alıntı aldım)

 

10x10 luk bir matris üzerine kelimeleri yazdım, karalanacak yerleri karaladım,

kelimelerin ne olduğuna baktım ve uzunluklarını da göz önünde bulundurdum.

 

Şekil 1-a:

http://www.geocities.com/neoturk2003/puzzle_1.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

Bunu yaptıktan sonra puzzleye bakıp sadece düşündüm...

yaklaşık 2 saat kadar öylesine düşündüm, baktım kağıda sürekli..

kalem oynatmadım,çünkü sentez aşamasındaydım..

kelimelerle ilgili hayaller görmeye başladım...

hani şu akıl oyunları filmindeki gibi bir hale geldim diyebilirim..

hep şu soruyu sordum: "kelimeler nasıl yerleşir?"

 

2 saat sonra, 2 tane soru sordum kendime,

bu bulmacanın kelimelerini kullanıcı kendisi mi elle yerleştirecekti?

yoksa bunun tersi mi yapılacaktı?

 

burada karar veremedim... ve bu fikrimi kağıda not aldım...

 

daha sonra ana kurallar listesi çıkarttım kendimce,

bulmacanın kuralları olmalıydı...

senin de belirttiğin üzere 50 boşluk olan bir yer için 50 karakter uzunluğunda

bir kelime yok ise bulmaca asla çözülemezdi.. bunun üzerine yoğunlaştım...

 

not aldım,

-yatay bloklarda kelimelere ilişkin uzunluk ya da genişlik olarak

 farlılık olmamalı

-aynı şekilde dikey bloklar için de geçerli

-blok uzunluğu(yatay-dikey) en az 2 karakter olmalı

..birşeyler karaladım, düşündüğümden biraz daha zor oluyordu..

..gittim tv izledim öylesine..

 

gecenin ilerleyen vakitlerinde devam ettim ( kağıt üzerinde )

kelimeleri nasıl yerleştirebilirdim? ve hız nasıl sağlanacaktı?

öncelikle yerleştirilecek olan boşlukları bloklara ayırmalıydım,

bunları karakter uzunluklarına göre sıralamaya aldım,

yatay yerleşecek kelimeleri tespit ettirdim sıralattım,

aynı şekilde dikey kelimeler için de aynı işlemi yaptım..

 

şu şartları düşündüm,

-tüm blokların başlangıç satır ve sütunu biliyor olacak

nce yataylar recursiflenecek

 .tüm yataylar dolduğunda,

 .dikeyler recursiflenecek.

-boş kare kalmadığında çözüm tamamdır

 

kelimelerin programda nasıl tanımlanacağına ilişkin yapı kurgusu tasarladım,

dizilerin type yapısını kullanmaya karar verdim.

 

bir blok yapısına ait kelimeler

.length

.sat

.sut

.text

 

şeklinde bir dizide tutulacaktı, ve bu diziler de seri olarak hafızada yer

alacaktı. böylece tüm varyantları denetecektim.

 

yapıyı kurduktan sonra,

yerleştireceği ilk kelimenin nasıl yerleştirebileceğini düşündüm,

 

bu yerleştirmeyi akıllıca yapmalıydı şartını koydum.

aptalca yerleştirilen bir kelimenin sonsuz bir zaman zarfında

çözümü bulacağını biliyordum. bundan önceki bu türden yazdığım

recursive programlarda aptal denemelerin ne kadar zaman harcadığını biliyordum.

 

ve gözümde şöyle bir kod parçacığı canlandı

 

if smartword(cumle) then setcumle(...);

 

burada smartword(cumle) adlı bir function düşündüm,

amaç, bu cümle(kelime), belirttiğim koordinatlara uygun şekilde

diğer kelimelerle birlikte çakışıyorsa yerleştir anlamını taşıyordu.

 

geri planda bu functionun epeyce kodlama ile yapılacağını farkettim.

function içerisinde bir çok alt functionlar açmam gerekiyordu.

çakıştırılacak kelimelerin listesini de tutup, her kelimenin type yapısını

dizilere aktarmam gerekiyordu, ve bunların tümüne birden "tlinks" adını verdim.

 

sonuç cümlesi olarak şu teoriyi çıkardım:

 

Tüm Tlinksler uygun dikey-yatay blokslardaki length wordlerinde var ise

smartword:=true değerini alacaktı.

 

eğer ben smartword adlı functionu tam istediğim gibi yapabilirsem,

bu kurguladığım yapıda ben bunu oturtturabilirdim.

 

smartword adlı functionun biraz zahmetli olduğunu farkettim...

ve sabah olduğunda uykum geldi uyudum... işe zombi modda gittim...

aklımda hep bu functionu nasıl kodlayacağım? düşündüğüm teorileri nasıl kodlayacağım?

sorusu vardı..

 

iş çıkışında eve geri gittim ve odama kapandım...

 

yeni bir boş kağıt aldım, aşağıdaki kurguyu kurdum:

( kağıt üzerinde )

 

şekil 2-a:

http://www.geocities.com/neoturk2003/puzzle_2.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

verileri text dosyasından okutturmaya karar verdim ve bunları tstringlist

dizi değişkenlerine nasıl aktaracağımın kurgusunu kurdum. bu kısım kolay idi...

 

ayrıca kelimeleri ayrıştırırken matris üzerinde oluşabilecek mantıksal hataların

da denetimini çözüme başlamadan önce yapması gerekiyordu, bunun için de gereken

teori şartlarını kurdum.

 

bu kısım üzerinde fazla zaman harcamadım, smartword (akıllı kelime) functionunun

teorisini kurgulamaya başladım.

 

puzzlenin ilk halini yeniden çizdim ve boşluklara kelime yerleştirme mantığını

şekil üzerinde kendime açıkladım.

 

Eğer şu mantığı kurabilirsem, bulmaca programım tamam olacaktı:

 

Şekilde görüldüğü gibi üçgen işaretleriyle karalanmış olan bloğa

bir kelime yerleştirdiğimi düşündüm,

bu kelimenin buraya yerleşip yerleşemeyeceğini bana smartword functionumun

söylemesini istedim.

 

Üçgenlere göre şöyle bir kural belirledim:

 

-İçi dolu olan üçgenler dikey olarak başka kelimelerle çakışmak zorundalar

-içi boş olan üçgenler için herhangi bir kurala gerek yok

 

Elle manuel şu çözümü devamına getirdim:

Üçgenlerin bulunduğu satıra "oversee" kelimesini elle yerleştiriyorum,

(5.satır 1.sütuna elle yerleştirdim)

bu kelimenin dikey çakışan bloklarını elle tespit ettim,

1.satır 1.sutun yukarıdan aşağıya

1.satır 3.sutun yukarıdan aşağıya

1.satır 6.sutun yukarıdan aşağıya

5.satır 7.sutun yukarıdan aşağıya

1.satır 1.sutun birinci sutun soldan sağa

9.satır 1.sutun soldan sağa

 

yerleşebilecek ve uzunlukları oturan tüm kelimeler bulunursa veritabanında,

"5.satır 1.sütuna oversee kelimesini yerleştirebilir" kuramını kurdum.

 

bu işleyiş mekanizmasını sağlıklı bir şekilde yaparsam,

ve her adımda tekrar recursive programlama yaparsam

eninde sonunda tüm kelimeler yerine oturacaktı ve doğal bir eleminasyona da sahip

olacaktı hız açısından.

 

Bunu yaparken yerleştirilecek olan kelimelerin dikeylerinde başlangıç ve bitiş

koordinatlarını da hesaplattırıp uzunluklarını öğrenip veri tabanından çektirmem

gerekiyordu, bu işin zahmetli olacağı kanısına vardım...

 

sonuçta bu function biraz uzunca bir kodlamadan oluşacaktı ama bana geriye

dönüş değeri olarak "true" veya "false" değeri döndürecekti.

 

true değer dönerse demekki kelime oraya uygundur mesajını verdirecektim,

false değer dönerse sonraki kelimeyi dene diyecektim.

 

ve tekrar baştan sona tüm yapıyı gözden geçirdim ve kağıt üzerine

ufak kod parçacıklarını yazarak grupladım. neyin nerden okutulacağını,

neyin nerden geleceğini kurgusunu kurdum. kullanacağım değişken türlerine kadar

hepsini sağlam olarak belirledim. askıda kalan bir düşünceyi veya değişkeni

şaibe altında bırakmadım.

 

gecenin ilerleyen vaktinde yorgun düştüm ve uykum geldi. uyudum. ikinci günü de

geride bıraktım böylece...

 

bu sırada senin bu programı benim yazabilip yazamayacağım konusundaki cümlelerin

kafamda zonklamaktaydı... bunu yazmak zorundaydım çünkü yazabileceğim tarzda bir

programdı. yazamayacağım bir programa da açık açık "yazamam" derdim her zaman.

 

üçüncü güne başlarken iş yerinde biraz arazi moduna girdim, arayan beni bulamadı.

bir pc üzerinde delphiyi kurdum ve işim var diyerek akşama kadar başından kalkmadım.

bu sırada ne kodbankasını okudum ne forumları takip ettim ne de messengerimi açtım,

ne de başka forumlara takıldım.

tüm fonksiyonları durdurmuştum. bu programı yazmam gerekiyordu. ve açıkçası

yazamamak gibi bir lüksüm olamazdı... bu tür durumlarda her zaman flash diskimde

yanımda taşıdığım "last mohican.mp3" parçamı kendimce dinlerdim.

yanımda top patlasa duymazdım. program yazmaya başladığım zaman belirlediğim

hedefe varmak için kodu bitirmeliydim. her yönüyle kodu test ederek ve aşama

aşama modüler şekilde yazmalıydım. bu benim kendimce bir alışkanlığım.

 

yaklaşık 7 saatlik bir kamptan sonra program tam istediğim şekilde çalışmaktaydı.

kareleri karalayıp değişik denemeler yapıyordum, ve çalıştığını görünce de

açıkçası çok sevinmedim. çünkü kafamda daha önceden gereken kurguları kurmuştum

ve çalışacağından adım gibi emindim. hazırlıklarım tam olmasaydı ve

emin olmasaydım bilgisayar başına geçip asla sıfırdan program yazmazdım.

böyle de bir huyum vardı.

 

üçüncü günün akşamında program bana göre hatasız çalışıyordu.

Derken sabah gazetesinde sorulmuş olan ve yerleştirilecek kelimeleri verilmiş

bir bulmaca sorusunu örnek olarak programa girdim. tam hatırlamıyorum 11x22 miydi

öyle bir matris üzerine kuruluydu.

 

programı test ettiğimde tüm denemeleri yapmış olduğunu, ancak çözümü bulamadığını

gördüm. yerleştirilemeyen 2 adet kelime kalmıştı. o anda dünyam başıma yıkıldı.

bu nasıl olur?!! dedim...

 

ertesi gün yakın bir arkadaşımla beraber gazetede sorulan bulmaca sorusunu elle

çözmeye çalıştık. Herşeyi denedik ama gerçekten de 2 adet kelime hiç bir yere

uymuyordu. Gerçekten bir BUG vardı verilmiş olan kelimelerde. Bu hata nasıl

olabilirdi ? gazete böyle bir hatayı yapamazdı.. ama hatalıydı işte!

sonra diğer arkadaşlarla da masa başında bunun kritiğini yaptık ve onlar da

aynı şekilde 2 adet kelimenin yerleştirilemeyeceğini söylediler.

Çünkü kelimelerin fazla kombinasyonu yoktu. tıkır tıkır kuyruk sistemine göre

gidiyordu. denenebilecek fazla kombinasyon yoktu yani.

 

Bu sorunun gazetedeki yanlış verilerden kaynaklandığını öğrenene kadar 2 gün

kaybettim. ve 6.güne geldiğimde diğer her türlü bulmaca alternatif sorularını

programa girdim ve hepsinin çözülmüş olduğunu gördüm. program hazırdı.

 

ve örnek exe dosyasını da yayınladım...

 

programda ufak bir bug tespit ettim daha sonradan, ince ufak bir yerde

mantıksal eksiğim vardı. onu da giderdim.

 

sonra veritabanı dosyam olmadığı için beklemeye geçtim.

genius arkadaşım bana birkaç db dosyası göndermişti sağolsun. onları kullanmaya

çalıştım. daha sonra messengerden bir başka arkadaşımdan ufak çapta bir ingilizce

ve tıp sözlüğü aldım. konu sapıtmaya başlamıştı. benim aradığım bunlar değildi...

 

sonra bu programdan text formatında hazırladığım wordlist yüzünden dolayı

nefret ettim. çünkü veritabanı mantığına göre kurgulasaydım daha esnek ve daha

hızlı olacaktı. öylece beklemeye bıraktım...

 

Daha sonra diğer gazetelerdeki farklı bulmaca soru tarzlarına baktım,

böyle bir paket programın neden olmasın? diyerek kendimce kurgular çıkarttım.

 

Şekil 3-a:

http://www.geocities.com/neoturk2003/puzzle_3.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

farklı senaryolar kurguladım. bulmacanın tersini yapmak istedim. ben kelimeyi

girecektim, etrafına kelimeleri kendisi yerleştirip kalan boşlukları karalayacaktı..

bunun kodunu yazmadım, biraz enerjim kaybolmuştu...

 

neleri programlayabileceğimi düşündüm,

 

anagram bulmaca

sözcük avı

sayı yerleştirmece

bulmaca

sudoku

 

tüm kapılar db dosyasından geçiyordu ve mantıksal olarak da

bulmaca algoritması sayı yerleştirmece ile aynıydı. kulağı tersten gösteriyorlardı.

sözcük avını saymıyorum çerezdi...

anagram bulmaca dediği de kelimelerle ilgili basit bir bağlaç kurma işlemiydi.

sudokuyu da zaten daha öncesinden yapmıştım...

 

ve bu haliyle kağıtlar masamda günlerce bekledi...

 

taa ki sen bana db dosyasını gönderene kadar dostum........

 

Şimdi biraz kafamı toparlamam lazım. Çok yoruldum. Boş vaktim de olmadığı için

beyinsel olarak çöküşlerdeyim anlayacağın...

 

kendime gelirim en kısa zamanda, buna emin ol.

 

sana kaynak kodun full source kısmını mailde gönderdim. programın mantığını

incelersin. eğer geliştirebilirsen her türlü desteği veririm sana.

 

ben sil-baştan verdiğin db dosyası ile büyük bir paket hazırlamayı yapacağım.

hemen yazMAyacağım bunu. önce kağıt üzerinde kurgularını yapacağım.

her türlü bulmaca stilini de kapsayacak şekilde yapacağım.

sakin... sağlam... emin adımlarla...

verdiğin bu db dosyasının olması gereken hakkını vereceğim.

 

ve geliştirdiğim her minor versiyonu sana source kodlarıyla beraber göndereceğim.

senin fikirlerine göre programı yönlendireceğim. ve paket program hazır hale

geldiğinde de nasip olursa para kazanacağız.

 

Burada da çok fazla polemiğe girdim, yoruldum. beynim durdu....

 

seni messenger listeme ekleyeceğim, şimdi değil, bir zaman sonra. şu anda

konuşabilecek durumda değilim. yorgun olduğum için.

 

Bana güven dostum, bu projeyi beraber yapacağız.

 

dinlenmeye ve biraz zamana ihtiyacım var...

 

Bu zamana kadar istemeyerek de olsa birbirimizi kırmış veya üzmüş olabiliriz,

ikimiz arasında yaşanan bu polemikten ötürü

öncelikle senden ÖZÜR DİLİYORUM dostum Cisko,

aynı şekilde burayı polemik savaş alanına çevirdiğimden dolayı

diğer tür değerli arkadaşlarımdan da ÖZÜR DİLİYORUM,

beni böyle kabul ediniz, polemikçi bir yapım var.

 

Bir müddet dinlenme moduna geçeceğim,

geri döndüğümde yeni polemikler( ! :p )

yeni tartışma konuları hepimizi bekliyor olacak,

demedi demeyin!!

 

Hepinize hayırlı işler, bol kodlu günler, mutlu ve sağlıklı bir yaşam

diliyorum değerli arkadaşlarım.........

 

"Fırtınadan önce sessizlik hakimdir..."

 

saygılarımla_

 

neoturk

 

Delphi - .....................................

 

neoturk: Re: Bulmaca Veri Tabanı Sözlüğü

"

Dostum Neoturk;

 

Son yazdıkların bu databasei göndermeme vesile oldu. Nedenini belki tahmin

edemezsin ama dediğin gibi Delphiturk'e bunca kod (500 ü aşkın -bunların

çok az bir kısmı tartışma içerikli de olsa o kadar mühim değil-) göndermene

karşılık şu ana kadar tek bir yardım isteğinde bulunmamışsın. Bu siteye çok

hizemet verdiğini anlamış bulunmaktayım. Böylesine hiçbir şey talep etmeden

uzun süre bu yardımseverliğin karşısında bu siteden(veya aracılığı ile)

tek bir rican olmuş onu da geriçevirmekten şahsen suçluluk duydum ve

vicdanımın sesine uyarak databasei göndermenin şart olduğunu düşündüm.

 

Ayrıca databasei nasıl elde ettiğim konusuna gelince;

ayhan03 rumuzlu bir arkadaşımız scannerdan tek tek sözlüğün sayfalarını

tarattırıp sonra OCR ile database oluşturduğumu düşünmüş!!!

Ben de onu kendi tarzımla kutlamıştım!

 

Mantık olarak senin mantığına çok yakın bir mantığımın olduğunu düşünmekteyim

(Bey ruhlu da denilebilir: Neden öyle dediğime birazdan hak vereceksin).

Benim öyle sözlüğün sayfalarını tek tek scannerden taratacağım kadar beyhude

işlerle uğraşacak sabrım yoktur. Senin yaklaşımınla ortada yapılacak bir iş

varsa bunu en kısa ve hızlı bir şekilde halletmek lazım. Ben bu sözlüğü

Türk Dil Kurumunun sitesinden (http://tdk.org.tr/yazim/default.asp)

öncelikle  A...Z ye kadar olan kelimeleri for next döngüsünden oluşan bir

program parçası ile yazım klavuzunu, elde ettim. Daha sonra kelimelerin

eklerini rneğin acemilik,-ği kelimesi "," ile ayrılmış bu türden olan

kelimelerin) çekim eklerini atıp yalın hallerini elde ettim...

Daha sonra 63 bin küsür kelimeyi yine bir for next döngüsüne sokarak

yine aynı sitenin http://tdk.org.tr/tdksozluk/sozara.htm sayfasına

post yaptım. Sonuçlarını HTML olarak kaydettim. Döngü tam 22 saat sürdü.

(Bilgileri siteden indirdi) Beni esas uğraştıran kısım işte bu HTML

parser  yapmam oldu. Piyasadaki HTML yi Parser yapan kod veya componentler

istediğim ayrıştırmayı yapamadılar.. Ben de kendimce kodlarla ayıkladım...

Daha sonra da 6000 küsür kelimeden oluşan başka bir bulmaca programının

verilerini tdk nin sayfasında yer almayanları tespit edip ekledim.

Dolayısıyla 64bin küsür kelimeden oluşan ve 94bin küsür anlam taşıyan bir

sözlük veritabanına kavuşmuş oldum. Biraz bu noktada yoruldum.

Databasei elde ettiğimin haftasında sen databasei istemiş oldun...

O zamanlar kıymetli idi..:)

 

Al! verdiklerinin karşılığında tepe tepe kullan....Helal olsun.

Ama benden sana bir dost tavsiyesi:

Projelelerinin önüne geçerek kendini heba etme...

Bırak projelerin veya kodların seni anlatsın. Naçizane bir tavsiye...

Karar sana kalmış.

 

Selamlarımla ve yine senin deyimlinle saygılarımla...

 

(Messenger kullanıyorsan adresimi eklersen görüşürüz)

S.Y - MALATYA

"

 

*******************************************************

 

mailini aldım Dostum Cisko,

 

Gönderdiğin mail için sana yürekten teşekkür ederim,

 

Ve inan bana beni mahçup ettin, nedenini soracak olur isen,

bunun algoritması üzerine sidik yarışına girdik,

sen bana yaz da göreyim dedin, ben de sana yazarım inat etme dedim,

ben de program oluştu, sende veri tabanı vardı...

 

bunları birleştirme fikrime olumsuz cevap vermeni anlayışla karşılamıştım,

ama biraz da gücenmiştim, ve daha sonra düşündüm ki, cisko bana veritabanını

vermekten vazgeçti, yaptığım program da boşu boşuna bende kaldı diye düşündüm.

 

Vicdan azabı çektiğim konu ise şu oldu,

programı yazdıktan sonra senin üstüne çok geldim, yeri geldi sert

cümleler kullanarak kalbini de kırdım, hepsinin farkındaydım,

daha sonra bana yazdığın açıklama metninde kullandığın bir cümle

beni duygulandırmıştı,

 

"... 6 aydır bu olayın mantığı üzerinde çalışıyorum, ama bir gün yapacağım,

sen bunu yapmışsın, ve 6 gün gibi kısa bir sürede yapmışsın, helal olsun,

ikimiz de aynı hedefe doğru koşuyoruz, sende program var, ben de veritabanı

dosyası var, nasıl bir kodlama yaptın bilmiyorum ama nesnelerin hiyerarşik

düzenlerini kullanarak bu işi yapabileceğimi sanıyorum..."

 

şunu düşündüm bir an,

demek 6 aydır üzerinde bu kadar çalışıyor... programını yazmaya çalışıyor,

elinde veritabanı da var, ve bahsettiği üzere bu veritabanı ne kadar bir

güzelliğe sahip acaba?.. eğer bu programı yazarsa ve bunu veritabanı ile

birleştirirse gerçekten güzel bir çalışma ortaya çıkartacak... ben de

bunu takdirle karşılarım, ama bahsettiği mantıkta nesnelerin hiyerarşik

yapıları veya bu türden ütopik hiç bir mantığı veya nesneyi veya komponenti

ben kullanmamıştım, olağan, sıradan delphi komutlarıyla bunu yapmıştım,

benden kodları isterse hemen verecektim, çünkü ortada yapılmış güzel bir emek

ve çalışma görüyordum, veritabanı sözlük dbsini oluşturmak herkesin harcı

değildi, ben de bir ara düşündüm, aklıma sözlük kitabı alıp scannerdan

taratmak bile geçti, kitapçıdan az daha alacaktım sırf böyle bir veri tabanı

dosyası oluşturmak için, gerekirse elimle tek tek yazacaktım...

bir yandan da, onun açısından düşünmüştüm, böyle aylarını belki de yıllarını

bir veritabanı dosyasını hazırlamaya vermiş birisinden sırf bir programı

yazdım diye ve üzerine ezici cümleler kullanarak gitmek bana yakışmayan

bir tavır ve davranıştı.

 

İyi dostluklar kavgayla başlar...

Biz kavga etmedik, birazcık inatlaştık o kadar..

gereksizdi tabi ki...

çocukça bir davranıştı ( kendi adıma konuşuyorum )

 

ve açıkçası sormuş olduğun bu soruyu programlamadan ne kadar zevk aldın

diye soracak olur isen, inan bana hiç zevk almadım, ve hiç de

zafer kazanmış edasını gütmedim.. güdemem de zaten..

 

gönderdiğin maildeki sozluk.db dosyasını aldım,

ve tekrar takdir ettim seni, çünkü her ihtimale karşı ne olur ne olmaz

diyerekten hem zip formatında göndermişsin, hem rar formatında göndermişsin.

bunun da bir anlamı var tabi ki....

içtenlikle gönderilmişliğin bir işaretiydi bu.

 

bahsettiğin üzere dosyayı accessde açtım ve inceledim, ve gerçekten

itina ile hazırlanmış olduğunu gördüm. iki tabloyu da birbiri ile ilişkilendirmişsin

hatta üşenmeyip kendi programınla sözcüklerin uzunluklarını da girdirmişsin,

birbirine çok güzel bağlamışsın.

 

şimdi kalkıp da böyle bir dosyayı hazırlamış olmanı mı takdir edeyim,

yoksa güzel türkçemize ait toparlamış olduğun tüm sözcük ve anlamları içeren

veritabanını hazırlamış olmanı mı takdir edeyim,

yoksa üşenmeyip bu sözcük ve anlamlarını ( diğer anlamları ile beraber )

birbiri ile ilişkilendirmiş olmanı mı takdir edeyim,

yoksa bu emeğini benimle paylaşmış olmanı mı takdir edeyim?....

 

Bunların da ötesinde, ben seni gerçek bir "feedback coder"(geri planda araştırıcı programcı)

olarak takdir ettim, ve ediyorum.

 

Sana yazdığım bulmaca programının full source kodunu mailine gönderdim.

Bunu hak ettiğinden değil, SENİ TAKDİR ETTİĞİMDEN DOLAYI gönderdim.

Bana veri tabanı dosyasını göndermeseydin, direkt programı sen benden isteseydin bile

ben sana göndecektim... dikkatini çekti mi bilmiyorum, sen benden karşılıksız olarak

programın kaynak kodunu istemedin  ve şu şekilde bir cümle kullandın,

"ben sana db dosyasını vermediğim sürece sen bana programı göndermezsin, dolayısıyla

program sende, db dosyası bende.." şeklinde belirsiz bir bekleyiş oluşmuştu..

halbuki benden direkt olarak isteseydin ben sana gönderirdim, benden bu kodu

istemeni bekledim ama istememiştin...

 

programı incelersin bakarsın, ucube kodlama kullanmadım, herhangi bir nesne

hiyerarşişi ya da thread da kullanmadım, komponent de kullanmadım,

sadece basit mantıksal kurgulara ilişkin kodlama kullandım.

 

Şimdi sana şu sözü veriyorum cisko,

 

Bu programı şimdi, sil-baştan senin gönderdiğin db ye göre kurgulayacağım.

Hemen bulmaca programına geçiş yapmayacağım. Öncelikle bir db explorer ve analiz

arayüz programı yazacağım. kelimeleri sorgulattırıp anlam cümlelerini gösterttireceğim.

 

daha sonra bunlar içerisinden kullanıcı istediği kriterlere göre kelime gruplarını

seçip daha sonra bulmaca hazırlama karesine sıçrattıracağım.

Bunu da en ince detay ayrıntısına kadar yapacağım. Enerjimin %30 luk bir kısmını

bu projeye ayıracağım şu saatten itibaren ( boş vaktim oldukça )

 

ve her türlü fikrimi ve senin fikirlerini seninle paylaşacağım.

Projenin her adımını, yazdığım her değişikliği sana göndereceğim,

ve bu projeyi beraber inşallah tamamlayacağız cisko.

nasip olursa bu işten emeğimizin hakkını da alacağız.

 

Asla şunu aklından geçirme,

sana danışmadan, seninle ortak kararlar almadan kendi başıma asla hareket

etmem. Nankör bir kişilik yapısına sahip değilim.

Bu projeyi inşallah beraber tamamlayacağız, ve inşallah nasip olursa

emeğinin ve emeğimin karşılığını alacağız.

 

sen bana fikirsel bazda yardımcı ol, ben programı yazarım.

programı zaman içerisinde test etme işlemi sana ait olsun.

ne zamanki "tamamdır" dersen, piyasaya icraata geçeceğiz.

 

Senin de belirttiğin gibi,

böyle bir projeden voleyi vurmamak içten bile değil.

Tüm il ve ilçelerdeki yerel gazetelere 50 YTL den verdiğini düşün,

rakam komik(!), kim olsa 50 YTL yi verir gazete veya mecmua-dergi olarak.

bunu da 500 ile çarparsan bizi ihya edebilir diye düşünüyorum.

 

benim de paraya ihtiyacım var, senin de paraya ihtiyacın var.

dertsiz veya zengin olanın buralarda işi olmaz diye düşünüyorum.

 

açıkçası benim maddi durumum zayıf, benim parasal desteğe ihtiyacım var,

bunu belirtiyorum.

 

senin de belirttiğin üzere muhasebeymiş-stokmuş-raporlamaymış bu tür

programlara piyasa doydu zaten. zamanında ben de sayısız bu türden program

yazdım sattım para kazandım, ama şimdi eskisi kadar potansiyel bulamıyorum.

 

sabit bir maaşım var, ama yetmiyor... herneyse, konuyu saptırmayayım...

 

benim dertlerim kimseyi ilgilendirmiyor, şu anda bu yazdığım yazıyla zaten

bir HATA işliyorum, amacından farklı olarak burayı kullanıyorum...

( herkesten özür ! )

 

bunları mailine de atmak isterdim, ama biraz da ibret-i alem olsun diyerekten

böyle bir örneği burada vurgulamak istedim...

 

Burada kodlarını ve bilgilerini paylaşan bir çok arkadaşımız var,

hepsine ayrı ayrı teşekkür ediyorum,

 

her ne kadar tartışsam da polemiğe girsem de (!) kimseye kin gütmüyorum,

 

Burada bilgilerinden ve kodlarından yararlandığım,

Muharrem Yıldız, Genius, Kemal, Yavuz (!), Cisko (!), Korsan, Debugger,

Hakan Sayın, Knoppix, Ersin Kecis, Barracudas, İskender (!), Unreachableboy(!)

delpiİbo, delphinin ustası, Ice (!)

ve ismini yazmadığım tüm arkadaşlara en içten samimiyetimle teşekkür ediyorum.

 

Ne kadar tartışsak da polemiklere girsek de,

birbirimize olan SAYGIMIZI kaybetmeyiz.

 

Şimdi tekrar bulmaca algoritmasına döneceğim,

 

Bana soruyu sorduğun ilk günün akşamı eve gittiğimde

masanın başına oturdum ve boş kağıt üzerine hazır olan bir puzzle çizdim.

(ingilizce kurs kitabından alıntı aldım)

 

10x10 luk bir matris üzerine kelimeleri yazdım, karalanacak yerleri karaladım,

kelimelerin ne olduğuna baktım ve uzunluklarını da göz önünde bulundurdum.

 

Şekil 1-a:

http://www.geocities.com/neoturk2003/puzzle_1.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

Bunu yaptıktan sonra puzzleye bakıp sadece düşündüm...

yaklaşık 2 saat kadar öylesine düşündüm, baktım kağıda sürekli..

kalem oynatmadım,çünkü sentez aşamasındaydım..

kelimelerle ilgili hayaller görmeye başladım...

hani şu akıl oyunları filmindeki gibi bir hale geldim diyebilirim..

hep şu soruyu sordum: "kelimeler nasıl yerleşir?"

 

2 saat sonra, 2 tane soru sordum kendime,

bu bulmacanın kelimelerini kullanıcı kendisi mi elle yerleştirecekti?

yoksa bunun tersi mi yapılacaktı?

 

burada karar veremedim... ve bu fikrimi kağıda not aldım...

 

daha sonra ana kurallar listesi çıkarttım kendimce,

bulmacanın kuralları olmalıydı...

senin de belirttiğin üzere 50 boşluk olan bir yer için 50 karakter uzunluğunda

bir kelime yok ise bulmaca asla çözülemezdi.. bunun üzerine yoğunlaştım...

 

not aldım,

-yatay bloklarda kelimelere ilişkin uzunluk ya da genişlik olarak

 farlılık olmamalı

-aynı şekilde dikey bloklar için de geçerli

-blok uzunluğu(yatay-dikey) en az 2 karakter olmalı

..birşeyler karaladım, düşündüğümden biraz daha zor oluyordu..

..gittim tv izledim öylesine..

 

gecenin ilerleyen vakitlerinde devam ettim ( kağıt üzerinde )

kelimeleri nasıl yerleştirebilirdim? ve hız nasıl sağlanacaktı?

öncelikle yerleştirilecek olan boşlukları bloklara ayırmalıydım,

bunları karakter uzunluklarına göre sıralamaya aldım,

yatay yerleşecek kelimeleri tespit ettirdim sıralattım,

aynı şekilde dikey kelimeler için de aynı işlemi yaptım..

 

şu şartları düşündüm,

-tüm blokların başlangıç satır ve sütunu biliyor olacak

nce yataylar recursiflenecek

 .tüm yataylar dolduğunda,

 .dikeyler recursiflenecek.

-boş kare kalmadığında çözüm tamamdır

 

kelimelerin programda nasıl tanımlanacağına ilişkin yapı kurgusu tasarladım,

dizilerin type yapısını kullanmaya karar verdim.

 

bir blok yapısına ait kelimeler

.length

.sat

.sut

.text

 

şeklinde bir dizide tutulacaktı, ve bu diziler de seri olarak hafızada yer

alacaktı. böylece tüm varyantları denetecektim.

 

yapıyı kurduktan sonra,

yerleştireceği ilk kelimenin nasıl yerleştirebileceğini düşündüm,

 

bu yerleştirmeyi akıllıca yapmalıydı şartını koydum.

aptalca yerleştirilen bir kelimenin sonsuz bir zaman zarfında

çözümü bulacağını biliyordum. bundan önceki bu türden yazdığım

recursive programlarda aptal denemelerin ne kadar zaman harcadığını biliyordum.

 

ve gözümde şöyle bir kod parçacığı canlandı

 

if smartword(cumle) then setcumle(...);

 

burada smartword(cumle) adlı bir function düşündüm,

amaç, bu cümle(kelime), belirttiğim koordinatlara uygun şekilde

diğer kelimelerle birlikte çakışıyorsa yerleştir anlamını taşıyordu.

 

geri planda bu functionun epeyce kodlama ile yapılacağını farkettim.

function içerisinde bir çok alt functionlar açmam gerekiyordu.

çakıştırılacak kelimelerin listesini de tutup, her kelimenin type yapısını

dizilere aktarmam gerekiyordu, ve bunların tümüne birden "tlinks" adını verdim.

 

sonuç cümlesi olarak şu teoriyi çıkardım:

 

Tüm Tlinksler uygun dikey-yatay blokslardaki length wordlerinde var ise

smartword:=true değerini alacaktı.

 

eğer ben smartword adlı functionu tam istediğim gibi yapabilirsem,

bu kurguladığım yapıda ben bunu oturtturabilirdim.

 

smartword adlı functionun biraz zahmetli olduğunu farkettim...

ve sabah olduğunda uykum geldi uyudum... işe zombi modda gittim...

aklımda hep bu functionu nasıl kodlayacağım? düşündüğüm teorileri nasıl kodlayacağım?

sorusu vardı..

 

iş çıkışında eve geri gittim ve odama kapandım...

 

yeni bir boş kağıt aldım, aşağıdaki kurguyu kurdum:

( kağıt üzerinde )

 

şekil 2-a:

http://www.geocities.com/neoturk2003/puzzle_2.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

verileri text dosyasından okutturmaya karar verdim ve bunları tstringlist

dizi değişkenlerine nasıl aktaracağımın kurgusunu kurdum. bu kısım kolay idi...

 

ayrıca kelimeleri ayrıştırırken matris üzerinde oluşabilecek mantıksal hataların

da denetimini çözüme başlamadan önce yapması gerekiyordu, bunun için de gereken

teori şartlarını kurdum.

 

bu kısım üzerinde fazla zaman harcamadım, smartword (akıllı kelime) functionunun

teorisini kurgulamaya başladım.

 

puzzlenin ilk halini yeniden çizdim ve boşluklara kelime yerleştirme mantığını

şekil üzerinde kendime açıkladım.

 

Eğer şu mantığı kurabilirsem, bulmaca programım tamam olacaktı:

 

Şekilde görüldüğü gibi üçgen işaretleriyle karalanmış olan bloğa

bir kelime yerleştirdiğimi düşündüm,

bu kelimenin buraya yerleşip yerleşemeyeceğini bana smartword functionumun

söylemesini istedim.

 

Üçgenlere göre şöyle bir kural belirledim:

 

-İçi dolu olan üçgenler dikey olarak başka kelimelerle çakışmak zorundalar

-içi boş olan üçgenler için herhangi bir kurala gerek yok

 

Elle manuel şu çözümü devamına getirdim:

Üçgenlerin bulunduğu satıra "oversee" kelimesini elle yerleştiriyorum,

(5.satır 1.sütuna elle yerleştirdim)

bu kelimenin dikey çakışan bloklarını elle tespit ettim,

1.satır 1.sutun yukarıdan aşağıya

1.satır 3.sutun yukarıdan aşağıya

1.satır 6.sutun yukarıdan aşağıya

5.satır 7.sutun yukarıdan aşağıya

1.satır 1.sutun birinci sutun soldan sağa

9.satır 1.sutun soldan sağa

 

yerleşebilecek ve uzunlukları oturan tüm kelimeler bulunursa veritabanında,

"5.satır 1.sütuna oversee kelimesini yerleştirebilir" kuramını kurdum.

 

bu işleyiş mekanizmasını sağlıklı bir şekilde yaparsam,

ve her adımda tekrar recursive programlama yaparsam

eninde sonunda tüm kelimeler yerine oturacaktı ve doğal bir eleminasyona da sahip

olacaktı hız açısından.

 

Bunu yaparken yerleştirilecek olan kelimelerin dikeylerinde başlangıç ve bitiş

koordinatlarını da hesaplattırıp uzunluklarını öğrenip veri tabanından çektirmem

gerekiyordu, bu işin zahmetli olacağı kanısına vardım...

 

sonuçta bu function biraz uzunca bir kodlamadan oluşacaktı ama bana geriye

dönüş değeri olarak "true" veya "false" değeri döndürecekti.

 

true değer dönerse demekki kelime oraya uygundur mesajını verdirecektim,

false değer dönerse sonraki kelimeyi dene diyecektim.

 

ve tekrar baştan sona tüm yapıyı gözden geçirdim ve kağıt üzerine

ufak kod parçacıklarını yazarak grupladım. neyin nerden okutulacağını,

neyin nerden geleceğini kurgusunu kurdum. kullanacağım değişken türlerine kadar

hepsini sağlam olarak belirledim. askıda kalan bir düşünceyi veya değişkeni

şaibe altında bırakmadım.

 

gecenin ilerleyen vaktinde yorgun düştüm ve uykum geldi. uyudum. ikinci günü de

geride bıraktım böylece...

 

bu sırada senin bu programı benim yazabilip yazamayacağım konusundaki cümlelerin

kafamda zonklamaktaydı... bunu yazmak zorundaydım çünkü yazabileceğim tarzda bir

programdı. yazamayacağım bir programa da açık açık "yazamam" derdim her zaman.

 

üçüncü güne başlarken iş yerinde biraz arazi moduna girdim, arayan beni bulamadı.

bir pc üzerinde delphiyi kurdum ve işim var diyerek akşama kadar başından kalkmadım.

bu sırada ne kodbankasını okudum ne forumları takip ettim ne de messengerimi açtım,

ne de başka forumlara takıldım.

tüm fonksiyonları durdurmuştum. bu programı yazmam gerekiyordu. ve açıkçası

yazamamak gibi bir lüksüm olamazdı... bu tür durumlarda her zaman flash diskimde

yanımda taşıdığım "last mohican.mp3" parçamı kendimce dinlerdim.

yanımda top patlasa duymazdım. program yazmaya başladığım zaman belirlediğim

hedefe varmak için kodu bitirmeliydim. her yönüyle kodu test ederek ve aşama

aşama modüler şekilde yazmalıydım. bu benim kendimce bir alışkanlığım.

 

yaklaşık 7 saatlik bir kamptan sonra program tam istediğim şekilde çalışmaktaydı.

kareleri karalayıp değişik denemeler yapıyordum, ve çalıştığını görünce de

açıkçası çok sevinmedim. çünkü kafamda daha önceden gereken kurguları kurmuştum

ve çalışacağından adım gibi emindim. hazırlıklarım tam olmasaydı ve

emin olmasaydım bilgisayar başına geçip asla sıfırdan program yazmazdım.

böyle de bir huyum vardı.

 

üçüncü günün akşamında program bana göre hatasız çalışıyordu.

Derken sabah gazetesinde sorulmuş olan ve yerleştirilecek kelimeleri verilmiş

bir bulmaca sorusunu örnek olarak programa girdim. tam hatırlamıyorum 11x22 miydi

öyle bir matris üzerine kuruluydu.

 

programı test ettiğimde tüm denemeleri yapmış olduğunu, ancak çözümü bulamadığını

gördüm. yerleştirilemeyen 2 adet kelime kalmıştı. o anda dünyam başıma yıkıldı.

bu nasıl olur?!! dedim...

 

ertesi gün yakın bir arkadaşımla beraber gazetede sorulan bulmaca sorusunu elle

çözmeye çalıştık. Herşeyi denedik ama gerçekten de 2 adet kelime hiç bir yere

uymuyordu. Gerçekten bir BUG vardı verilmiş olan kelimelerde. Bu hata nasıl

olabilirdi ? gazete böyle bir hatayı yapamazdı.. ama hatalıydı işte!

sonra diğer arkadaşlarla da masa başında bunun kritiğini yaptık ve onlar da

aynı şekilde 2 adet kelimenin yerleştirilemeyeceğini söylediler.

Çünkü kelimelerin fazla kombinasyonu yoktu. tıkır tıkır kuyruk sistemine göre

gidiyordu. denenebilecek fazla kombinasyon yoktu yani.

 

Bu sorunun gazetedeki yanlış verilerden kaynaklandığını öğrenene kadar 2 gün

kaybettim. ve 6.güne geldiğimde diğer her türlü bulmaca alternatif sorularını

programa girdim ve hepsinin çözülmüş olduğunu gördüm. program hazırdı.

 

ve örnek exe dosyasını da yayınladım...

 

programda ufak bir bug tespit ettim daha sonradan, ince ufak bir yerde

mantıksal eksiğim vardı. onu da giderdim.

 

sonra veritabanı dosyam olmadığı için beklemeye geçtim.

genius arkadaşım bana birkaç db dosyası göndermişti sağolsun. onları kullanmaya

çalıştım. daha sonra messengerden bir başka arkadaşımdan ufak çapta bir ingilizce

ve tıp sözlüğü aldım. konu sapıtmaya başlamıştı. benim aradığım bunlar değildi...

 

sonra bu programdan text formatında hazırladığım wordlist yüzünden dolayı

nefret ettim. çünkü veritabanı mantığına göre kurgulasaydım daha esnek ve daha

hızlı olacaktı. öylece beklemeye bıraktım...

 

Daha sonra diğer gazetelerdeki farklı bulmaca soru tarzlarına baktım,

böyle bir paket programın neden olmasın? diyerek kendimce kurgular çıkarttım.

 

Şekil 3-a:

http://www.geocities.com/neoturk2003/puzzle_3.jpg

( tam ekranda bakınız, resmi büyütünüz )

 

farklı senaryolar kurguladım. bulmacanın tersini yapmak istedim. ben kelimeyi

girecektim, etrafına kelimeleri kendisi yerleştirip kalan boşlukları karalayacaktı..

bunun kodunu yazmadım, biraz enerjim kaybolmuştu...

 

neleri programlayabileceğimi düşündüm,

 

anagram bulmaca

sözcük avı

sayı yerleştirmece

bulmaca

sudoku

 

tüm kapılar db dosyasından geçiyordu ve mantıksal olarak da

bulmaca algoritması sayı yerleştirmece ile aynıydı. kulağı tersten gösteriyorlardı.

sözcük avını saymıyorum çerezdi...

anagram bulmaca dediği de kelimelerle ilgili basit bir bağlaç kurma işlemiydi.

sudokuyu da zaten daha öncesinden yapmıştım...

 

ve bu haliyle kağıtlar masamda günlerce bekledi...

 

taa ki sen bana db dosyasını gönderene kadar dostum........

 

Şimdi biraz kafamı toparlamam lazım. Çok yoruldum. Boş vaktim de olmadığı için

beyinsel olarak çöküşlerdeyim anlayacağın...

 

kendime gelirim en kısa zamanda, buna emin ol.

 

sana kaynak kodun full source kısmını mailde gönderdim. programın mantığını

incelersin. eğer geliştirebilirsen her türlü desteği veririm sana.

 

ben sil-baştan verdiğin db dosyası ile büyük bir paket hazırlamayı yapacağım.

hemen yazMAyacağım bunu. önce kağıt üzerinde kurgularını yapacağım.

her türlü bulmaca stilini de kapsayacak şekilde yapacağım.

sakin... sağlam... emin adımlarla...

verdiğin bu db dosyasının olması gereken hakkını vereceğim.

 

ve geliştirdiğim her minor versiyonu sana source kodlarıyla beraber göndereceğim.

senin fikirlerine göre programı yönlendireceğim. ve paket program hazır hale

geldiğinde de nasip olursa para kazanacağız.

 

Burada da çok fazla polemiğe girdim, yoruldum. beynim durdu....

 

seni messenger listeme ekleyeceğim, şimdi değil, bir zaman sonra. şu anda

konuşabilecek durumda değilim. yorgun olduğum için.

 

Bana güven dostum, bu projeyi beraber yapacağız.

 

dinlenmeye ve biraz zamana ihtiyacım var...

 

Bu zamana kadar istemeyerek de olsa birbirimizi kırmış veya üzmüş olabiliriz,

ikimiz arasında yaşanan bu polemikten ötürü

öncelikle senden ÖZÜR DİLİYORUM dostum Cisko,

aynı şekilde burayı polemik savaş alanına çevirdiğimden dolayı

diğer tür değerli arkadaşlarımdan da ÖZÜR DİLİYORUM,

beni böyle kabul ediniz, polemikçi bir yapım var.

 

Bir müddet dinlenme moduna geçeceğim,

geri döndüğümde yeni polemikler( ! :p )

yeni tartışma konuları hepimizi bekliyor olacak,

demedi demeyin!!

 

Hepinize hayırlı işler, bol kodlu günler, mutlu ve sağlıklı bir yaşam

diliyorum değerli arkadaşlarım.........

 

"Fırtınadan önce sessizlik hakimdir..."

 

saygılarımla_

 

neoturk

 

Delphi - .....................................

 

YUHH BE KARDEŞİM.

Abiler bu ne yaaa. tam bi gövde gösterisine dönüştürmüşsünüz KodBank'ı ya.

Hiç olmazsa kodbank'ı yazanlara saygılı olun yaaa.

 

Yazıklar olsun

 

Delphi - .....................................

 

YUHH BE KARDEŞİM.

Abiler bu ne yaaa. tam bi gövde gösterisine dönüştürmüşsünüz KodBank'ı ya.

Hiç olmazsa kodbank'ı yazanlara saygılı olun yaaa.

 

Yazıklar olsun

 

Delphi - .....................................

 

yavuzyavuz or neoturk

Konuşmalarınızdan bilgi beceri ve yaşınızın bizden çokyüksek olduğu anlaşılıyor.

25 yaşşındayım iki yıldır delphi öğrenmeye çalışıyorum.  Size laf söyleyecek yaşta ve bilgide değilim ama

mütavazi olmak islere şeref kazandıracağına inanıyorum.

 

Her ikinizede saygı ve sevgilerimle.

 

Delphi - .....................................

 

yavuzyavuz or neoturk

Konuşmalarınızdan bilgi beceri ve yaşınızın bizden çokyüksek olduğu anlaşılıyor.

25 yaşşındayım iki yıldır delphi öğrenmeye çalışıyorum.  Size laf söyleyecek yaşta ve bilgide değilim ama

mütavazi olmak islere şeref kazandıracağına inanıyorum.

 

Her ikinizede saygı ve sevgilerimle.

 

Delphi - .....................................

 

Re: Re: Re: Coder Test 5

Cevap vermeyeceğim dedim  ama kendimi tutamadım

 

1- İki Üniversite mezunuyum sonuncuyu 1993 yılında High Honour Derecesiyle  bitirdim.

2- Bitirme projem AI (yapay Zeka) üzerineydi.

   Türkiyedeki 4 Üniversite İstatistik çalışmalarında projeden yaralanıp, bu sebeple

   Teşekkür yazısı gönderdi.

3- Askerliğimi 33 yaşında Bitirdim ve Keskin Nişancı ödülü aldım.

   (Neden geç yaptığımı merak edene izah edebilirim)

   (Keskin nişancı olmak mantığını kullananlar için çocuk oyuncağı,

   kahve içme, sakin ol,nefesini tut, meşhur 3 nokta ile hedefi aynı hizaya getir

   parmagının ucuyla hafifçe dokun. )

4- Asla yedekleme ve  hata konusunda titremedim, bu konuda çok basit kurallarımız vardır,

   kurallara uyarsan gece rahat uyursun.(merak edenlere bu kuralları gönderirim)

5- O kadar laftan sonra hala bilmişlik taslıyorsun kendin sorup kendinin içinden

   çıkamadığın sorunları çözme yöntemlerinden bahsediyorsun. Benim yedekleme görevim yok

   hata yaparsam sadece işlemlerde hata yapabilirim , ama denemeler gerçek verilerle yapılmaz

   genellikle bir gün önceki yedeklerle yapılır. Günlerce denendikten sonra hata yoksa işleme geçilir.

6- Yedekleme için kendi geliştirdiğim bir sistemim var

   20.000 bilgisayar 10 arlı en alt sistemler (9+1) bir üst sisteme .... (20.000 i

   nasıl bulacağını binary tree bildiğine göre kolayca bulabilirsin.) Her alt sistem

   kendinin bir üst sistemindeki veri tabanlarının yedegini tutar.  kendi yazdığım rutin

   ile veri tabanları max 200 kb a sıkıştırılmış  yedek yeri tabanlarını tutarlar.

   (bunun nasıl yapıldığı anlatılamayacak kadar uzun bir bilgi, paylaşamadığım için

   herkesten özür diliyorum) kısaca her anlık işlemde benim 20.000 adet yedeğim var,

   titremem gerekmiyor.

7- yıgın dediğin şey lifo (Last in first out) ile çalışan STACK ve birde yazmayı

   unutmuşsun fifo (first in first out) ile çalışan QUEUE olmasın sakın.

8- Öğretim görevlilerinin yüzlercesi ile çalıştım ve haklarındaki analizim kesinlikle

   doğru istersen kendi kendini objektif olarak sorgula gerçeklerle yüzleş.

9- Ben başladığımda 80286 lar değil 8086 lar henüz üretiliyordu, MSDos un esamesi

   yoktu ortadaniversitede yazıcı olarak daisy wheel kullanır punch Card lara

   veri kaydederdik. Fortran en baba dildi, ticari programlar cobol ile yazılırdı.

   Türkiyenin ilk bilgisayar dergisi "Bilgisayar Pazarı" nı hatırlarmısın? Bulabilirsen

   düzenledikleri yazılım yarışmalarında derece alanlara bir göz at bakalım kimi göreceksin.

   Towers of Hanoi oyununu bilirmisin? algoritması ve flow chart ı aldığım ilk

   pascal dersindeki sınav sorumdu, o sınavdan kaç aldım dersin?

   Eminim Flow Chart ın ne olduğunu öğrencilerine öğretiyorsundur.

10- Bulunduğum konuma tırnaklarımla kazıyarak geldim, ne sana ne başkasına laf

    söyletmem, torpille kayırmayla işim olmaz, kimsenin alt kademesindede çalışmıyorum.

11- KodBank ı yazanların ellerine sağlık, ama senin gibiler burayı bozdu.

    Bozulmuş bir şeyi daha fazla bozamazsın, öğrencilerine söyle onlarda burayı

    ıvır zıvırla doldurmalarını öğütlede senin nasıl oyun bozan olduğunu anlasınlar.

12- Yazdığın kodlara kesinlikle laf etmedim, buranın amacı bu zaten,

    " bildiğin varsa konuş feyz alsınlar yoksa sus seni adam sansınlar"

13- Buraya neden çok fazla kod göndermediğime gelince, ya zaten yazılmış yada

    burda yazılamayacak kadar uzun ve teferruatlı.

 

Umarım aklını başına alır eskiden olduğu gibi güzel kodlarını göndermeye devam edersin,

yada almaz burayı çöplüğe dönüştürmeye devam edersin. Senin bileceğin iş.

 

Verdiğim rahatsızlıktan dolayı herkesten çok özür diliyorum, bir önceki yazımı

kendime yakıştıramadım geri alıyorum. Çok canım sıkılmaz ise başka cevap yazmayacağım.

 

Saygılarımla.

 

Delphi - .....................................

 

Re: Re: Re: Coder Test 5

Cevap vermeyeceğim dedim  ama kendimi tutamadım

 

1- İki Üniversite mezunuyum sonuncuyu 1993 yılında High Honour Derecesiyle  bitirdim.

2- Bitirme projem AI (yapay Zeka) üzerineydi.

   Türkiyedeki 4 Üniversite İstatistik çalışmalarında projeden yaralanıp, bu sebeple

   Teşekkür yazısı gönderdi.

3- Askerliğimi 33 yaşında Bitirdim ve Keskin Nişancı ödülü aldım.

   (Neden geç yaptığımı merak edene izah edebilirim)

   (Keskin nişancı olmak mantığını kullananlar için çocuk oyuncağı,

   kahve içme, sakin ol,nefesini tut, meşhur 3 nokta ile hedefi aynı hizaya getir

   parmagının ucuyla hafifçe dokun. )

4- Asla yedekleme ve  hata konusunda titremedim, bu konuda çok basit kurallarımız vardır,

   kurallara uyarsan gece rahat uyursun.(merak edenlere bu kuralları gönderirim)

5- O kadar laftan sonra hala bilmişlik taslıyorsun kendin sorup kendinin içinden

   çıkamadığın sorunları çözme yöntemlerinden bahsediyorsun. Benim yedekleme görevim yok

   hata yaparsam sadece işlemlerde hata yapabilirim , ama denemeler gerçek verilerle yapılmaz

   genellikle bir gün önceki yedeklerle yapılır. Günlerce denendikten sonra hata yoksa işleme geçilir.

6- Yedekleme için kendi geliştirdiğim bir sistemim var

   20.000 bilgisayar 10 arlı en alt sistemler (9+1) bir üst sisteme .... (20.000 i

   nasıl bulacağını binary tree bildiğine göre kolayca bulabilirsin.) Her alt sistem

   kendinin bir üst sistemindeki veri tabanlarının yedegini tutar.  kendi yazdığım rutin

   ile veri tabanları max 200 kb a sıkıştırılmış  yedek yeri tabanlarını tutarlar.

   (bunun nasıl yapıldığı anlatılamayacak kadar uzun bir bilgi, paylaşamadığım için

   herkesten özür diliyorum) kısaca her anlık işlemde benim 20.000 adet yedeğim var,

   titremem gerekmiyor.

7- yıgın dediğin şey lifo (Last in first out) ile çalışan STACK ve birde yazmayı

   unutmuşsun fifo (first in first out) ile çalışan QUEUE olmasın sakın.

8- Öğretim görevlilerinin yüzlercesi ile çalıştım ve haklarındaki analizim kesinlikle

   doğru istersen kendi kendini objektif olarak sorgula gerçeklerle yüzleş.

9- Ben başladığımda 80286 lar değil 8086 lar henüz üretiliyordu, MSDos un esamesi

   yoktu ortadaniversitede yazıcı olarak daisy wheel kullanır punch Card lara

   veri kaydederdik. Fortran en baba dildi, ticari programlar cobol ile yazılırdı.

   Türkiyenin ilk bilgisayar dergisi "Bilgisayar Pazarı" nı hatırlarmısın? Bulabilirsen

   düzenledikleri yazılım yarışmalarında derece alanlara bir göz at bakalım kimi göreceksin.

   Towers of Hanoi oyununu bilirmisin? algoritması ve flow chart ı aldığım ilk

   pascal dersindeki sınav sorumdu, o sınavdan kaç aldım dersin?

   Eminim Flow Chart ın ne olduğunu öğrencilerine öğretiyorsundur.

10- Bulunduğum konuma tırnaklarımla kazıyarak geldim, ne sana ne başkasına laf

    söyletmem, torpille kayırmayla işim olmaz, kimsenin alt kademesindede çalışmıyorum.

11- KodBank ı yazanların ellerine sağlık, ama senin gibiler burayı bozdu.

    Bozulmuş bir şeyi daha fazla bozamazsın, öğrencilerine söyle onlarda burayı

    ıvır zıvırla doldurmalarını öğütlede senin nasıl oyun bozan olduğunu anlasınlar.

12- Yazdığın kodlara kesinlikle laf etmedim, buranın amacı bu zaten,

    " bildiğin varsa konuş feyz alsınlar yoksa sus seni adam sansınlar"

13- Buraya neden çok fazla kod göndermediğime gelince, ya zaten yazılmış yada

    burda yazılamayacak kadar uzun ve teferruatlı.

 

Umarım aklını başına alır eskiden olduğu gibi güzel kodlarını göndermeye devam edersin,

yada almaz burayı çöplüğe dönüştürmeye devam edersin. Senin bileceğin iş.

 

Verdiğim rahatsızlıktan dolayı herkesten çok özür diliyorum, bir önceki yazımı

kendime yakıştıramadım geri alıyorum. Çok canım sıkılmaz ise başka cevap yazmayacağım.

 

Saygılarımla.

 

Delphi - .....................................

 

neoturk:  Re: Re: Coder Test 5

"

Neoturk artık baydın bizi, daha önce bir bok anlamadan benim yaptığım yoruma

cevap yazdın ,cevap vermedim , neden biliyormusun çirkefe bulaşmamak için.

 

Günde 20000 (sayı ile yirmibin) bilgisayar uzerinde üzerinde çalışan uygulamayı

5 yıldır yürütüyorum ve işim kuruşu kuruşuna para ile, yapılacak tek kuruşluk

hata aradan yıllar dahi geçse bana hesabı sorulacak türden.

 

Burada kimsenin ilkokul seviyesindeki soru ve milleti sınama gayretinle

ilgilendiginini sanmıyorum,sen kısa pantolonla gezerken bizler üretim yapıyorduk.

Herkesi küçümsemen , öğretmen edasıyla laf kalabalığı,kitap yorumu yapman benim

canımı sıkıyor.

 

Buradaki insanlara yardımın olabilecegine inandığın bir kodun var ise yaz

yoksa sus otur. kimse senin öğrencin, cömezin değil, burasıda forum, test yada

sınav merkezi değil, hele hele sidik yarıştırma platformu hiç değil.

 

Yazdıklarından öğretim görevlisi yada benzeri olduğun anlaşılıyor, benim

tecrübelerime göre genellikle öğretim görevlileri, piyasada iş yapma cesareti

olmayan, akademik kariyer ile kendini kandıran yada askerden kaçan tiplerdir.

Piyasada iş yapmak öğretim görevlisi olmaya benzemez, karnını doyurmak için bir

proje için yıllarını vermen , bin kişinin ağız kokusunu çekmen,gecelerce

sabahlaman gerekir. çocuk oyuncağı yarım saatte yanlız başına bir odada çözdüğün

teknolojik mastürbasyon türünden sorular, gerçek uygulamalara benzemez, yaptığın

tek bir hata ipinin çekilmesine, daha kötüsü aç kalmana sebep olur.

 

Programcılık yada moda deyimiyle yazılım mühendisliği insanların işleri kısaltmak,

kolaylaştırmak, sisteme sokmak, kısacası hayatı kolaylaştırmak için yapılır,

sidik yarıştırmak için degil.

 

Burada insanların bazen senin yazdığın kodlardan coğu kez yararlandım herkese

çok çok teşekkür ediyorum ama burası kullanım amacını aştı  Ne yazarsan yaz artık

ne sana nede başkasına cevap vermeyeceğim.

 

Saygılarımla.

 

yavuz yavuz

"

 

****************************************************************

 

"

...

Neoturk artık baydın bizi, daha önce bir bok anlamadan benim yaptığım yoruma

cevap yazdın ,cevap vermedim , neden biliyormusun çirkefe bulaşmamak için.

...

"

 

baydıysam özür diliyorum değerli arkadaşım,

hiç bir yazıyı boş yere yazmam,

hiç bir yorumu boş yere yapmam.

eğer anlamadığım bir şey varsa, ve bunu da farkında olmadan yapmış isem

ben senden özür diliyorum.

 

"

...

Günde 20000 (sayı ile yirmibin) bilgisayar uzerinde üzerinde çalışan uygulamayı

5 yıldır yürütüyorum ve işim kuruşu kuruşuna para ile, yapılacak tek kuruşluk

hata aradan yıllar dahi geçse bana hesabı sorulacak türden.

...

"

 

yaptığın işi takdir ediyorum, ve önemsiyorum.

yazdığına bakılırsa ATM veya büyük veri tabanlarıyla ilgileniyorsun,mesleğin gereği.

1994 yılında SSK kurumları için hazırlanan "Mali Bütçe ve Emekli Sandığı" projesi

yapılırken (AS/400 sistemlerde) ben de orada bulundum yavuz. İşinin öneminin farkındayım.

 

"

...

Burada kimsenin ilkokul seviyesindeki soru ve milleti sınama gayretinle

ilgilendiginini sanmıyorum,sen kısa pantolonla gezerken bizler üretim yapıyorduk.

Herkesi küçümsemen , öğretmen edasıyla laf kalabalığı,kitap yorumu yapman benim

canımı sıkıyor.

...

"

 

Herkesi küçümsediğimi nereden çıkarıyorsun?...

Küçümsemek ile Kızmak tabiri caizse Fırça Atmak farklı şeylerdir!

Haklı olabilirsin, ben kısa pantolonla gezerken sen askerlik yapıyordun,

ben elma-armut savaşı yaparken arka bahçede,

sen ms-dos 4.0 versiyonunu kullanıyordun 80286 model pclerde...

öğretmen edasıyla laf kalabalığı yapmaktansa susarım daha iyi yavuz.

Meydan senindir, buyur....

 

"

...

Buradaki insanlara yardımın olabilecegine inandığın bir kodun var ise yaz

yoksa sus otur. kimse senin öğrencin, cömezin değil, burasıda forum, test yada

sınav merkezi değil, hele hele sidik yarıştırma platformu hiç değil.

...

"

 

en çok kod gönderen kısmına bak yavuz... ve gönderdiğim kodlardan kaç tanesi

işe yaramaz ve boş kod?... hangi sorunun cevabı BOŞ ?... bom-boş ?.....

bana bunu söyle, susup oturacam.

Haklısın kimse benim öğrencim değil,

burası forum değil, test ya da sınav merkezi değil,

sidik yarıştırma platformu da değil...

burası ne?...

kod bank mı ?.... ah evet....

sitenin admini olarak bana bu siteyi savunmakta yerden göğe kadar haklısın ne diyebilirim!

 

 

"

...

Yazdıklarından öğretim görevlisi yada benzeri olduğun anlaşılıyor, benim

tecrübelerime göre genellikle öğretim görevlileri, piyasada iş yapma cesareti

olmayan, akademik kariyer ile kendini kandıran yada askerden kaçan tiplerdir.

Piyasada iş yapmak öğretim görevlisi olmaya benzemez, karnını doyurmak için bir

proje için yıllarını vermen , bin kişinin ağız kokusunu çekmen,gecelerce

sabahlaman gerekir. çocuk oyuncağı yarım saatte yanlız başına bir odada çözdüğün

teknolojik mastürbasyon türünden sorular, gerçek uygulamalara benzemez, yaptığın

tek bir hata ipinin çekilmesine, daha kötüsü aç kalmana sebep olur.

...

"

 

işte burada DURUNUZ derim değerli arkadaşım,

öğretim görevlisi olup olmadığım konusunda hakkımda bir şey bilmiyorsun,

öğretim görevlisi olsam da, olmasam da, böyle bir şeyi söylemene müsade etmem.

Akademik kariyer takıntım olsaydı buralarda gezinip birilerinin beynine

bilgi aşılamaya çalışmazdım. Söylediğin yorumlara katılmıyorum arkadaşım.

Böyle bir genellemede bulunamazsın, nankörlük etme.

Çocuk odasında çözdüğüm teknolojik mastürbasyon türünden sorularım hakkında

şunu anlıyorum ki sen üniversite mezunu bile değilsin, ve eğitim seviyen zayıf.

eminim ki yaptığın işi bir şekilde oraya yerleştirilerek devam ettin.

kendini yetiştirmeye çalıştın, ama eğer günde 20.000 bilgisayarı ilgilendiren

bir yapıdan bahsediyorsan, bana "oyuncak sorular" türünden ithamda bulunmaman

gerekirdi arkadaşım.

Ve anlıyorum ki, senin teknik bilgin akademik konularda epeyce zayıf.

20.000 bilgisayarının veri tabanını ben de tutabilirim, senden daha iyi bir şekilde.

ister oraclede tut, ister sqlserverde tut, istersen as400 de tut umrunda bile değil.

20.000 bilgisayarın birbirlerinin sorgulanmasını ve router üzerindeki önceliklerini

sen belirleyebiliyor musun bana onu söyle?...

söyleyemezsin arkadaşım! çünkü sorduğum sorular "yığın yapısı ve binary-tree"

konularıyla ilgili!

Senin yerinde olsaydım, şu anda kullandığın yazılım tekniğinin GOOGLE deki

binary-tree yapısına benzetmeye çalışırdım. Sen bunları bilir misin yavuz?

Bilmediğine eminim. Eminim çünkü adamın yazısından anlarım ne marifette olduğunu.

İşinde yapacağın hata, seni ilgilendirir. beni ilgilendirmez arkadaşım!

 

Kusura bakma ama madem konu açıldı, biraz çirkeflik katmak istiyorum!

 

UPDATE musteriler SET kartno= '123456'

 

yazdın ve run ettin. uykusuz kalmışsın da "where" cümleciğini bağlamayı unutmuşsun (bak sen)

 

sabah kalkmışsın bir bakmışsın bi sürü telefon!

tüm kolonlar değişmiş 123456 olmuş. 20.000 adet bilgisayar sapıtmaya başlamış...

son backup işleminden bu yana da epeyce veri kaybı olmuş! bak sen şu işe !

 

böyle bir problemle karşılaştın mı yavuz ?....

 

karşılaşmış isen sana ne yapacağını ÖĞRETEYİM,

 

veri tabanlarının tuttuğu log dosyalarını önce okutturmayı öğreneceksin,

kullandığın en iyi dil neyse, o dille bu log dosyasını okutturacaksın.

 

ve son işlenen kayıtları tekrardan sisteme girdireceksin.

 

ne kadar basit oldu dimi ?...

 

sen .bat dosyalarıyla recover dosyaları da oluşturmuşsundur eminim,

hatta o kadar hatasız bir programcısın ki herşeyi 4x4 lük kodlarsın hata yapmadan.

 

herneyse, veri tabanında seni sınav yapacak değilim.

madem ki 20.000 bilgisayarı ilgilendiren bir olayda görevlisin,

ve üzerinde de tir-tir titriyorsun aman hatalı bir şey olmasın diye,

 

kalkıp buralara takılma o azaman arkadaşım, ne işin var senin buralarda ?...

 

oracle mi kullanıyorsun, sqlserver mi kullanıyorsun, as400 mü kullanıyorsun

beni ilgilendirmez....

eğer delphi kullanıyorsan, ilgilendirir !

 

log dosyalarını okutan kodu sana verebilirim, bir gün işine yarayabilir.

olur ya seni ipe götüren bir hata yapabilirsin bir gün........

 

sonuç olarak,

sen ne "binary-tree" ağaç yapısını biliyorsun ( ilk defa duyuyorsundur eminim )

ne de "yığın" yapısını biliyorsundur....

 

eğitimini almış isen ( üniversiteden bahsediyorum değerli arkadaşım )

bunları sana hocaların öğretir!

bunları kitaplarda öğrenemezsin!

 

bunların nerelerde kullanıldığı konusunda da hiç bir fikrin yoktur senin.

20.000 bilgisayarı ilgilendiren bir yapıda, bu konuların veri tabanı ile

ne kadar yakın bağlantılı olduğunu sana ÖZEL DERS OLARAK anlatırım yavuz.

 

Senin işin önemli olabilir, benim işim de önemli !

 

Konumuz iş önemliliği değil !

 

sen bana kalkıp 20.000 bilgisayardan bahsedip,

bu konulara ilişkili olan sorularıma ocuksu" dersen,

bunun cevabını sana "eğitimini al, üniversitesini oku, sonra gel konuş" şeklinde veririm.

 

 

"

...

Programcılık yada moda deyimiyle yazılım mühendisliği insanların işleri kısaltmak,

kolaylaştırmak, sisteme sokmak, kısacası hayatı kolaylaştırmak için yapılır,

sidik yarıştırmak için degil.

Burada insanların bazen senin yazdığın kodlardan coğu kez yararlandım herkese

çok çok teşekkür ediyorum ama burası kullanım amacını aştı  Ne yazarsan yaz artık

ne sana nede başkasına cevap vermeyeceğim.

..."

 

 

haklısın, yazılım mühendisliği sidik yarıştırmak için değil, işleri kısaltmak

ve kolaylaştırmak için yapılır.

benim vurguladığım konu da şu yavuz:

 

"eğer yazılım mühendisi isen,

sana sorulan-verilen-istenen-arzuedilen her türlü projeyi yapacaksın"

anlamına gelir arkadaşım....

 

bu herkes için geçerlidir!!

 

tekrar söylüyorum,

 

kızdığım nokta,

 

"yazılım mühendisi olan bir x adlı kişi,

hem teknik bilgide uzman olmalıdır,

hem mantık bilgisinde uzman olmalıdır"

 

teknik bilgi kendisini yetiştirmekle olur,

yetiştirememiz ise ne anladım ben o yazılım mühendisinden ?...

 

oldu gözlerim doldu !

 

sen kalk, ben yazılım mühendisiyim de,

çocukca soruları cevaplayacak mantığa sahip olama,

sonra da kalk gel "neoturk niye polemik yapıyor?" de

yaparım tabi :)

 

yaparım arkadaşım yaparım :)

 

niye mi çok konuşuyom ?

 

sen yazılım mühendisin, ben de yazılım mühendisiyim.

senin teknik bilgin süper, benim de teknik bilgim süper.

senin mantığın zayıf, benim mantığım kuvvetli.

 

kim kazanır ?........

 

tekrar soruyorum, "kim kazanır ?" ..........

 

tabi ki ben kazanırım !

 

ha buna sen sidik yarışı diyorsan,

 

o zaman gelir beni geçersin, tabiri caizse hatalı anlattığım bir konuyu,

ya da bir kodu, düzeltir gelip yüzüme yapıştırırsın, tabiri caize mor edersin beni!

 

ha ben başkasını mor eder miyim ?

mor ederim arkadaşım !

 

yazılım mühendisi ya da programcı dediğin kişi ( ya da her ne ise )

 

bu işle uğraşıyorsa bordo bereli bir asker olacak arkadaşım !

anladın mı?.. askerlik yapmışsan bilirsin komando eğitimi nasıl olur!

 

bilgisini de geliştirecek,

mantığını da geliştirecek,

tecrübesini de geliştirecek,

bilgisini de paylaşacak!

 

ben paylaşıyor muyum ?....

Tabi ki paylaşıyorum !

 

Ama bir yere kadar !.... hak edeni var, hak etmeyeni var...

 

Buranın ağası ben miyim ?....

 

hayır ben değilim...!

 

açıkçası umrumda bile değil !

 

Buraya bu kadar şeyler yazıp çiziyorsam,

programcılıkta kendime iyi arkadaşlar edinmek içindir!!

bilgimi paylaşıyım da, kafama uygun ve bilgisi dolgun arkadaşlarım olsun şu

sanal dünyada diyorum !

 

şu kod bank açılalı ne kadar oldu bilmiyorum ama,

buraya sorduğum 1 adet soruyu bulamazsın !!

1 tane bile soru sormuşluğum yok !

Gidip kendim araştırdım buldum çözdüm kafa yordum!

 

aptallık etmişim bunca zamandır....

 

cevaplayacak aptal var nasıl olsa....

 

sor sorunu ( öyle ya da böyle )

al cevabını............

 

nerde beleş oraya yerleş.......

 

Emin ol yavuz,

şu kod bankasına acıyorum....

sen de kalkmış bana burayı savunuyorsun, sen buranın admini misin ?....

yoksa ilk üyelerinden misin ?.....

 

şimdi benim kötü niyetli duygularım kabarsa,

ve her öğrencime ( gerçek hayatta )

gidin şu siteye üye olun günde 100 tane abuk subuk şeylerle doldurun

desem, bunu engelleyebilir misin ?

 

sitenin admini de engelleyebilir mi ?.....

 

ilgilenen yok ise, sen de gelip bana NaRa atma değerli arkadaşım.......

 

Chat ortamı olmuş muş, polemik ortamı olmuş muş, kimin umrunda ?.......

 

"bahçelerde maydanoz, gel bize bazı bazı............"

 

saygılarımla_

 

Delphi - .....................................

Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol