Bit Bazında İşlemler ve Bit Kaydırma Operatorleri

java

Java programlama dilinde integral tipteki operatörler biz bazında ve bit kaydırma gibi işlemlere olanak sağlarlar.
Integral tipli ile anlatılmak istenilen limitli ve sayısal ifade alabilen tiplerdir.

byte,short,int,long,char

Soru
Javada integral tipler yönlüdür?
Cevap
Yanlış. Char eksi değerde ifade almaz.Tek yönlüdür

Buradaki operatörler diğerlerine göre çok az kullanılır.çok az kullanılır
Bu nedenle kapsamları kısadır.

Bitsel operatörler int ve long tipleri üzerinde işlemlere
girerler operatörler byte ya da short tipinde ise
önce int veya long a çevrildikten sonra bitsel işlemler yapılır.

“~”   — Tek bitli değeri tersine çeviren(complement) işarettir.
Bir sayının eksi almış halini ifade edip tutmak için kullanılır.Negatif sayılar pozitif sayıların tümleyeni şeklinde tutulur.

Kural :
Ikilik tabana göre en soldaki sayı yön bitidir. 0 pozitif, 1 negatifi ifade eder. Pozitiften negatife çevrilirken, tümleyen alınır. 1 eklenir. Negatiften pozitife çevrilirken, tümleyen alınır. 1 çıkarılır.

Örnek
int tipinde 4 sayısı iki bitlik temsili karşılık 100 dür

Sayılarımız int olduğu için 32 bitlik basamak karşılığını yazalım

4 sayısı için negatifi bulalım

4     0000 0000 0000 0000 0000 0000 0000 0100  
~4    1111 1111 1111 1111 1111 1111 1111 1011

Sonucuna 1 ekliyoruz

~4 + 1 = -4 tür. =  1111 1111 1111 1111 1111 1111 1111 1100

Program

public static void main(String[] args) {
 int a = 4;
 int b = ~4 + 1;
 System.out.println(a);
 System.out.println(b);
}

Çıktı

4
-4

 

 

Bitsel operatör tablomuzu öğrenelim.

a  b    a|b  a&b   a^b    ~a
0  0     0    0     0      1
1  0     1    0     1      0
0  1     1    0     1      1
1  1     1    1     0      0

Tek olan karşılaştırma operatörlerinde ( &, |, ^ )
hem sağ hemde solundaki ifadelerin karşılaştırılmaları kesinlikle yapılır.

Yönlü veya yönsüz kaydırma işlemlerinde mutlaka integer basamak sayısı karşılığında sayımızı yazdıktan sonra işlemleri yapmalıyız.

Örneğin
 a ifadesinin sonucu alınır. b ifadesinin sonucu alınır. Ikisinin arasındaki operatörün işlemi yapılarak sonuç üretirlir.Kod akışı bu şekilde devam eder.

a & b  ve (and) # her iki taraf doğru ise (a, b değerleri) sonuç doğru kabul edilecek
a | b veya (or) # iki taraftan biri doğru ise(a, b değerleri) sonuç doğru kabul edilecek
a ^ b veya tersi (xor)  # yanlızca biri doğru ise(a, b değerleri) sonuç doğru kabul edilecek
a~ değili (not)

a << z  (left shift) # z kadar a nın basamaklarını sola kaydır.
Yönlü kaydırma işlemidir.(integer basamak sayısı ile sayımız yazıldıktan sonra işlem yapmalıyız)
a sayısı pozitif ise sağdaki boş kalan basamağa 0 ekle.
a sayısı negatif ise sağdaki boş kalan basamağa 0 ekle.

a >> z (right shift) # z kadar a nın basamaklarını sağa kaydır.
Yönlü kaydırma işlemidir.(integer basamak sayısı ile sayımız yazıldıktan sonra işlem yapmalıyız)
a sayısı pozitif ise soldaki boş kalan basamağa 0 ekle.
a sayısı negatif ise soldaki boş kalan basamağa 1 ekle.

örnek

  a = 3;
  b = 5;
 
 3 | 5        -- 0011 | 0101  sonuç 0111 
 3 & 5        -- 0011 & 0101  sonuç 0001
 3 ^ 5        -- 0011 ^ 0101  sonuç 0110
 ~3 bulalım   -- 0011         sonuç 1100 (Baştaki yön biti dikkate alma çıkan sonuç -4, 1 ekleyelim -3 oldu)


 3 << 2       
--0000 0000 0000 0000 0000 0000 0000 0011         
--0000 0000 0000 0000 0000 0000 0000 1100  sonuç 001100  Sayı büyür (12)


 -3 << 2
--1111 1111 1111 1111 1111 1111 1111 1101
--1111 1111 1111 1111 1111 1111 1111 0100 sonuç sayı küçülür (-12)


 3 >> 2       -- 0011         
--0000 0000 0000 0000 0000 0000 0000 0011
sayısı bir sağa kaydırdık 3 değeri 1,5 oldu biz integer işlemi yatığımızdan
sayı 1 oldu
--0000 0000 0000 0000 0000 0000 0000 0001
sayısını bir sağa kaydırdık 1 değeri 0,5 oldu biz integer işlemi yaptığımızdan
sonuç 0
--0000 0000 0000 0000 0000 0000 0000 0000


 3 >>> 2      -- 0011         sonuç 1100   
(bitleri 2 hane sola kaydır) Sayı büyür.Yönsüz kaydırma sadece kaydır.
 3 <<< 2      -- 0011         sonuç 0000   
(bitleri 2 hane sola kaydır)Yönsüz kaydırma sadece kaydır. 

Teşekkürler, iyi çalışmalar 🙂

JAVA kategorisinde yayınlandı

Eşitlik, İlişkisel ve Koşullu Operatörler

 

java

 

Eşitlik ve ilişkisel operatorler, elimizdeki iki ifadenin birbirine göre küçük, büyük, eşit veya eşit değil gibi sonuçları saptamamızı sağlarlar.Bu operatorlerin büyük çoğunluğu bizlere düşündüğümüzde tanıdık geliyor.

Aklımızda bulunsun;
Iki ilkel tip karşılaştırmasında eşittir ve eşit değildir kullanılabilir.

== eşittir
!= eşit değildir
> büyüktür
>= büyük veya eşittir
< küçüktür
<= küçüktür veya eşittir

Örnek

class ComparisonDemo {

public static void main(String[] args){
 int value1 = 1;
 int value2 = 2;
 if(value1 == value2)
 System.out.println("value1 == value2");
 if(value1 != value2)
 System.out.println("value1 != value2");
 if(value1 > value2)
 System.out.println("value1 > value2");
 if(value1 < value2)
 System.out.println("value1 < value2");
 if(value1 <= value2)
 System.out.println("value1 <= value2");
 }
}

Çıktı

value1 != value2
value1 < value2
value1 <= value2

Koşullu Ifadeler – The Conditional Operators

Iki boolean ifade karşılaştırılırken koşullu-ve ve koşullu-veya kullanılır.

&& koşullu-ve
|| koşullu-veya

Bu operatorler elimizdeki koda kısa-devre yaptırmak için kullanılır. Peki bu ne anlama gelir.
Ikinci operator ihtiyaç olduğunda değerlendirilir. Ifadenin solundaki durum kodun devam etmesi icin beklenen ifade olmadığı durumda kodumuzun akışı kesilir ve ifadenin sağ tarafına hiç bakılmaz.

class ConditionalDemo1 {

public static void main(String[] args){
 int value1 = 1;
 int value2 = 2;
 if((value1 == 1) && (value2 == 2))
 System.out.println("value1 is 1 AND value2 is 2");
 if((value1 == 1) || (value2 == 1))
 System.out.println("value1 is 1 OR value2 is 1");
 }
}

Çıktı

System.out.println("value1 is 1 AND value2 is 2");

System.out.println("value1 is 1 OR value2 is 1");

Bunlardan farklı olarak üç operatorlü yani if-then-else mantığı içeren koşullu ifade mevcuttur.

? ve : ile uygulanır. Aşağıdaki ifade üzerinden inceleyelim.

Soru işaretinin sol tarafı true ise iki nokta(:) işaretinin sol tarafı,
false ise sağ tarafı sonuç olacak dönülecektir

class ConditionalDemo2 {

public static void main(String[] args){
 int value1 = 1;
 int value2 = 2;
 int result;
 boolean someCondition = true;
 result = someCondition ? value1 : value2;

System.out.println(result);
 }
}

Tip karşılaştırma instanceOf kullanımı – The Type Comparison Operator instanceof

Elimizdeki objeler ile istenilen objeleri karşılaştırmak için
kullanılır. Ayrıca objemizin hangi sınıftan oluştuğunu, alt sınıf
olup olmadığını veya bir arayüz(interface) olup olmadığını karşılşatırmamızı
sağlar.

null değerinin hiçbir şeyin nesnesi olmadığını karşılaştırma yaparken dikkate almayı unutmayalım 🙂

class InstanceofDemo {
 public static void main(String[] args) {

Parent obj1 = new Parent();
 Parent obj2 = new Child();

System.out.println("obj1 instanceof Parent: "
 + (obj1 instanceof Parent));
 System.out.println("obj1 instanceof Child: "
 + (obj1 instanceof Child));
 System.out.println("obj1 instanceof MyInterface: "
 + (obj1 instanceof MyInterface));
 System.out.println("obj2 instanceof Parent: "
 + (obj2 instanceof Parent));
 System.out.println("obj2 instanceof Child: "
 + (obj2 instanceof Child));
 System.out.println("obj2 instanceof MyInterface: "
 + (obj2 instanceof MyInterface));
 }
}
class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}

Çıktı

obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true

Teşekkürler, Iyi çalışmalar 🙂

 

Tagged with: , , ,
JAVA kategorisinde yayınlandı

alien komutu

Merhabalar

Linux te birbirinden farklı dağıtımların, kendilerine özgü dosya paket uzantıları mevcuttur.

Red Hat  dağıtımı rpm uzantılı olabilirken , Debian dağıtımı deb uzantılı paketleri içerir.

Bir uzantıda hazırlanmış programın farklı uzantıda ve dağıtımda çalışmasını istediğimiz zaman alien komutunu kullanılabilir.

Bilgisayarımıza yükleyelim.

sudo apt-get install alien

Elimizdeki rpm uzantılı bir dosyayı deb uzantılı hale çevirelim.

sudo alien -v -d test.rpm

Teşekkürler, Kolay gelsin 🙂

Tagged with: , , , ,
Linux kategorisinde yayınlandı

Oracle WebLogic Server a Uygulamamızı Nasıl Deploy Yaparız?

Merhabalar,

Bir java web uygulaması geliştirdik ve bunu Oracle WebLogic Server üzerinde uygulamamızı görüntülemek istiyoruz.Komut satırından bu duruma bir çözüm oluşturacağız.

Ihtiyacımız maven aracı ile oluşturulmuş bir projenin, ear veya war
hallerindeki dosyalardır.

Terminalimizi açıyoruz.
projemizdeki pom.xml bölümünde şu komutu çalıştırıyoruz.

mvn clean install

projemizin target isimli klasörünün altında .war uzantılı bir dosya
oluşturuldu.

Dosyamız hazır olduğuna göre sunucu dosyalarının arasında olan weblogic.jar ın bulunduğu yere gidelim

~/workarea/servers/weblogic/wls12213/wlserver/server/lib

Ardından komutu çalıştıralım.

java -cp weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -username weblogic -password weblogic1 -deploy -name PROJE_ADI -targets AdminServer -source /WAR_DOSYASININ_OLDUGU_KLASOR/PROJE_ADI.war

Herşey başarılı olduğunda aldığımız çıktı şu şekildedir.

Target state: deploy completed on Server AdminServer

Tarayıcı üzerinden projemizi görebiliriz.

localhost:7001/PROJEMIZE_VERDIGIMIZ_ISIM

Şimdi de sunucudaki projemizi sunucudan silelim.

java -cp weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -username weblogic -password weblogic1 -undeploy -name PROJE_ADI -targets AdminServer

 

Herşey başarılı olduğunda aldığımız çıktı şu şekildedir.

Target state: undeploy completed on Server AdminServer

Teşekkürler, Iyi çalışmalar 🙂

 

weblogic kategorisinde yayınlandı

Ubuntu Oracle WebLogic Server Kurulumu

Merhabalar,

Oracle WebLogic bir uygulama sunucusudur.
Kurulum için gerekli dosyaları Oracle kendi sitesinden bu link üzerinden edinebilirsiniz.

Bu yazımızda kurulum yapmak istediğimiz versiyon  12.2.1.3 versiyonudur.

Terminali açıyoruz.Kurulum için çalışma alanımıza gidiyoruz.

/home/user/workarea/servers/weblogic

Oracle WebLogic sunucusunu çalıştırabilmek için java kurulu olmalıdır. Buradan java kurulumuna bakabilirsiniz.

Indirdiğimiz kurulum dosyalarını unzip komutu ile içinde bulunduğumuzu klasöre çıkartıyoruz.Buradan unzip komutunun kullanımına bakabilirsiniz.

unzip fmw_12.2.1.3.0_wls_quick_Disk1_1of1.zip

Çalıştırılabilir jar uzantılı dosyamızı çalıştırıyoruz.

java -jar fmw_12.2.1.3.0_wls_quick.jar

Kurulum arayüzüne erişmek için aşağıdaki komutları kullanabiliriz.

cd wls12213

./oracle_common/common/bin/config.sh

Burada bizden bir domain ismi belirtmemizi istiyor. Benim verdiğim isim my_domain.

/home/user/workarea/servers/weblogic/wls12213/user_projects/domains/my_domain

Burada sadece şu kısmı işaretliyoruz.

 - Basic WebLogic Server Domain

Kurulumdan sonra arayüzü kullanmak için kullanacağımız kullanıcı ve şifre bilgileri

name : weblogic
password : weblogic1

Domain mode bölümünden şu kısımları işaretliyoruz.Ve kurulumu tamamlıyoruz.

 - Development
 - Kullanılan jdk

Kuruluma ait özellikle istenilen değişiklikler yapmayıp standart kurulum yaptığımız için bu adımı geçiyoruz.Kurulumu başlatmak için oluştur butonuna tıklıyoruz.

Kurulumumuz hazır olduğuna göre artık sunucumuzu ayağa kaldırabiliriz.Terminali açıyoruz.

 /home/user/workarea/servers/weblogic/wls12213/user_projects/domains/my_domain

 

Sunucuyu açmak için :

 ./startWebLogic.sh

Terminal üzerinde şu şıktıyı aldıktan sonra sıradaki adımı yapınız.

The server started in RUNNING mode

Artık tarayıcımız üzerinden sunucumuza erişebiliriz.

http://localhost:7001/console

web-logic

Teşekkürler, Iyi çalışmalar 🙂

weblogic kategorisinde yayınlandı

Git yapılandırma dosyası (Git Config)

Merhabalar

Git kullanırken bir yapılandırma dosyası kullanarak bazı özelliklerin otomatik olarak çalışmasını sağlayabiliyoruz.

3 farklı şeklide bu ayarları yapabiliyoruz.

  • sistem düzeyi,  git kurulu olduğu makina düzeyinde kontrol
  • kullanıcı düzeyi(session), git kurulu olduğu makinadaki kullanıcının düzeyinde kontrol
  • proje düzeyi, git kullanılan projeye özel kontroller.

Terminali açıyoruz.

$ git config --system --list --show-origin #sistem düzeyi
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" http.sslbackend=openssl
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" diff.astextplain.textconv=astextplain
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" filter.lfs.clean=git-lfs clean -- %f
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" filter.lfs.smudge=git-lfs smudge -- %f
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" filter.lfs.required=true
file:"C:\\Program Files\\Git\\mingw64/etc/gitconfig" filter.lfs.process=git-lfs filter-process

Bir sonraki komut.

$ git config --global --list --show-origin  #kullanıcı düzeyi
file:C:/Users/your_user/.gitconfig user.email=ozsoy.kerami@test.com
file:C:/Users/your_user/.gitconfig user.name=Kerami Ozsoy

Bir sonraki komut terminalden proje içerisine girildikten sonra çalıştırılır.

$ git config --list --show-origin  # proje düzeyinde
file:.git/config core.repositoryformatversion=0
file:.git/config core.filemode=false
file:.git/config core.bare=false
file:.git/config core.logallrefupdates=true
file:.git/config core.symlinks=false
file:.git/config core.ignorecase=true

Şifre işlemleri

Credential Manager kullanıyorsanız git kurulu olan makinada şifreleri kayıt yapabilir ve projenizde her değişiklik için şifre sormamasını sağlayabilirsiniz.

Bu ayarı yaptığınızda git, sistem düzeyindeki yapılandırma dosyasına şifre bilgisini
Credential Manager üzerinden alacağının bilgisini yazar.

Bu komut ile içeriğini görebiliriz.

git config --system --edit

Bu durumu tersine çevirmek için yapılandırma dosyanızdan  [credential] bölümünü
silebilirsiniz. Veya proje düzeyindeki config dosyasına

[credential]
            helper = #eşitliğin bu tarafı boş kalıyor

şeklinde ekleme yapıldığında uyarı sorusu gözükmeyecektir.

Teşekkürler Kolay Gelsin 🙂

GIT kategorisinde yayınlandı

sed komutu

linux
Merhabalar,

sed komutu bizlere,
elimizdeki dosyayı herhangi bir editör ile açma ihtiyacı duymadan doğrudan komut satırı,terminal üzerinden dosya içeriğine müdahale etmemizi sağlar.

Komutumuzun işletim sistemi üzerinde nerede bulunduğunu öğrenelim

which sed

Komut Çıktısı:

/bin/sed

 

Parametreler ile kullanılabilecek özel karakterler aşağıdadır.

\ 
.  
*  
[]  
^  
$    Bu karakter satır sonunu belirtir.  
&
a    Ekleme komutu

 


-e parametresi
Birden fazla komutu tek seferde,satırda kullanmak için (her komut için sed kelimesini tekrar yazmamak için bir tane sed kelimesi ile işimizi halledebiliriz 🙂 )

-i parametresi
Dosyayı düzenleyebilmek için gereken parametre.

 

Bir örnek ile açıklayalım.
test.txt isimli bir dosyamız mevcut ve içindeki yazılar şu şekildedir.

1. satir
2. satir
3. satir
4. satir
5. satir

Dosyamızın en alt satırına

BURASI EN SON SATIR

yazısını ekleme için sed komutunu kullanalım.

sed -i -e "\$aBURASI EN SON SATIR" test.txt

Komut Çıktısı:

1. satir
2. satir
3. satir
4. satir
5. satir

BURASI EN SON SATIR

Iyi günler, Iyi Çalışmalar 🙂

 

 

 

Linux kategorisinde yayınlandı

How to use flyway for version control for your database

Merhabalar,

Flyway teknolojisinin ne işe yaradığını  açıklayarak başlayalım.

Bir projeninz var. Projenizin dosyalarının bir tanesinin içerisinde PLSQL, SQL gibi sorgularınız var. Projenizin kodlarını sunucuya atıp projenizi çalıştırmak istiyorsunuz. Kodlarınızı sunucuya atıp sunucunuz çalıştırdığınızda sql içeren dosyamızdaki sql komutları otomatik olarak çalışıyor.  Tabiki sunucu olmadan bu durumu test edebilirsiniz bu sadece bir örnek senaryodur.

Bu sql dosyası, bir geliştirme yaptınız ve bu geliştirmenini sorgulanacağı veribanındaki alanların,tabloların,kayıtların vb. hızlı bir şekilde otomatik olarak kodun çalıştırılmadan önce hazır olmasını sağlıyor.

Flyway in kendi sitene buradan ulaşabilirsiniz…    flywaydb.org

Flyway ,
sorguların çalışmasını sağlarken elimizde sadece flyway in kullandığı bir tablo olmalıdır.
Bu tablo içerisinde her çalışan sorgunun
– versiyon numarası
– içerik numarası (checksum)
– içerik adı
–  şema
– sorgu çalışma tarihi
– çalıştıktan sonra başarılı olup olmaması

bilgileri mevcuttur.

Bu durum bize en son hangi sql çalıştırılmış veya hangi sql içerisinde değişiklik olmuş anlamıza yardımcı olur.

Eğer eski bir sql üzerinde işlem yapmanın gerekiyor ise değişikliği yaptıktan sonra
içerik numarası (checksum) kolonuna baktığınızda değiştiğini farkedeceksiniz.Çünkü bu kolon her sorgu içeriğine ait özgün bir numara belirmek için vardı. Artı veya eksi bir sayı olması bizim için önemli değildir.

Bir örnek uygulama yapalım. Bu uygulamanın kaynak kodlarının linki aşağıda mevcuttur.

Gerekenler

  • Java 1.7
  • Maven
  • Apache Derby (Embedded DB)

Projemizi Maven ile oluşturalım.

mvn archetype:generate -DgroupId=com.keramiozsoy.javaFlywaySample -DartifactId=java-flyway-sample -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Elimizde iki tane sorgu içeren dosya mevcut bunları projemizi çalıştırdığımız zaman veritabanına eklemek istiyoruz.Bu dosyaları projemize ekliyoruz.

V1_001__init.sql

 CREATE TABLE usertable 
(
 id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1,INCREMENT BY 1) , 
 name VARCHAR(50) 
)

V1_002__insertUser.sql

insert into usertable(name) values ('kerami');
insert into usertable(name) values ('ozsoy');

Sorgularımızı ekledim.

Kullanmak isteidiğimiz veritabanımızın adı testDerbyDB .

Flyway kendisine ait tablosunu belirleyelim. Bunun ismi FLYWAY_SCHEMA_TABLE olsun.

Uygulamamızı çalıştırdığımız zaman aşağıdaki gibi bir çıktı elde edeceğiz

Jan 11, 2018 9:19:18 PM org.flywaydb.core.internal.util.VersionPrinter printVersion
INFO: Flyway 4.0.3 by Boxfuse
Jan 11, 2018 9:19:19 PM org.flywaydb.core.internal.dbsupport.DbSupportFactory createDbSupport
INFO: Database: jdbc:derby:src/main/resources/testDerbyDB (Apache Derby 10.11)
Jan 11, 2018 9:19:20 PM org.flywaydb.core.internal.command.DbValidate validate
INFO: Successfully validated 2 migrations (execution time 00:00.045s)
Jan 11, 2018 9:19:20 PM org.flywaydb.core.internal.metadatatable.MetaDataTableImpl createIfNotExists
INFO: Creating Metadata table: "APP"."FLYWAY_SCHEMA_TABLE"
Jan 11, 2018 9:19:20 PM org.flywaydb.core.internal.command.DbMigrate migrate
INFO: Current version of schema "APP": << Empty Schema >>
Jan 11, 2018 9:19:20 PM org.flywaydb.core.internal.command.DbMigrate applyMigration
INFO: Migrating schema "APP" to version 1.001 - init
Jan 11, 2018 9:19:21 PM org.flywaydb.core.internal.command.DbMigrate applyMigration
INFO: Migrating schema "APP" to version 1.002 - insertUser
Jan 11, 2018 9:19:21 PM org.flywaydb.core.internal.command.DbMigrate logSummary
INFO: Successfully applied 2 migrations to schema "APP" (execution time 00:01.009s).
 -------------- 1 ------ kerami
 -------------- 2 ------ ozsoy
 SELECT * FROM FLYWAY_SCHEMA_TABLE 
 - 
--installed_rank >>1***version >>1.001***description >>init***type >>SQL***script >>V1_001__init.sql***checksum >>-1226849264***installed_by >>APP***installed_on >>2018-01-11 21:19:21.027***execution_time >>27***success >>1*** - 
--installed_rank >>2***version >>1.002***description >>insertUser***type >>SQL***script >>V1_002__insertUser.sql***checksum >>1051103084***installed_by >>APP***installed_on >>2018-01-11 21:19:21.391***execution_time >>152***success >>1***

 

Sorgularımız çalıştı gerekli tablolarımız oluşturuldu.

Iyi günler, Iyı Çalışmalar 🙂

Github Link

https://github.com/keramiozsoy/java-flyway-sample

 

Nedir,Nasıl Yapılır ? kategorisinde yayınlandı

Which workflow is better for code development in git

git-logo
Bu yazı içeriğinde bir yazılım geliştirirken kullandığımız git aracı ile projemizin kod sürümlerini, kalitesini  yönetirken kullabileceğimiz iş akışı taslaklarını anlatmaya çalışacağım.

  • Centralized Workflow
  • Feature Branch Workflow
  • Gitflow Workflow
  • Forking Workflow

Centralized Workflow

Bu iş akışı şemasında bir tane merkezi dal (branch) mevcuttur.

Versiyon kontrol sistemlerinden
svn (subversion) sisteminde trunk,
git üzerinde master olarak bu dal adlandırılıyor.

Bu iş akışında svn üzerinde yaptığınız geliştirmeleri git üzerinde de yapabilirsiniz.

Fakat git , svn e ek olarak bir çok güzel özelliğe sahiptir.

Ilk olarak git, merkezdeki kodun bir kopyasını tüm geliştiricilerin kendi bilgisayarlarında tutma imkanı sağlar.

Projedeki tüm değişiklikler birbirinden bağımsız ilerleyebilir.Her yerel depo yani bilgisayarınızdaki kopya  üzerinde yaptığınız değişiklikler sadece sizin yerel deponuz üzerinde değişikliğe uğrayarak istenildiğinde  merkezdeki depoya yaptığınız değişlikler gönderilerek eklenir.

Ikinci olarak git, Güçlü bir dal(branch) ve birleştirme (merge) alt yapısı sağlar.

svn den farklı olarak git dalları tasarlanırken kodları birleştirmek ve depolar arası
farklılıkları eşitlemek için hata-güven mekanizmasına dikkat edilerek tasarlanmıştır.

Bu iş akışında diğer iş akışları ile ortak özellik olarak,
merkezi bir sunucudaki depodan kod alınır,  değişiklikler yapıldıktan sonra tekrar merkezi depoya gönderilir.

Fakat diğer iş akışları ile karşılaştırdığımızda merkezi iş akışında,
kopyalama (forking) veya kodun bir kopyasını alıp farklı bir kullanıcı kendi geliştirmelerini yapıp sizin elinizdeki kod ile karşılaştırılmasını isteyebileceği bir
özelliği (pull request) yoktur.

How it works?

Ali  uzak sunucudaki merkez kodu bilgisayarına alır ve değişikliklerini yapar.
Merkez depoda ne olduğu ile ilgilenmez.
Veli nin de Ali gibi kendine ait geliştirmeleri yaptığını düşünelim.

Ali kendi işini Veli den önce bitirdi ve merkez kod(master) üzerindeki değişikliklerini diğer takım çalışanları ile paylaşabilmek için merkez depoya gönderdi. Ali ilk olarak gönderdiği ve o zaman dilimine kadar kimse uzak sunucudaki merkez kod(master) uzerinde değişiklik yapmadığı için Ali nin değişiklikleri kolayca merkezdeki kod ile birleşerek artık merkez kod son halinde yani Ali nin yaptığı değişiklikleri de barındıracak hale gelir.

Veli kodunu merkez depoya göndermeye çalışsın.Sonuç olarak hata alacaktır.

Alınan hata uzak sunucudaki merkezi kod, yerel bilgisayarındakinden daha farklı ve yeni değişiklikler olduğu için kod gönderilemeyecektir.

Hata bizlere,  önce uzaktaki sunucudaki kodun son halini yerel deponuza çekmeyi
ardından ilgili hatalar(conflict) varsa düzelttikten sonra gönderebileceğimizi söyler.
Bunun yerine aşağıdaki durum tercihte edilebilir.

Veli merkezi depodan kodu ne zaman almış ise o tarihten itibaren başlayarak günümüze kadar olan değişiklikleri merkezde geçici bir yerde tutup (rebase), Veli kendi değişikliklerini merkez koda ekler.

Daha sonra geçici yerde tutulan kodlar merkez koda eklenerek değişiklik işlemi tamamlanmış olur. Varsa hataları Veli yine çözmelidir.

Bu iş akışı için her zaman ikinci yöndem daha uygundur.
Çünkü birincide kodu birleştirme değişikliğini (merge commit) bir noktada sonuçlandırırsınız fakat ikincide her değişiklik için tek tek karşılaştırılma yapıldığından problem varsa sadece o adım içindeki problem çözülerek sonraki değişikliklere geçilerek ilerlenebilmektedir.

Temiz bir proje geçmişimiz olursa, istediğimiz noktayı da geriye doğru değiştirebiliriz. 🙂

Feature Branch Workflow

Bu iş akışının arkasında yatan temel fikir ;

Tüm geliştirmeler, merkezdeki ana dal (master branch) yerine
her özellik için ayrı bir dal(branch) oluşturularak
birbirinden ve merkez koddan bağımsız  ortam sağlanarak yapılır.

Bu yapı sürekli entegrasyon ortamlarını(continuous integration) kullanıyor iseniz
ana dal üzerinde problemli kod oluşmayacağı, her özelliğin ana dal tarafına eklenirken
tek tek incelenerek geliştirmeler aktarıldığı için güzel bir alt yapı sağlar.

Ayrıca bu durum geliştirilen özellikler üzerinde farklı geliştiricilerin
koda kendi istedikleri veya geliştirmek istedikleri kısımları adapte edebileceği
ortamı(pull request) sağlar. Bu özellik sayesinde birlikte meslektaşlarınız
arasında fikir alışverişi yapmak kolaylaşır.

How it works?

Uzaktaki sunucudaki kodumuzda bir ana dal(master branch) vardır.
Bu dal daha önce yapılan tüm geliştirmelerin son halini içerir.

Ali projede bir özellik geliştirmek istiyor.

Ana dal üzerinden kendine ana dalın kopyasını oluşturup bilgisayarına çekiyor.
Bu kopyanın adı ali-feature-1 olsun.

Ali tüm geliştirmeleri yapar ve merkez koda eklenmesi(merge) için gönderir. Bu geliştirme aynı zamanda kodu başkalarının incelemesine olanak sağlar ve kodu bir başkası da gözden geçirerek(code review) tartışmaya olanak sağlar. Bu değişiklik hemen ana kod ile birleştirilmek zorunda değildir ve istenildiği kadar saklanabilir.

Aynı şekilde Veli de geliştirme yapmak istiyor.
Oluşturduğu kopyanin adı ise veli-feature-1 olsun.
Geliştirmelerini yapıyor,merkez koda eklenmesi isteği yapıyor ardından ana dal ile kodu birleştiriliyor(merge).

Ali ve Veli den başka bir kişi de geliştirme yapmak isteyip kopya oluşturduğunda
artık ana dal(master branch) üzerinde Veli nin yaptığı değişiklikler mevcut
olduğundan oluşturduğu kopyasında veli-feature-1 içinde yapılan değişiklikler
mevcuttur.

Yukarıdaki şekilde sürekli olarak birbirinden bağımsız özellikler geliştirebiliriz. 🙂

 

Gitflow Workflow

Bu iş akışı, güçlü bir sürüm-dal yapısı sağlıyor.
Büyük ölçekli projelerin yönetilmesi için güçlü bir çatı oluşturuyor.
Projeninizin her sürümünün geliştirilmesi ve tasarlanması için uygun ortam oluşturuyor.

Bu iş akışı Feature Branch Workflow un eksikliklerine yeni fikirler ve özellikler kazandırmak için geliştirilmemiştir.
Aksine eldeki işleri çok özelleştirilmiş farklı dallara ayırmayı amaçlarken diğer yandan ne zaman ve nasıl tasarlanacağını, tanımlanacağını belirler.

Ek olarak özellik dalları (feature branches) projenin yeni kazanımları için birbirinden bağımsız bireysel dallar ile bakımının yapılabilmesi ve sürümlendirilebilmesini sağlıyor.

Tabi ki Feature Branch Workflow ın tüm özelliklerinden yararlanabiliyoruz.

Gitflow Workflow her ne kadar sanal bir olgu olsada somut aracı mevcuttur.

https://github.com/nvie/gitflow

Zaten kullandığımız Git komutlarına ek olarak bu iş akışı
kullanımını kolaylaştıran, terminalinizden kullanabileceğiniz komut kümesi sağlıyor.

Temel olarak bu iş akışı,
hangi dal tipleri oluşturulabilir ve birbiri ile birleştirilebilir sorularının yanıtı kendi kurallarına göre ortaya koyuyor.

How it works

Git kullanmak istediğimiz projemizde
eğer yukarıdaki aracı kullanmak istiyorsak

git flow init

kullanmıyorsak

git init

komutları ile başlangıç yapabilirsiniz.

Oluşturacağı dal(branch) kümesi şu şekildedir

 tag
 master
 develop
 feature
 release
 hotfix
 support

 

master ve develop hakkında;

Gitflow Workflow tek bir tane ana dal tutmak yerine iki dal tutma eğilimindedir. Ikisinde de aynı kod barınır fakat amaçları farklıdır.

master ana sürümlerin geçmişini temiz bir şekilde tutmayı amaçlar.Her zaman stabil ve sürüm numarası bulunan kodlar bu dal üzerinde istenildiğinde kullanılabilir durumda
hazır beklemektedir.

develop ise yeni geliştirilen tüm özelliklerin birleştirilerek koda dahil olduğu genel kodun tamamıdır.


feature hakkında;

Her yeni oluşturulan özellik için bir dal oluşturmalıyız.
örnek olarak
master ve develop  dışında  feature-21  veya feature-36  adı ile bir dal oluşturularak geliştirmeler saklanmalıdır.

Peki bu özellik dalını hangi merkez dal üzerinden oluşturmalıyız?
Tabi ki bu dal oluşturulurken develop tan bir kopya alınıp geliştirmeler yapılıp tekrar işi bitince develop ve master taraflarına birleştirme(merge) yapılmalıdır.

Hiç bir zaman bir feature, master dalına direk olarak birleştirilmemelidir.

 

release hakkında;

Bu dal aslında develop dalının bir kopyasıdır.
release üzerinde geliştirmeler yaptıktan sonra tekrar develop
dalına birleştirilir.Tam tersi de doğrudur.

Biraz daha bu durumu açalım.

develop dalından kopyalarayarak adı feature-30 olan bir dalınız olsun.

Şimdi develop aslında belirli bir release dalından
sürüm numarası 1.2 gibi bir sürümden kopyalanarak oluşturulmuştur.

Siz de  feature-30 u buradan oluşturmuş oldunuz.
Sürüm oluşturulduktan sonra başka geliştiriciler develop dalına geliştirme yapmış olsalar bile etkilemez, hala release 1.2 sürümden oluşturulmuş bir kopya üzerinde geliştirme yapıyoruz.

Işimiz bittiğinde feature-30, develop ile birleştirilir(merge).
Eğer bu geliştirmeden sonra release oluşturmak istiyorsanız sürüm numarası ilerleterek
release 1.3 gibi bir kopya dal develop dalından tekrar oluşturmalısınız.

Ayrıca release 1.3 dalını da master dalına bileştirme(merge) yapmalısınız.
Sonrasında master için yeni bir sürüm(tag) numarası verilmelidir.

Ve yeni develop, release 1.3 ten bir kopya oluşturularak bu döngü devam etmeyi sürdürür.

Bu örneğe şöyle yaklaşabiliriz.
Önümüzdeki ay içinde release 201801 sürümünü çıkaracağız ve
ondan sonraki ay release 201802 sürümünü çıkarmış olacağız.

 

hotfix hakkında;

Genellikle canlı ortamda çalışan kodlarımızda
yeni bir sürüm çıkarılması beklenemeyen zamanlar için
oluşan hataların giderilmesi için master dan alınan kopya
olarak adlandırılır. Geliştirdiğimiz yeni özellikler hem master hemde develop
dallarına birleştirilmelidir.

hotfix dalı master dalına birleştirildikten sonra
küçük versiyon ilerlemesi yapılmalıdır.(tag  1.3 ten 1.3.1 gibi)
Çünkü büyük versiyon ilerlemesi release ile yapılmaktadır.(1.3 ten 1.4 gibi)

Tüm anlatılanları komutlar üzerinden görelim.
Bir proje oluşturduk. Klasörün içerisinde

git init

komutu ile başadık şuan merkez dal (master branch) elimizde var.

 git checkout -b develop

 git checkout -b release/0.1.0

 git checkout develop

 git checkout -b feature_branch

 git checkout release/0.1.0

 git merge feature_branch

 git checkout develop

 git merge release/0.1.0

 git checkout master

 git merge release/0.1.0

 git branch -D release/0.1.0

Bir hotfix nasıl geliştirilir?

 git checkout master

 git checkout -b hotfix_branch

 git checkout develop

 git merge hotfix_branch

 git checkout master

 git merge hotfix_branch

 

Tüm adımları özetlersek hangi dal hangi daldan oluşturulur?

Soldaki oluşan, sağdaki oluşturulan yer.

 develop < master

 release < develop

 feature < develop

 hotfix < master

 

Geliştirilen değişiklikler nereye birleştirilmelidir ?

 feature > develop

 release > develop ve release > master

 hotfix > master

 

Forking Workflow

Bu iş akışının temeli,
diğerlerinin odaklandığı noktaya yani tek sunucu merkezli kodun iş akışı modellerine yeni bir anlam kazandırmıştır.

Her geliştirici kendi sunucusunda kodu barındırabilir.
Bu durum her geliştiricide birbirinden bağımsız merkez kod var anlamına gelmez.
Her geliştiricinin bir yerel bir de genel deposu mevcuttur.

Bu yaklaşımı genel olarak halka açık,her geliştiriciye hitap eden, açık kaynak kodlu projelerde görebiliyoruz.

Bu iş akışının en temel avantajı,
açık kaynak projelerde bir merkez depoya kodu göndermeden projeye geliştirmeler entegre edilebilir.

Geliştirici kendi merkez deposuna geliştirici özellikleri ekler ve sadece proje yöneticileri resmi depoya bu geliştirmeyi gönderebilmektedir. Resmi olmayan geliştirmeler bu durumla birlikte gözden geçirilebilir ve kullanılabilir duruma gelir.

Temel olarak Gitflow Workflow iş akışı mantığı ile çalışır.
Bu mantık dağıtık olarak kullanıldığı için büyük ölçekli projelerde güvenli şekilde iş birlik ortamı oluşturur.

How it works

Aşağıdaki gibi bir deponuz olsun.

git clone https://repository-name/user/repo.git

Her şey resmi, herkese açık depolarda kodun tutulaması ile başlar.

Yeni bir geliştirici istediği özellikleri eklemek için direk olarak merkez kodu kopyalamayamaz. Bunun yerine kendi çalışma ortamına bir çatallama(forking) yapar.

Peki bu ne anlama gelir?
Aslında kodun tam bir kopyası sizin uzak çalışma ortamınızdadır fakat hala asıl kopyalandığı yerden tam olarak ilişkisi kesilmemiştir.

Yerel deponuzda bilgisayarınızda bir geliştirme yaptınız ardından
bunu size ait uzak deponuzdaki merkez kodunuza gönderip herkesin
görebilmesini sağlıyorsunuz. Bu geliştirmenizin bu depoyu asıl oluşturan ilk geliştiricilerinin görmesini istiyorsanız onlara bir geliştrime isteği (pull request)
yollayarak bakın ben bu geliştirmeleri yaptım kullanmak isterseniz burdan alabilirsiniz diyorsunuz. Isterlerse alıyorlar, genelde alırlar 🙂

Bu iş akılı github, bitbucket, gitlab gibi ortamlar tarafından kullanılır.

 

Resources

https://www.atlassian.com/git/tutorials/comparing-workflows
https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow
Iyı günler, Iyi çalışmalar 🙂
git-logo

Tagged with: , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
GIT kategorisinde yayınlandı

how to use openssl for file encyripted

Komut satırımızı açıyoruz.

echo "This is test file for openssl." > file.txt

Benim kullanmak istediğim şifreleme

aes-256-cbc

Farklı türlerde mevcuttur.

Aşağıdaki komut ile devam edelim.

openssl aes-256-cbc -in file.txt -out file-encrypted.txt

komut çıktısı :

enter aes-256-cbc encryption password: 12345 #şifre giriyoruz
Verifying - enter aes-256-cbc encryption password: #şifre tekrar giriyoruz

 

Dosyamızı açalım

vi file-encrypted.txt

komut çıktısı :

Salted__ó^Oάfí^E¿©á¾¤;#â<9f>-^Y£»^XÓ^DjoË<97><8e>¥yÃ<95>)ÿÝ<93><9a>õnq

 

Dosyanın içerisinde yazan yazılar okunabilir durumda değildir.
Şimdi de şifrelediğimiz dosyaları açalım.

openssl aes-256-cbc -d -in file-encrypted.txt -out file-decrypted.txt

komut çıktısı :

enter aes-256-cbc decryption password: 12345 # şifre

 

Dosyamızın içine tekrar bakalım.

vi file-decrypted.txt

komut çıktısı:

This is test file for openssl.

 

Iyi günler, Iyi çalışmalar 🙂

Linux kategorisinde yayınlandı