configR paketi ile R’da konfigürasyon dosyaları yazmak, okumak


Şöyle bir config dosyamız olsun, iki parametremiz var:

[max_allowed_error]
=10

[a]
=10

Bu dosyayı R’da okumak için şöyle yaparız:

library(configr)
#
config <- read.config(file="config.ini")
print(config$max_allowed_error)

Gördüğünüz gibi direkt olarak parametrlerimizi alanımıza çağırdık. Şimdi parametreleri değiştirip config.ini dosyamıza bir daha yazdıralım:

yazilacak_veriler <- list(max_allowed_error =200,a=10)
write.config(yazilacak_veriler,file="config.ini")

Bu durumda config.ini dosyamızı açınca değerlerimiz 200 ve 10 olarak görülecektir.

Bu configR paketi bizi dosya aç, oku gibi işlemler yerine config.ini dosyalarından kolayca okuma yazma yapmamızı sağlar.

INI formatı yerine YAML formatı

Daha pratik olan yaml formatını da kullanabilirsiniz

library(configr)
config <- read.config(file="config.ini",file.type = "yaml")
print(config)

yazilacak_veriler <- list(max_allowed_error =200,starting_id=10)
write.config(yazilacak_veriler,file="config.ini",write.type = "yaml")

Sadece Tek Değişkeni Değiştirikten Sonra Dosyaya Yazmak

Yukarıda her write işleminde tüm değişkenleri yeniden yazmamız gerekirdi, ama aşağıdaki gibi liste parametresini yukarıda tanımlayarak tekli parametre güncellemesinden sonra bunu konfigürasyon dosyasına yazdırabiliriz.

library(configr)

yazilacak_veriler <- list(a=10,b=20)

#ilk yazma
write.config(yazilacak_veriler,file="deneme.yaml",write.type = "yaml",)

config <- read.config(file="deneme.yaml",file.type = "yaml")
print(config)

#sadece tek değişkeni editleme
yazilacak_veriler[['a']] = 10000
write.config(yazilacak_veriler,file="deneme.yaml",write.type = "yaml",)

RCrawler ile Web Crawling İşlemi


Metin madenciliği yapabilmek için elde büyük miktarda verinin olması gereklidir. Bu miktardaki veriyi ancak ya hazır bulmak ya da web scraping adını verdiğimiz yöntemlerle web sayfalarından derlemek durumundayız. Bu durumda ise Python için kullanılacak scrapy, ve python selenium gibi kütüphanelerin yanında R için Rvest ve scrapeR gibi kütüphaneler bulunmaktadır.

R için Rcrawl adlı bir kütüphane daha bulunmaktadır. Bu kütüphaneyi yeni keşfettim. RCrawl kütüphanesinin diğerlerinden temel farkı scraping işleminde sayfa içerisinde scrape edilecek elementlerin yerlerini CSS veya XPath ile belirleme ihtiyacının olmaması. Bu durum sayfa içinde “iğne” arama külfetinden kurtarıyor. Ayrıca çok ama çok daha kısa kod ile scraping yapmayı sağlıyor.

library(Rcrawler)
Rcrawler(Website = "https://www.sayfa_adi.com/lg-mobile", 
                    no_cores = 4, 
                    no_conn = 4, 
                    crawlZoneCSSPat = c("#gridListView",".pagination"))

ASlında sadece web sayfasını parametre olarak versek de crawler sayfaları derlemeye ve bir klasöre atmaya başlıyor. Ancak bu kütüphanenin (şu adresteki https://github.com/salimk/Rcrawler ) dokümantasyonunda gördüğüm çok iyi özellikler var. Bunlardan en önemlisi no_cores ve no_conn parametreleri bu parametreler aynı anda birden fazla scraping bağlantısı ile hızı arttırıyor.

Bu crawler epey agresif. Sayfada bulduğu her bağlantıyı açarak o bağlantıyı ve altındaki bağlantıları da alıyor. Bu durum daha sonra baş edilmesi güç miktarda ilgili ilgisiz verinin gelmesine neden olabilir. Bunu engellemek için crawlZoneCSSPat parametresi mevcut, bu parametre saydada sadece ilgili CSS selectorü ile tanımlı yerdeki linkleri (mesela haber linki, yorumlar vs.) açıyor, sayfadaki diğer ilgisiz linklere izin vermiyor.

Kütüphane dokümantasyonunda ayrıca URL parametresi ile filtreleme, proxy ekleme, sadece belli bir url listesini indirme gibi özelliklerin yanında sayfalar arası bağlantıları network grafiği ile gösterme gibi harika özellikler de mevcut.

Keyifli kullanımlar…

Artık Script Src denerek Javascript Yazılmıyor


npm ile ilgili görsel sonucu"

Normalde Javascript ile işimiz olduğunda ne yapardık? Eski web uygulama geliştiricileri hatırlayacaklardır. Hatta bir çok genç geliştirici de halen eski yöntemleri sürdürmeye devam ediyor. Çünkü çalışıyor. Nedir bu yöntem:

<script src="kutuphane_1"/>
<script>
//Buraya işlerimizi kodlarız
</script>

Bu kodları HTML dosyamıza koyarız ve çalışır. Buraya kada problem yok. Sonra ne olur, yeni kütüphaneler ekleriz ve scriptlerimiz şöyle olur

<script src="kutuphane_1"/>
<script src="kutuphane_2"/>
<script src="kutuphane_3"/>
<script src="kutuphane_4"/>
<script src="kutuphane_5"/>
<script src="kutuphane_6"/>



<script>
//Buraya işlerimizi kodlarız
</script>

Çorba Hazır!

İşte hikaye ondan sonra başlar, kütüphaneler çakışır, karışır, kodları düzenlerken bilerek bilmeyerek silinir (Ertan abi….!)

Ondan sonra insanlar Javascript’e sövmeye başlar ve Javascript ile harika şekilde halledilebilecek işleri bile garibim sunucu tarafına C#’a veya Java’ya yaptırır.

Oysa kurallar değişmiştir. npm denen mucizevi paket yöneticisi icat olmuş, insanlar aya çıkmıştır ama bir çok kişi bunu görmezden gelmektedir. Haksız sayılmazlar, çünkü sinsi sinsi yayılıp yüzbinden fazla paketi artık bünyesinde barındırmaktadır npm.

NPM nedir?

Visual Studio kullananlar nuget’i, Python kullananlar pip’i, Linux kullananlar apt-get’i bilirler. Komut satırına şunu getir, bunu kur, bunu güncelle deriz. Bu tür araçlar “konsol üzerinden paketlerimizi kurmamıza olanak verir.”

NPM ya da npm.js ise Javascript kütüphanelerinin tamamını barındıran evrensel bir yerdir. Bu kütüphane yardımı ile yukarıdaki gibi eski usülde “srcipt src” satırlarını şiir gibi dizmezsiniz, lazım olanlarını “npm install” komutu yardımı ile indirir, daha sonra browserify adlı araç yardımı ile (elbette bu da bir npm paketidir) hepsini tek bir “bundle.js” dosyasına sıkıştırır ve sayfanızdan sadece tek bir “bundle.js” dosyası çağırırsınız. Tüm paketler güvenle bir arada olur. Her seferinde bu birleştirme işleminini yapmamak için ise watchify adlı paket kullanabilirsiniz. Bu ise sizin ayrı ayrı javascriptlerinizi her kaydedişte otomatik birleştirir.

Haydi Deneyelim

  • Linux kullanıyorsanız “sudo apt-get install npm” komutu ile windows kullanıyorsanız önce ilgili programı kurun. https://www.npmjs.com/get-npm
  • Konsolu açın ve npm yazıp enter’a basın. Eğer çalışırsa npm kurulmuştur.
  • Boş bir klasör açın ve cd komutu ile içine girin
  • Konsolda bu klasörde iken “npm init” komutunu verin.
  • Bu komut bu klasörde package.json adlı paket envanterini yaratır. Bu bir nevi kuracağınız her paketin otomatik olarak listeleneceği yerdir.
  • Şimdi javascript birleştirme aracı browserify’i kurmak için şu komutu verin: npm install -g browserify
  • Klasöre göz atınca node_modules adlı klasör oluştuğunu görürsünüz bu otomatik inen paketlerdir.
  • Şimdi ise denemek için hesap makinesi kütüphanesi olan arithmetic adlı kütüphaneyi indirelim. Bunun için ise npm install –save arithmetic komutunu kullanırız. Burada save parametresi paketin adını daha önce oluşturduğumuz package.json dosyasına yazar.
  • Her şey hazır, şimdi direkt olarak newway.js diye bir dosya oluşturup içerisine aşağıdaki kodları yazalım:
 var arithmetic = require('arithmetic');
 var x = arithmetic.add(2,4);
 console.log("---merhaba---");
 console.log(x);
  • Şimdi ne oluyor diyebilirsiniz? Bu kodları ayrı bir dosyaya yazdık. Bu kodlardaki arithmetic nesnesi için daha önce duymadığımız ‘require’ fonksiyonunu kullandık. Bu yeni Javascript’çenin importu demek.
  • Şimdi browserify yardımı ile bu javascriptimizi sıkıştıracağız.
  • Bunun için konsola: browserify newway.js -o bundle.js Normalde bu zorunlu değildir ancak olması faydalıdır. Bu komut sonrasında bundle.js adlı bir dosyamız oluşur.
  • Şimdi index.html dosyasını açık sadece <script src="bundle.js"> diyerek dosyamızı çağırabiliriz.

Ne Yaptık, Ne Fark Var?

Normalde bu işlem için önce gidip artihmetic kütüphanesini bulup dosyasını indirip daha sonra bu dosyayı “script src” ile html dosyamıza çağıracaktık. Sonra da kendi yazdığımız (içinnde merhaba yazan) newway.js dosyamızı oluşturacaktık, ortada iki js dosyası ve html içinden çağrılan iki js referansı olacaktı. Bu daha fazla js için daha fazla iş demekti.

Yeni yöntemdeki senaryoda ise tek js dosyası mevcut, ayrıca kütüphaneleri indirmek için sitesine gitmek gerekmiyor.

Buna Değer Mi?

npm paketlerini şuradan inceleyebilirsiniz: https://www.npmjs.com/search?q=keywords:packages

Bu paketlerin içersinde daha önce javascript’e yaptırmadığınız onlarca işlevi barındıran süper paketler var. Örneğin resim işlemeden Json içinden sorgu yapmaya, tarihleri şekillendirmeden (moment.js), yapay zeka ile resim tanıma kütüphanelerine kadar “ücretsiz” yüzbinlerce kütüphane var. Emeğinize değer.

Evet bu yazıyı buraya kadar okumuş pek az kişi olacağını biliyorum, o parmaklar ekrandaki yazıları kaydırırken bir çok fırsat kaçıyor 🙂 Buraya kadar okuduysanız da “ehemm” diyip bu yazıyı unutup eski alışkanlıklarınızla kod yazmaya devam edebilirsiniz. Ama konfor zonda kalmak, ilkelliğe razı olmaktır. Daha sonra javascript çakışmaları yaşadığınızda bu yazıyı hatırlayacaksınız:)

Daha detaylı İngilizce bir yazı için: https://medium.com/jeremy-keeshin/hello-world-for-javascript-with-npm-modules-in-the-browser-6020f82d1072

Beğendiniz mi?

SQL Server Manager’de Tüm Tabloları ve Tablo Adlarını Arama Motoru


SQL Server’da çok fazla sayıda tablo ile uğraşıyorsanız bu tabloları aramak bazen zor olabilir. SQL Server içinde tabloları aramak için bir araç yok. Bunun için SQL Server Search adlı bir eklenti mevcut. Bu eklenti ile yazdığınız bir terimi tüm tablo adlarında ve tabloların içindeki kolon adlarında bulup isterseniz sizi direkt o tabloya yönlendiriyor.

SQL Search Eklentisinin adresi: https://www.red-gate.com/products/sql-development/sql-search/

Web Sayfalarınız için Stres Testi Aracı


Web sayfanıza aynı anda çok fazla sayıda kullanıcı girdiğinde ne olacağını simüle mi etmek istiyorsunuz? Buyrun buradan: Locust.

Bu araç python ile yazılmış. Bunu kullanabilmek için bilgisayarınıza Python kurulmuş olmalıdır. Python kurulumu için: buradan.

Python’u kurduktan sonra konsoldan

pip install locustio

dediğinide Locust kurulmuş olur. Daha sonra test dosyanızı yazarsınız. En ilkel versiyonu burada. Bu dosyayı locustfile.py olarak adlandırın. Bu dosya sadece o sayfaya girmek içindir. Login olmak ve form doldurtmak gibi fonksiyonlar da mümküdür:

from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
    def on_start(self):
        self.diger_sayfa()
    @task(1)
    def diger_sayfa(self):
        response = response = self.client.get("/authentication/register")
class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 0
    max_wait = 0

Son olarak bu kodların bulunduğu klasöre konsoldan gidin ve aşağıdaki komutu çalıştırın:

locust -f locustfile.py --host=http://testedeceginizadres.com

Bu komutu çalıştırdıktan sonra http://localhost:8089 sayfasını açın. Bu sayfa şöyledir:

Bu komutu çalıştırdıktan sonra http://localhost:8089 sayfasını açın. Bu sayfa şöyledir:

Bu alana aynı anda 100 kullanıcının 10 “hatch rate”si ile gireceğimizi simüle edeceğimizi söyledik. “Start swarming’ butona basınca ekran şöyle olur:

Burada sayfanın bu strese nasıl cevap verdiği, cevap verme süreleri ve eğer erişim durdu ise erişimin kesilmesi gibi bilgiler görüntülenir.

Charts ekranından da sayfanın tepkilerini canlı izleyebiliriz.

Bu araç sayesinde ilk stres testimizi yapmış olduk. Daha ileri testler için Locust dokümantasyonunu okuyabilirsiniz.: https://docs.locust.io/en/stable/

Kolay gelsin

Linux’ta Tamamen Sildiğiniz Dosyayı Geri Getirme


Adli bilişimcilik sadece uzmanlarına yarar sağlamaz. Bu bilim özellikle kötü günlerinizde de işe yarayabilir. Diyelim ki tezinizi yanlışlıkla sildiniz. Çöp kutusunda da yok. Bu durumda debian tabanlı linux sürümlerinde (Ubuntu, ElementaryOS gibi) aşağıdaki komutu kullanarak silinmiş dosyayı komut satırında geri getirebilirsiniz. Tabii bu text dosyaları için işe yarıyor. Eğer diğer dosyalar için de tam bir araştırma yapmak isterseniz “photoscan” adlı komutu kullanın.

Gelelim bizim diğer komuta:

grep -a -C 200 -F 'sildiğiniz dosyada geçen özel bir kelime' /dev/sda1

Bu komutu şöyle kullancaksınız. Sildiğiniz dosyada hatırladığınız bir kelime varsa bunu yukarda ilgili alana yazın. En sonda ise ‘sda1’ yazan yere disk adını yazın.

Komut eğer bulabilirse tamamen silinmiş dosya veya dosyaları geri getirip içeriğini komut satırında gösteriyor.

Principal Component Analysis (PCA) R ile nasıl yapılır?


Egzersiz

PCA ile ilgili olarak unuttuklarımızı gözden gözgen geçirmek için basit bir egzersiz tasarladım. Bu örnek hipotetik bir veri seti üzerinde tasarlanmıştır. Durumu tam kavradıktan sonra bunu gerçek veri seti üzerinde uygulayacağız.

Memleket ve Dil Örneği

Diyelim ki bir grup öğrencinin farazi bir okulda Türkçe, Farsça, Arapça ve Süryanice dillerinden aldıkları dil puanları ve memleket bilgileri yer alsın. Bu veri setinde özellikle Van’lı olanları Türkçe ve İngilizcelerinin iyi Farsçalarının da azıcık iyi olmasına özen gösterdik. Mardinlilerin ise Arapçalarının iyi, Türkçe e İngilizcelerinin ise Van’lılara göre kötü olacağını düşündük. Daha sonra Siirtlileri ise Türkçe ve İngilizcelerinin kötü ancak Arapça’da en az Mardinliler kadar iyi olmalarını sağladık. Son olarak Süryanice’de en usta olanların Siirt’liler, Mardinliler ise azıcık Süryaniceye hakim olsun.

Şimdi PCA yaparak bu 5 dil yerine tek bir gösterge ortaya çıkararak tüm veri setinde memleket değişkenini en yüksek ölçüde açıklamayaçalışacağız.

Veri setimiz şuydu:

data = read.csv("ornek2.csv")
rownames(data) <- data$student
data[2:7]
##       memleket turkce farsca arapca ingilizce suryanice
## suat       van     90     60     10        90         0
## garb       van     88     70     11        88         0
## vahi       van     89     71     13        93         0
## mahi       mrd     70     10     90        66        11
## meli       mrd     65     11     98        67         7
## fahro      srt     40     40     89        60        90
## abdo       srt     40     40     89        60        90
## hako       srt     40     40     89        60        90

PCA Uygulaması

data.pca <- prcomp(data[3:7])
data.pca
## Standard deviations (1, .., p=5):
## [1] 62.697451 32.779140  3.550695  1.399083  0.912195
## 
## Rotation (n x k) = (5 x 5):
##                  PC1         PC2        PC3        PC4        PC5
## turkce    -0.3574760  0.11677660 -0.2578622  0.1165373 -0.8823267
## farsca    -0.2328702 -0.56494423  0.7378478 -0.1834692 -0.2202935
## arapca     0.6056701  0.49571857  0.5167242  0.1554323 -0.3102639
## ingilizce -0.2295579 -0.07426912  0.1540874  0.9442049  0.1628538
## suryanice  0.6312284 -0.64494065 -0.3135936  0.1925512 -0.2240209

PC1 adlı komponentimizin %62 oranında tüm veri setini açıkladığını görüyoruz, PC2 adlı komponent ise %32 oranında açıklıyor. Sadece bu iki komponenti kullarak tüm veri setini 62+32 = %94 oranında açıklayabiliriz. Bunun için 5 dille ilgili parametrelere gerek kalmaz.

#library("devtools")
#install_github("vqv/ggbiplot")

Görselleştirme

data.pca adlı değişkenimize tanımladığımız komponentlerden en güçlü iki komponentimizi grafiğe yerleştiriyoruz. Görülen okun yönü ise her bir parametrenin (dil) ekseninde yer aldığı komponente hizmet ettiğini gösteriyor, ok ne kadar uzunsa o parametre o komponente o kadar hizmet ediyor (açıklıyor). Buna göre yatay eksende PCA1 komponentini en çok arapça ve süryanice açıklıyor. Aynı komponenti Türkçe, İngilize ve Farça bilgisi de açıklıyor ancak ters yönde.

Öte yandan Süryanic bilgisi ile Farsça bilgisi ise PCA2’yi açıklıyor bu bilgilerin aksi istikamete ise Arapça yer alıyor. Tüm bu ilişkiler yani hangi komponentin hangi parametre ile ne kadar ilgili olduğu zaten PCA tablosunda görülebiliyor.

library("ggbiplot")
ggbiplot::ggbiplot(data.pca,labels= rownames(data),groups = data$memleket)

Bu grafiğe isimleri de eklediğimizde memleketlerine göre de renklendirdiğimizde sağ alt köşede üç mardinli arkadaşın da aybı yerde yer aldığını ve bu arkadaşların da bir küme olma nedeninin Süryanice bilgisi olduğunu başka bir şeye bakmaksızın anlıyoruz. Yani memlekete bilgisi olmasaydı dahi PCA bize bu arkadaşların ortak bir özelliğinin var olduğunu söylemiş oluyor. Aynı durum grafiğin üstünde siirtiler kaar olmasa da yine ayrı bir grubun var olduğunu gösteriyor. Solda is Van’lılar yer alıyor onlar ise Türkçe, İngilizce ve Farsça bilgisi ile göz dolduruyor 🙂

Sonuçlar

  • PCA ile çok fazla sayıda parametre daha az parametreye indirgenebilir. (PCA1, PCA2 gibi)
  • Bu indiregeme işlemi görselleştirildiğinde birbiri ile ilgili (benzer ya da tam tersi) parametreler (örneğin Türkçe, İngilizce ve Farsça’nın grubun bir kısmı için birbiri ile ilgili parametreler olması yani öğrencilerin memleketindeki şu veya bu nedenden ötürü Farsçası iyi olan kişinin İngilizcesinin de iyi olması gibi) ortaya çıkarılabilir.
  • GGBiplot aracı yardımı ile gözlemlerin (öğrencilerimiz) de grafiğe eklenmesi ile veri seti içinde gizli gruplar da ortaya çıkarılabilir. Örneğimizde memleket kolonu yer almasa bile biz bu öğrencilerinin bazılarının adını koymadığımız bir nedenden ötürü (memleket) grup olduklarını anlamış oluyoruz.