12 Ekim 2014 Pazar

En bilinen/kullanılan linux/unix komutları

Merhaba arkadaşlar,
Unix sistemleri öğrenmeye başladığımda en çok kullanılan komutları not etmiştim. Bu notumu sizede faydası olur diye paylaşmak istiyorum. Ayrıca bende hala Unix tarafında yeni komutlar öğreniyorum. Dolayısıyla benim Unix hazineme yeni komutlar eklendikçe bu sayfayı da güncelleyeceğim.

Şu anlık elimde olanlar aşağıdadır : 


KOMUT
AÇIKLAMA / KULLANIM
İŞLEV
Pwd
Print working directory
Bulnduğumuz directory’nin path  bilgisini verir.
Cd
Change directory
Ls
List Directory Contains
Bulunduğumuz dizindeki tüm dosyala ve dizinleri listeler.
Mkdir
Make Directory
Bulunduğumuz dizinde yeni bir klasör oluşturur.
Touch
Bulunduğumuz dizinde yeni bir dosya oluşturmak için kullanılır.
Rm
Remove
Dosya silmek için kullanılır
Mv
Move
Dosyayı taşımak için kullanılır.
Cp
Copy
Dosyayı kopyalar
Man
Short For Manual Page
Komutların kullanımını gösteren manual sayfasına gider
Grep
 cat /var/log/catalina.log | grep "error"
Regex aracılığıyla girilen değere benzer listelemeler yapar.
Sudo
Substitute User  Do
Rm -r
Rm –r directoryName
Klasörü içindeki dosyalarla birlikte siler.
Dpkg
dpkg --get-selections| grep -v deinstall > output.log
Yüklenen paketleri listeler
 Curl
  curl -I http://twitter.com/
supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)
 locate
 Locate tomcat
 Dosyayı ismine göre arar. Regex ile arama yapar.
Passwd
passwd adm_levent
Enter new UNIX password:
Retype new UNIX password:
Unix sistemler üzerinde ki kullanıcı hesabınızın şifresini değiştirmenize olanak sağlar.
find
find -name Abc.java
Abc.java adında dosya arar
sha256sum
echo -n 'bunuşifrele' |sha256sum
Stringi sha256 ile şifreler

11 Ekim 2014 Cumartesi

Java İle Dosya İşlemleri (Okuma / Yazma / Ekleme)

Merhaba arkadaşlar,
Bayram, şehir dışı seyahatler , iş yoğunluğu derken uzun zamandır yazamıyordum.  Bu gün sizlere Java ile Dosya işlemleri nasıl yapıldığını paylaşacağım.  Bir aksilik olmazsa eğer[uyku/yorgunluk.. vs :)  ] 1-2  yazı daha yazıp proje/kaynak dosyalarıyla birlikte paylaşıyor olacağım.

Aslında her işlem de olduğu gibi dosya operasyonlarını da Javada birden fazla yöntemlerle yapabilirsiniz ancak ben burada en  bilinen yöntem olan BufferedWriter ve BufferedReader ile dosya  işlemleri yapacağım.

Öncelikle intelliJ aracılığıyla bir consol projesi oluşturalım(Web projesi oluşturarak ta aynı işlemleri yapabilirsiniz). 

Projenin yapısı(Son hali) aşağıdaki gibi olacaktır.



Dosya  işlemleri için Service paketinin altında Operations.java adında bir sınıf oluşturuyoruz.
Bu sınıfın içinde aşağıdaki isimlerde 3 tane metot olacak. 
public static void writeFile(String content) // dosya yazar 
public static void appendFile(String content) // dosyaya içerik ekler(Eski verileri silmeden)
public static void readFile(String path) // dosyadan okur


Operations.java / writeFile

    public static void writeFile(String content) {

        File file = new File("write-file.txt");

        //if file doesn't exists , then create it
        if (!file.exists())
            try {
                file.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }

        try {
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
            System.out.println("SUCCESS..");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


Yukarıdaki metot dosyaya yazmak istediğiniz her içeriği işlerken, mevcut  dosya içeriğini temizler/ezer(override).  Eğer dosyadaki var olan içeriğe dokunmadan en alta satır eklemek istiyorsanız yapmanız gereken tek işlem var oda FileWriter'a true değerine sahip  ikinci bir parametre göndermek. Bu sayede FileWriter sınıfındaki override işlemi disable olur. Girdiğiniz içerikler ardı ardına eklenir.

Operations.java / appendFile
            FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

Operations.java / readFile
    public static void readFile(String path) {

        BufferedReader br = null;

        String sCurrentLine;
        String filePath = path;

        try {
            br = new BufferedReader(new FileReader(filePath));
            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println("READ ::::: " + sCurrentLine);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }


Run.java sınıfındaki main metodu çalıştırarak console ekranından işlemlerin sonucunu görebilirsiniz.
controller/Run.java
    public static void main(String[] args) {

        System.out.println("RUNING..");

        //call writer class
        Operations op = new Operations();

        Long currDate = System.currentTimeMillis();
        Date date = new Date(currDate);
        String timeStr = date.toString();

        //content to file  + system time
        String content1 = "ilk satiri dosyaya yaz " + timeStr + "\n";
        String content2 = "ikinci satiri dosyaya yaz " + timeStr + "\n";
        String content3 = "Ucuncu  satiri dosyaya yaz " + timeStr + "\n";

        //write to file
        op.writeFile(content1);
        op.writeFile(content2);
        op.writeFile(content3);

        //append to file
        op.appendFile(content1);
        op.appendFile(content2);
        op.appendFile(content3);


        //read file
        op.readFile("C:\\read-file.txt");


    }


NOT1: okunacak dosya C:\read-file.txt  dosyasıdır. C dizininde bu dosya bulunmazsa file not found exception hatası alırsınız.

NOT2: Özel karakterlerin string'e dönüştürebilmesi için dosya path inde  ki slash ları iki kere yazın C:\read-file.txt yi C:\\read-file.txt şeklinde

Son olarak projeyi run edince aşağıdaki çıktıları üretecektir.



kaynak dosyalar(github) : indirmek için tıklayın

21 Eylül 2014 Pazar

javax ile smtp mail gönderme

Merhabalar herkese,
bu yazımda sizlere javax ile smtp doğrulama yaparak mail gönderme işlemi yapacağız. Java da Mail gönderme işlemi yapan birkaç yöntem var ben sadece bir tanesini anlatacağım. Bu size şimdilik  yol göstermiş olsun ilerleyen zamanlarda ihtiyaç duyulursa diğer metodları da yazarım.


Öncelikle yine intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
projenin bitmiş hali aşağıdaki yapıda olacaktır:


projeyi oluşturduktan sonra maven dosyasını(pom.xml) aşağıdaki tanımlamaları ekleyelim.
pom.xml 
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

burada gördüğünüz üzere iki farklı tanımlama var. Birincisi mail göndermemize yarayan jar diğeri ise json değerleri okumamıza yarar.


index html sayfasında basit bir form oluşturalım ve bu form sayesinden son kullanıcıdan mail bilgilerini alalım.

index.html 
<div class="mailDiv">
    <form role="form" id="mailForm" method="POST" onsubmit="return false;">
        <div class="form-group">
            <input type="text" class="form-control" name="firstname" id="firstname" placeholder="Ad">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" name="lastname" id="lastname" placeholder="Soyad">
        </div>
        <div class="form-group">
            <input type="email" class="form-control" id="email" name="email" placeholder="E-Posta">
        </div>

        <div class="form-group">
            <input type="password" class="form-control" id="password" name="password" placeholder="Sifre">
        </div>

        <div class="form-group">
            <input type="text" class="form-control" id="subject" name="subject" placeholder="Konu">
        </div>

        <div class="form-group">
            <textarea class="form-control" rows="3" name="message"></textarea>
        </div>
        <button type="submit" id="btnFormPost" class="btn btn-primary">Gonder</button>
    </form>
</div>

özetle bu formdan bilgileri post edip java ile karşılayacağız. Daha sonra  gelen değerli alarak Javax ile mail gönderme yapacağız.

 MailController.java
        final Mail mail = new Mail();
        mail.setFirstname(request.getParameter("firstname")); // Adı
        mail.setLastname(request.getParameter("lastname")); // Soyadı
        mail.setFromMail(request.getParameter("email")); //Gönderen Mail
        mail.setToMail(request.getParameter("email")); // Alan Mail
        mail.setPassword(request.getParameter("password")); // Gönderen Mail Şifresi
        mail.setMessage(request.getParameter("message")); // Mail mesajı
        mail.setSubject(request.getParameter("subject")); //mail konusu


        mail.setHost("smtp.gmail.com"); //sender smtp host
        mail.setPort(587);//smtp port

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", mail.getHost());
        props.put("mail.smtp.port", "587");//gönderen mail port

üstteki kodlar ile formdan gelen bilgilerle Mail nesnesini dolduracağız. Ayrıca Properties sınıfını da gmail in mail sunucu bilgilerine göre dolduruyoruz. Diğer mail sunucular için ayarları(port,auth,host,..vs) güncellemeyi unutmayın.

projenin çıktısı aşağıdaki gibidir:


formdan girilen değerlerle mail gönderme işlemi yaptıktan sonra Adı,Soyadı,Email ve Email gönderme durumunu ekrana yazacaktır.

kaynak dosyalar(github) : indirmek için tıklayın

20 Eylül 2014 Cumartesi

Jsp ile Basit Dört işlem

Merhaba, hatırlarsanız  Neden yazıyorum? Neler yazacağım ? başlıklı yazımda sizlere(yeni başlayanlara) dört işlem ve form işlemlerinden başlayarak belirli bir java seviyesi kazandırmayı amaçladığımı belirtmiştim.
Bu yazımda  jsp sayfası üzerinden form işlemleri çerçevesinde basit aritmetik işlemler(Toplama,Çıkarma,Çarpma,Bölme) yapacağız.

Hemen intelliJ ile bir web(Spring MVC) projesi oluşturarak işe başlıyoruz.
Projenin bitmiş hali aşağıdaki yapıda olacaktır:


Oluşturduğumuz projenin görsel tarafıyla zaman kaybetmemek adına projeyi  bootstrap üzerine inşa edeceğim.
Öncelikle bootstrap  kaynak(source) linklerini jsp sayfamıza ekleyelim.

index.html 
<!-- minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

<!-- minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>

Projede jquery ve ajax post işlemleri yaptıracağımız için Jquery  kodlarını da   sayfaya ekleyelim.
 index.html
<!-- minified jQuery -->
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>


sonuçları json formatında alacağım için pom xml'e jackson-mapper-asl' yi ekliyorum.
pom.xml 
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.7.1</version>
        </dependency>

OpController.java dosyasında tüm işlemler(toplama,çıkarma,çarpa,bölme) için birer method ekleyelim.

OpController.java 
    @RequestMapping(value = "/topla.html", method = RequestMethod.POST)
    public
    @ResponseBody
    Numbers topla(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        Numbers numbers = new Numbers();
        numbers.setFirstNum(Integer.parseInt(request.getParameter("firstNum")));
        numbers.setSecNum(Integer.parseInt(request.getParameter("secNum")));
        numbers.setResult((double) (numbers.getFirstNum() + numbers.getSecNum()));
        return numbers;
    }


Yazıda bilgi tekrarı yaparak sizleri sıkmamak adına yazımı burada sonlandırıyorum.Kolay anlaşılabilmesi için  projenin kaynak kodlarını yazarken gerekli yerlerde  yorum satırları ekledim. Bu size yol gösterecektir.

Projenin çıktısı aşağıdaki gibi olacaktır:




kaynak dosyalar(github) : indirmek için tıklayın

19 Eylül 2014 Cuma

Maven Profil Oluşturma (Dev + Preprod + Prod) - 2

Herkese merhaba,
bir önceki yazımda sizlere maven profilinin nasıl oluşturulacağını ve intelliJ ile nasıl profil bazlı compile edileceğini  anlatmıştım. Geçen süre zarfında düşündüm ki ,  sizleri biraz ezberciliğe yönlendirmiş olabilirim. Dolayısıyla konuyla ilgili bir yazı daha yazarak arka planda bu işlerin nasıl ilerlediğini anlatayım istedim. Bu yazım da da komut satırı üzerinden maven profiline göre compile etmeyi anlatacağım.

Kısacası bir önceki  yazıda olan işlemlerin aynısını yapacağız ancak compile ederken maven install butonlarına basmadan bu işlemlerin komutunu yazarak yapacağız.

Öncelikle bir önceki yazımı yazarken oluşturduğum projemi tekrar intelliJ  ile açıyorum. Pom.xml dosyasındaki  profiles tagları arasındaki tüm profiller için  activation tanımlaması yapacağım. Bunun için activation tagları arasında property ve property içinde de name/value tag lerini kullanacağım. Bu sayede profillere birer isim ve bu isimlere birer değer set etmiş olacağız.

  • profiles
    • profile
      • activation
        • property
          • name = env
          • value = Test, Prod yada Dev 
şeklinde bir hiyerarşide olacak.
pom.xml 
<activation>
     <property>
          <name>env</name>
          <value>Test</value>
     </property>
</activation>

Basitçe şöyle düşünebilirsiniz : env diye bir değişken tanımlayıp ve değerini Test olarak set ediyoruz.

şimdi komut satırı üzerinden cd komutuyla projenin kodlarının olduğu dizine gidelim


başlangıçta   
mvn help:active-profiles
 komutunu çalıştırarak varsayılan da hangi profil ile compile edildiğine bakıyoruz(sonuç aşağıdadır).



hemen ardından  
mvn -Denv=Test help:active-profiles
 komutuyla aktif profili önce Test olarak set ettim. Daha sonrada aktif profili tekrar ekrana yazdırdım.


Son olarak ta alttaki komutla profili test olarak set edip projemizi compile edelim.
mvn -Denv=Test install

Bu işlemlerden sonra projenin  target dizini altında oluşan war dosyası artık test profiline göre hazırlanmıştır. Test sunucusuna deploy edebilirsiniz.. :)


kaynak dosyalar(github) : indirmek için tıklayın

15 Eylül 2014 Pazartesi

Maven Profil Oluşturma (Dev + Preprod + Prod)

Herkese merhaba bu yazımda maven ile profil oluşturma dan bahsedeceğim. Biraz uzun fakat ehemmiyeti büyük olan bir yazı olacak. Bir senaryo üzerinden örnekleme yaparak anlatacağım maven profile kullanmayı. Bu arada bir parantezle  belirtmek istiyorum ki Java ile geliştirme yaparken maven kullanan yada kullanacak olan herkese  maven profile kullanmalarını kesinlikle ve şiddetle tavsiye ediyorum.

Maven profile ne amaçla kullanıldığıyla ilgili internetten çeşitli araştırmalar yapabilirsiniz. Ben çok detaya inmeden kendi kullanımımı anlatacağım size.

Java ile geliştirme yaptığım her projede 3 farklı profilim olur benim.  dev , prep ve prod diye..

  • dev  : Development(geliştirme yaptığım) ortamını ifade eder
  • prep : preProduction dan gelir. Test ortamını ifade eder.
  • prod : production ortamını ifade eder.
Peki neden 3 farklı profil size kısaca anlatayım. Öncelikle genel olarak şirketlerde kodları geliştirdiğiniz bir makine oluyor(Bu size verilen laptop). Geliştirme işlemleri bitince sizden geliştirme isteyenlerin kodlarınızı görebilmesi ve test uzmanlarının sizin geliştirdiğiniz kodu test edebilmesi için bu projeye ait bir test sunucusu oluyor. Birde testlerden onay alındıktan sonra amacına hizmet etmek üzere kodları attığınız gerçek(Erişime açılan) sunucular...

Bir projenin geliştirilip yayına çıkması bu 3 aşamadan geçerek gerçekleşir. Dolayısıyla siz geliştirme yaparken localde kullandığınız veri tabanı bilgileri ayrı, testte kullandıklarınız ayrı ve prodda kullandıklarınız ayrı olacaktır. Bu farklılıklara istinaden projenizi deploy ederken ya her sunucunun bilgilerini elle güncelleyip, compile edip, deploy edeceksiniz, yada birazdan göstereceğim şekilde  maven ile profil oluşturarak bu üç farklı sunucu için üç farklı ayar dosyası oluşturacaksınız. Ve compile ederken profil seçeceksiniz.
Kısacası ; localde çalışırken maven'a kodlarımı dev profiline göre compile et, teste giderken prep'e göre ve son olarak production a çıkarken prod'a göre compile et diyeceksiniz..

NOT : Bu yazıyı sadece  4 satırlık veri tabanı ayar dosyaları üzerinden örneklendiriyorum ancak gerçek ortamlarda kod yazarken bu ayar dosyalarının farklılıkları onlarca satırı bulur ve eğer profil kullanmazsanız her deploy etmede(dev+test+prod) bu onlarca satır kodu ilgili sunucuya göre değiştirmek durumunda kalırsınız. 

şimdi örneklendirmeye geçiyorum.Geliştirme yaptığımız ortamda(development) bir  MySQL veri tabanımız   olsun erişim bilgileri aşağıdaki gibi olsun 
url   : localhost
user : root 
pass : 12345 

Birde bu geliştirmeleri yaptıktan sonra tester ların bu kodları test edebilmesi için bir test sunucusu olduğunu ve  tabi bu sunucu içinde bir test veri tabanımız olsun.
url   : 192.168.1.110
user : rootTest 
pass : 12345Test 

son olarak geliştirmeyi yaptık, testlerden geçti ürünün yayınlandığı gerçek ortam(production) olacak birde.
url   : 192.168.1.111
user : rootProd
pass : 12345Prod 


Hemen intelliJ ile bir web(Spring MVC) projesi oluşturup projemizi geliştirmeye başlayalım.

projenin son hali aşağıdaki yapıda olacaktır:


İlk olarak resources dizini altında üç profili ayırmak için üç dev , prod ve prep diye üç farklı dizin oluşturuyoruz. Her üç dizinin altında da config.properties dosyasını oluşturuyoruz.

Bu işlemlerden sonra xml dosyasında config dosyasını load edecek şekilde ayarlıyoruz. Bu işlemler için alttaki parametreyi mvc-dispatcher-servlet.xml dosyasına eklemek yeterlidir(classpath ten sonra gelen tüm .properties uzantılı dosyaları yükle anlamı taşır).

mvc-dispatcher-servlet.xml
    <context:property-placeholder location="classpath*:*.properties"/>

bu tanımlamayı yaptıktan sonra config.properties dosyalarını aşağıdaki şekilde düzenliyoruz.

dev/config.properties
db.url = localhost
db.user = root
db.pass = 12345

 prep/config.properties
db.url = 192.168.1.110
db.user = rootTest
db.pass = 12345Test

prod/config.properties
db.url = 192.168.1.111
db.user = rootProd
db.pass = 12345Prod



ayar dosyalarını da tanımladıktan sonra , controller'a giderek yüklenen ayar dosyasındaki değerleri okuyalım.


 HelloController.java

@Controller
@RequestMapping("/")
public class HelloController {

    @Value("${db.url}")
    public String dbUrl;


    @Value("${db.user}")
    public String dbUser;


    @Value("${db.pass}")
    public String dbPass;



                @RequestMapping(method = RequestMethod.GET)
                public String printWelcome(ModelMap model) {
                               model.addAttribute("message", "Okunan Degerler!");
        model.addAttribute("url",this.dbUrl);
        model.addAttribute("pass",this.dbPass);
        model.addAttribute("user",this.dbUser);

                               return "index";
                }
}



son olarak okunan değerlerin view edilmesi için index.jsp sayfasına aşağıdaki kodları ekleyelim.
index.jsp
                <h3>${message}</h3>
                <p><b> user :</b>${user}</p>
                <p><b> pass :</b>${pass}</p>
                <p><b> url: </b>${url}</p>



Kodlamamız buraya kadardı ancak bizim maven'a giderek profil tanımlamasını  henüz yapmadık. Üstte üç farklı dizine ayırdığımız ayar dosyalarını profillerle eşleştirmemiz gerekmektedir.  Bu tanımlamayı yapmak için pom.xml e aşağıdaki kodları ekleyelim.



 pom.xml
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/dev</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prep</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/prep</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources/prod</directory>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>

Buradaki komutlarla maven'a  dev,prep ve prod diye 3 profil ID si verdik. bu profillerin ayar dosyalarının nerede olduğunu belirttik. Üstteki kodları pom.xml e ekledikten sonra sağ üste köşedeki maven tabında profil bilgileri listelenecektir. Burada hangi profili seçip maven install dersek artık  maven  o profile ait ayar(config.properties) dosyasını okuyarak war dosyası oluşturacaktır.


 Her profil için maven clean deyip ardından maven install ettikten sonra projeyi çalıştırınca  oluşan  3 farklı (profile göre) çıktı aşağıdaki gibi olacaktır.




kaynak dosyalar(github) : indirmek için tıklayın