![]() |
![]() |
![]() | #1 | |
Çevrimdışı ![]() IF Ticaret Sayısı: (0) | Scripting İleri Seviye Ders: Scripting İleri Seviye Yazan: L4roXyL - Hasan AYDENİZ Tarih: 17 Ağustos 2012 Not: [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] dökümanıdır. Evet arkadaşlar bu makalemizde mIRC Scripting-de kod yazarken daha kısa, hızlı ve işlevsel kod yazma biçimleri hakkında örnekler vereceğim. Ders içeriği scripting-de bildiğiniz kullanımınların, farklı kullanımlar ile daha işlevsel hale gelmesi ve bir takım orta/ileri seviye kod yazarları için pratik ve değişik bilgiler içermektedir. mIRC Scripting her zaman dediğimiz gibi hayal gücüne bağlı, belirli yeterlilikler ile işgören veya gelişime yönelik kodlar yazma sanatıdır. Betik bir dil olduğundan, aynı işlevi getiren bir sonucu çeşitli farklılıklar ile yazabilme olanağını fazlasıyla tanımaktadır bize. Ders başı uyarısı: Ders içeriği yeni kodlamaya başlamış veya normal düzey kodlayıcı arkadaşlar için uygun değildir. Ders içeriğindeki bilgiler, zaten scripting konusunda belirli bir noktaya gelmiş(orta ve ileri düzey kod yazarları) kişilere yöneliktir. Fazla uzatmadan dersimize başlayalım. 1- Ölçüm Parantezleri Kod yazarken sık sık kullandığınız, daha doğrusu eski kodlara bakıldığında görülen "[" - "]" parantezleridir. Türkiye'de ki mIRC Scripting-de bu parantezler genellikle gereksiz biçimlerde kullanımaktadır(bu önizlemem forumlardaki birçok kodlar üzerindendir) Bu parantezler esasında daha çok öncelik tanıma işlevi kullanılır. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde bir aliasımız var. Bu aliası kullanalım. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yaptığımızda: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonucunu alırız doğal bir sıralama ile. Şimdi ölçüm parantezlerini devreye sokalım, örneğin; Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde kullandığımızda sonuç aşağıdaki gibi olacaktır. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Gördüldüğü üzere sıralama değişti. Sıralamanın açıklamasını yapacak olursak, tek ölçüm/öne getirme kullandığımız d3 ilk sıraya alındı. Çift ölçüm kullandığımız d4 verisi 2. sıraya alınmıştır. Çift ölçüm kullanılan d4 verisini bu kullanımda her zaman 2. sırada olacaktır. Bunun sebebi kullanım esnasında ilk girilen ölçüm parantezi d3 verisine aittir. Yani kısacası siz ölcüm yapsanız dahi, internal bir sıralama olacaktır her daim. Ölçüm parantezleri örnek kullanımda değişik yerlere geldiği taktirde bir çok farklılıklar yapabilir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Aşağıdaki kullanımda tamamen tersden sıralama yapacaktır. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Buraya kadar ölçüm parantezlerinin sıralama/öncelik tanıma hakkındaki işlevlerini gördük. Lakin bu parantezler farklı kullanımlarda değişik etkiler yapabilir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde bir kullanım yaptığınızda: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde bir hata alırsınız. Yani geçersiz parametreler hatası. Bu normaldir ve doğru bir bildirimdir. Çünkü $regex() kullanımı normalde $regex(text,re) şeklindedir. Şimdi burada "ama biz %. değişkenine atadık o kullanımı, neden görmüyor?" denilebilir. İşte bu durumda öncelik/gelişim parantezlerini kullanabiliriz. Aynı kullanımı şu şekilde yaptığımızda: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Olarak dönecektir. Yani $regex tanımı, girdiyi doğru olarak algılayıp cevabı verecektir. Devam edelim. Ölçüm parantezleri öncelik tanıma konusunda hemen hemen her yerde geçerlidir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yaptığınızda sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yani tanımın kendisi dönecektir. İşte yine böyle durumlarda ölçüm parantezlerini devreye şu şekilde soktuğumuzda: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yani kısacası çift ölçüm parantezi kullandığımızda tanımda "!" olduğu halde yine işlevini görür. Bu konu hakkında gelişmiş örnekler verelim. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Buraya kadar ölçüm parantezleri hakkında, öncelik tanıma ve değer belirleme örneklerini gördük. Ölçüm parantezleri yukarıda verilen örnekler ve daha değişik şekiller ile kullanılabilir. 2- Matchtext Kısmında Kullanılabilir Değişiklikler Matchtext kod yazan kişilere yabancı bir kelime gelmeyecektir. Bir takım event-lerde olayın gerçekleşmesinde bir nevi sorgu teşkil eden text-dir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanımı, bulunduğumuz herhangi bir kanalda içerisinde "deneme" kelimesi geçen bir satır/text/yazı gönderildiğin -de- demektir. Yukarıdaki kullanım aşağıdaki kullanım ile aynı işlevi görür: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Bu kullanımlar zaten bildiğiniz şeyler. Bazende ilk kelime şu olsun ve eğer 2. hatta 3. kelime varsa işlem yapalım gereksinimi duyulur. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanımı, bulunduğunuz herhangi bir kanala gönderilen text-lerden birinci kelime($1) !deneme ise ve(&&) ikinci kelime($2) varsa demektir. Yani kısacası bu olay sorgu eşleşirse çalışır. (!deneme x - !deneme 1 - !deneme deneme gibi.) Bu tür kullanımlarda yani eğer 2. kelimede varsa gibi kullanımlarda, text-i genellikle matchtext kısmından çıkarıp direk bir /if sorgusu içerisine entegre ederiz. İşte tam burada normalde bitwise operatörlerinden olan "&" operatörünü kullanabiliriz. Bitwise operatörlerinden olan "&" prefix-i "ve" manasına gelir. Yani scripting-deki "&&" gibi. Yukarıdaki kodu bu operatörü kullanarak matchtext kısmına girebiliriz. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yaptığınızda yukarıdaki kullanım ile aynı işlevi görecektir. Yani kısacası external bir sorgu yerine, internal bir sorgu gerçekleşir. Bu kullanımda kodun daha hızlı çalışmasını ve gereksiz karakter fazlalığından kurtulmasını sağlar. Bir örnek daha verelim: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Bulunduğunuz herhangi bir kanala gönderilen text-ler içerisinde ilk kelime !deneme ise ve ikinci(ilk &) üçüncü(ikinci &) varsa demektir. Yani aşağıdaki kullanımlar ile aynıdır. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Vesaire. Buraya kadar matchtext kısmında kullanılan "&" prefixinin ne işe yaradığını gördük. Devam edelim. Matchtext kısmında regular expression kullanabileceğimizi daha önce söylemiştim. Bunun için gereken olay başına "$" prefixini eklemekdi. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Bulunduğunuz herhangi bir kanalda gönderilen text-ler slm veya merhaba kelimesi ile başlayıp/bitiyorsa /echo ile yakalanan veriyi yansıt demektir. Bilindiği üzere matchtext kısmında %değişken de kullanabilirsiniz. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Gönderilen text içerisinde deneme kelimesi geçiyorsa demektir. Buraya kadar anlaşılmayan birşey yok sanırım. Şimdi esas konuya gelecek olursak, $eval/$() sayesinde matchtext kısmında belirlediğimiz bir alias-ıda kullanabiliriz. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklama: Oluşturduğumuz _d ismindeki aliasımıza geriye dönüş işlemi ile(/return) bir regular expression eşleşmesi atadık. Bu eşleşme esasınsa slm/selam/selm/slam - mrhb/merhb/mrheba/merhaba/mrhba vs. kelimeleri ile eşleşir. Kısacası bulunduğumuz herhangi bir kanalda bu kelimelerden birisi gönderilen text-ler arasında sadece $1(1. kelime) ise işlev yapılır. Daha gelişmiş bir örnek verelim. Bu örnek alias veya %değişken-lerinizi matchtext ve kanal kısmında da kullanabileceğinize örnektir. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Oluşturduğumuz _ct ismindeki aliasımızın kullanım şeklinde eğer 1. kelime($1) chan ise kanallar dönecek, eğer yine 1. kelime text ise belirttiğimiz regular expression string-i dönecektir. Yani kısacası TEXT olayında; _ct aliasında bulunan kanallar kısmındaki herhangi bir kanalda, text kısmında bulunan herhangi bir text gönderildiğinde /echo komutu(değiştirilebilir) uygulanır. 3- Döngü İçerisinde Döngü(ler) Kullanma Bildiğiniz üzere /while komutu scripting-de döngüler kullanmak için kullanılır. Bu döngüler içerisinde sorgular dahil olmak üzere birçok şey kullanabilir, hatta bazen döngü içerisinde döngü ve isterseniz döngü(döngü(döngü(vs.)))) şeklindede kullanabilirsiniz. Örnek bir while döngüsü: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde basit bir örnek. Peki /while içerisinde /while kullanılabilirmi? Evet kullanılabilir. Ciddi bir örnek verelim: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Oluşturduğumuz /_wh aliasımız 3 adet while döngüsü kullanılır. İlk döngüde değeri ilk başta %: değişkeni 2 ile eşleştiğinde, 2. döngü başlatılır. 2. döngüdeki değeri ilk başta 6 olan %; değişkeni 4 ile eşleştiğinde, 3. döngü başlatılır. 3. döngü 0 ile eşleştiğinde, 2. döngü devam eder. Ve 2. döngü yine 0 ile eşleştiğinde, ilk döngü son olarak devam ederek 0 ile eşleşir ve döngülerin tamamı kapatılır. Buradaki mevzu bahis nedir? Scripting içerisinde aynı anda 2 döngü kullanamıyoruz. Yukarıdaki örnekde gördüğünüz üzere özetlemek gerekirse: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklindedir. Döngüler hakkında bir kaç bilgi daha verelim.
Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklama: Farkındaysanız 10 tekrarlı bir döngü oluşturuyoruz. Lakin çıkan sonuç sayısı 6 adet. Bunun sebebi /tokenize ile ayrıştırdığımız(32 boşluk karakteri) "5 10 15 20 25 30" verileri toplam 6 adettir. Ve $* tanımını aynı komut içerisinde(/echo) kullandığımız için while döngüsü başlamaz. $* işlemi uygulanır ve dolayısıyla 6 tekrar yapılır. Sonuçların devamlı 10 çıkmasının sebebi döngüyü 10-dan aşağıya 0-a eşleşinceye kadar /dec ettirdiğimiz için, ilk döngünün değişkeni sabitlenir. Zaten ilk döngüde çıkan sonuçda 10 dur. Not: $* ayrıştırıcı tanımı while içerisinde farklı bir komut içerisinde bağımsız kullanılabilir. Lâkin bu kullanımda dahi önceki döngü pause konumuna geçer. $* işlemi bittikten sonra devam eder. Kullanıma göre bu işlevler değişkenlik gösterebilir. Örneğin $* tanımını ilişiksiz ve döngüye ait komut veya komutların işlev satırından önce kullanırsak, ilk önce $* tanımının işlevi gerçekleşir. Ardından döngüye atanan diğer komutlar gerçekleşir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Diğer olarak eğer ilk başta döngünün diğer komutunu ve sonraki işleve $* atarsak, ilk döngü atanmış olan esas komutu 1 defalığına gerçekleştirir. Devamında $* ya atanmış işlemleri gerçekleştirir. Bu işlemler sonlandığında, döngü devam eder. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklama: Sonuç kısmında d ve t harflerini ben manuel olarak ekledim. d = döngü / t = tokenize anlamındadır. Anlamanız daha basit olacaktır bu şekilde. Sonuç olarak yukarıdada değidiğim gibi kullanım şekillerine göre değişiklikler gösterebilir. 4- Tokenize İle İnternal Döngü Bildiğiniz üzere /tokenize komutunu scripting-de ayrıştırma için kullanılır. Genellikle socket-larda kullanılan /tokenize esasında daha değişik işlemler içinde kullanılabilir. Örnek bir tokenize işlemi: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklindedir. Yani komutdaki text kısmı artık ayrı birer kelimedir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Buraya kadar basit /tokenize kullanımlarını gördük. Şimdi /tokenize ile nasıl sorgulamalar yaparız, bu konuya değinelim. Scripting-da bazen basit sorgulamak için /while vb. döngüler kullanılırız. İlk öncelikle /tokenize ile ilişikli kullanılan $* tanımını kullanalım. $* tanımı ayrıştırılan kelimeleri ayrışma sayısınca satır satır verir. Bunu en basitinden /echo kullanarak görebilirsiniz. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Buraya kadar anlaşılmayan birşey yok sanırım. Zaten bunlar bildiğiniz bilgiler. Peki $* kullanarak sorgulama veya değişik işlemler nasıl yaparız. Örneğin yukarıdaki ex* kelimelerini sıralarken hepsini büyük yazdıralım. İşlem: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Not: /scid kullanmamızın sebebi, işlevi sabitleyerek uygular(/timer-ın sabitleme özelliği gibi) üzerinde uygular. Dolayısıyla $!upper kısmı internal döner.($upper(text)) $* ile sorgulama örnekler Örneğin herhangi bir kanal penceresindeki seçili nicklerden($snicks) belirlediğimiz harf ile başyana nickleri listelemek isteyelim. Bunun için /while yada çok iyi kombine edilmiş bir regex kullanmamız gerekebilir. While ile örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanım: /_nl <harf> Şimdi aynı işlevi $* ile yapalım. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanımı: /_nl2 <harf> Gördüğünüz gibi external bir döngü olmadan aynı işlemi /tokenize ile birlikte kullanılan $* sayesinde yapabildik. Şimdi $* tanımında farklı bir kullanım göstereceğim. Komut satırı: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Gördüğünüz gibi normalde kelimelerin sol baştan ilk 3 harfini /echo yapması gerekirken(den), `~$ verisi echo-landı. Bunun sebebi mIRC çoğu internal fier-ları bu şekilde tanımlar. Tokenize ve $* hakkında söyleyeceklerim bu kadar. 5- $remtok Tanımının Önemi Remtok kullanımı bilindiği üzere belirtilen string içerisindeki belirtilen konumda olan ve yine belirtilen biçimi silmeye yarar. Lâkin $remtok tanımın en önemli kısmı silinmesi istenilen text ne ise kesinlikle sadece onu siler. Yani benzer text-leri koruma altına alır. Scripting-de en çok kullanılan genelde text-ler içerisinde kelime/harf silme ayıklama işlemidir. Bunun için bir çok şey kullanılabilir. Örnek: $regsubex, $remove, $removecs, $replace/x vb. Ama bu kullanımların hepsi ($regsubex detaylı string girdileri hariç) silinecek veya değiştirilecek kısmı tam olarak ayıklar. Örnek: Text-imiz şöyle olsun: deneme deneme2 deneme3 deneme4 ene Ve biz bu text içerisinde "ene" kelimesini silmek istiyoruz. Bunun için Türkiye'de en çok ezbere kullanılan tanım $remove olacaktır. Peki deneyelim bakalım. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Evet ene kelimesi silindi. Lakin diğer kelimeler içerisindede olduğu için, onlarda ayıklandı. Yani kısacası bu işlev yanlış bir işlem olmuş durumda. Peki bu durumda ne yapabiliriz? Örneğin $replace kullanalım. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç yine aynı. Değişik bir kullanım deneyelim. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Bu sefer oldu. Lâkin ene kelimesi ortada da olabilirdi veya baştada olabilirdi. Yani dolayısıyla bu yine yeterli bir kullanım olmayacaktır. Hatta yanlış bir kullanım. İşte bu durumda kullanmamız gereken token $remtok tanımıdır. Hemen deneyelim: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç doğru. Gördüğünüz gibi tam eşleşme yaparak ayıklama işlemi gerçekleşti. Bu konuya bu kadar değinmemin sebebi, ileri seviye coder-ların dahi düştüğü basit hatalardan birisidir yukarıdaki kullanımlar. 6- Kelime Sayısı Belirlemede Kullanımlar mIRC Scripting-de özelliklere olaylara dayalı kodlarda genellikle cümle içerisinde kaç kelime var olduğu alınır. Bu tür bir işlevde genellikle $numtok($1-,32) veya $gettok($1-,0,32) gibi tanımlar kullanılır. Bu kullanımlar her ne kadar yanlış olmasada, olaylar içerisinde daha basit bir kullanımı mIRC bize olanak tanımıştır. Bakınız: $0 Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Tanım $0 /tokenize komutuyla herhangi bir ayrıştırma işlemi yapıldığında da kullanılabilir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
7- Tekil İleti Penceresi Kullanımı mIRC üzerinden bağlantı kurduğunuz bir server-da size mesaj gönderen, veya siz tarafından mesaj gönderilen nickler için query penceresi açılır. Text gönderimi/alımı bu pencereler üzerinden yapılılır. Bu tür pencereler üzerinde işlev yapmak için, genellikle: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Kullanılmaktadır. Peki bütün özele gönderilen text-lerin hepsini otomatik olarak kişiye özel query penceresi açmaksızın tek bir pencere nasıl görüntüleyebiliriz dersek. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Komutunu kullanabilir. Açıklama: on/açmak - off/kapatmak - show/pencereyi göstermek - hide/pencereyi saklamak - min/pencereyi minimize konuma getirmek için kullanılır. /dqwindow on yaptığınızda, bu işlemi devreye sokmuş olursunuz. İşlem devreye girdikten sonra, herhangi birisinin özeline göndereceği text Messages penceresinde gösterilir. mIRC default olarak kişi tarafından gelen mesajları; Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şeklinde gösterecektir. Messages penceresindeki editbox-da her daim /msg komutu aktiftir. Yani siz bir text gönderdiğinizde editbox-da /msg komutu yeniden çıkacaktır. Messages penceresi hakkında bazı bilgiler:
Sonuç olarak Messages penceresi üzerinden değişik kullanımlar ile, farklı korumalar veya işlevler yazılabilir. 8- Yığın Bellek Ayırma Hatası mIRC üzerinde kendi komutlarınızı veya tanımlarınızı alias üzerinden oluşturabilirsiniz. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Gibi(kullanım: /_d) Lâkin oluşturduğunuz bir alias içerisinde direkt aynı alias-ı kullanmaya kalktığınızda, 2. kez uygulanmaz. Daha doğrusu, eğer bir işlev varsa işlev gerçekleşir, 2. işlev 1. işlevi gerçekleştirecek bir işlemse, 2. işlev sunucuya gönderilir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
/_d yaptığınızda sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Uyarılarını alırsınız. Bunun sebebi, oluşabilecek kısır döngüleri engellemek içindir. Gördüğünüz gibi, 1 kez mIRC local olarak uyguladı ve 2. kez server-a komut olarak göndermeye kalktı. Yani aliaslar içerisinde aynı alias bazında kısır döngü kurmaya kalktığınızda, mirc buna müsade etmez. Peki alias-lar üzerinde internal kısır döngü oluşturulabilir mi? Evet oluşturulabilir. Yukarıdaki örnek-de geri dönüş işlemini 2. bir alias ile yapmaya kalkalım. Yani yapacağımız işlev şu şekilde: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Bu tablo bir kısır döngüdür. Bir örnekle deneyelim. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yapmanız gereken: /_d1 veya /_d2 Karşımıza çıkan sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
İşte bu uyarının sebebi, yığın belleğe yüklenmede ayırma hatası gerçekleşmesinden kaynaklanır. Kısır döngü her koşulda sonucun değişmesi veya kısır döngünün kesilmesi için bu ikilemeyi standart olarak "255" defa uygular. Kısır döngü devam ediyorsa, yukarıdaki hatayı alırsınız. 9- Timer / Tokenize($*) İlişkisi Tokenize(/tokenize) hakkında yukarıdaki bölümlerde genişce açıklamalarda bulunduk. Lâkin bu bölümüzde daha farklı değişiklerden bahsedeceğiz. /tokenize komutu ile uygulanan $* tanımının ne işe yaradığını söylemiştik. Kısacası değinmek gerekirse, $* tanımı öncesine konan veya işlev içerisinde gerçekleştirilen işlemi ayırıcının algıladığı sayı kadar tekrarlar. Kısa bir örnek verelim: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Gördüğünüz gibi /echo işlemi 3 defa tekrarlandı. Buna sebeb olan "a b c" texti-i içerisinde 3 ayrıştırma işlemi olmasıdır(32/white-space) Şimdi esas konumuza gelecek olursak, /tokenize komutu, /timer komutu ile beraber uygulandığında ne gibi farklı değişiklikler gösterebilir? Yukarıdaki diğer /tokenize açıklamamızda, $* tanımını sorgu için kullanmak istediğimizde /scid veya /scon komutları ile birlikte kullanmamız gerektiğimizi söylemiştik. Bunun sebebinin bu şekilde kullanıldığında, local bazlı olarak gönderilen sorgu veya işlemlerin SABİTLENEREK UYGULANMASI ve yine local bazlı cevap verme özelliğinin olmasıydı. Bunların haricinde(/scid - /scon) ek olarak $* tanımını sorgu veya tanıma yeni bir işlev amaçlı /timer içerisinde de kullanabiliyoruz. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: "deneme danama dinimi" kelimelerini /tokenize 32 ile ayrıştırdık. Elde edilen 3 kelimeyi /scon ile $regex tanımını kullanarak içerisinde string karşılaştırmaları yaptık. Sonuç olarak her kelimenin içerisinde "e, i ve a" harfleri arandı. Yukarıdaki gördüğünüz işlev gayet açık. Şimdi bunu /timer kullanarak nasıl yapabilir? Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Gördüğünüz gibi aynı işlem gerçekleşti. Sonuca dikkat ederseniz /tokenize ile ayrılan kelimeler; Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yani burada internal bir sıralama şekli var. Ve farkındaysanız /timer-da /scon-da bize sonuçları sıralama yolunu takip ederek verdi. Kısacası ilk önce "deneme" kelimesi arandı, sonra "danama" ve en son olarak "dinimi" kelimesi. Sonuçlara bakarsanız ilk gönderilen /echo çıktısı "e" harfidir. Şimdi /timer ile bu işlev yapılırken sıralama değişebiliyormu? Evet değişebiliyor. Örneğin, timer-ın interval/aralık kısmını ile oynayalım. Yukarıdaki /timer işleminde 1 saniye sonra, 1 kez işlemi gerçekleştir diyoruz. Şimdi aşağıdaki vereceğimiz örnekde ise, işlemi hemen ve yine 1 kez gerçekleştir diyeceğiz. Bakalım sıralama da değişiklik olacakmı. Uygulanan komut: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi sıralamada değişiklik oldu. Timer interval kısmı ile oynanınca, sıralamada değişiklik gösterdi ve yukarıdaki sonuçların tam tersi olarak, tersden string karşılaştırması yapıldı. 10- $()/$eval Tanımlarındaki Kullanımlar. mIRC-deki en önemli tanımlardan birisi $eval tanımıdır. Bunu zaten kodlama ile içli dışlı olan kişiler her zaman bilirler. $eval(text,N) tanımı genellikle değişkenlerin verilerini değerlendirmek için kullanılır. Bunun haricinde, herhangi bir text-ide değerlendirebilir. N kısmına 0 girilirse, text kısmı değerlendirilmez. Eğer N kısmı girilmezse, otomatik "1" olarak tanımlanır. Bu konu altında $eval tanımının ne gibi değişiklikler ve bazende çok farklı sonuçlar verdiğini göreceksiniz. Örnekler Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Yukarıda gördüğünüz örnekler gibi, binlerce örnek daha yazılabilir. Bu örnekler sayesinde $eval tanımının(kısa hali $() tanımıdır) değerlendirme bazındaki etkilerini görmüş olursunuz. Eval($eval) hakkında bir kaç bilgi daha verelim. Aşağıdaki bilgilerde kullanımların aynı olduğu gösterilir. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Evaluation hakkında söyleyeceklerim bu kadar. 11- Timer Sabitleme Özelliğini Devre Dışı Bırakma Yolları Bildiğiniz gibi /timer, değişken bir yapısı olan tanımları veya değişkenleri, sabitler. Bu durum çoğu zaman kod yazımında istenilen sonuçların alınmamasına sebep olabilir. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi, $ticks tanımı /timer komutunu ilk açtığımız an sabitlendi. Ve devamlı aynı veriyi bize verdi. Bunun sebebi /timer kullanım içerisinde olan <command> kısmını girilen veri ile sabitler. Yani size /echo ile $ticks tanımının verisini almaya kalksanız dahi, o anki $ticks tanımına ait olan veriyi echo-latır. Bunun önüne daha öncede nasıl geçilebileceğini söylemiştik. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi $ticks tanımının verileri doğru bir şekilde yansıtıldı. Şimdi daha açık yanlış ve doğru olan bir örnekle anlayalım. Yanlış kullanıma örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi, $ticks sabitlenmiş. - Doğru kullanıma örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi $ticks tanımı, doğru olarak sonuç verecektir. Çünki /timer her defasında, tanıma ait olan veriyi sabitleyerek değilde, tanıma ait olan veriyi online olarak verecektir. Şimdi, daha farklı yollar ile bu sabitlemenin önüne geçilebilirmi? Evet geçilebilir. Aşağıdaki kullanımlar $identifier -lar için örneklerdir. Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
- Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Bu vb. yollar ile tanımlar için olan sabitleme özelliğini devre dışı bırakabiliriz. Söz konusu %loops (değişkenler) olduğunda yapmamız gerekenler aşağıdaki gibidir. Doğru kullanımlara örnekler: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Timer sabitleme özelliği hakkında söyleyeceklerim bu kadar. 12- Regsub(Ex) Hakkında Bazı Kullanımlar Regsubex bilindiği gibi belirtilen text-i, yine belirtilen kombinasyonlarla değiştirmenize ve birçok daha işlev yapmanıza olanak sağlayan ileri düzey bir tanımdır. Regex zaten mIRC içerisinde ayrı bir kütüphane olup, mIRC için biraz daha farklı uyarlanmış, metin içerisinde altmetinler elde etmek veya sorgular yapmak için kullanılan mükemmel bir tanımdır. Daha fazla uzatmadan, $regsubex ile alt-metinler nasıl elde edilir bir göz atalım. Yazının devamında ilk öncelikle normal bir scripting kodlayıcısının rahatlıkla anlayabileceği bilgiler verilecektir. Devamında biraz daha ileri düzey örneklerle dersimize son vereceğim. Standart, $regsubex kullanımı: $regsubex([name], text, re, subtext) Açıklaması: [name]: Bu kısım girilmesi mecburi bir alan değildir. Lâkin çok iç içe kullanılan regsubex-larda isim belirtmek $regml veya \belirleyici ile yakalanan veriyi almak için daha iyi olur. Bunun dışında evaluation bracket-lar kullanılabilir tabii, onu ilerleyen kısımlarda anlatacağım. text: Bu kısım altmetin elde edilecek esas metindir. re: Bu kısım değiştirilmesi gereken daha doğrusu alt metini belirleyen kısımdır-ki herşey burada konuşulur- .) subtext: Bu kısım ise "alt metin" dediğimiz kısımdır. Yani bize geri dönüş yaptıran yer. Buraya kadar anlaşılmayan birşey olmadığını varsayıp örneklere geçiyorum. Örnek: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: İlk olarak "/" kısmı karşılaştırmadır. Yani /g(çoklu arama) kullanabilmemiz için bu kısmın girilmesi gerekmektedir. Yani kısacası bir karşılaştırma şu şekilde tanımlayabilirsiniz: /text/parametre Yukarıda kullanılan (e) kısmımız yakalama işlemi için kullanılır. Bu şekilde "e" harfi yakalanan kısım olmuştur. Bunu daha iyi anlamak için: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sanırım buraya kadar anlaşılmayan birşey yok. Şimdi gelişmiş kullanımlara geçelim. Örnekler Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: \n anahtarı yakalanan verileri sayıyla gösterir. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: \ $+ n kullandığımız için, sabitlenen bir text olarak görüldü. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Evaluation brackets kullandığımız için sabitleme özelliği göz ardı edildi. Yukarıda daha detaylı bilgi alabilirsiniz eva-brackets hakkında. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: $* tanımının /tokenize kullanmasak bile internal olarak `~$ şeklinde döndüğünü söylemiştik. Yukarıdaki örnekler ilk örnek hakkında detaylı kullanımlar için verilmiştir. Şimdi seviyeyi biraz daha yükselterek "subtext" kısmında sorgulamar yapabileceğimizi görelim. Örnekler Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: \n parametresinin yakalanan verilerin kaç adet olduğunu sayı olarak verdiğini söylemiştik. Burada yaptığımız işlev, \n eğer 1-e eşit değilse "-" karakteri olarak dönsün diyoruz. Görüldüğü gibi $regsubex içerisinde sorgu kullanabiliyoruz $iif() ile. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: \n 1-e veya 3-e eşit değilse, "-" karakteri olarak dönsün. Aksi halde $v1(kendisi) olarak dönebilir. Regsubex ile hiç external döngü kullanmadan alfabedeki harfleri sıralayalım mesela. Not: Normalde bu tür bir işlev için /while /goto vb. döngüler kullanılabilir. Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: "-" karakterinden(ki bu örnektir) 26 adetlik bir text içerisinde, (.) herhangi bir karakteri yakaladık. Buda bize 26 karakterin tümünüde yakalamıza olanak sağladı. Devamında $calc(96+ \n) ile \n ile alınan sayıları +96 olarak değiştirdik. Devamında $chr() ile bu sayıların ascii karakterini görüntüledik. Son olarak $chr(32) kullanarak her harf arasına boşluk koyduk. Peki şimdi, yukarıdaki kullanımda ortaya çıkan text içerisinde, harflerden birisi küçük, diğeri büyük nasıl yapabiliriz? Deneyelim. Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Görüldüğü gibi ek bir $iif() sorgusu ile bu işlemi gerçekleştirdik. Mantık gayet basittir. Burada denilen şey; eğer \n sayısı, 2 sayısının katları ise karakter normal dönsün. Eğer değilse, karakterler $upper() ile harf(ler) büyütülsün. Böyle bir işlemi /while ile yapmaya kalktığımızda, söyle bir kod yazılabilir. Kod: Kodu kopyalamak için üzerine çift tıklayın!
Şimdi her iki koda baktığımızda aradaki fark nedir? Kısa bir bechmark yapalım. Regsubex-li kodumuz: Internal Loop + $iif() sorgusu + Internal Sorgular Döngülü kodumuz: External Loop + $iif() sorgusu + /if sorgusu + Variables-lar + Harici echo çıktısı Aradaki farkı gördünüz. Unutmayınki mIRC bir external loop bitmeden, diğerini asla gerçekleştirmez. Lâkin aynı anda birden fazla internal loop kullanabilir. İki kullanım arasında 10.000 tekrarlı bir döngü ile bench yapıldığında sonuçlar: Regsubex: 12.963 ms Normal kodumuz: 16.489 ms Gördüğünüz gibi $regsubex kullandığımız kod daha hızlı çalışıyor. Sanırım buraya kadar anlaşılmayan birşey yok. Konu çizgisinden daha fazla çıkmadan $regsubex tanımımıza geri dönelim. Örneklere Devam Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Evaluation bracket tek kullandığımız için, alt-metin $1 şeklinde döndü. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: Evaluation bracket iki tane yan yana kullandığımız için, ilki karakter olarak döner. 2.-si öncelik tanıma işlemini yapar. - Kod: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Sonuç: Kod: Kodu kopyalamak için üzerine çift tıklayın!
Açıklaması: \t(toplam karşılaştırma) olması gerektiği gibi döndü. Çünkü evaluation bracket-lar işlemini tam manası ile görmüş bulunmaktadır. Yani Regsubex hakkında söyleyeceklerim bu ders için bu kadardır. Regsubex konusu ap ayrı bir konudur. Hakkında çok daha fazlası yazılabilir. Ki zaten bu ders-de gereğinden fazla uzun oldu. O yüzden bu dersin 2. sürümünün büyük bir bölümü sadece regsubex hakkında olacaktır. Birkaç Bilgi
Dersimiz 12 madde başlığı altında sona ermiştir. Biraz uzun olduğu için söylenecek bir kaç konuyu, bu dersin ikinci sürümüne bırakmış bulunmaktayım. Onuda ne zaman yazarım? Pek bilinmez. .) Konu L4roXyL tarafından (12 Ekim 2012 Saat 19:15 ) değiştirilmiştir. | |
| ![]() |
![]() | #2 |
Çevrimdışı ![]() IF Ticaret Sayısı: (0) | Cevap: Scripting İleri Seviye Kuru bir teşekkürle geçemiyeceğimi anladım.Gerçekten hobi edinenler adına muazzam bir kaynak olduğunu belirtmeliyim.Gözüme çarpan $regsubex ve $* tokenize var mesela stabil kod yazma mantığına uygun identifierlar. Yazan ellerin dert görmesin,sağolasın. |
| ![]() |
![]() | #4 |
Çevrimdışı ![]() IF Ticaret Sayısı: (0) | Cevap: Scripting İleri Seviye Eline emeğine sağlık dostum. Zaman ayırıp tamamen karşılıksız ve hobi olarak yaptığın bu işteki çalışmalarını forumlardada paylaşman gerçekten çok güzel birşey. Bilgini kendine saklamıyorsun paylaşıyorsun öğretiyorsun. Teşekkür ederim bu güzel yazıyıda paylaştığın için iyi çalışmalar. |
| ![]() |
![]() |
Etiketler |
scripting, seviye, İleri |
Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| |
![]() | ||||
Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
Uygulamalı Tiyatro (İleri Seviye) | Sır | Kurs Eğitimleri | 0 | 31 Aralık 2019 00:52 |
Reklam Tasarımı (İleri Seviye) | Sır | Kurs Eğitimleri | 0 | 27 Aralık 2019 00:11 |
Fotoğraf Çekim Teknikleri (İleri Seviye) | Sır | Kurs Eğitimleri | 0 | 27 Aralık 2019 00:03 |
Kur'an-ı Kerim Tecvidli Okuma 2 (İleri Seviye) | Sır | Kurs Eğitimleri | 0 | 26 Aralık 2019 23:53 |
İşte İleri Demokrasinin İleri Hukuku : Hükmü Cezaevi Müdürü Veriyor | N999 | Haber Arşivi | 0 | 31 Mart 2012 16:09 |