27 Şubat 2023 Pazartesi

IntelliJ Idea Debug İpuçları - Watch View İçin Customize Data Views - Entry renderers

Watch View içindeki bir değişkene sağ tıklarız ve Customize Data Views seçilir. Şeklen şöyle

Şeklen şöyle

Sağ sekmedeki Java Type Renderers seçilir. Nesneyi açılmamış haliyle gösteren şey When rendering a node altına yazılır. Nesneyi açılmış haliyle gösteren şey When rendering a node altına yazılır


IntelliJ Idea Debug İpuçları - Object Marking

Giriş
Açıklaması şöyle
Marking is effectively the declaration of a new reference to an object. Like declaring a new global variable. 

Developers often track issues where they literally write on a piece of paper the object ID (or pointer value) for an object they're looking at. With object marking, we can give an instance a specific global name. We can then reference that instance out of any scope...

E.g., when you're debugging and want to make sure that the object you're looking at in a method is the one that will be sent to another method (and not a cloned copy). Just mark the object with a name. Then, in the other method, compare the argument to the marked object. 

You can use this in conditional breakpoints to stop at the right location. It's an amazingly useful feature.
Şeklen şöyle

Daha sonra marking ile işaretli olan nesne için bir global değişken tanımlarız. Şeklen şöyle. Burada Label deniliyor ancak aslında global bir değişken ismi.
Eğer istersek bu değişkeni condition olarak kullanabiliriz. Şeklen şöyle


 
Örnek
Şöyle yaparız
Thread.currentThread() == MyThread_DebugLabel

26 Şubat 2023 Pazar

IntelliJ Idea Appearance & Behavior Ekranı

Proje Ağacı
Show tree indent guides ve Use smaller indents in tree seçenekleri ile ağaç yardımcı dikey çizgiler ekleniyor ve ağaçtaki nesneler daha küçük çiziliyor

Ayrıca Archive Browser eklentisi ile proje ağacında zip dosyaları da görülebilir.

HashMap.newHashMap metodu - Java 19 İle Geliyor

Giriş
Constructor ve yeni newHashMap arasındaki fark şöyle
new HashMap<>(1000); //It will not allow you to put 1000 elements without rebalancing HashMap.newHashMap(1000); // we will have 2048 buckets with threshold of 1334
Yani constructor ile verilen sayı eleman sayısı değil, istenilen bucket sayısı. Verilen sayı da ikini üssü olan en yakın bir sonraki sayıya yuvarlanıyor. Açıklaması şöyle
It’s just the nearest number to the power of 2. So, if you pass 1000 to the constructor (new HashMap<>(1000)), 1024 buckets will be created.
Ancak problem şu. Bucket sayısı ve HashMap'in kendi içinde kullandığı threshold sayısı farklı şeyler. Dolayısıla threshold sayısı daha küçük bir şey ve biz 1000 tane elemanı hiç rebalancing olmadan ekleyebiliriz diye düşünürken aslında yanılıyoruz.

Bu yüzden yeni HashMap.newHashMap metodu var. Direkt istenilen eleman sayısını girdi olarak alıyor. Kendisi threshold ve bucket sayısını hesaplıyor 

24 Şubat 2023 Cuma

String.describeConstable metodu

Giriş
Açıklaması şöyle
The method Optional<String> describeConstable()returns an Optional containing the nominal descriptor for the given string, which is the string itself.
Örnek
Şöyle yaparız
String s = "Java";
Optional<String> optionalS = s.describeConstable();
System.out.println(optionalS.get());

String.resolveConstantDesc metodu

Giriş
Açıklaması şöyle
The method String resolveConstantDesc(Lookup lookup)resolves the given string as ConstantDesc and returns the string itself.
Örnek
Şöyle yaparız
System.out.println("Java".resolveConstantDesc(MethodHandles.lookup()));

23 Şubat 2023 Perşembe

IntelliJ Idead Live Template

Giriş
Açıklaması şöyle
IntelliJ IDEA has a feature called “Live Templates” that allows you to quickly insert predefined code snippets using keyboard shortcuts. For example, you can type “sout” and press the Tab key to automatically expand it into a System.out.println() code block. You can customize and create your own live templates in the IntelliJ IDEA configuration.
1. Hazır Gelen Live Template
Giriş
İlk defa burada gördüm

Benim kullandıklarım
main 
main metodu yaratır

prfsi 
private final static int

sout
System.out.println satırını yaratır

psvm
main metodu yaratır

object.var
Değişkene eşitler

object.for
For döngüsü yaratır

Conditional statement'lar
boolean.if -> if(boolean)
boolean.else -> if(!boolean)
string.null -> if(string==null)
string.nn -> if(string!=null)
string.switch -> switch(string)

object.try
try...catch yaratır

object.castvar
Başka bir tipe cast eder

object.field
Yerel değişkeni sınıfın üye alanı yapar

object.opt
Optional.of() ile nesne yaratır

object.lambda
lambda yaratır

2. Custom Template
Settings > Editor > Live Templates ile ulaşılır.  Açıklaması şöyle
As you can see, IntelliJ already has several predefined sections depending on the programming language we are using, but we can also create our own section with the “+” symbol that appears on the right side of the window.
Örnek
Burada bir örnek var

Örnek - Edit variables
Açıklaması şöyle. Edit variables ile Live Template içinde kullanacağımız değişken için kod tanımlarız
In my case I have selected java and clicked on the add button (“+”) to add a new live template to this group, and then a new window will open asking us for the abbreviation of our shortcut, a description if we wish and the part of the code that corresponds to our new shortcut

In this example we have created a Live Template to declare a logger in the class we want and in this way import it by simply typing in our code “log” and pressing the enter key to set it. As you can see, we have indicated the abbreviation with which we will call this shortcut (“log”), a brief description and then in “Edit variables” we have given value to the variable declared in the expression $CLASS_NAME$
Örnek - $END$
Açıklaması şöyle
To create a custom live template, go to Settings > Editor > Live Templates. Click the "+" icon to add a new template. Enter an abbreviation, a description, and the template text, then click "OK".
Şöyle yaparız
public static void main(String[] args) {
    $END$
}
Açıklaması şöyle. İmleç $END$ ile belirtilen yere gelir.
Now, when you type “main” and press Tab, the main method will be inserted, and your cursor will be placed at the $END$ position. 


String.translateEscapes metodu

Giriş
Açıklaması şöyle
The method String translateEscapes() returns a new String with escape sequences translated if present in the original string.
Örnek
Şöyle yaparız
String s = "java\\nhello\\tword";
System.out.println(s); // Output: java\nhello\tword

System.out.println(s.translateEscapes()); 
// Output: 
// java
// hello word

String.join metodu

Giriş
İlk parametre ayraçtır. Stringleri birleştirir. Son son string'den sonra ayracı eklemez. Açıklaması şöyle. Yani CSV tarzı şeyleri oluşturmak için ideal :)
The join method offers the convenience of not adding the delimiter at the end of the string as well.
İmzası şöyle
public static String join(CharSequence delimiter, CharSequence... elements)
public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
CharSequence
Örnek
Şöyle yaparız
String joined = String.join("-", "java", "programming", "hello", "world");
System.out.println(joined); // Output: java-programming-hello-world

String joined2 = String.join("", "java", "programming", "hello", "world");
System.out.println(joined2); // Output: javaprogramminghelloworld
Örnek
Şöyle yaparız.
String.join(delimeter, foo, bar, baz, foo1, bar1);
Iterable
Örnek
Şöyle yaparız
List<String> list = List.of("java", "programming", "hello", "world");
String joined = String.join(", ", list);
System.out.println(joined); // Output: java, programming, hello, world











String.transform metodu

Giriş
Java 12 ile geliyor. İmzası şöyle
public <R> R transform(Function<? super String, ? extends R> f)
Örnek
Şöyle yaparız
Function<String, String> titleCase = s -> 
  Character.toUpperCase(s.charAt(0)) + s.toLowerCase().substring(1);
System.out.println("animal".transform(titleCase)); // Animal

Function<String, Integer> converToInt = Integer::parseInt;
int num = "123".transform(converToInt);
System.out.println(num); // 123

String.indent metodu

Giriş
Java 12 ile geliyor. Her satırın başına belirtilen sayı kadar boşluk ekler

Örnek
Şöyle yaparız
String poem = "Two loves I have of comfort and despair,\n" +
                "Which like two spirits do suggest me still:\n" +
                "The better angel is a man right fair,\n" +
                "The worser spirit a woman color’d ill.\n";

System.out.println(poem);
System.out.println(poem.indent(4));
System.out.println(poem.indent(10));


Two loves I have of comfort and despair,
Which like two spirits do suggest me still:
The better angel is a man right fair,
The worser spirit a woman colord ill.

    Two loves I have of comfort and despair,
    Which like two spirits do suggest me still:
    The better angel is a man right fair,
    The worser spirit a woman colord ill.
          
          Two loves I have of comfort and despair,
          Which like two spirits do suggest me still:
          The better angel is a man right fair,
          The worser spirit a woman colord ill.


String.repeat metodu - String'in Kendisini Tekrarlar

Giriş
Java 11 ile geliyor. Açıklaması şöyle
Repeats the String as many times as provided by the int parameter
İmzası şöyle
public String repeat(int count)
Eskiden Apache StringUtils kullanılırdı. Yani şöyle yapardık. Şimdi artık gerek yok
String str = "...";

String repeatedStr = StringUtils.repeat(str, 3);
String repeatedStr2 = str.repeat(3);

Örnek
Şöyle yaparız.
System.out.println("java".repeat(5));    // javajavajavajavajava
System.out.println("apple, ".repeat(4)); //apple, apple, apple, apple, 
System.out.println("*".repeat(10));      // *********
Örnek
Şöyle yaparız.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");

String.lines metodu - Java 11 İle Geliyor, Stream Döndürür

Giriş
Java 11 ile geliyor. Açıklaması şöyle.
Uses a Spliterator to lazily provide lines from the source string
İmzası şöyle
public Stream<String> lines()
Örnek
Şöyle yaparız.
String output = paragraph.lines().collect(Collectors.joining());
Örnek
Şöyle yaparız
String sentence = "marry\n had\n a\n little\n lamb";
Stream<String> lineStream = sentence.lines();
lineStream.forEach(System.out::println);
// marry
// had
// a
// little
// lamb


System.out.println("The sentence has a total of " + sentence.lines().count() + " lines");

// The sentence has a total of 5 lines

22 Şubat 2023 Çarşamba

TestContainers Neo4jContainer

Giriş
Şu satırı dahil ederiz
import org.testcontainers.containers.Neo4jContainer;
withoutAuthentication metodu
Örnek
Şöyle yaparız
import org.testcontainers.utility.DockerImageName;

Neo4jContainer<?> container = new Neo4jContainer<>(DockerImageName.parse("neo4j:5.5.0"))
  .withoutAuthentication();

String url = container.getBoltUrl()
withLogConsumer metodu
Örnek
Şöyle yaparız
import org.testcontainers.containers.output.Slf4jLogConsumer;

public static final Neo4jContainer<?> container = 
  new Neo4jContainer<>(DockerImageName.parse("neo4j:5.5.0"))
    .withoutAuthentication()
    .withLogConsumer(new Slf4jLogConsumer(LOGGER).withPrefix("Docker"));


Kafka Connect API

Kendi Kodumdan Kafka Connect Task Kullanmak - Bunu neden yapmak isteyeyim? 
Örneğin bir başka harici kaynağa erişmek için kod yazmak ve idame ettirmek istemiyorum. Hazır Kafka Connect bunu yapıyor benim için. Aradaki tek fark Kafka Connect Source veriyi Kafka topic içiner yazarken ben kendim bir şey yapmak istiyorum

Maven
Şu satırı dahil ederiz
<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>connect-api</artifactId>
  <version>2.8.2</version>
</dependency>
Gradle
Şöyle yaparız
implementation group: 'org.apache.kafka', name: 'connect-api', version: '...'
Örnek
Şöyle yaparız
import org.apache.kafka.connect.connector.ConnectorContext;
import org.apache.kafka.connect.source.SourceConnector;
import org.apache.kafka.connect.source.SourceRecord;
import org.apache.kafka.connect.source.SourceTask;
import org.apache.kafka.connect.source.SourceTaskContext;
import org.apache.kafka.connect.storage.OffsetStorageReader;

public class MyKafkaConnectSource<T> {

  private final SourceConnector connector;
  private final SourceTask task;
  private final Map<String, String> taskConfig;


  public void process() {
    if (!taskInit) {
      task.initialize(...);
      task.start(taskConfig);
      taskInit = true;
    }
    try {
      List<SourceRecord> records = task.poll();
      if (records == null) {
        return;
      }

      for (SourceRecord record : records) {
   ...
}
    } catch (InterruptedException e) {
      ...
    }
  }
}

IntelliJ Idea HttpClient İle Debug

Giriş
Açıklaması şöyle
We just create a file inside root folder of the app, type any name we want and add .http extension at the end. HTTP request syntax is pretty simple.
Örnek
Şöyle yaparız
// Add new product to the database
POST http://localhost:8080/api/v1/admin
Content-Type: application/json
Accept: application/json

{
  "brand": "Bombbar",
  "category": "cookie",
  "name": "Protein cookie",
  "flavour": "Chocolate brownie",
  "caloriesPer100Gram": 271,
  "weight": 40
}

###

// Get info about the product from the database
GET http://localhost:8080/api/v1/client?brand=Bombbar
Accept: application/json
Örnek
Şöyle yaparız
POST http://localhost:8080/clients
Content-Type: application/json

{
  "clientId": "my-trusted-ui",
  "clientSecret": "Passw0rd#",
  "scope": "read, write",
  "authorizedGrantTypes": "password,refresh_token",
  "authorities": "USER,BUSINESS",
  "accessTokenValidity": 93601,
  "refreshTokenValidity": 604801,
  "additionalInformation": "none"
}


AssertionError Sınıfı

Giriş
Şu satırı dahil ederiz
import java.lang.AssertionError;
Kalıtım şöyle
java.lang.Object
  java.lang.Throwable
    java.lang.Error
      java.lang.AssertionError

Bu sınıfı direkt kullanmaya gerek yok. JUnit içindeki assertTrue(), assertFalse() gibi metodlar AssertionError exception fırlatıyor zaten

constructor
Örnek
Şöyle yaparız
class Example {
  private Example() {
    throw new AssertionError();
  }
}

21 Şubat 2023 Salı

package-info.java Dosyası

Giriş
İki tane amaca hizmet eder.
1. Paket için javadoc yazılır. Böylece tüm paketin amacı belirtilir
2. Paket2 uygulanacak anotasyonlar bu dosyaya yazılır

19 Şubat 2023 Pazar

FlightRecorderMXBean Sınıfı

Örnek
Şöyle yaparız
FlightRecorderMXBean flightRecorder = ManagementFactory
  .getPlatformMXBean(FlightRecorderMXBean.class);

long recordingId = flightRecorder.newRecording();
flightRecorder.startRecording(recordingId);
// Perform some operations
flightRecorder.stopRecording(recordingId);

HttpClient Sınıfı İle GET - HttpClient API

Örnek
Şöyle yaparız
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://...")) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
Örnek
Şöyle yaparız
HttpClient httpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) .connectTimeout(Duration.ofSeconds(20)) .build(); HttpRequest httpRequest = HttpRequest.newBuilder() .GET() .uri(URI.create("https://...")) .build(); HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); System.out.println(httpResponse.body());