Linux’de belli bir tarihten daha eski dosyaları silmek

Özellikle yoğun bir şekilde çalışan sunucularda log dosyalarının disk üzerinde kapladığı alan hızlı bir şekilde büyüyebiliyor. Böyle durumlarda belli bir tarihten daha eski log dosyalarını silmek gerekebiliyor. Bunları tarih sırasına göre listeleyip elle tek tek silmektense aşağıdaki gibi bir komut kullanılabilir:

 find error.log* -mtime +7 -exec rm {} \;

 find error.log* -mtime -7 -exec rm {} \;  

Yukarıdaki ilk konut çalıştığı dizin içindeki 7 günden daha eski error.log dosyalarını bulup silmektedir. İkinci komut ise bunun tam tersini yapıp son 7 gün içerisinde oluşmuş error.log dosyalarını silecektir.

Reklamlar

GNUStep ile Windows Üzerinde Objective C Programlama

Bu yazıda windows üzerinde Objective C’ye başlayabilmek için atılması gereken adımlardan bahsedeceğim.

Anlatıma geçmeden önce GNUStep projesinden bahsetmek istiyorum. GNUStep projesi önceden NEXTStep olarak da bilinen Cocoa API’sinin açık kaynak kodlu bir versiyonu. Proje’nin amacı Cocoa araçlarını ve kütüphanelerini diğer işletim sistemlerinde de çalışır/kullanılabilir hale getirmek. Bu proje ile Cocoa bileşenleri kullanarak windows, linux uygulamaları geliştirebilirsiniz.

Cocoa demişken hemen şunu belirteyim. Cocoa API’si  AppKit ve UIKit isimli 2 farklı bileşenden oluşuyor. AppKit MAC OSX işletim sistemi’ne özel bişleşenler içeriyor ve MAC OSx için görsel uygulamalar geliştirirken kullanılıyor. UIKit ise Iphone OS olarak bilinen ve Iphone/IPad cihazları için özel olarak port edilmiş işletim sistemine özel bileşenler içeriyor.

Yukarıdaki açıklamayı yapmamın sebebi şu: GNUStep şu anda bir AppKit implementasyonu. Yani GNUStep ile Iphone uygulamaları geliştirmek mümkün değil. Bir başka deyişle eğer amacınız Objective C öğrenmekten ziyade Windows üzerinde Iphone/Ipad uygulamaları geliştirmekse bu yazının devamını okumayın çünkü bu yazı sadece Windows üzerinde Objective C derleyip çalıştırmakla alakalı.

GNUStep kullanabilmek için aşağıdaki linkten GNUstep MSYS System, GNUstep Core ve GNUstep Devel dosyalarını indirip sırasıyla kuralım:

http://www.gnustep.org/experience/Windows.html

Kurulumu herhangi bir özel işlem yampadan Next butonları yardımıyla tamamlayabilirsiniz. Kurulum işlemi tamamlandıktan sonra başlat menüsünde GNUStep isimli bir dizin göreceksiniz.

Bu dizinden Shell isimli programı çalıştıralım. Bu program karşımıza bir konsol arayüzü çıkarır. Windows komut satırına benzeyen bu konsol aslında windows altında linux/unix shell komutlarını çağırabilmenizi ve cross-platform derleme işlemi yapabilmenizi sağlayan ve Minimalist GNU olarak da bilinen bir GNU compiler’ın arayüzüne erişim sağlar.

Windows üzerinde Objective C programlarımızı bu derleyici ile derleyeceğiz. Burada derleme kelimesi önemli. Cross platrofm uygulamalarda zor olan derleme işidir. Derleme işi bir dilde yazılmış kodu ilgili işletim sisteminin kurulu olduğu makinadaki işlemcinin anlayacağı assembly kodlarına çevirip executable dosyayı oluşturma işi olarak tanımlanabilir.  İşte GNUStep aracı da MinGW vasıtaysıyla, Objective C programlarını Windows için derlenebilir ve dolayısıyla çalıştırılabilir hale getiriyor.

Bu hatırlatmayı yaptıktan sonra işleme devam edelim. Başlat menüsünden GNUStep dizini altına gidip Shell programını çalıştırdığımızda karşımızda aşağıdaki gibi bir terminal ekranı çıkar. Bu terminal ekranının varsayılan dizini /home/kullanıcıAdi olarak belirlenmiştir. Linux’de hangi dizinde olduğunuzu görebilmek için pwd (Print Working Directory) komutunu vererek bulabilirsiniz.

MinGW’deki/home/kullaniciAdi dizininin windows altındaki karşılığı C:\GNUstep\msys\1.0\home\kullaniciAdi dizinidir. Yani MinGW altında bir dosya olşturduğunuzda, aslında o dosya C:\GNUstep\msys\1.0\home\kullaniciAdi dizini altında da aynı dosya oluşur.

Artık sıra objective c dosyamızı oluşturmaya geldi. /home/kullaniciAdi dizini altında mkdir komutunu kullanarak merhaba isimli bir dizin oluşturalım ve bu dizinin altında merhaba.m isimli bir metin dosyası yaratalım.

mkdir merhaba

cd merhaba

notepad merhaba.m

Bu işlem sonucunda açılan notepad dosyasını içini aşağıdaki gibi dolduralım.


Yukarıda en basit haliyle bir Objective-C kodu görüyoruz. Bir C türevi olan Objective C dilinde de programların başlangıç noktası main fonksiyonudur. Bu kod basitçe ekrana Merhaba Dunya yazdırmaktadır. NSLog ifadesi C dilindeki printf ifadesinin Objective C’deki karşılığıdır.

Bu arada elbette ki editor olarak notepad kullanmak zorunda değilsiniz. Notepad++ gibi Objective C desteği olan editörler de kullanabilirsiniz.

Dosyamızı oluşturduktan sonra derleme işlemi için son bir adımımız kaldı o da makefile adı verilen ve oluşacak exe dosyasının adını ve içereceği kaynak kodları tek bir elden belirlemizi sağlayan GNUmakefile isimli dosya. Bu dosyanın içeriğini aşağıdaki gibi oluşturalım.

Yukarıdaki dosya derleme işlemi sonrası oluşturulacak executable dosyasının ismini vermemizi(Merhaba.exe) ve bu executable dosyayı oluşturuken gerekecek kaynak dosyalarını(merhaba.m) tek bir elden tanımlayabilmemizi sağlar. Dosyanın başındaki ve sonundaki include ifadeleri programımızı derleme işlemini yapacak olan make isimli programın varsayılan ayarlarını okumasını sağlar. Yani make programı include satırını gördüğünde çalıştığı dosyayı bırakır ve include ile gösterilen dosyanın içindeki komutları çalıştırmaya başlar. O dosyadaki işlem bittikten sonra kaldığı yerden devam eder.

Bu dosyayı da oluşturduktan sonra artık derleme işlemine hazırız demektir. /home/kullaniciAdi/merhaba dizininin altına gidip make komutunu çalıştıralım.

cd /home/tkiziloren/merhaba

make

Aşağıda derleme işlemi esnasında komut satırının detaylı görüntüsü bulunmakta. make işleminden sonra ls -altr komutuyla bulunan dizin altındaki dosyalar listelendiğinde merhaba.m ve GNUmakefile dosyasına ek olarak obj isimli bir başka dizinin oluştuğunu da görmekteyiz. İşlem sonrası Merhaba.exe isimli executable dosyamız işte bu dizin altında çalışıtırılmak üzere bizi beklemekte.

make işlemi sonrası obj dizini altındaki Merhaba.exe dosyasını çalıştırdığımızda yazdığımız kodun ekran çıktısı olan Merhaba Dunya ifadesini görebiliriz.

Hatırlatmakta yarar var biraz önce Merhaba.exe dosyamız çalıştıktan sonra artık Windows işletim sistemi için çalışabilir hale geliyor demiştim. Bunu laf olsun diye söylemedim. GNUStep ve MinGW ile işimiz derleme işlemi tamamlanıncaya kadardı. Merhaba.exe dosyası oluştuktan sonra artık GNUStep komut satırına ihtiyacımız kalmadı. Oluşan dosyayı artık windows komut satırından da çalıştırabiliriz:

Görüldüğü üzere GNUStep MAC OSX kadar kolay olmasa da windows üzerinde de Objective C dilinde uygulama geliştirip çalıştırabiliyoruz. MAC OSX’de işimizi kolaylaştıran yegane şey XCode isimli IDE’nin varlığıydı. GNUStep’de XCode kadar başarılı olmasa da onun yerine geçen GORM isimli bir araç sunuyor. Bu aracı da vakit bulduğumda başka bir yazıda anlatmayı düşünüyorum.

Önemli Not: Bu yazı da Windows üzerinde durdum fakat GNUStep Linux altında da Objective C derlemeye izin veriyor. Bunla ilgili dokümanı da aşağıda bulabilirsiniz:

http://www.techotopia.com/index.php/Installing_and_Using_GNUstep_and_Objective-C_on_Linux

Referanslar:

http://www.gnustep.org/

http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/

http://www.techotopia.com/index.php/Installing_and_using_GNUstep_and_Objective-C_on_Windows

Mysql root şifresini sıfırlamak

Ufak bir kod denemesi yapmak için MySQL kullanmam gerekti. Fakat Mysql ile uzun zamandır uğraşmadığım için root şifresini unutmuşum. Birkaç başarısız hatırlama denemesinden sonra şifreyi sıfırlamaya karar verdim. Bunu yapabilmek için MySQL dökümantasyonunda önerilen şu yol izlenebilir:

Bir adet text dosyası oluşturup ismine mysql-init.txt diyelim. Dosyanın içine aşağıdaki ifadeyi yazalım:


UPDATE mysql.user SET Password=PASSWORD('yeni_sifreniz_buraya') WHERE User='root';
FLUSH PRIVILEGES;


Dosyayı C:\‘nin altına kaydedelim.

Komut satırından MySQL’in kurulu olduğu yerdeki bin dizininin altına gidelim ve aşağıdaki komutu çalıştıralım.

mysqld.exe --init-file=C:\\mysql-init.txt

Artık root kullanıcısı için atadığınız yeni şifreyi kullanabilirsiniz.

POJO ile JavaBean arasındaki farklar

Çoğu Java kitabında POJO(Plain Old Java Object) terimi ile JavaBean terimi birbirinin eşleniği olarak kullanılıyor. Halbuki bu iki terim birbirini tam olarak karşılamıyor.

JavaBean spesifikasyonuna göre bir sınıfın JavaBean olarak tanımlanabilmesi için aşağıdaki 3 özelliğe sahip olması lazım:

  1. Sınıfın mutlaka public bir yapılandırıcı methodu olmalı.
  2. Sınıf Serializable arayüzünü implement etmeli.
  3. Sınıfın üye değişkenlerine erişim get/set/is gibi acessor/mutator metotlarıyla sağlanmalı.

POJO’da ise bu özelliklerin bulunması gerekmiyor. Aslında POJO’nun kesin bir tanımı yok. Kimi kaynaklarda javax.ejb ile ilgili herhangi bir arayüzü implement etmeyen bir sınıf olarak tanımlanıyor. Kimi kaynaklarda ise herhangi bir framework’e bağımlığı olmayan ve herhangi bir sınıftan türemeyen bir sınıf olarak tanımlanıyor. Yani bir POJO için aşağıdaki gereksinimlerden bahsedebiliriz:

  1. Bütün frameworkler için aynı anlam ifade etmeli.
  2. EJB arayüzlerini implement etmemeli.
  3. Herhangi bir sınıfın subclass’ı olmamalı.

Yukarıdaki tanımlardan şunu çıkarabiliriz:

Bütün JavaBean’ler POJO’dur fakat her POJO bir JavaBean değildir.

Bu iki terimin kitaplarda ve dokümantasyonda birbirinin eşleniği olarak kullanılmasını sebebi her ikisinin de “EJB olmayan Java Sınıfı” anlamına gelmesi olarak açıklayabiliriz.

Yine de farklarını bilmekte fayda var diye düşünüyorum.

Kaynaklar:

http://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans

http://en.wikipedia.org/wiki/JavaBean

http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html

Glassfish’de Proxy Tanımlamak

Glassfish sunucusuyla lokal’de uygulama geliştirirken proxy arkasında olmanız JMS Connection factory tanımlarında sorun yaratabilir.Bu sorunu aşabilmek için kullandığınız proxy ayarlarını glassfish’de tanımlamak gerekir.

Bu işlemi yapabilmek için komut satırında glassfish’in bin klasörüne giderek aşağıdaki komutları çalıştırın:

asadmin create-jvm-options -Dhttp.proxyHost=proxy.adresi
asadmin create-jvm-options -Dhttp.proxyPort=proxy.portu

Bu komutlar glassfish’i proxy arkasından çalıştırmak için yeterli olacakıtr.

Google App Engine SDK Jetty default port’unu değiştirmek

Google App Engine’de Jetty default olarak 8080 portunda çalışır. Java uygulama geliştirirken çok kullanılan bu port bazen diğer uygulama sunucularıyla çakışabilir. Portu değiştirebilmek için

$SDK_HOME\config\user\ant-macros.xml

dosyasına gidip

<attribute name=”port” default=”8080″ description=”The port the server starts on”/>

yazan satır bulunduktan sonra buradaki 8080 değeri, çalışılmak istenen port değerine çekilmelidir.

Linux/Unix’de grep kullanım örnekleri

Bir metin/log dosyası içinden belirli bir kelimenin geçtiği yerleri getirmek için grep komutu kullanılır. Grep in açlımı g/re/p (global / regular expression / print) olarak verilebilir. Aşağıda örnek kullanımları verilmiştir:

grep SQLException log.txt

// (log.txt dosyasında SQLException geçen bütün satırları yazdır.)

grep –i sqlexception log.txt

// (yukarının aynısı. Büyük küçük harf ayrımına dikkat etme)

grep –c SQLException log.txt

// (log.txt dosyasında kaç tane SQLException geçiyor)

grep komutu’nun cat ile kullanılması da yaygın bir örnektir.

cat log.txt | grep SQLException

// (log.txt dosyasında SQLException geçen bütün satırları yazdır.)

cat log.txt | grep –c SQLException log.txt

// (log.txt dosyasında kaç tane sqlexception geçiyor. Büyük küçük/harf ayrımı yapmadan sayıyı bul)

Glassfish-JPA-MYSQL Encoding Problemi

MySQL ayarlarında encoding’i utf8-turkish_ci yapmanıza rağmen glassfish üzerinde çalışan JPA uygulamalarınızda hala encoding problemi yaşıyorsanız sun-resources.xml aşağıdaki satırları ekleyerek bu sorunu çözebilirsiniz.

<property name="useUnicode" value="true"/>
<property name="characterEncoding" value="utf8"/>
<property name="characterSetResults" value="utf8"/>

Bu propertyleri kullanan örnek bir sun-resources.xml dosyası aşağıdaki gibi olabilir.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
 <jdbc-resource enabled="true" jndi-name="jdbc/sinavDataSource" object-type="user" pool-name="sinavPool">
 <description/>
 </jdbc-resource>
 <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0"
 connection-creation-retry-interval-in-seconds="10"
 connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0"
 connection-validation-method="auto-commit"
 datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"
 fail-all-connections="false" idle-timeout-in-seconds="300"
 is-connection-validation-required="false" is-isolation-level-guaranteed="true"
 lazy-connection-association="false" lazy-connection-enlistment="false"
 match-connections="false" max-connection-usage-count="0" max-pool-size="100"
 max-wait-time-in-millis="60000" name="sinavPool" non-transactional-connections="false"
 pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1"
 steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
 <property name="URL" value="jdbc:mysql://localhost:3306/sinav"/>
 <property name="User" value="user"/>
 <property name="Password" value="password"/>

<!-- Türkçe encoding ayarları için gerekli olan parametreler -->
 <property name="useUnicode" value="true"/>
 <property name="characterEncoding" value="utf8"/>
 <property name="characterSetResults" value="utf8"/>

 </jdbc-connection-pool>
</resources>