Ekim 5

Merkeziyetsiz Ponzi / Decentralized Ponzi

The English version of the article is below.
Yıllardır yakın çevreme anlatıyorum. kripto para merkeziyetsiz ponzidir. yatırım araçlarını düşündüğünüz zaman, hepsinin arkasında bir fiziksel varlık vardır. Mesela altın bir çok alanda kullanılan değerli bir madendir, yada hisse senedi bir şirkette payınız olduğunun kanıtıdır ve kardan pay almanızı sağlar. Ülkelerin para birimleri ise en kötü ihtimalle ilgili ülkede fiziksel ürün takasına imkan sağlar. Kripto para ise kabul görmediği zaman bir hiçtir. Bir oksijen, hava, kum ya da su bile değildir.

Merkezi olmayan kripto para sadece kara para trafiğine hizmet eder, arz talep dengesi bozulduğu anda ise bir ponziye dönüşür.

örneğin lunaya bakacak olursak; luna alıp yüklü miktarlarda paralar kaybeden insanlar var. arz talep dengesi bozulduğunda herkes kaçtığı anda işin ponzi yüzü ortaya çıkar.

yine bir diğer batık kripto para olan one koine bakacak olursak; dolandırıcılık olduğu ortaya çıktıktan, organizatörleri kaçtıktan sonra dahi alım satımı devam etmiştir, çünkü son zamanlarda para kaptırmış olanların tek çıkar yolu yeni kurbanları sisteme dahil etmektir.

Bu bağlamda, merkeziyetsiz kripto para için, arz-talep dengesi bozulduğunda, kesinlikle bir ponzi aracı olacaklarını söyleyebiliriz.

in english

I’ve been telling my friends for years. Cryptocurrency is a decentralized ponzi. When you think of investment instruments, there is a physical presence behind them all. For example, gold is a precious metal used in many fields, or a stock is proof that you have a share in a company and allows you to get a share of the profits. currencies of countries, on the other hand, at worst, allow physical product exchange in the relevant country. Cryptocurrency is nothing when it is not accepted. It is not even an oxygen, air, sand or water.

Decentralized crypto money only serves dirty money traffic, when the supply and demand balance is disturbed, it turns into a ponzi.

For example, if we look at luna; There are people who bought luna and lost large sums of money. When the supply-demand balance is disturbed, the ponzi side of the business emerges as soon as everyone flees.

If we take a look at “one” coin, which is yet another bankrupt cryptocurrency; The trading continued even after it turned out to be a scam and its organizers escaped, because the only way out for those who have lost money lately is to include new victims in the system.

In this context, we can say that they will definitely become a ponzi tool for decentralized crypto money when the supply-demand balance is disturbed.

Haziran 17

SQL Collation nedir, neden kullanılır, Turkish CI AS takıntısı şart mıdır?

SQL Server’daki collation dediğimiz ve türkçe anlamlı bir kelime bulamadığım kavram, verileriniz için sıralama kuralları, büyük/küçük harf ve aksan duyarlılığı özellikleri sağlar. char ve varchar gibi karakter veri türleri ile kullanılan bu kavram, kod sayfasını ve bu veri türü için temsil edilebilecek karşılık gelen karakterleri belirler.

Dünyada ki hiç bir yazılım geliştiricisine Türkçe’deki büyük “I” harfi ile küçük “i” harfinin farklı olduğunu anlatamazsınız.
Ve inatla Turkish Case Insensitive collation kullanırsanız özellikle server collation ayarı olarak başınıza neler gelir?

Bir çok uluslar arası yazılım kurulum aşamasında dahi sunucunuzda çalışmayabilir.
Sebebi ise kullanılan veritabanında, tablo, kolon, prosedür isimlerinde büyük “I” harfi geçecek olması.
örneğin tabloda UID diye bir kolon var ama kurulum sırasında bir joinde bu alanlar x.uid=y.uid diye bağlandı ise bu query sizin sunucunuzda çalışmayacak. Kurulumu tamamlayamayacaksınız. Binlerce dolar verdiğiniz yazılımı kurmak için ticketlar açacaksınız. En sonunda bir uzman sql serverınızdan trace alacak ve collationdan kaynaklandığını söyleyecek.

peki neden hal böyleyken UNICODE collation kullanmıyoruz.

ya da bu sorunu kalıcı olarak düzeltmenin yolu var mıdır?

düşünün bulursanız bana da haber verin.

Ekim 12

SSL Sertifikası üretme, imzalama, doğrulama


Global ssl sertifika üreticilerinden bıktınız mı? bu paralar artık bu kan emicilere gitmesin değil mi? kendi otoritenizi kurabilirsiniz. hatta ve hatta kurun!

Sırasıyla uygulamanız gereken adımlar;
1- önce bir centos 8 üzerine sertifika otoritesi kuracağız.
2- sonra bu sunucu da root sertifikamızı ve private key imizi oluşturacağız.
zaman zaman root sertifikamızı istemci ve sunucularımızın trusted keystorelarına yükleyeceğiz.
3- sonra örnek bir linux yada windows sunucuda secure bir servis için server key ve server csr (certificate signing request, sertifika imzalama isteği) oluşturacağız.
4- sonra bu isteği sertifika otoritemize gönderip private key ile imzalayacağız.
5- sonra server sertifikamızı alıp servisimizin ayarlarını yapacağız.
6- sonra root sertifikamızı örnek bir istemcinin trusted key store una ekleyeceğiz. (normalde işletim sistemi ve browserlar global sertifika üreticilerinin root sertifikalarını kurulum sırasında bilgisayarınızın keystore una yüklüyorlar, böylece global sertifika üreticilerinin sertifikaları servislerle istemcilerin konuşmalarını güvenli hale getiriyor, gidip secure bir siteye girin, sertifikasının hangi global kan emici tarafından imzalandığına bakın, sonra trusted keystore unuza girip o kan emiciyi kaldırın, artık kan emicinin imzaladığı hiç bir sertifikayı bilgisayarınız kabul etmeyecektir. Active Directory kullanıyorsanız kendi sertifika otoritenizin root sertifikasını basit bir policy ile tüm domain kullanıcılarının bilgisayarına login sırasında yükleyebilirsiniz.)
7- sonra servisimizi bir istemciden (bizim örneğimizde web server kullanıyoruz) çağıracağız ve nasıl trusted göründüğünü inceleyeceğiz.

CA Kurulumu
root olmayan sudoer yetkisi olan kullanıcı ile Centos 8 ca otorite sunucuma ssh ile bağlanıyorum. extra packages içerisinden bir uygulama kuracağım için önce epel i kuruyorum, ardından easy-rsa i kuruyorum.

[baris@labca /]$ sudo dnf install epel-release
[sudo] password for baris:
CentOS-8 — AppStream 3.9 MB/s | 7.0 MB 00:01
…..
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Is this ok [y/N]: y
Key imported successfully
Installed:
epel-release-8–8.el8.noarch
Complete!
[baris@labca /]$ sudo dnf install easy-rsa
Extra Packages for Enterprise Linux 66 kB/s | 118 kB 00:01

Installing:
easy-rsa noarch 3.0.7–1.el8 epel 46 k
Installed size: 117 k
Is this ok [y/N]: y
….
Installed:
easy-rsa-3.0.7–1.el8.noarch
Complete!
/home/baris/ altında easy-rsa klasöründe public ve private keyler oluşturacağım için bir klasör açıyorum, ca işlemleri için gerekli dosyaları
/usr/share/easy-rsa/3/ klasöründen yeni klasörüme symlink olarak bağlıyorum. klasörü baris user ı dışında kimse erişemeyecek şekilde yetkilendiriyorum. private key de bu klasör altında olacağından bu çok önemli. private key i hiç bir şekilde CA sunucusu dışına çıkartmamamız gerekiyor, eğer bu dosya bir şekilde sunucudan çıkarsa daha önce üretip yayınlamış olduğunuz sertifikaların kullanıldığı sistemlerin “man in the middle” ataklarına maruz kalmasının önüne geçemezsiniz.

[baris@labca /]$ mkdir ~/easy-rsa
[baris@labca /]$ ln -s /usr/share/easy-rsa/3/* ~/easy-rsa/
[baris@labca /]$ chmod 700 /home/baris/easy-rsa

ilk olarak init-pki komutu ile public key infrastructure oluşturuyoruz.
[baris@labca /]$ cd ~/easy-rsa
[baris@labca easy-rsa]$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/baris/easy-rsa/pki

nano text editörü oldukça kullanışlıdır, bazı dosyaları editlemek için nano kuruyoruz.
[baris@labca easy-rsa]$ sudo dnf install nano

/baris/easy-rsa altına “vars” diye bir text dosya açarak CA parametrelerimizi tanımlıyoruz
[baris@labca easy-rsa]$ cd ~/easy-rsa
[baris@labca easy-rsa]$ nano vars
set_var EASYRSA_REQ_COUNTRY “TR”
set_var EASYRSA_REQ_PROVINCE “Istanbul”
set_var EASYRSA_REQ_CITY “Beykoz”
set_var EASYRSA_REQ_ORG “TELCO LAB”
set_var EASYRSA_REQ_EMAIL “admin@lab.local”
set_var EASYRSA_REQ_OU “Community”
set_var EASYRSA_ALGO “ec”
set_var EASYRSA_DIGEST “sha512”

CTRL+X ile kaydetme onayını verip çıkıyoruz ve CA mızı oluşturmak için easyrsa komutunu build-ca parametresiyle çalıştırıyoruz. bu kısımda vereceğiniz şifre private key ile sertifika imzalamada ve public key in clientların trusted key storelarına yüklenmesi sırasında sorulacaktır. parametrelere nopass i de ekleyerek password kullanmadan da oluşturabilirsiniz.
[baris@labca easy-rsa]$ ./easyrsa build-ca
Using SSL: openssl OpenSSL 1.1.1c FIPS 28 May 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
…….+++++
………………………..+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorpora ted
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
— — –
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Lab L ocal CA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/baris/easy-rsa/pki/ca.crt
CA sunucusu yani sertifika otoriteniz artık hazır.
public key (yani domaininizdeki tüm istemcilerin trusted key store larına import edeceği root sertifikası) /home/baris/easy-rsa/pki/ca.crt dosyası.
private key (yani diğer sunucularda kullanacağınız sertifikaları imzalayacağınız ve ca sunucusu dışına çıkarmayacağınız key dosyanız) /home/baris/easy-rsa/pki/private/ca.key dosyası.

SECURE WEB SERVER KURULUMU
yine bir başka centos 8 sunucumuzu önce kendi sertifika otoritemiz ile tanıştırarak root sertifikamızı sunucumuzun trusted key store una ekleyeceğiz. ca sunucumuzdaki public key imizi (/home/baris/easy-rsa/pki/ca.crt) cat komutuyla ekrana döktürüp kopyaladıktan sonra yeni sunucumuzda /tmp/ca.crt dosyasını oluşturarak içine kaydediyoruz.

[baris@labca easy-rsa]$ cat ~/easy-rsa/pki/ca.crt
— — -BEGIN CERTIFICATE — — –
MIIDTjCCAjagAwIBAgIUQRY1WZrvgRXMu…..
WMCtB+Xrntns30cWscPuY6MNgM8+a1gxZkruT4xbTnv3oQ==
— — -END CERTIFICATE — — –
[root@SRVB ~]# nano /tmp/ca.crt
— — -BEGIN CERTIFICATE — — –
MIIDTjCCAjagAwIBAgIUQRY1WZrvgRXMu…..
WMCtB+Xrntns30cWscPuY6MNgM8+a1gxZkruT4xbTnv3oQ==
— — -END CERTIFICATE — — –
[root@SRVB ~]# cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
[root@SRVB ~]# update-ca-trust

sunucuma openssl , apache 2 + modssl kurup kendi sertifika otoritemin imzaladığı sertifika ile web hizmeti yayınlayacağım. firewall da 443 portuna erişim izni tanımlayacağım.
[root@SRVB etc]# dnf install openssl httpd mod_ssl
[root@SRVB conf.d]# firewall-cmd -zone=public -add-port=443/tcp - p ermanent
[root@SRVB conf.d]# firewall-cmd -reload

/tmp altında server.key ve server.csr oluşturacağım
[root@SRVB ~]# cd /tmp

[root@SRVB /tmp]# openssl genrsa -out baris-server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
……….+++++
…………………………………+++++
e is 65537 (0x010001)
[root@SRVB /tmp]# openssl req -new -key baris-server.key -out baris-server.req
You are about to be asked to enter information that will be incorpora ted
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
— — –
Country Name (2 letter code) [XX]:TR
State or Province Name (full name) []:Istanbul
Locality Name (eg, city) [Default City]:Istanbul
Organization Name (eg, company) [Default Company Ltd]:BKF RND
Organizational Unit Name (eg, section) []:Community
Common Name (eg, your name or your server’s hostname) []:srvb.lab.loc al
Email Address []:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@SRVB practice-csr]# openssl req -in baris-server.req -noout -su bject
subject=C = TR, ST = Istanbul, L = Istanbul, O = BKF RND, OU = Commun ity, CN = srvb.lab.local

csr talebimi CA sunucuma gönderiyorum. root olmayan kullanıcımı kullanarak yapıyorum.

[root@SRVB practice-csr]# scp baris-server.req baris@192.168.7.49:/tm p/baris-server.req
The authenticity of host ‘192.168.7.49 (192.168.7.49)’ can’t be estab lished.
ECDSA key fingerprint is SHA256:YtxAe/zcUSk1Z5rkmlo430K5/ZYvZMYEVYJo9 t0F0jc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type ‘yes’, ‘no’ or the fingerprint: yes
Warning: Permanently added ‘192.168.7.49’ (ECDSA) to the list of know n hosts.
baris@192.168.7.49’s password:
baris-server.req 100% 1017 1.0MB/s 00:00

CA sunucumda csr ı imzalayarak server.crt dosyasını oluşturup web sunucuma geri gönderiyorum.

[baris@labca ~]$ cd ~/easy-rsa
[baris@labca easy-rsa]$ ./easyrsa import-req /tmp/baris-server.req baris-server

[baris@labca easy-rsa]$ ./easyrsa sign-req server baris-server
Using SSL: openssl OpenSSL 1.1.1c FIPS 28 May 2019

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that thi s request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender  .

Request subject, to be signed as a server certificate for 825 days:

subject=
countryName = TR
stateOrProvinceName = Istanbul
localityName = Istanbul
organizationName = BKF RND
organizationalUnitName = Community
commonName = srvb.lab.local

Type the word ‘yes’ to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /home/baris/easy-rsa/pki/easy-rsa-6199.U4e0G A/tmp.aSdJmT
Enter pass phrase for /home/baris/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName  :PRINTABLE:’TR’
stateOrProvinceName  :ASN.1 12:’Istanbul’
localityName  :ASN.1 12:’Istanbul’
organizationName  :ASN.1 12:’BKF RND’
organizationalUnitName:ASN.1 12:’Community’
commonName  :ASN.1 12:’srvb.lab.local’
Certificate is to be certified until Sep 15 07:33:54 2022 GMT (825 da ys)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/baris/easy-rsa/pki/issued/baris-server. crt

[baris@labca easy-rsa]$ scp pki/issued/baris-server.crt root@192.168. 7.22:/tmp
root@192.168.7.22’s password:
baris-server.crt 100% 4828 236.6KB/s 00:00

[root@SRVB tmp]# ls
baris-server.crt

[root@SRVB /tmp]# cp baris-server.key /etc/httpd/ssl/
[root@SRVB /tmp]# cp baris-server.crt /etc/httpd/ssl/
[root@SRVB /tmp]# cp /tmp/ca.crt /etc/httpd/ssl/

ssl conf içerisinde yeni sertifikamızı tanımlıyoruz

[root@SRVB /tmp]# nano /etc/httpd/conf.d/ssl.conf
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/httpd/ssl/baris-server.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you’ve both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# ECC keys, when in use, can also be configured in parallel
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/httpd/ssl/baris-server.key

[root@SRVB /tmp]#systemctl status httpd
[root@SRVB /tmp]#systemctl enable httpd
[root@SRVB /tmp]#systemctl start httpd
[root@SRVB /tmp]#systemctl status httpd
Secure Web Server kurulumumuz tamamlandı.

İstemci ye root sertifikamızı yükleyip secure web serverımızı
deneyeceğiz.
bunun için bir windows 10 kullanıyorum, mmc (microsoft management console) yi run as admin ile açıyorum. file menüsü add remove snap-ins adımından certificates i seçerek selected bölümüne taşıyıp next e basıyorum. Arada certificates i hangi account için açtığımı soracak “computer account” u seçiyorum.

Test sunucumun https servisini çağırıyorum ve sertifikayı kontrol ediyorum.

 

Mart 10

SILENT SCREEN CAPTURE

https://sourceforge.net/projects/silent-screen-capture/

You can take screenshots from all of your monitors separately and silently by hitting “prt scr” key with this tool.

you can set options in ini file like below;

# log file path
LogPath=c:\sscapture\log
# screen shot folder
SSPath=c:\sscapture
# to disable logs
SaveLogOnExit=No
# to disable notification baloon
NotificationOnCapture=No

Ekim 25

UDP port testi nasıl yapılır?

UDP bir taşıma katmanı protokolüdür. UDP bağlantısız ve güvenilmezdir. UDP akış kontrolü, hata kontrolü ve yeniden gönderim yapmaz. UDP TCP’den hızlıdır. UDP genel olarak video ve ses iletiminde kullanılır. UDP asla önemli dökümanların iletiminde kullanılmaz.

Örneğin bulunduğunuz networkten başka bir networkdeki UDP bir servise veri göndermeniz gerekiyor. Öncelikle Trace Route komutuyla tüm trafiğin yolunu tespit etmeniz gerekir, aradaki noktalardan bir tanesi bile bazı paketleri göndermezse istediğiniz iletişimi sağlayamayabilirsiniz.

UDP testleri için bir araç olmadığını farkettim ve udp port dinleyen ve udp client olarak sunuculara bağlanabileceğiniz 2 uygulama geliştirdim. UDP test tool u olarak https://sourceforge.net/projects/udptelnet/ adresindeki udptelnet i kullanabilirsiniz.

Temmuz 7

Export Call Records from Genesys Pureconnect for Verint

  • You should select all records to be export from I3_IC database and insert them to a table.
    Below you can see “insert select” statement to do this.

TRUNCATE TABLE EXPORT4VERINT
GO
INSERT INTO EXPORT4VERINT 
 select distinct rd.RecordingId AS RecordingId, ConnectedDateTimeGMT, replace(convert(nvarchar(10),cd.ConnectedDateTimeGMT,111),'/','-') AS StartDate, LEFT(convert(nvarchar(12),cd.ConnectedDateTimeGMT,114),8)+'.'+
 RIGHT(convert(nvarchar(12),cd.ConnectedDateTimeGMT,114),3) AS StartTime,
 replace(convert(nvarchar(10),cd.TerminatedDateTimeGMT,111),'/','-') AS EndDate,
 LEFT(convert(nvarchar(12),cd.TerminatedDateTimeGMT,114),8)+'.'+
 RIGHT(convert(nvarchar(12),cd.TerminatedDateTimeGMT,114),3) AS EndTime,
 case when cd.CallDirection='Outbound' then 2 else 1 end as Direction,
 cd.CallDirection, cd.nHeld, cd.nConference, cd.nTransfer,
 cd.HoldDurationSeconds,cd.LocalNumber as LocalUserId,
 cd.StationId,cd.RemoteNumber,
 replace(replace(replace(
 replace(cd.DNIS,'-',''), 'sip:',''), '@CICAIPADDR:5060',''), '@CICBIPADDR:5060',''
 ) as DNIS,
 cd.LocalNumber,cd.CallId as InteractionId, 
 replace(cd.AssignedWorkGroup,'-','') as AssignedWorkGroup, cd.LocalName
 from calldetail_viw cd with (nolock)
 inner join RecordingDetail_viw rd with (nolock) on cd.CallId=rd.InteractionId
 Where 
 cd.ConnectedDateTimeGMT between '20171201 00:00:00' and '20171202 00:00:00'
 and cd.InteractionType=0 
 and cd.StationId like '%STATION%'
 and cd.localnumber in (
 'EXTENSON1','EXTENSION2'
 )
 order by InteractionId

 

  • You should execute BkfRc4PureConnect2Verint.exe from command line after collect all records.

Tool is located in g:\projectfolder\tool\bkf folder.

BkfRc4PureConnect2Verint.exe CICSERVER CICUSER ConnectedDateTimeGMT RecordingId 2018-06-07 00:00:00 2018-06-08 00:00:00 EXPORT4VERINT g:\projectfolder\ G:\projectfolder\tool\temp_prod.xml 1 gsm StartDate 1

PARAMETERS:

CIC HOST: CICSERVER

CIC USER: CICUSER *user should have read rights to get records, you should configure this from Recorder Policy – Security Rights in PureConnect Administrator. The User should not have any License.

DateTime Field Name: ConnectedDateTimeGMT

RecordingId field Name: RecordingId

Start Date: 2018-06-07 *YYYY-MM-DD

Start Time: 00:00:00

End Date: 2018-06-08 *YYYY-MM-DD

End Time: 00:00:00

Table Name: EXPORT4VERINT

Export Path: g:\projectfolder\ *last backspace (“\”) is most important

Template File: G:\projectfolder\tool\temp_prod.xml

Convert Flag: 1 *use 1 if file should convert to wav otherwise use 0

CIC File Extension: gsm *CIC file type. gsm, wav … etc

Folder Field Name: StartDate  *records will categorize by this field

Delete after convert flag: 1 *if you convert from other format to wav format you should delete old files

 

if you need this tool you can send me an email (baris @ bariskayar.com)

 

 

Mart 14

JS ve SQL ile iki nokta arasındaki mesafeyi ölçme

Günümüzde bir çok mobil uygulama ve web sitesi tablet, akıllı telefon ve gps desteği olan masaüstü yada dizüstü bilgisayarların lokasyon bilgilerini alabilmekte. uygulamalarda HTML5 Geolocation kütüphanesi kullanılmakta.

Uygulamalarda GPS koordinatlarını almak için


<!DOCTYPE html>
<html><body>
<p>Kordinatlar için tıklayın.</p>
<button onclick="lokasyonuBul()">Burayı tıkla</button>
<p id="lokasyonBilgi"></p>
<script>
var x = document.getElementById("lokasyonBilgi");
function lokasyonuBul() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else { 
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}
function showPosition(position) {
    x.innerHTML = "Latitude: " + position.coords.latitude + 
    "<br>Longitude: " + position.coords.longitude;
}
</script>
</body></html>

SQL ile iki nokta arası kuş uçuşu mesafeyi hesaplamak için:


CREATE FUNCTION MesafeKacMetre(
@Latitude1 float,
@Longitude1 float,
@Latitude2 float,
@Longitude2 float
)
RETURNS float
AS 
BEGIN
-- CONSTANTS
DECLARE @EarthRadiusInMeter float;
--SET @EarthRadiusInMiles = 3963.1
SET @EarthRadiusInMeter = 3963.1 * 1609.344
DECLARE @PI  float;
SET @PI = PI();
-- RADIANS conversion
DECLARE @lat1Radians float;
DECLARE @long1Radians float;
DECLARE @lat2Radians float;
DECLARE @long2Radians float;
SET @lat1Radians = @Latitude1 * @PI / 180;
SET @long1Radians = @Longitude1 * @PI / 180;
SET @lat2Radians = @Latitude2 * @PI / 180;
SET @long2Radians = @Longitude2 * @PI / 180;
RETURN Acos(
Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) +
Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) +
Sin(@lat1Radians) * Sin(@lat2Radians)
) * @EarthRadiusInMeter;
END
 
select dbo.MesafeKacMetre( 29.0904, 41.0944, 29.0778, 41.0970 )

Şubat 14

Windows updatelerini toplu olarak kaldırma

Windows 10 ile birlikte microsoft güvenlik güncellemeleri başa bela olmaya başladı.
Bazı güncellemelerin bazı uygulamaların ağ üzerindeki hareketlerini kısıtlayan ters etkilere sebep olması sinirleri iyice gerdi.
Microsoft güncellemelerini toplu olarak kaldırmak için aşağıdaki toplu işlem dosyasını kullanabilirsiniz:


@echo off
FOR /f "tokens=1-6 delims== " %%a IN ('wmic qfe') DO (
 rem echo a=%%a b=%%b c=%%c d=%%d e=%%e f=%%f
 IF [%%d]==[Security] (
  echo security update: %%b kaldiriliyor.
  wusa /uninstall /kb:%%b /quiet /norestart
 )
 IF [%%d]==[Update] (
  echo update: %%b kaldiriliyor.
  wusa /uninstall /kb:%%b /quiet /norestart
 )
)

Ocak 26

Javascript ile Slot Makinesi

Geçenlerde Alexandrapoli’de Alexandrapouli hotel’in içindeki Casino Thraki’de “20 super hot” oynadım. Oyun hızlı kaybettirmeyen eğlenceli bir oyun. Hoşuma gittiği için javascript te oyunun bir benzerini yazmaya karar verdim.
Oyun rastgele sembollerin dizildiği 5 tane tekerlekten oluşuyor. Bu tekerlekler rastgele hızlarla dönüyor. Durduğunda her tekerlek üzerinde 3 adet sembol den oluşan 3×5 lik bir matris değerlendirmeye alınıyor. 20 adet sıralama bu matrisin içinde kontrol ediliyor ve dizilimlere göre bahisin katları kazanılıyor.

20 dizilimin 3×5 matris üzerindeki sıralamaları:


  var Lines = [];
  Lines[1 ]=[[1,1],[1,2],[1,3],[1,4],[1,5]];
  Lines[2 ]=[[2,1],[2,2],[2,3],[2,4],[2,5]];
  Lines[3 ]=[[3,1],[3,2],[3,3],[3,4],[3,5]];
  Lines[4 ]=[[1,1],[2,2],[3,3],[2,4],[1,5]];
  Lines[5 ]=[[3,1],[2,2],[1,3],[2,4],[3,5]];
  Lines[6 ]=[[1,1],[1,2],[2,3],[3,4],[3,5]];
  Lines[7 ]=[[3,1],[3,2],[2,3],[1,4],[1,5]];
  Lines[8 ]=[[2,1],[1,2],[1,3],[1,4],[2,5]];
  Lines[9 ]=[[2,1],[3,2],[3,3],[3,4],[2,5]];
  Lines[10]=[[1,1],[2,2],[2,3],[2,4],[1,5]];
  Lines[11]=[[3,1],[2,2],[2,3],[2,4],[3,5]];
  Lines[12]=[[2,1],[3,2],[2,3],[1,4],[2,5]];
  Lines[13]=[[2,1],[1,2],[2,3],[3,4],[2,5]];
  Lines[14]=[[1,1],[2,2],[1,3],[2,4],[1,5]];
  Lines[15]=[[3,1],[2,2],[3,3],[2,4],[3,5]];
  Lines[16]=[[2,1],[2,2],[1,3],[2,4],[2,5]];
  Lines[17]=[[2,1],[2,2],[3,3],[2,4],[2,5]];
  Lines[18]=[[1,1],[3,2],[1,3],[3,4],[1,5]];
  Lines[19]=[[3,1],[1,2],[3,3],[1,4],[3,5]];
  Lines[20]=[[2,1],[1,2],[3,3],[1,4],[2,5]];

1. tekerleğin üstündeki sembol ile komşuları aynı olması koşulu ile 3,4,5 yanyana sembol aranıyor.
Çarpan matrisi aşağıdaki gibi.


  var MeyveCarpan3 = {'bigwin':5  , 'yedi':2 , 'muz':1 , 'karpuz':1 , 'erik':1 , 'portakal':0.5, 'limon':0.5, 'kiraz':0.5};
  var MeyveCarpan4 = {'bigwin':20 , 'yedi':20, 'muz':4 , 'karpuz':2 , 'erik':2 , 'portakal':1  , 'limon':1  , 'kiraz':1  };
  var MeyveCarpan5 = {'bigwin':500, 'yedi':50, 'muz':20, 'karpuz':10, 'erik':10, 'portakal':5  , 'limon':5  , 'kiraz':5  };

Tekerleklerde yedi, yıldız, erik, üzüm, karpuz, portakal, limon ve kiraz var. yıldız gelmesi olasılığı en düşük olan sembol. yedi nin olasılığı yıldızdan büyük, üzüm, erik ve karpuzdan daha olasılıklı, karpuz ve erik, geri kalanlardan daha olasılıklı. 3,4 ve 5 komşu gelmesine göre katsayıları değişiyor. 1. çark dışında yedi gelir ise dizilimlerde joker olarak tüm sembollerin yerini tutuyor. yıldız sembolü yerine bigwin üzüm sembolü yerine ise muz kullandım 😀 hızı ayarlanabilir bir simülasyon. bir çok deneme yaptım, uzun vadede tamamen şansa bağlı olduğunda bile kaybedeceğiniz gerçeğini acı bir şekilde gün yüzüne çıkarıyor.

Sabitler ve değişkenler;


  var KacinciEl   = 1; // El sırası
  var pTema      = '20bkf'; //tema dizini, muz.png,yedi.png ..vb dosyalar bu klasörde
  var pSembolGenislik = '130';//sembollerin boyutu
  var beklemeKatsayisi= 5; //kazanç olan ellerde otomatik çevirme aktif iken beklemeKatsayisi*cevirmesüresi kadar bekler
  var cevirmeSuresi = 250;//1000;// otomatik çevirmelerde milisaniye kadar bekler, tekerlek dönüş süresi aynı zamanda
  var Bahis    = 10; // başlangıç bahis ayarı
  var Kredi    = 5000; // başlangıç kredi ayarı
  var ElTop   = 0; // El de oluşan toplam kazanç
  var pTekerlekler   = []; // Tekerlekler
  var hSlot    = 9; // tekerlekteki eleman sayısı
  var vSlot    = 5; // tekerlek sayısı
  var autoPlay = false; // otomatik dönüş modu
  var slotDizi = []; // slot sonucunda gelen 3x5 lik matris
  var slotEkran = []; // slotun ekrandaki nesneleri
  slotEkran[1]=['', '#s_1_1', '#s_1_2', '#s_1_3', '#s_1_4', '#s_1_5'];
  slotEkran[2]=['', '#s_9_1', '#s_9_2', '#s_9_3', '#s_9_4', '#s_9_5'];
  slotEkran[3]=['', '#s_8_1', '#s_8_2', '#s_8_3', '#s_8_4', '#s_8_5'];

Tekerlek üreten fonksiyon;


  function yeniMeyveSerisi(){
  var pMixed    = [];
  var pRandomMeyve, secilenMeyve = null;
  var pMeyveler  = [  
          'bigwin','bigwin',
          'yedi','yedi','yedi','yedi',
          'muz','muz','muz','muz','muz',
          'karpuz','karpuz','karpuz','karpuz',
          'karpuz','karpuz','karpuz',
          'erik','erik','erik',
          'erik','erik','erik',                             
          'portakal','portakal','portakal',
          'portakal','portakal','portakal',  
          'portakal','portakal','portakal',  
          'limon','limon','limon',
          'limon','limon','limon',
          'limon','limon','limon',
          'kiraz','kiraz','kiraz',
          'kiraz','kiraz','kiraz',
          'kiraz','kiraz','kiraz',

          'bigwin','bigwin',
          'yedi','yedi','yedi','yedi',
          'muz','muz','muz','muz','muz',
          'karpuz','karpuz','karpuz','karpuz',
          'karpuz','karpuz','karpuz',
          'erik','erik','erik',
          'erik','erik','erik',
          'portakal','portakal','portakal',
          'portakal','portakal','portakal',
          'portakal','portakal','portakal',
          'limon','limon','limon',
          'limon','limon','limon',
          'limon','limon','limon',
          'kiraz','kiraz','kiraz',
          'kiraz','kiraz','kiraz',
          'kiraz','kiraz','kiraz'
           ];//Meyveler
    
    while (pMixed.length <= pMeyveler.length){
      secilenMeyve='';
      pRandomMeyve  = Math.floor((Math.random() * pMeyveler.length) );
      secilenMeyve = pMeyveler[pRandomMeyve];
      pMeyveler.splice(pRandomMeyve,1);
      if (secilenMeyve != '') pMixed.push(secilenMeyve);
    }
  return pMixed;
  }  

Dizilimleri hesaplayan fonksiyon;


  function LineHesapla(LineNumara,SonucMatrixi){
    var cercevelenecekHucre=[];
    var LastMeyve = "";
    var LineTop = 0;
    var MeyveSayisi = {'bigwin':0   , 'yedi':0 , 'muz':0 , 'karpuz':0 , 'erik':0 , 'portakal':0  , 'limon':0  , 'kiraz':0  };
    for (k=0;k<=Lines[LineNumara].length-1;k++){
      if (LastMeyve==="") 
        LastMeyve = SonucMatrixi[Lines[LineNumara][k][0]][Lines[LineNumara][k][1]];
        else 
        if (
          LastMeyve != SonucMatrixi[Lines[LineNumara][k][0]][Lines[LineNumara][k][1]] &&
          SonucMatrixi[Lines[LineNumara][k][0]][Lines[LineNumara][k][1]] != "yedi" 
          ) break;
      //hep ilk elemanı arttır
      MeyveSayisi[SonucMatrixi[Lines[LineNumara][0][0]][Lines[LineNumara][0][1]]]++;
      cercevelenecekHucre[k]=slotEkran[Lines[LineNumara][k][0]][Lines[LineNumara][k][1]];
    }
    for (meyve in MeyveSayisi){
      if (MeyveSayisi[meyve]>=3){
      for (hucre=0;hucre < cercevelenecekHucre.length;hucre++) 
      $(cercevelenecekHucre[hucre]).css('border', '5px solid red');
      }
      switch(MeyveSayisi[meyve]) {
        case 3:
          LineTop += MeyveCarpan3[meyve]*Bahis;
        break;
        case 4:
          LineTop += MeyveCarpan4[meyve]*Bahis;
        break;
        case 5:
          LineTop += MeyveCarpan4[meyve]*Bahis;
        break;
      }
    }
    return LineTop;
  }