Posts

Map struct file template for IntelliJ

 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; #parse("File Header.java") @Mapper public interface ${NAME}EntityMapper {     ${NAME}EntityMapper INSTANCE = Mappers.getMapper(${NAME}EntityMapper.class); }

About Kubernetes

Image

Spring Boot / Embedded Tomcat - SSL

 @Bean     public ServletWebServerFactory servletContainer() {         TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {             @Override             protected void postProcessContext(Context context) {                 var securityConstraint = new SecurityConstraint();                 securityConstraint.setUserConstraint("CONFIDENTIAL");                 var collection = new SecurityCollection();                 collection.addPattern("/*");                 securityConstraint.addCollection(collection);                 context.addConstraint(securityConstraint);             }       ...

Liquibase in Docker container kimi istifade edilmesi

docker run --rm --network my-test-net -v D:\Workspace\my-app\migration-service\src\main\resources\:/liquibase/changelog liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.properties generateChangeLog url : jdbc:postgresql://a54427d8649e/my_db username : postgres password : hamid318 changeLogFile : /liquibase/changelog/mytestv3.yaml Eger evvelceden yaradilmis db container varsa, docker de network yaradib hemin containeri i yaradilan network a elave etmek lazimdir. liquibase i run ederken hemin networka elave edirik docker run --rm --network my-test-net -v D:\Workspace\my-app\migration-service\src\main\resources\:/liquibase/changelog liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.properties generateChangeLog --includeObjects="users"

JRE - a Certificate elave etmek

Windows10 : command prompt as adminstrator olaraq run edilmelidir. java nin yerleshdiyi foldere kechib, oradan  jre  daxilinde olan bin folderine kecmek lazimdir.  keytool -import -trustcacerts -keystore "/path/to/cacerts" -storepass changeit -noprompt -alias "aliasname" -file /path/to/cerfiticate.cer result: Certificate was added to keystore menim numunemde => keytool yerleshdiyi folder : C:\Users\HamidSF\.jdks\corretto-1.8.0_302\jre\bin cacerts uchun path : C:\Users\HamidSF\.jdks\corretto-1.8.0_302\jre\lib\security\cacerts

Git Gizli host və repository üçün credential helper

 Gizli host və repo üçün həfə username password yazmamaq üçün   git config --global credential.helper store run edib daha sonra git pull(push və ya digər username password istəyən komandalar) icra edirik.  username password yazdıqdan sonra home(linux) folder də gizli git.credentials faylı yaranır. Username və password burada saxlanılır. növbəti dəfə artıq username və password tələb olunmur. git özü fayldan oxuyur.

Stateful vs Stateless

Image
 

About Linux

 Linux dediyimiz eslinde hardware i idare etmek uchun yaradilan sistemdir. Ubuntu ve ya diger sistemler GNU adlanir. Isitfadeciye gosterilen teref ise shell olur. Muxtelif shell-ler var, sistem ilk defe qurulanda default olaraq bash shell secilmish olur. Butun shell-ler siyahisina baxmaq uchun  cat /etc/shells ----- Ubuntuda beledir. Diger sistemlerde ferqlene biler. ============================ Ubuntu-da esas directory-ler haqqinda / - root , esas folder /bin - ishledile bilen proqramlar, meselen bash, sh, ls ve ya digerleri burda olur /boot - sistem ishe dushende lazim olan fayllar burda saxlanir /home - sistemde olan user-ler uchun folderdir. burada hansi user ile sisteme daxil olmusuzsa, hemin user-e aid xususi bir folder olur. meselen /home/hamid /etc - config fayllari burada saxlanilir /media - flashcard, cd-rom kimi cihazlarin melumatlari saxlanilir (?) /mnt - external hard disk qoshulubsa, onun melumatlarini burada mount ede bilerik /proc - cpu ve diger melumatlar bura...

ThreadPoolExecutor ve ThreadPoolTaskExecutor ferqleri

Arashdirdigim qederi ile aralarinda ferqli cehetler yox kimidir. ThreadPoolTaskExecutor ozu arxada ThreadPoolExecutor istifade edir.  Bir ferqli meqam var ki, TPE yaradarken, constructorda mutleq corePoolSize, maxPoolSize ve s kimi deyerlerini vermeliyik. TPTE ise, TPE ni bean-style yaratmaga imkan verir. Hetta corePoolSize ve maxPoolSize deyerlerini vermesek bele ozu arxada default deyerler saxladigina gore TPE ni yarada bilir. https://stackoverflow.com/questions/39934115/difference-and-suggest-threadpooltaskexecutor-and-threadpoolexecutor

Left , Right ve Inner Join ferqleri

Bu ferqleri gostermek uchun choxun bire elaqeni nezerde tutaq. Meselen bir user bir neche kitaba sahib ola biler. amma hemin kitab yalniz hemin user e aiddir. userleri cheken zaman left join elesek, bu zaman ustunluk user table da olan datalara verilecek. yeni bir userin kitabi olmasa bele bu user de sechilen datalar ichinde olacaq.  link yene userleri chekmekle misal gosterek ve bu defe inner join istifade edek. Burada artiq hech bir kitaba sahib olmayan user secilen datalar ichinde olmayacaq. Burada ustunluk iki table arasinda kesismeye verilir.  link right join istifadesinde ustunluk book table a verilecek.  link

@Transactional annotation haqqinda. Cascade istifade olunmasi

Image
Umumiyyetle bu annotation Service Layer de istifade etmek duzgundur. Repository de istifade etmek, Serivce layerden cagrilan her bir Repository method uchun tranzaksiyanin yaradilmasi demekdir.  Meselen, UserRepository de save ve remove adli method var tutaq ki ve Transactional annotation u ile qeyd olunub. Service Layerde saveAndRemoveUnused adli method var. Bu method save edib, istifade olunmayanlari remove edecek.  Eger Service Layerden bu iki methodu cagirsaq, bu zaman her bir emeliyyat uchun Tranzaksiya achilacaq ki, bu da db ni yora biler. Hell yolu olaraq, Service Layerde bu methodlarin istifade oludugun yerde @Transaction qeyd etmek kifayetdir. Bu zaman bu method ishlediyi vaxt boyunca yalniz bir tranzaksiya achilacaq. save ve update methodlari uchun ayrica tranzaksiya achilmayacaq. Diger istifadesine baxsaq meselen, update method id e gore tapir ve hemin useri hansisa field ni deyishir. Methodun bashina @Transactional yazmaqla, userRepository nin save methodunu cagirm...

Microservices Security Example #3 - Zuul Proxy Server haqqında danışırıq

Image
 Zuul Proxy Server Zuul Serveri bir qala qapısı kimi düşünə bilərik. Məsələn qalaya daxil olmaq istəyən şəxsləri yalnız vahid bir qapıdan qəbul etmək üçün və ya tanımadığınız şəxsləri qalaya buraxmamaq üçün istifadə edilə bilər.  Bunu Zuul Server-ə texniki olaraq nümunə gətirsək, məsələn user-service və auth-service lər var. Zuul vasitəsilə bu service-lərə girişi yalnız vahid bir yerdən edə bilərik. Burada Zuul Serverin işi Routing olacaq. Zuul Serverə öz servisimizi tanıtdıqdan sonra, artıq gələn sorğuya uyğun olaraq uyğun service çağrılacaq və sorğuya uyğun iş görüləcək. Zuul Serverin Routing prosesi üçün Ribbon istifadə olunur. Ribbon, Eureka Server də qeydiyyatdan keçən service-ləri özündə saxlayaraq, uyğun yönləndirmələr edə bilir. Application da istifadə olunan versiyalar: 1. spring-boot-starter-parent (2.3.8.RELEASE) 2. spring-cloud.version (Hoxton.SR9)

Microservices Security Example #2 - Servisin Eureka Serverdə qeydiyyatı

Image
 Dummy Service Eureka Server də qeydiyyatdan keçirmək üçün sadə bir service yaradırıq, sadəcə praktika məqsədli olaraq. Daha sonradan real service-lərə tətbiq olunacaq. Application-ı yaradıb uyğun dependency-ləri əlavə etdikdən sonra edəcəyimiz ilk iş Main class-ın üzərinə @EnableEurekaClient əlavə edirik. Discovery Server də Service i qeydiyyata salmaq üçün EnableEurekaClient və EnableDiscoveryClient annotationları var. Aralarındakı fərqi sadə olaraq, belə göstərirlər. Əgər Discovery Server Eureka-dırsa, @EnableEurekaClient istifadə olunması məsləhət görülür. Digər hallarda @EnableDiscoveryClient istfadə etmək lazımdır. Daha sonra application.yml faylını açırıq. Burada bəzi configuration-lar etmək qeyd etmək lazımdır.  Burada ilk parameterdə application-ın adı, növbətidə hansı port da işləyəcəyi qeyd olunur. Digər parameterlər artıq Eureka Server də bir client application kimi qeydiyyatdan keçmək üçün lazımdır. prefer-ip-address parameterinə true dəyəri verməklə, Eurekanın bi...

Microservices Security Example #1 - Eureka Discovery Server haqqında danışırıq

Image
Eureka Discovery Server Eureka Server nədir və nə üçün istifadə olunur suallarının cavabını internetdə axtarıb daha geniş məlumat tapmaq olar. Bu yazıda yalnız praktikasına fokuslanacağıq. Qısa məlumat olaraq, Spring Cloud Netflix Eureka, servislerin makina adı ve bağlantı noktasına ihtiyaç olmaksızın birbirleriyle iletişim kurmasını sağlar. Bu mimarideki tek önemli nokta, her servisin kayıt olması gereken bir servis olmasıdır. Ətraflı    Eureka Server yaratmaq standart prosedurdur.  http://start.spring.io/ keçid edərək yarada bilərik. Bu application-da istifadə olunan versiyalar: 1. spring-boot-starter-parent (2.3.8.RELEASE) 2. spring-cloud.version (Hoxton.SR9) Bu versiyaların istifadə məqsədi bundan ibarətdir ki, spring-boot 2.4.X versiyalarda spring-cloud yeni versiyanı işlətmək lazımdır (2020.0.0). Spring Cloud bu versiyada Zuul, Ribbon dəstəkləmir. Gateway kimi Spring Cloud Gateway istifadə etməyi məsləhət görülür. Sadəcə bu arxitekturada Zuul istifadə etdiyimə...

Validation for AZ phone numbers with RegEx in Java

Number bir neche formada gele biler bize. Meselen,  99451xxxxxxx 99455xxxxxxx ve s. 051xxxxxxx 055xxxxxxx ve s. 51xxxxxxx 55xxxxxxx ve s. Bu nomreleri standart formaya salmaq uchun kichik kod : public static String validate (String number){ final String prefix = "994" ; if (number.length() == 12 && number.matches( "^(994)+(50|51|55|70|77|99).*$" )) { return number ; } else if (number.length() == 10 && number.matches( "^(0)+(50|51|55|70|77|99).*$" )) { return prefix + number.substring( 1 ) ; } else if (number.length() == 9 && number.matches( "^(50|51|55|70|77|99).*$" )) { return prefix + number ; } return null; } sonda bize qayidan netice  99451xxxxxxx ve ya 99455xxxxxxx sheklinde olacaq. Eger null qayidarsa, bu methodun cagrildigi yerde uygun helli etmek olar.

Annotations in Java

@Retention(RetentionPolicy.RUNTIME) -  byte-code a yazilir ve VM runtime zamani istifade ede bilir @Retention(RetentionPolicy.CLASS) - byte-code a yazilir, VM istifade ede bilmir @Retention(RetentionPolicy.SOURCE) - byte-code a yazilmir. Yalniz compile zamani istifade olunur

Frontdan gelen base64 file contenti mail de attachment kimi gondermek

String cnt = attachmentDto.getContent(); int index = cnt.indexOf(",") + 1; // cnt = cnt.replaceFirst("^data:image/[^;]*;base64,?", ""); cnt = cnt.substring(index); byte[] bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(cnt); mimeMessageHelper.addAttachment(    attachmentDto.getName(),    new ByteArrayResource(bytes) ); 

React JS. esas meqamlar

props ve state haqqinda props bir componentden digerine data dashimaq uchun istifade olunur. state ise bir basha componente aid olan bir ozellikdir. state deyishdiyi zaman componentin render funksiyasi ishe dushur ve sehife yeniden generasiya olunur. bele bir veziyyet dushunek ki, Parent componentden child component e bir data gonderirik. bu data parentin statein de saxlanib.  <Child someData = {this.state.someData}> </Child> bu child component bu data ile her hansisa html generasiya eleyir. daha sonra parent componentin state datasi deyishir. burda bele bir hal yaranir ki, child a gonderilen data bir basha parent in datasindan asilidir. parentin datasi deyishdiyine gore child in da datasi deyishir ve yeniden render funksiyasi ishe dushur. method istifadesi addToCart = (product) => {    alert(product.productName + " added to cart!"); } <Button     onClick={() => this.addToCart(product)}     color="success">     <spa...

JWT - generate public and private key (YML example)

@SpringBootApplication public class AuthServerApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(AuthServerApplication.class, args); } @Override public void run(String... args) throws Exception { KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA"); keyGenerator.initialize(1024); KeyPair kp = keyGenerator.genKeyPair(); PublicKey publicKey = kp.getPublic(); PrivateKey privateKey = kp.getPrivate(); String encodedPublicKey = Base64.getEncoder().encodeToString(publicKey.getEncoded()); String encodedPrivateKey = Base64.getEncoder().encodeToString(privateKey.getEncoded()); System.out.println(convertToPublicKey(encodedPublicKey)); System.out.println(); System.out.println(convertToPrivateKey(encodedPrivateKey)); } private static String convertToPrivateKey(String key) {         StringBuilder result = new StringBuilder();         result.append(...

Apache Mail - for mail operation

 <dependency> <groupId> org.apache.commons </groupId> <artifactId> commons-email </artifactId> <version> 1.5 </version> </dependency> MimeMessageParser parser = new MimeMessageParser((MimeMessage) message).parse(); "parser" ile body ni hem html, hem de text/plain formatinda chekmek mumkundur.