18 Aralık 2020 Cuma

SQL Server'da Bir Tablonun Veritabanını Bulmak

Merhaba Arkadaşlar,

Kullandığım bir kod bloğunu sizinle de paylaşmak istedim. SQL Server'da birkaç instance üzerinde yüzlerce veritabanınız olabilir. Bazen öyle zamanlar oluyor ki, elinizdeki tablonun hangi database üzerinde yer aldığını bilemeyebiliyorsunuz.

Aşağıdaki gibi bir kod bloğu ile bu dertten kurtulabilirsiniz. :)

sp_msforeachdb 'use [?] select db_name() db,* from sys.tables where name like ''%TableName%'''

Sarı olan kısma tablonuzun adını yazabilirsiniz. İşinize yarayabilir.

Görüşmek üzere.

13 Aralık 2020 Pazar

Veri Ambarında (DWH) Neden SK(Surrogate Key) Üretilir?

Merhaba Arkadaşlar,

DWH işinde, özellikle modelleme yaparken, kaynak sistemdeki arkadaşlara bir mimari kurduğumuzu anlatmak sıkıntılı bir iş. Kendileri webservise iki parametre geçtiği için, dwh etkisini de bu şekilde düşünüyorlar. :)
Girizgahı savunma-vari şekilde yaptıktan sonra, konumuza gelelim: Surrogate Keys(vekil anahtar imiş Türkçesi). 

Malumunuz, OLTP sistemlerde genelde normalize tutulan verileri incelediğimizde, genelde bir primary key olduğunu görebilirsiniz. Bu kimi zaman bir sequence, kimi zaman bir timestamp, kimi zaman bir kombinasyon(işlemtarihi-000-kurum kodu-işlem tipi-seq vb) olabiliyor. Tıpkı OLTP sistemlerde olduğu gibi, Veri Ambarı dünyasında da bir surrogate key kullanımı mevcut. Surrogate Key'ler genelde herhangi bir anlam içermeyen, sequental yapıdaki numeric alanlardır. 

Peki kaynak sistemlerde bir business key varken(ki ona natural key de diyoruz), neden bir daha SK üretiyoruz?

İlk belirtmemiz gereken neden, kaynak sistemlerdeki bu business key'ler(natural key), o sistem içinde bir anlamı olabilir. Örneğin bir şahıs şirketidir. Key olarak TCKN tutuyordur. Ancak sonrasında mevzuat değişmiştir, artık VKN(vergi no) almıştır kendisine. Dolayısıyla datanın şekli şemali tipi vs değişebilir. Bu kaynak ile ilgili bir durum. Absürt örnek vereyim, TCKN yerine de 'bjk1903' gibi bir değer de tutabilirler. Bunu izlemek, değişimleri yönetmek sıkıntı. Üstüne üstlük, bu keyin geçtiği, join kurduğu tüm alanları bulup dwh'te düzeltmek zorunda kalabilirdik. Bu nedenle business key'leri genelde string bir data tipinde tutup, karşılığında SK değer üretmek mantıklıdır. 

Bunun dışında bir diğer neden de, az önce de yazdığım üzere, bus,ness key olarak, upuzun bir kombinasyon tutulabilir. Tabi bu şekilde çok fazla yer kapalayacaktır. Dolaylı olarak performans etkisi yaratacaktır. SK ile hem yerden tasarruf edecek hem de performans sorunu yaşamayacaksınız.

Belki de kritik bir sıkıntı daha da şu: kaynakta, örneğin transactionı fazla olan yapılarda, belli bir süre sonra, truncate edilip, bu natural key'ler en baştan başlatılabilir. Bu çok riskli bir durumdur. DWH data dilmeyip, history'i saklama konusunda hassastır, malumunuz. Bu şekilde büyük işlem karmaşaları ortaya çıkabilir.

Bunun gibi nedenlerden ötürü, kaynak(operasyonel) sistemlerden çekilen tablolar için, veri ambarında genelde bir SK değeri üretilir.

Sonra görüşürüz.

5 Aralık 2020 Cumartesi

Kanban: Classes Of Services

Selamlar Herkese,

Kanban metodolojisinde, backloga gelen işleri yönetmek için bir ritüel daha mevcut: Classes of Services.
Bu yöntemle gelen işleri önceliklendirmek, sıraya almak ve planlamak sağlam bir temele oturuyor. Bu konsept ile işi oturttuğunuz kategoriye göre cost of delay, yani gelen işin maliyetini daha net görebilirsiniz.

Genel anlamda 4'e ayrılır:
1. Expedite
2. Fixed Date
3. Standart
4. Intangible

Elinizde bir iş var ve sprinte alamadınız örneğin. Bu iş size kaça patlar? İşte bu konsept ile bir tahminleme yapabilirsiniz.
Önce internetten bulduğum ve çok güzel özetleyen resim ile göstereyim.

Expedite: Production bug gibi düşünebilirsiniz. Sizde bir günde milyon dolar bile kaybettirebilir. Bu şekilde bir iş geldiğinde, WIP Limit falan kalmaz ortada. Bu iş ya da işler diğer tüm işlerin önüne geçer.

Fixed Date: Regülatif değişiklikler gibi düşünebilirsiniz. Diyelim ki ssl ile bir devlet kurumuna erişiyorsunuz. Kurum kararınca 2 ay içinde TLS'e geçmeniz istendi. Eğer gecikirseniz, yaptırım ve maddi zararlar ortaya çıkar. Planlamak ve atlamamak gerekir, bu sınıftaki işleri.

Standart: Klasik standart müşteri talepleridir. Sıradaki iş direkt çekilir mantığı yani.

Intangible: Aciliyeti olmayan ama yapmazsan ileride masraf çıakrtabilecek altyapı değişimleri gibi düşünebilirsiniz. Uygun bir zaman dilimine planlanabilecek işlerdir.

Sonra görüşürüz.


SQL'de Join Çeşitleri

Merhaba Arkadaşlar,

Temel bir konuya değinmek istiyorum bugün. Zira mail üstünden gelen sorularda özellikle işin outer join kısmında bir kafa karışıklığı olduğu görülüyor. Oracle üzerinden anlatacağım konuları, gidişata göre ayrı başlıklar da açabilirim.

JOIN dediğimiz kavram, birden fazla tablodan veri almamızı sağlayan ifadeler, bağlaçlardır. 

JOIN sorgusu çalıştırırken, Oracle'da Optimizer'ın bazı kontrolleri vardır. Join'i yaparken index kullanılacak mı; full table scan mı gidecek(yani tüm tabloyu tek tek gezecek mi; yoksa nokta atışı yapacak mı gibi çevirebilirim burayı), bunu belirler. Akabinde join'e giren tablo sayısı 2'den fazlaysa, join order'ı yapar. Yani önce küçük tabloları joinler, sonra buradan dönen data set'i üstünden büyük tabloya gider. Bu sayede sorgu performansında artış amaçlanır. Son olarak da yazdığımız join'e bağlı olarak arka planda hangi join method'u(hash-sort merge-nested loop) kullanılır, bu belirlenir. Yöntemlere kısaca ayrı bir başlıkta değineceğim.

Gelelim sql önyüzünde, Toad-plsql developer-sql plus gibi bir arayüzde yazdığınız join türlerine.
1. Inner Join
2. Left Join (Left Outer Join)
3. Right Join (Right Outer Join)
4. Full Join (Full Outer Join)

Öncelikle örnekte kullanmka üzere iki tablo yaratalım.
JoinTableTest1 tablosu takım bilgisi tutuyor olsun.

JoinTableTest2 tablosu da oyuncuları tutuyor olsun; TakımID de foreign key'i ve bu kolon üstünden join kuralım. Tablolar ve alanlar çok uyduruk. :) Joini anlatmak için hızlıca oluşturdum, mantıksal tasarımı sıkıntılı; join'e odaklanın lütfen. :)


INNER JOIN:
İki tablonun joininde eşleşen kayıtlar için sonuç döndüren join türüdür. 
select t1.TakimAdi,t2.OyuncuAdi from JoinTableTest1 t1, JoinTableTest2 t2
where  t1.TakimID=t2.TakimID --bu eşitlikle inner join veriyoruz.
--Yani her iki tabloda TakimID'si eşit olan oyuncuları getiriyor. 


İnternetten aldığım resimle olayı açıklıyorum. 
Örneğimizde iki tabloda takımIDsi aynı olan kayıtlar getiriliyor.

Aynı sorguyu = operatoru yerine, INNER JOIN ile de yazabilirsiniz:
select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1 INNER JOIN JoinTableTest2 t2
ON t1.TakimID=t2.TakimID

Bu da aynı sonucu üretir:



LEFT JOIN:
Kitabi anlatmayacağım. :) Joinin solundaki tablonun tamamı listelenir. Olayın mantığının temeli bu. Eğer select ifadesinde, sağdaki ikinci tablodan kolonlar varsa, solda olup, sağda karşılığı olmayan kayıtlar için, selectteki o kolonlar null gelir. Örnekle açıklamak en güzeli. :)

select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1 LEFT JOIN JoinTableTest2 t2
ON t1.TakimID=t2.TakimID 

Şimdi örnek üstünden açıklayalım. Soldaki tablo nedir: JoinTableTest1. Bu tabloda takımlar vardı. Demek ki eşleşse de eşleşmese de, bu tablonun tüm kayıtları gelecek. Eşleşen 11 kayıt, zaten inner join'de de görmüştük, kafadan gelmiş. Ancak son 2 kayda dikkat buyurun. Oyuncuları tutan JoinTableTest2 tablosunda Trabzonspor ve Galatasaray'lı oyuncu yoktu. Yani eşleşme yok. Bu nedenle OyuncuAdı alanları NULL bir şekilde, bu iki takım da gösterilmiş. Left Join tam olarak böyle bir dünya. :)

Bu sorguyu ben yukarıdaki gibi yazmaya üşeniyorum. (+) ile yazıyorum. Bu şekilde yazmak isteyeneler için:
select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1, JoinTableTest2 t2
where t1.TakimID=t2.TakimID(+)

Eşitliğin t2 kısmına (+) konmuş. Demek ki t1'in hepsini alacağız, şeklinde aklınızda da tutabilirsiniz. :)
Oracle docs'u yerle yeksan ettik. Kendimi eski hbb kanalındaki beyin egzersizci abimiz gibi hissettim. :)

Şekilsel gösterimi de şöyle:



RIGHT JOIN:
Joinin sağındaki tablonun tamamı listelenir. Left'in aynı mantığı var burada da. Eğer select ifadesinde, soldaki birinci tablodan kolonlar varsa, sağda olup, solda karşılığı olmayan kayıtlar için, selectteki o kolonlar null gelir. Ben direkt örneğe geçeyim; en temiz öyle anlaşılır.

select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1 RIGHT JOIN JoinTableTest2 t2
ON t1.TakimID=t2.TakimID


Sağdaki tablomuz nedir: JoinTableTest2. Oyuncu bilgilerini tutan tablo. Eşleşen 11 kayıt yine geliyor. İlave olarak sağdaki oyuncu tablosunda TakımID'si 21 ve 26 olan iki oyuncu bilgisi de geliyor. Yalnız bu takımID'ler, JoinTableTest1 tablosunda yok. Bu nedenle TakımAdı bilgisi boş geliyor. Ancak sağdaki tablonun tüm kayıtları listelendiğinden, Nouma ve İlhan kayıtları, eşleşmese de sonuç kümesinde geliyor.

Tıpkı Left Join'de olduğu gibi, Right Join'de de, aşağıdaki gibi yazabilirsiniz.
select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1, JoinTableTest2 t2
where t1.TakimID(+)=t2.TakimID


Aynı şekilde, t1'in yanında (+) olduğundan, t2'nin hepsi listelenir gibi düşünebilirsiniz.
Şeklini de verelim right outer join'in:


FULL JOIN:
Left Join ve Right Join'in birleşimi gibi düşünülebilinir. İki tablodaki tüm kayıtlar döner. Karşılığı olmayan kayıtlar için, alanlar NULL döner.

select t1.TakimAdi,t2.OyuncuAdi 
from JoinTableTest1 t1 FULL JOIN JoinTableTest2 t2
ON t1.TakimID=t2.TakimID


Gördüğünüz üzere, hem right'taki hem de left'teki kayıtları getirdi. 
Bu join tipini de şu şekilde görselleştirebiliriz; tabi ki kaynak yine internet:

Optimizer'da görülecek olan join tiplerine daha sonra değinelim; okunurluk düşüyor.

Sonra görüşürüz.





12 Kasım 2020 Perşembe

Kabul Kriterleri: Gherkin Formatı

Merhaba Arkadaşlar,

Bildiğiniz üzere user story'lerin temelde 3 bölümü vardır. Hikayenin tanımı - kabul kriterleri - bitimin tanımlanması. Şimdi Kabul Kriterleri kısmına bir alternatif oluşturan dil/model/format üzerinde duracağız: Gherkin Format/Language.

Malumunuz olduğu üzere, Kabul kriterleri müşterinin perspektifinden yapılır. Bunu en etkili kullanabileceğiniz formatlardan birisi de Gherkin yöntemidir. Kimilerine göre 3 kimilerine göre 5e ayrılır.
  • Given
  • When
  • Then
Temelde bu 3leme üstüne kuruludur. Her bir adımda AND ile çoklayabilirsiniz. Bir de senaryoyu sayarsak, toplamda 5 yapar. Hatta daha da geliştirip daha fazla keyword kullanan da var. Evet, anlamsız gelen arkadaşlarım için adımları açıklayalım. :)

Given: description of the state of the system. Yani başlangıç durumudur. Senaryo için başlangıç noktası. 
When: customer or system action. Yani bir aksiyon alınması
Then: result of the action. When adımında alınan aksiyonun sonucu, çıktısı.

Hemen bir örnekle açıklayalım.
Örneğin ödeme sayfasında müşterilerin sorunsuzca ödeme yapabilmesi isteniyor olsun.

Given: Ödeme sayfasına girilmesi; müşterinin ödeme syafasında beklemesi
When: Müşteri ekrana, atıyorum, Krdi Kartı bilgilerini girmesi
Then: Sistemin müşteriye one-time-password(OTP) ile onay sms'i göndermesi.

Gördüğünüz gibi başarılı bir ödeme işleminde bir adımı, gayet düzenli ve anlaşılır bir şekilde kabul kriteri haline dönüştürebildik.

Görüşmek üzere.

6 Kasım 2020 Cuma

Spotify Agile Organization - Spotify Çevik Organizasyonu

Merhaba Arkadaşlar,

Üzerinde mutabık olunamayan ama bazı firmalarca taklit edilen bir diğer Agile organizasyonu ise : Spotify Yapılanması. 

Önce kitabi kısmından bahsedelim, sonra neden itilaf oluşuyor kısaca ona değinelim.
Bir klasik haline gelen internetten resim alıntılama faslıyla başlayalım. :)


Spotify yapılanmasında da agile'daki gibi squad'lar ve bunların birer PO'su var. Tam olarak agile ritüellerini uygulamazlar. Scrum ya da kanban master'ları yoktur. Bir agile coach'a bağlıdırlar ve onunla çalışırlar.

Tribe denilen yapı, birbiriyle ilişkili olan birçok squad'ın bir araya gelmesiyle oluşan bir yapıdır. Yukarıdaki resimden de göreceğiniz üzere, bir tribe altında birçok squad ve her squad'ın da kendi Product Owner'ı vardır. Her tribe'ın da bir tribe leader'ı olmaktadır. Bir önceki yazımda bahsettiğim hiyerarşik bir yapı yok, Product Owner'lar arasında. Chief yok yani. PO'lar kendi aralarında işbirliği yaparlar. High-level bir roadmap üzerinde çalışırlar. Tribe'ın tüm PO'ları birlikte çalışır.

Chapter denen yapı ise, tribe altında, farklı squadlardan, benzer uzmanlığı bulunan kişilerin bilgi paylaşımı ve çözümler için oluşturdukları yapılardır. 

Guild'ler ise farklı tribe'lardan da katılanılan, daha genel, workshop veya atölye tarzında, isteyenin katılabidiği daha genel bir bilgi paylaşımıdır. Chapter'da örneğin arayüz geliştiricileri toplanmıştır. Guild ise tüm geliştiriciler gibi düşünebilirsiniz.

Gelelim bu yapıya yapılan itirazlara. :) Kurumların bu yapıya geçerek, sadece squad ya da direktörlük isimlerini değiştirerek, bu modeli uyguladığını sanmaları en büyük yanlışlardan birisi. Yani bu model size isimlerinizi değişitirip yola devam edin demiyor. 
Bir diğer sıkıntı da, bu model ya da yapılanma, Spotify firmasına göre yıllar içinde tecrübe edilen, denenen bir yapı. Bir modeli alayım, aynısını kullanayım çok başarılı bir yol olmaz. Bunu baz alıp firmalar kendilerine uyarlamadığı sürece, çok da başarılı olmayabilir. Örneğin, scrum master kullanıp da bu yapıyı deneyenler var. :)
Ve bu modelin arkasında Spotify'ın kendi organizasyonel ve kurum kültürü de var. Çalışanlara düşünmeleri eğlenmeleri için verilen zamanlar; hataların pişkince yüze vurulmasından ziyade, denemenin göstergesi olduğu inancı vs vs. Tüm bunları alt alta koyduktan sonra bu model daha anlamlı olacaktır.

Sonra görüşürüz.

3 Kasım 2020 Salı

Chief Product Owner

Merhaba Arkadaşlar,

Chief Product Owner nedir, ne değildir'i kısaca sizinle de paylaşmak istiyorum. Önce bir adım geri gidelim. Agile mantalitesinde, biliyorsunuz, bir product owner-scrum master-development team yer alır. 

Normalde product owner'lar, kitabi terimle anlatmak gerekirse, ürünün değerini arttıran ve bunu da dev team ile çalışarak yapan kişidir. 

Buraya kadar sorun yok. Soru tam olarak şu: " Tek bir Product Owner'ın başa çıkabileceğinden daha büyük bir ürün varsa ne olacak? ( what happens when the product ise too large for a single product owner?)

Bir diğer soru da şu: Tek bir ürün üzerinde çalışan birçok takım varsa ne olacak? ( what happens when you have dozens of teams working on a single project?)

Tam da böyle durumlara karşı, agile organizasyonel yapılanmasında bir kavram karşımıza çıkıyor: Chief Product Owner. 

Chief Product Owner, daha üst seviyeden kararlar alabilen, takım product ownerlarının kendisine bağlı olduğu ve bu takım product owner'larına yön veren kişidir.

Bu yapılanmadaki anahtar kelime HİYERARŞİ'dir (hierarchical organization). Burada ast-üst olayı var yani.  İnternetten yine hazır bir resme kondum; kendim çizmedim, onu paylaşayım sizlerle.


Yani daha üst seviye olaylara bakan, stratejik kararları veren, ürünün nereye gideceğini belirleyen ve hatta bunun için karar verici paydaşlarla görüşen kişidir. Takım PO'su gibi detaylarla ilgilenmez.

Sonra görüşürüz.

7 Ağustos 2020 Cuma

Çocuğumu Hangi Okula Göndermeliyim?

Merhaba Herkese,

Her zaman bilişim ile ilgili yazı yazamayabilirim. :) Benim gibi çocuğunu okula gönderme konusunda başlangıç noktasında olan, yön almak isteyen veya neler yaşandığını duymak isteyen arkadaşlarımız vardır diye yazmak istedim. Zira ben her yazılanı tek tek okudum. :)

Öncelikle ben ilkokul aradım. Aklınıza gelebilecek her şeyi okudum; size de tavsiye ederim: "okul seçerken nelere dikkat etmeliyim", "okul seçimindeki kriterler nelerdir", "doğru okulu nasıl bulmalıyım" vs vs. :)

Her şeyi dinleseniz de mutlaka potansiyel okullarınıza gidin sevgili arkadaşlarım. Bir defa okulu görün. Yerini, muhitini görmeniz iyi olacaktır. Herkesten duyacaksınız, ilkokul seçimi aslında öğretmen seçimidir. Yüzde yüz haklıdır da. Ancak kişisel görüşüm bununla sınırlandırmamak yönünde. Birçok okul gezdim. Hepsinde müdür ve müdür yardımcılarıyla görüştüm. Evet belki haddim değil, belki yanlış bir bakış açısıdır ama konuştuğum idarecilerden dolayı elediğim okullar oldu. İletişime açık olmamaları veyahut konuşmaları benim o okulları direkt elememe yol açtı. Bunun yanında bahçesi bile olmayan okullar türemiş; örneğin bu bile bir kriter olabilir. Salgın süreci olmasa, okul aile birlikleri aslında tek adresiniz olmalı. Okul aile birliğindekiler size okul nasıldır, hangi öğretmenler sevecen, hangileri çocuklar üstünde otorite deniyor vs her şeyi anlatıyorlar. Şanssızlıktır ki, bu süreçte bulmanız kolay değil. 

Okulların yan aktiviteleri/dersleri de önemli. İsteyene satranç isteyene halk oyunları gibi birçok ilave ders olması da önemli. Bunun için küçük bir maddi destek gerekebilir. Bunun dışında güvenlik, hemşire, temizlik gibi konular da kriterlerden sayılabilir. 

Yaşadıklarımı yazmak istedim; benim durumumdaki arkadaşlarımın işine yaraması dileğiyle. :)

İyi Geceler

2 Ağustos 2020 Pazar

Linux'ta Ortak Disk Sorunu ve Yama Çözüm

Merhaba Arkadaşlar,

Windows ya da Linux fark etmeksizin, uygulama makinalarınız ortak diskleri görüyordur. NFS ya da CIFS kullanıyor olabilirsiniz. Buradaki amaç, uygulamalarınızın ortak dosyaları görebilmesidir. Örneğin, sözleşme gibi önemli bir dosyayı bir uygulama sunucusundan ekrana bağlandığınızda görüp, diğerindeyken görememeniz kabul edilemez. Veyahut bir web siteniz vardır; bir kullanıcı arayüzden girip, siteye resim yüklemiştir. Bir başka kullanıcı başka bir makinaya düştüğünde o resimi göremezse, takdir edersiniz ki çok saçma olur. Ortak diskler bunun için vardır. Bunun da çok detayı vardır. IP bazlı, kablolu vs diye ama ona girmeyeceğim, asıl konum bu diskler değil zira.

Diyelim ki ortak diskte bir sorun var. Tabi ki storage ekibiniz hızlıca müdahale edecektir. :) Ancak storage ile uygulama farklı networktedir ve network sorunu vardır vs vs. Böyle durumlarda kısmet deyip beklemek kabul edilemez takdir edersiniz ki. =) Böyle durumlarda, uygulama üstünde ortak diski, herhangi bir uygulama sunucusu ile değiştirmeniz gerekiyor. Akabinde sunucuları sync etmelisiniz. Yani hangi sunucudan döküman, nesne yüklenirse yüklensin, hızlıca sizin belirlediğiniz, ortak disk olarak hizmet verecek uygulama sunucusuna bunları göndermeniz gerekecektir. Bunu da linux'taki rsync komutu ile yaparız. 

Örnek komut satırı:
rsync -avhz /gurkan/wsadmin/WS-Docs/gurkanalkan.blogspot.com/wp-content/uploads makina2:/gurkan/wsadmin/WS-Docs/gurkanalkan.blogspot.com/wp-content/

Uploads altında ne varsa, ikinci makina altına atmış olacaksınız. Tüm uygulama sunucularınızda bu scripti çalıştırıp, shell olarak kurarsanız, düzenli olarak atmış olursunuz. 

Yazıyı bitirmeden de çok kısa rsync komutuna değineyim, daha önce kullanmamış arkadaşlarım için. Rsync komutu bu şekilde, dosya transferi, günlük delta backuplar, incremental backuplar gibi, farkları bulup, onları kopyalayan bir komuttur. 
rsync -parametreler kaynak hedef  şeklinde bir notasyonu vardır.

Yukarıdaki örneğimde kaynak: /gurkan/wsadmin/WS-Docs/gurkanalkan.blogspot.com/wp-content/uploads 
hedef: makina2:/gurkan/wsadmin/WS-Docs/gurkanalkan.blogspot.com/wp-content/

Burada iki farklı makina yerine, aynı makina içinde yapsaydım, hedefte makina2'yi ayrıca belirtmeye gerek kalmazdı. Bu durumda hedef: /gurkan/wsadmin/WS-Docs/gurkanalkan.blogspot.com/wp-content/ olurdu.

Kullandığım parametreleri ise şöyle:
-a dosya veya diizne ait her şeyi arşivleyerek taşır(rol-izin-mtime gibi)
-v yaptığımız işlemin detayını ekranda, konsolda görmemizi sağlar.
-h bizim okuyabileceğmiz bir çıktı oluşturur(Human readable)
-z dosya ya da dizini sıkıştırarak alır.

Sonra görüşürüz.

1 Ağustos 2020 Cumartesi

Web Sitenizde Otomatik Restart Shell Scripti

Merhaba Arkadaşlar,

Web sitesi işlerinde çok temel seviye dedim ama sonuçta shell işlerinde o kadar da yeni değiliz. :)))
Başıma gelen bir olay ve nasıl bir ara çözüm uyguladığımı paylaşacağım. Elimdeki web sitesi çok temel seviyede olan, caching'i zayıf denebilecek, yüksek trafikleri kaldıramayacak basit bir mini site idi. Ancak bir şekilde web siteme aşırı yük geldi. :)

Eğer sizin de web sitelerinize fazladna yük geldiyse ve/veya web sitenize restart atmak isterseniz aşağıdaki gibi ilerleyebilirsiniz.

Öncelikle apache altında, executables'larınız her nerdeyse, altında bir sh dosyası oluşturmalısınız. Örneğin apache/exec altında olsun.

1. oto_restart.sh oluşturun.
2. İçine şunları yazın:
./stop-apache-WS    (sizin apacheyi kurarken apache stop scriptiniz her neyse, onu yazarsınız)
sleep 3                      (3 saniye bekle dedik, ki tüm processler kill olsun)
./start-apache-WS    (sizin apacheyi kurarken apache stop scriptiniz her neyse, onu yazarsınız)

3. chmod +x oto_restart.sh    (yetkilendirmenizi yaparsınız)

4. while [[ 0 -ne 1 ]]; do ./oto_restart.sh;   sleep 300; done  yazıp çalıştırabilirsiniz.

Bu sayede 300 saniyede bir oto_restart.sh çalışmış olacak. Yani 5 dakikada bir restart etmiş olacaksınız. Böylece site down olmayacaktır. Tabi bu işlemi yaparken db'nin durumunu da gözlemlemeniz iyi olacaktır.

Bu mantıkla web sitenizi de auto restart atabilirsiniz; herhangi bir apache platformunuzu da otomatik olarak restart edebilirsiniz. Genel mantık bu şekilde.

Sonra görüşürüz.
     

31 Temmuz 2020 Cuma

Web Sitenizin Internet Explorer Uyumluluğu

Selam Arkadaşlar,

Web sitelerinde benim gibi çok temel seviye bilgi sahibi olan arkadaşlarım ve ileride unutursam diye kendim için paylaşım yapmak istedim. :)

Şayet web sitenizin internet explorer ile açıldığında, bozuk olduğunu, kaydığını vs gördüyseniz, bu IE Uyumluluk için ufak bir ilave yapmanız gerektiğini söyler. Örneğin bazen çalıştığınız firmalar, kurumsal olarak eski Internet Explorer'ı policy üstünden makinalara yüklemiş olabilir. Bunu aşmak ve web sitenizin düzgün çalışması için:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

IE=edge ile, en son IE versiyonuyla uyumlu hale getiriyormuşuz. Bu satırı benim sitem php olduğundan, header.php altına attım. <head> etiketleri arasına koymanız gerekiyor.

İyi Akşamlar herkese.

30 Temmuz 2020 Perşembe

Performance Monitor (PerfMon)

Merhaba Arkadaşlar

Geçen yazımda performance monitor ile ilgili yazıma gelen soruya istinadeni perfmon'un mantığına kısaca değineceğim. PerfMon özetle sunucunun perfomans verilerini toplayabildiğimiz, izleyebildiğimiz, loglatabildiğimiz bir uygulamadır. 

Performance Monitoring'te 3 seviye vardır:
1.Object
2.Counter
3.Instance



Örnekle açıklayalım: Processor bizim objectimiz(nesne) oluyor. İçinde bir sürü counter(sayaç) var. Örneğin ben Interrupt Time'ı seçtim. Counterımız Interrupt Time oldu yani. Altında da instance olarak herhangi bir processor'ı seçebiliriz. Bunlar da instance oluyor. 



Hep bu 3 seviye olmak zorunda değil. Örneğin memory objectimizi seçersek, altında available bytes counter'ını seçebiliriz. Göreceğiniz üzere, altında instance yok. 



Önceki yazımda Data Collector'u anlattığım için ona burada değinmiyorum. En temel anlatımı bu şekildedir. Bundan sonrasını kullanabilmek için tek tek objectleri ve counterları bilmek lazım ki, o da biraz tecrübeyle olacak iş. Ben de kendi kullandıklarımı ara ara paylaşmaya çalışacağım.

Şimdiden herkese iyi bayramlar.

Word'de İçindekiler Sayfası Oluşturmak

Merhaba Arkadaşlar,

Bu yazıda Microsoft Word'de İçindekiler sayfasının nasıl yapılacağına değineceğim. Eskiden manuel yapılırdı bu fihrist ya da sayfa indeksleri. Ancak uzunca bir süredir Word'de bu işlemi otomatik olarak yaptırabiliyoruz.

Öncelikle deneme için uzunca bir yazı gerekiyordu. Lorem Ipsum'dan ödünç aldım tabi ki. :)
30 paragraflık bir yazıyı word'ün içine koydum. Aralara Başlık 1 - Başlık 1.1 gibi başlıklar uydurdum.

Word'de içindekiler sayfası oluşturma1

Bu işteki en kritik bilgi, kendi başlıklarınızı Microsoft Word'e, başlık olarak tanıtmanız. Bunu yapmanın en kolay yolu da, Word'de Home dizinindeyken, Heading kullanmak. Başlıklarınızı Heading1 yapmalısınız. Örneğin başlığınızın da alt başlığı olacaksa, alt başlıklara da Heading2 diyeceksiniz. Alt başlığın da kendi alt başlıkları varsa, onlara da Heading3 diyeceksiniz; bu böyle gider.
Word'de İçindekiler indeksi oluşturmak

Şimdi İçindekiler Sayfamızı yapalım. Boş bir sayfaya gidip: References (Başvurular) --> Table of Contents (İçindekiler Tablosu) seçilir. Ve oradan Automatic Table (otomatik tablo) 'dan birini seçersiniz. 


İçindekiler Sayfamız hazır. Burada atlanmaması gereken nokta, diyelim ki sayfalar değişti. Başka başlık geldi veya sayfada kaydırma oldu. İşlem çok basit. Ben şimdi sayfa 8in alt maddeleri ile 9'u biraz öteleyeceğim.(enter ile aşağıya atacağım).
Yapmanız gereken İçindekiler kısmına bir defa tıklayıp, Update Table demeniz. Tüm değişimi direkt tabloya yansıtır. Update table deyince, bir de soru sorar, sadece sayfa numaraları mı, tüm tablo mu diye. Sırf tablodaki sayfanın yeri değiştiyse, sadece sayfa numarası demeniz yeterlidir ama ben genelde tüm tabloyu seçmenizi öneririm. Ne değiştiyse, otomatik olarak gider bulur ve yansıtır.

Sonra görüşürüz.


29 Temmuz 2020 Çarşamba

IIS CPU Settings

Merhaba Arkadaşlar,

Bu yazımızda, IIS üzerindeki istediğiniz uygulamamız için Advanced Settings altındaki CPU sekmesini açıklayacağım. Burası önemli alanlardan birisi. O nedenle ayrı başlıkta paylaşmak istedim.

IIS'i açın. Application Pool'lara girip, hangi uygulamanın app pool'unu isterseniz onu seçin.
Sağ panelden Advanced Settings'e tıklayın. Artık birçok ayarı yapabileceğimiz panele geldiniz. Biz bu yazıda CPU kısmına değineceğiz.


Limit: Uygulamanız kendisine tahsis edilen CPU'nun ne kadarını kullansın demektir bu. Genelde 0 yazar. 0 yazdığınizda, cpu'yu limitleme demiş oluyorsunuz; yani tahsis edilenin tüm CPU'yu(%100) kullan diyorsunuz. Şimdi burayı her yerde okumuşsunuzdur ama bu alanın nasıl kullanabileceğini konuşalım. Diyelim ki, bir uygulamanız var ve cpu'su IISi aşağı indiriyor ve sürekli IISi ayağa kaldırmakla uğraşıyorsunuz. Eğer uygulamanıza cpu limiti koyarsanız, nispeten daha kontrol altında tutabilirsiniz. Ki normal şartlarda hiçbir uygulama %100e vurdurmamalıdır. Eğer böyle bir durum varsa, ya leak vardır ya da debug modda log açılmıştır veyahut farklı kod defecti vardır. 
Varsayalım ki %70 koymak istiyorsunuz. Bu limit aşıldığında ne yapılacağını belirleyebilirsiniz. Bunun için de sizi ikinci alana davet ediyorum(Limit Action)

Limit Action: Yukarıda bahsettiğim gibi, limiti koydunuz. Ve o limite gelindi. Bu durumda hangi aksiyonun alınmasının karar verilmesi gerekiyor.

a)No Action: En masumudur. Limit aşıldığında, hiçbir şey yapma demektir. :)
b)KillW3wp: Eski versiyon IISlerin vazgeçilmezidir. :) Diyelim cpu %70e geldi. App pool'u kill eder. Limit interval da kontrol ediyor o an. Bir sonraki limit interval kontrolüne kadar app pool öyle kalır.
c)Throttle: CPU limite geldi mi, peşinden gelen istekleri bekletir. Daha fazla cpu kullanamaz uygulamanız, cpu boş da olsa dolu da olsa.
d)ThrottleUnderLoad: Throotle gibi CPU'ya herhangi bir kısıt getirmez. Eğer CPU boş ve kullanabilir duurmdaysa, rahat bir şekilde CPU kullanırsınız. Ancak cpu limitine ulaşılırsa, CPUyu limitle kısıtlar. Yani adı gibi, sadece load altında throttle. :)

Limit Interval: İlk resimde 5 yazıyordu örneğin. 5 dakikada bir IIS'te cpu kontrolü yapılacak demektir. KillW3wp ile genelde kullanılır. Throttle ve ThrottleUnderLoad ile kullanılmaz. Kill edilen uygulamayı manuel start vermeniz iyi olacaktır. Yoksa 5 dakika dolana kadar IIS worker processi kill edilmiş şekilde durur. 

Processor Affinity Enabled: Diyelim ki 32 core cpu'unuz var. İlk 6 tanesini kullan, gerisini kullanma diyebilirsin, server sağlığını düşünüp. False derseniz, tüm cpunuzu kullanıma açarsınız. Bu durumda diğer iki değerin önemi yoktur. True derseniz, sizi aşağıya alalım. :)

Processor Affinity Mask: Hem bu arkadaşın hem de bir altındaki "64-bit option" olanın default(varsayılan) değeri 4294967295 'tir. İlk resimde bu nedenle o değeri görüyorsunuz. (2^32 -1 değeridir) Uygulama hangi processora bağlanıp çalışsın onu belirliyoruz. 1 dersek, ilgili IIS workerprocess'i birinci cpu'da çalışacaktır. Binary gösterimi: 00000000000000001  (2 üzeri 0)
2 dersek, ikinci processor'da çalışacaktır. Binary gösterimi: 00000000000000010 (2 üzeri1)
3 dersek, hem 1 hem de 2nci processorda çalıaşcaktır. Binary gösterimi: 00000000000000011 (2 üzeri 0 ve 2 üzeri 1'in toplamı)

Sonra görüşürüz.

27 Temmuz 2020 Pazartesi

SQL Server'daki Authentication Seçimi

Selam Arkadaşlar,

Bildiğiniz üzere SQL Server'da iki tip authentication yöntemi var:

1. Windows Authentication
2. SQL Authentication

Şimdi envai çeşit kaynakta bunların ne olduğunu okumuşsunuzdur. Kısaca Windows Authentication kullanılması için Active Directory üzerinde bir user oluşturulmalı ve bu user üzerinden yetkilendirme yapılmalıdır. SQL Authentication için ise, db üzerinde, sql master database'inde user oluşturulmalı ve bunun üzerinden bir yetkilendirme yapılmalıdır. 

Değinmek istediğim nokta şu: eğer seçim aşamasına gelirseniz, şunu göz önünde bulundurun her zaman, Windows Authentication seçtiğiniz zaman Active Directory'e gideceğinizden, araya bir network katmanı koyuyorsunuz demektir. Uygulamanızı AD Server'a bağımlı yapıyorsunuz aslında. Bu nedenle SQL Authenticationı tercih ediyorum ben genelde. SQL Authentication'daki sıkıntıya da genelde dba'ler çıkartabilir. :) Buradaki olay da, hala fixlenmediyse, OS user bilgisini çekemiyordu SQL Server. Bu durum hala yaşanıyorsa, hala os userı çekemiyorsa, bu sorunu kod seviyesinde çözüp, yine sql authentication ile devam etmenizi öneririm.

Sonra görüşürüz.

26 Temmuz 2020 Pazar

İpucu: Dynamic Teaming Sorunu

Merhaba Arkadaşlar,

Başıma gelen bir problemden ve çözümünden kısaca bahsedeyim. Bir load balancerım ve arkasında sunucularım vardı. Aradan loadbalancerı çıakrttığımda 10 milisaniyede cevap veren servislerim, loadbalancer koyduğumda 30-40 saniye bandına çıkıyordu. Loadbalancer'ın tüm configleri düzgün ve best practice'e uygundur. 

Sonunda sorunu tespit ettik. Sunucularımız Hyper-v platformundan hizmet alan sanal sunuculardı. Loadbalancer'ımız ise Netscaler idi(F5 değil). Meğer Netscaler ile Hyper-v platformu arasında bonding ya da teaming denilen bir problem varmış. Özetle sorun şu: LoadBalancer arkasındaki sunuculara giderken, aynı sunucu için farklı MAC adresleri görüyorduk. Yani bir LB, bir MAC ile bir sunucuma gidiyor. Sunucum başka bir MAC üstünden cevap veriyor. Sonra LB yeni gelen MAC üstünden tekrar sunucuma geliyor, Sunucumun da kafası karışıyor, bekletme sürecinden sonra cevap veriyor. Hyper-v fiziksel sunucusunun MACi oluyor bu aslında. Bu iki MAC'i tek bir MACmiş gibi davranmasını sağlamalıyız. 

Konfigürasyonu aşağıdaki gibi aktif-pasif yapıp, loadbalancing mode: hyper-v port balancing seçilmeli.

Sonrasında uygulamalara restart atıp denediğinizde, webservisinizin loadbalancer ile de birkaç milisaniyede cevap verdiğiin göreceksiniz.

Sonra görüşürüz.

SFTP Public Key Authentication

Merhaba Arkadaşlar,

İki makina arasında iletişimi kolaylaştırmak veya iki makina arasında otomatik dosya transferi yapabilmek için makianalar arasında iletişim kurulabilir. Bu yönteme sftp public key authentication denir. Böylece herhangi bir şifre olmadan, key ile bağlantı sağlanmış oluyoruz.

Öncelikle kendi makinamızdan bağlanacağın user'a geçiş yaparız. (ör: dzdo -iu wlsadmin)
Kendi makinamızda .ssh adında bir directory oluşturulur:
mkdir .ssh

ls -la komutu ile oluşturduğumuz .ssh directory'sini görürüz.

chmod 777 .ssh
diyerek  directory'e full yetki verdik. Tabi bu istenen bir şey değildir; 777 benim işime gelir ama os admin'ler bir şekilde bu yetkiyi iptal etmek için kapınızı çalar. =)

Şimdi erişimde kullanmak için private/public anahtar çiftini oluşturacağız. Bunun için de şu komutu çalıştırırız:
ssh-keygen

Gelen her soruya Enter deyip geçebilirsiniz. Sizden passphrase isteyecektir. Bir şifre belirleyip, onu iki defa girmenizi isteyecektir. Onu da girdiğinizde, wlsadmin userımın altında .ssh directory'si altında, id_rsa ve id_Rsa.pub adında iki dosya oluşacaktır.
chmod 777 id_rsa*   ile yine yetkileri dibine kadar alıyoruz.

more id_rsa.pub komutu ile dosya içeriğindeki açık anahtarını karşı sunucuya girilmek üzere alabilirsiniz.

Karşı sunucuda da login olup, aynı şekilde:
mkdir .ssh   komutuyla .ssh folderı oluştururuz.
Akabinde chmod 777 .ssh komutuyla yetkileri açarız.

Şimdi bu sunucuda authorized_keys adında bir dosya oluştururz bu defa(dizin değil)
touch authorized_keys
Ve bir klasik olarak=)   chmod 777  authorized_keys

Diğer sunucudaki, id_Rsa.pub içinde oluşturduğumuz key'i, authorized_keys altına kopyalarız.

Hepsi bu kadar. Şimdi minik bir test yaparız:

İlk sunucumuza girerek:
ssh wlsadmin@IkinciSunucuIPsi

Eğer password olmadan erişirsek ikinci sunucu konsoluna, her şey tamam demektir. :)

Sonra görüşürüz.

Oracle'da Kolondaki Data Formatlarını Bulmak

Merhaba Arkadaşlar,

Oracle'da bir kolonunuz var diyelim ki. Best practice olarak kolonu data tipi, gerekirse validasyonlarla kontrol edebiliriz. Ancak bazen dba'lerin önem vermemesi ya da uygulama operasyonlarının ilgisizliği veyahut ilgili analist/geliştiricinin kötü tasarımı/geliştirmesi ile(bazen de hızlı canlıya çıkma ihtiyacının bir sonucu olarak) bazı alanlarda bozuk formatlarda data girilebilir.
Bizim ihtiyacımız da bu formatları bulmak ve düzenlemek idi. Örneğin müşteri numarası ya da telefon numarası gibi nümerik bir alan girişi olduğunu düşünün. Tüm formatları nasıl bulurdunuz?

Şöyle yapabiliriz, ki muhtemelen daha güzel çözümler vardır, tüm sayıları 0'a çevirip, öncelikle sayıları eşitledik. Sonra da distinct kolonu çektik. Böylece kaç tipte data var görmüş oluruz.

select distinct
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(replace(a.TelNo,9,0),8,0),7,0),6,0),5,0),4,0),3,0),2,0),1,0) as alan
from gurkan_tablo_yedek a 

Örneğin şöyle sonuçlar dönebilir:
00/000/-000-00
00/000/-000000
00/000/00000/00
00/000/000000
00/000/00
0/000/0000000
0000000000
00/0000000000
00/000/000000/00

Hepsini sıfıra çevirme nedenim de, sonuçlardan göreceğimiz üzere, her bir sayı için farklı sonuç gelmemesi içindi.

Sonra görüşürüz.

25 Temmuz 2020 Cumartesi

Agile Yaklaşımlar için Tuckman Modeli

Merhaba Arkadaşlar,

Agile ekiplerimiz ortaya çıktıktan sonra hangi açıdan bakarsanız farklı farklı evrelerden geçtiğini görebilirsiniz. =) Türk usulü bakarsak, her işi üstüne alan ekipten, her iş üstüne yıkılan ekibe kadar birçok aşama var. =)  İşin mizahı bir yana, yıllar önce psikolog abimiz Bruce Tuckman, küçük gruplardaki gelişim modelleri üzerine bir teori geliştirmiş. Çevik yaklaşımlar da, bu modeli kendine uyarlamış diyebiliriz.

Tuckman Modeli 4 temel aşamadan oluşur:
1.Forming aşaması
2.Storming aşaması
3.Norming aşaması
4.PErforming aşaması

Beni tanıyanların da bildiği üzere, görsel çizimi yerine, yine internetten hazır bir resimle konuyu anlatacağım. =)
Şimdi bu aşamalar nedir, kısaca bakalım.

Forming Adımı: Ekip olmanın ilk aşamasıdır. Agile yaklaşımda, board oluştulur, squad'a isim bulunur, ekip mottosu bulunur, ekip üyeleri birbirini tanımaya başlar. Bu aşamada yöneticiler biraz daha direktiflerle ilerler.

Storming Adımı: Bu aşamada ekip artık birbirini tanımıştır. Ekip artık kibarlığı ve çekingenliği bir tarafa koyup, eleştirilere başlıyor. Retro'lar bu aşamada verimli ve sert geçmeye başlar. =) Ekip kendi içinde sınırlarını anlamaya da çalışır. Yöneticiler bu aşamaya geçmiş ekiplere daha ziyade koçluk yapar.

Norming Adımı: Storming sonrasıdır. Ekip kaynaşmıştır artık. Retro'lar daha geliştiricidir. İnsanlar birbirleriyle çalışmayı öğrenmiştir. 

Performing Adımı: Ekip artık tek kişi gibi çalışmıştır. Her konuyu herkes iyi bilir diyebiliriz. Yöneticiler delegasyonu devreye sokar bu tip ekiplerde. Artık müdahaleye gerek yoktur zira bu ekip için.

Hep bu adımlar anlatılır edilir de, peki Performing'e ulaştıktan sonra ne olur? Her şey sürekli iyi gidecek diye bir kaide yok. Ekip geriye de gidebilir. Geçişken bu süreçlerin hepsi. Gelen işler, işlerin baskısının ekip üzerine etkisi, ayrılık, yönetici değişimi vb sebeplerle, bir anda Forming adımına geri dönülebilir.

Sonra görüşürüz.

24 Temmuz 2020 Cuma

WIP (Work in Progress) Limit

Merhaba Arkadaşlar,

Bugün biraz da çevik felsefeden bir kavramla karşınızdayım: WIP Limit.

Kanban Board'larda üretim bandının hızı, en yavaş adımının hızı kadardır. Hatta geçen gün öğrendim ki, en yavaş adıma da "şişman çocuk" denmekteymiş. :)
Şöyle düşünelim, Analizler yapılıyor; geliştirmeler ve testler yapılıp canlıya çıkılıyor. Analistler işleri bitirdikçe Analiz Done'a işleri çekmeye başladılar. 1-2-5-7 derken, Analiz Done şişmeye başladı diyelim ki. Bu noktada bu şişmeye dur demek için WIP Limit konuyor. Böylece develoeprların önündeki yığınak engellenmeye çalışılıyor. Hedefimiz Canlı'ya doğru üretimi arttırmak. Eğer Analiz Done'ı durdurmazsak, canlıya çıkmaktan öte, board'da sıkıntı çıkartır. Bunun için Analizleri durdurmak, analistleri testlere yöneltmek gerekebilir. Belki de analistleri development'a yönlendirmek gerekebilir. =)

Örnek resim kanbanize sitesinden, çizmeye üşendim. =)


Bu Work in Progress limiti deneyimlerle belirlenir. Fazla yaparsanız paralel işlere gider iş; verim düşer. Çok düşük verirseniz, üretim sıkıntıya girer. Bu değeri deneyerek bulmak en idealidir. Hızlı ve kaliteli üründen taviz vermemek lazım. :)

Sonra görüşürüz.

23 Temmuz 2020 Perşembe

Client IP'yi IIS Loguna Yazdırmak

Selam Herkese,

IIS logunuza baktığınızda client bilgisine ihtiyaç duyabilirsiniz, ki bence fazlasıyla duymalısınız. Zira her daim firewall ya da başka bir network cihazı IPsi görmek size anlam ifade etmez. Sonra user bazında anlamaya çalışırsınız ki, o daha da zorlaşır.

Sizi çağıran clientın IPsini görebilmek için, öncelikle firmanızdaki network ekiplerince bu bilginin paketin içinde gönderilmesi lazım. Bu kısmı network ekipleriyle hallettikten sonra, IIS'te Logging'e girin.


Select field deyin. 

Çıkan ekranda Add Fields diyoruz.

En kritik kısım sarı ile boyadığım yer. XFF yani X-Forwarded-For seçmelisiniz. Siyah kutu içine aldığım yere, network ekibiniz firewalldan geçirip paketi size iletirken, paket içinde nasıl tutuyorsa, o ismi yazmalısınız. 


Sonra görüşürüz.

WinDBG ile Dump Analizi

Merhaba Arkadaşlar,

Daha önceki yazılarımda envai çeşit dump alma yöntemini paylaşmıştım. Şimdi ise aldığımız bu dump'ları çok kısa nasıl inceleyebileceğimize bakalım. Burada her şeyiyle dumpı analiz etmekten bahsetmiyorum. Onu yapmak başlı başına bir sanat. Ciddi bir tecrübe ve pratik gerektiriyor(ben de çoğunuz gibi bu konuda guru değilim, kendime de söylüyorum bu kısmı=) ). Burada daha ziyade konsept olarak ve belli komutlarla neler yapılabilir ona değineceğim. 

WinDBG tool'u ile almış olduğumuz dump'ı inceleyeceğiz. Dump'ı her önüne gelene vermemenin ne kadar öenmli olduğuna da değineceğiz, subliminal mesaj olarak. =)
Uygulamayı açıyoruz öncelikle, File sekmesinden, Open crash dump tıklanır. Ve dump'ınızı burdan verirsiniz.(benim dump adına takılmayın, full dump almakta tereddüt ettiğim bir andı=) )


Burada aldığınız dump ile, dump aldığımız sunucu ile de ilgili bazı bilgileri görebiliyoruz. 
System Uptime: uygulama sunucunuzun ne kadar süredir ayakta olduğunu gösterir. Bu süre çok uzunsa, demek ki uzun süredir sunucu restart almamış. Atıyorum sunucu 120 gündür restart görmediyse, son 4 aylık patch'leri de geçilmediğini anlayabiliriz. Ve kötü niyetli kişiler bunu kullanır.
Process Uptime: Process'in ne kadar süredir ayakta olduğudur. Bu süre çok uzunsa, process'in recycle edilmediğini gösterir. IIS dump'ı ise bu, application pool recycle'ı düşünmek gerektiğini gösterebilir. Genelde günde 1 defa recycle geçilmesi best practise olarak geçer.
Symbol search path alanı boş gelmiş. Kısaca Symbol şudur: uygulamalar, işletim sistemi ile vs iletişim kurduğunda, ki bildiğiniz üzere bu makina diliyle oluyor, dll veya exe gibi dosya yarattığında bir de pdb dosyası oluşturur. Symbol tam da budur. Symbol içinde assembly için debugging sembolleri vardır. Windbg'nin dumpı çözebilmesi için global, Microsoft'un sitesinden bu sembolleri indirmesi gerekmektedir.

File sekmesi altından, Symbol File Path deyip, Symbol Path'e tıklanır. Sonrasında SRV*https://msdl.microsoft.com/download/symbols yazılır. Artık symboller de hazır.
.sympath yazarak symbollerin nereden alındığını da görebiliyoruz.



.reload yazarak ilgili adresten cache'imize çekebiliriz de bu sembolleri:

!analyze -v komutu ile crash analizi başlatılabilir.

Analiz sonrası !threads komutu ile dump alınan sistem üzerindeki aktif threadlerin durumunu görebiliyoruz.

En soldaki 164-166 olanlar threadIDlerdir. ThreadID alanında XXX yazanlar ise, işini bitiren threadlerdir ve dump aldığımız esnada henüz Garbage Collector işini tamamlamamıştır. 

Mex diye bir extension var debuggingi incelemek için. Onu kurabiliriz.

!us komutu ile unique stacklerin listesini verir. Çalışan threadler işini yaparken, biz dump alarak, onları böldük. Onlar da işlerini bırakıp bize dump verdi. 
36 stack(s) with 203 threads displayed (203 Total threads) à 36 farklı iş yapan thread var. 203 total treadin.

Şimdi bir threade bakalım mesela.

~(tilda): thread demektir.
87s: 87 nolu threadi select ediyor. Onu çağırıyor yani.

!clrstack2 :  .net stacki döker.(mex ile gelen komuttur)

0:000> ~87s

eax=00000000 ebx=00000001 ecx=00000000 edx=00000000 esi=00000001 edi=00000001

eip=7741c8ac esp=39b2ec10 ebp=39b2ed98 iopl=0         nv up ei pl nz ac po nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000212

ntdll!NtWaitForMultipleObjects+0xc:

7741c8ac c21400          ret     14h


0:087> !clrstack2  à artık başında a görüldüğü gibi 87 nolu thread'e geçti.

DbgId ThreadId Apartment Kind CLR              GC Mode    GC Suspending?

   87    11fc4 MTA            v4.0.30319.34209 Preemptive no

 

MonitorWait

-----------

Method          XXXXXXX.Esb.Queue.QueueManager.GetNextMessage()

Monitor Address 0x0000000020421088

 

SP       IP       Function                                                                                                                                   Source

39b2ef7c 00000000 GCFrame                                                                                                                                   

39b2f02c 00000000 HelperMethodFrame_1OBJ [System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)]      à alttaki de bunu çağırmış.                                            

39b2f0b0 72625d16 System.Threading.Monitor.Wait(System.Object, Int32, Boolean)     à alttaki getnextmessage methodu bir yerde threadslep yapıyor; bekliyor yani. 87 nolu thread bekliyor.                                                                        

39b2f0c0 39006df7 XXXXXX.Esb.Queue.QueueManager.GetNextMessage()                                                                                         

39b2f104 39006ff5 XXXXXXXX.Esb.Queue.WorkerThread.Run()                                                                                                     

39b2f128 7259ab43 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)                                                                          

39b2f134 725ada07 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

39b2f1a0 725ad956 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)        

39b2f1b4 725ad921 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)        à http contextin içine konup istek gelir soaptan vs. burda contextin içi kounuyor.         

39b2f1cc 7259aacc System.Threading.ThreadHelper.ThreadStart()       à threadim burda başlar.                                                                                         

39b2f320 00000000 GCFrame                                                                                                                                   

39b2f500 00000000 DebuggerU2MCatchHandlerFrame                                                                                                              

39b2f56c 00000000 ContextTransitionFrame                                                                                                                     

39b2f6f4 00000000 DebuggerU2MCatchHandlerFrame



System'den ziyade XXXXX ile başlayanlar önemli. Bunları ben maskeledim. Kütüphaneler vs belli olmasın diye. =) Sizinkiler ne ise onu yazar.



!name2ee * XXXXXX.Esb.Queue.WorkerThread.Run        komutu ile bu classın bu methodunu tüm kütüphanelerde ararız.

 

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

Module:      3647869c   à esb.dll’in memorydeki adresi

Assembly:    XXXXXX.Esb.dll

Token:       0600d745

MethodDesc:  38f4b56c

Name:        XXXXX.Esb.Queue.WorkerThread.Run()

JITTED Code Address: 39006fd0

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

 

!savemodule 3647869c C:\Temp\XXXXX.Esb.dll     à bu komut ile esb.dll’i Temp dizinine oluşturmuş oluruz.


Yani dump dosyasından dll'i elde etmek de mümkün. 

Dediğim gibi temel komutlara kısaca baktık. Yoksa dump analizi başlı başına bir alan.

Birazdan görüşürüz.


22 Temmuz 2020 Çarşamba

Unix'te Text/IP Replacement

Merhaba Arkadaşlar,

Üst üste Windows konuları yazdım. Bu defa da unix'te kullanabileceğiniz bir bilgi paylaşalım. Unix makinanızda bir text ya da IP aramak istiyorsunuzdur, yetkiniz dahilinde. Bunu çok hızlı yapabileceğiniz mini bir shell scriptini aşağıda paylaşıyorum:

for x in `find . -name \* | xargs grep -l "127.0.0.1"`;
do
echo $x
done

Sarı ile verdiğim IPyi bulunduğunuz dizin ve onun alt dizinlerinde aratacak, yetkiniz varsa da listeleyecektir.

Mesela bir connection string değişimi veyahut server IP değişimi yapacaksınız. IPleri listelettiniz yukarıdaki gibi. Tek tek elle mi değiştireceksiniz? Tabi ki hayır. Küçük bir ilave ile onu da aşağıdaki gibi yapabilirsiniz:

for x in `find . -name \* | xargs grep -l "127.0.0.1"`;
do
echo $x
sed "s@127.0.0.1@19.86.19.03@g" $x > temp;
mv temp $x;
done

Sarı ile yazılı olan IP yerine --> yeşil ile yazılı olan IP yazılacaktır. 

Sonra görüşürüz.