30 Ağustos 2022 Salı

Amazon Web Service (AWS) Secrets Manager

Giriş
AWS Secrets Manager ekranına gideriz. Store a new secret düğmesine basarız

Örnek - Credentials For Database
Şeklen şöyle
Maven ile şöyle yaparız
<dependency>
     <groupId>com.amazonaws</groupId>
     <artifactId>aws-java-sdk-secretsmanager</artifactId>
  </dependency>
  <dependency>
     <groupId>com.amazonaws.secretsmanager</groupId>
     <artifactId>aws-secretsmanager-jdbc</artifactId>
     <version>1.0.5</version>
  </dependency>
application.properties ile şöyle yaparız
spring.datasource.url = (name/path of your secrets manager)
spring.datasource.username = (name/path of your secrets manager)
spring.datasource.driver-class-name = com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver
Örnek - Other Secret Type
Secret Type seçeriz. Burada Other type of secret seçiliyor. Key/Value çiftleri saklanacak.

Configure Secret ekranında secret'a bir isim verilir.

Rotation işlevi kapatılır.







23 Ağustos 2022 Salı

Lineer Programlama - Linear Programming - Min Max Değerleri Bulur

Giriş
Lineer programlama bir şeyin min veya max değerini bulmak için kullanılır. Min max ile de işler daha küçük parçalara ayrılarak load balancing yapılır. Linear Programlama halen geçerli bir şey. Açıklaması şöyle
Linear Programming is probably more useful than 50 years ago.

The software for solving linear programming problems has dramatically improved and more and more practical problems can be solved. Most of these practical problems are mixed integer linear programs (MILPs), but linear programming is integral to solving MILPs.

To support this statement, here a few indicators:

The airline industry heavily uses mathematical optimization for solving problems such as pairing optimization and crew scheduling. The same is true for public transport. The exitance of companies like Sabre and Optibus testifies to that.

The best way to find provenly optimal solutions to the traveling salesman problems is based on linear programming: https://www.math.uwaterloo.ca/tsp/concorde.html.

Companies that focus on mathematical optimization with linear programming at their core are thriving, for example Gurobi. Meanwhile, new competitor enter the market for mathematical optimization, specifically linear programming using the simplex algorithm, such as COPTMindOpt, and Huawei.

Google has increased interest in linear and integer programming, including having their own linear programming solver GLOP.

Amazon is looking for people with skills in linear optimization: https://www.amazon.jobs/de/jobs/1716646/research-scientist.
Data Science
Şeklen şöyle. Veri analisti olmak için Linear Programming bilmek gerekiyor.



22 Ağustos 2022 Pazartesi

git stash seçeneği

Giriş
Açıklaması şöyle
git stash : Değişiklikleri rafa kaldırır ve saklar
git stash apply : Rafa kaldırılan değişiklikleri yeniden uygular
push seçeneği
Add tracked files to stash

push -u
Add tracked and untracked files to stash and perform git clean

push -a
Add tracked, untracked, and ignored files to stash and perform git clean

git stash list
View all stashed data

git stash list -p
View all stashed data with changes

git stash show -p <stashIndex>
View specific stashed data

git stash clear
Delete all stashes

git stash drop <stashIndex>
Delete a specific stash

git stash apply <stashIndex>
Apply a stash into the workspace

git stash pop <stashIndex>
Apply the topmost stash and delete it

git stash branch <branchName> <stashIndex>
Apply stash into a separate branch




19 Ağustos 2022 Cuma

Jenkins Execute Shell Kutusu

Komut çalışınca çıktısı şuna benzer
Started by user anonymous
Building in workspace ...
...
Build step 'Execute shell' marked build as failure
Finished: FAILURE
Ortam Değişkeni
Build Script yazarken ortam değişkenini atamak gerekebilir. Bu durumda Windows'ta aşağıdaki gibi yaparız.
set MYVAR= abc

Diğer Kabul Dosyalarını Çağırmak
Build Script yazarken başka bat veya sh dosyalarını çağırmak gerekebilir. Çağırılan dosya normalde başka bir kabukta çalışır. Eğer aynı kabukta çalışsın istiyorsak (Execute Windows Batch Script penceresi) Windows'ta call komutu kullanılır. Örnek:
call myfile.bat

Linux'ta ise source edilerek çağırılır.
. Foo.sh 
veya
source Foo.sh
Visual Studio C++
Bat dosyasında Visual Studio Projelerini derlemek için şöyle yaparız:
msbuild /p:Configuration=Release BigProject.sln
Docker
Örnek
Önce Docker'a giriş yapmak gerekir. Şöyle yaparız
# login with docker first.
docker login -u "USERNAME" -p "PASSWORD" docker.io

sudo cp -r $HOME/.docker /var/lib/jenkins/.docker
sudo chown -R jenkins:jenkins /var/lib/jenkins/.docker
sudo usermod -aG docker jenkins # current user must have a group call docker.
Şöyle yaparız. Burada kullanılan değişkenler için Jenkins Ortam Değişlenleri yazısına bakabilirsiniz
username="deletify" # replace your username
v_tag=$JOB_NAME:$GIT_COMMIT # tag for version
l_tag=$JOB_NAME:latest # tag for latest

# build a tag locally
docker build -t $v_tag .

# make tag ready to push to docker registry.
docker tag $v_tag $username/$v_tag
docker tag $v_tag $username/$l_tag

# push both tags to docker registry.
docker push $username/$v_tag
docker push $username/$l_tag

# remove both tags on cicd machine,
# because we don't need them anymore
docker rmi $v_tag $username/$v_tag $username/$l_tag



gcloud container images - List and manipulate Google Container Registry images

Giriş
add-tag, delete, describe, list, list-tags, untag seçenekleri vardır

list seçeneği
Örnek --project
Proje altındaki repository'leri listelemek için şöyle yaparız
$ gcloud container images list --project product-spanner
NAME
gcr.io/product-spanner/aquasec
gcr.io/product-spanner/auditor
gcr.io/product-spanner/benc-uk
gcr.io/product-spanner/bigip_exporter
gcr.io/product-spanner/cephcsi
gcr.io/product-spanner/coredns
gcr.io/product-spanner/csi-attacher
gcr.io/product-spanner/csi-node-driver-registrar
gcr.io/product-spanner/csi-provisioner
gcr.io/product-spanner/csi-resizer
gcr.io/product-spanner/csi-snapshotter
gcr.io/product-spanner/ehdb
gcr.io/product-spanner/gitea
gcr.io/product-spanner/haproxy
gcr.io/product-spanner/ipd
gcr.io/product-spanner/jenkins-portable
gcr.io/product-spanner/kube-downscaler
gcr.io/product-spanner/nginx
gcr.io/product-spanner/ngom-to-uc-app
gcr.io/product-spanner/oce
gcr.io/product-spanner/oce-5g
gcr.io/product-spanner/openshift-release-dev
gcr.io/product-spanner/pdf
gcr.io/product-spanner/quickstart-image
gcr.io/product-spanner/registry
gcr.io/product-spanner/sonobuoy
gcr.io/product-spanner/spotinst
gcr.io/product-spanner/test
gcr.io/product-spanner/velero
Örnek --repository
repository altına bakmak için şöyle yaparız
$ gcloud container images list --repository gcr.io/product-spanner/oce
NAME
gcr.io/product-spanner/oce/planetscale
gcr.io/product-spanner/oce/prom
gcr.io/product-spanner/oce/vitess

list-tags seçeneği
Örnek
Proje altındaki bir image'ın tagine bakmak için şöyle yaparız. Image path veriliyor
gcloud container images list-tags gcr.io/PROJECT/myimage
Örnek
Belli bir tag'i aramak için şöyle yaparız. Image path veriliyor
gcloud container images list-tags 
  --project product-spanner 
  --filter=tags:85.1.91-alpha16 
  --format=json gcr.io/product-spanner/oce/rlwy
Silmek için şöyle yaparız. Image path veriliyor
gcloud container images delete gcr.io/product-spanner/oce/rlwy:85.1.91-alpha28
Örnek
Tüm tag'leri görmek için şöyle yaparız.
$ gcloud container images list-tags --project product-spanner gcr.io/product-spanner/oce/rlwy
DIGEST        TAGS             TIMESTAMP
f3b20a3c3cf8  85.1.91-alpha28  2022-08-12T07:55:36
aaa2ad58d288  85.1.91-alpha27  2022-07-30T15:27:52
67bb81211a3d  85.1.91-alpha26  2022-07-30T06:48:39
Şöyle yaparız.  Burada aslında image üzerinde iki tane tag var.
$ gcloud container images list-tags --project product-spanner gcr.io/product-spanner/oce/oce-rlwy-gui
DIGEST        TAGS             TIMESTAMP
11c28c119b15  9d9c3ac,v0.0.26  2022-08-17T12:33:14
9c6502979fd6                   2022-08-12T07:26:56
Json olarak görmek için şöyle yaparız
$ gcloud container images list-tags --project product-spanner --format json gcr.io/product-spanner/oce/oce-rlwy-gui | more
[
  {
    "digest": "sha256:11c28c119b159ab25a8faa4a63566f7d143e76e69b1a5218aac0a51dd8d40772",
    "tags": [
      "9d9c3ac",
      "v0.0.26"
    ],
    "timestamp": {
      "datetime": "2022-08-17 12:33:14+00:00",
      "day": 17,
      "fold": 0,
      "hour": 12,
      "microsecond": 0,
      "minute": 33,
      "month": 8,
      "second": 14,
      "year": 2022
    }
  },

18 Ağustos 2022 Perşembe

DO-178B - Plan for Software Aspects of Certification (PSAC) - Ana Planlama Belgesidir

Giriş
SOI-1 öncesinde hazırlanan ve sertifikasyon otoritesine gönderilen planlardan bir tanesi. Açıklaması şöyle
PSAC communicates the proposed development methods to the certification authority for agreement (11.1)
PSAC ve SQA
Açıklaması şöyle. Yani PSAC, SQA tarafından denetlenir ve doğrulanır
How does the Software Quality Assurance (SQA) team work in your DO-178C project?

Here are 6 ways….
...
Software Quality Assurance (SQA), one of the Integral processes of DO-178C, provides the evidence showing that a project complies with processes, standards and guidance throughout the development life cycle. Broadly, there are six areas of software quality focus throughout a project.

At the beginning of a project:

1. Checking that the PSAC and the associated plans and standards align with the objectives of DO-178C.
2. Creating the Software Quality Assurance Plan (SQAP).
3. Checking that software life cycle processes comply with approved plans and standards.
4. Establishing supplier oversight.

During the project:

5. Checking that software activity follows the software life cycle processes – in particular, checking that transition criteria between life cycle processes are satisfied.

At the end of the project:
6. Conducting the conformity review of the software product.

These activities must be conducted whether software activities are internal to one organization or part of an integrator-supplier relationship. In the latter case, each organization that has further suppliers must coordinate SQA activities so that the integrator’s evidence includes evidence from their supplier’s SQA activities.
PSAC Başlıkları
Kullanılacak araçlar, işletim sistemi, izlenecek yöntem, diğer planların neye göre gözden geçirileceği, gözden geçirme listeleri gibi konular yazılır. Açıklaması şöyle. Yani PSAC ana planlama belgesidir
What is a PSAC within DO-178C?
 
First, a little context.
 
Within DO-178C you have 4 Stages Of Involvement (SOIs). SOIs provide the framework for you to communicate with your certification authority throughout your project.
 
The SOI#1 focuses on planning. Within this stage you need to create a PSAC.
 
A PSAC is the Plan for Software Aspects of Certification
 
This consists of a description of:
 
1.     the software you plan to develop
2.     the hardware environment it will be used in
3.     the design assurance processes you will follow
4.     how you will demonstrate compliance, including how you will verify your implemented code and any commercial tools you will use in your verification
 
This acts as the parent planning document.
PSAC ve DER
PSAC, DER tarafından onaylanır. DER ile yapılan bir sözleşme gibi düşünülebilir.

17 Ağustos 2022 Çarşamba

SQL Cümlesi Nasıl Çalıştırılır

Giriş
Açıklaması şöyle
The diagram below shows the process. Note that the architectures for different databases are different, the diagram demonstrates some common designs.

Step 1 - A SQL statement is sent to the database via a transport layer protocol (e.g.TCP).

Step 2 - The SQL statement is sent to the command parser, where it goes through syntactic and semantic analysis, and a query tree is generated afterward.

Step 3 - The query tree is sent to the optimizer. The optimizer creates an execution plan. 

Step 4 - The execution plan is sent to the executor. The executor retrieves data from the execution.

Step 5 - Access methods provide the data fetching logic required for execution, retrieving data from the storage engine. 

Step 6 - Access methods decide whether the SQL statement is read-only. If the query is read-only (SELECT statement), it is passed to the buffer manager for further processing. The buffer manager looks for the data in the cache or data files.

Step 7 - If the statement is an UPDATE or INSERT, it is passed to the transaction manager for further processing.

Step 8 - During a transaction, the data is in lock mode. This is guaranteed by the lock manager. It also ensures the transaction’s ACID properties. 
Şeklen şöyle



DO-178B Decision Coverage Nedir? - Level B

Giriş
Şeklen şöyle
- Yani koddaki her if/else ve türevi için if ve else kısımlarını çalıştıran en az bir tane test olmalı. 
- Her metoda girilmeli ve tüm çıkış noktalarından bir kere çıkılmalı


Özellikle and, or gibi Boolean logic kullanan if ifadelerinin testi için çok önemli bir faaliyet. Açıklaması şöyle. Yani if/else için "statement coverage" ile aynı şey. Ancak "Boolean value assignment" için farklı
So, what is the difference between decision coverage and branch coverage?

Decision coverage and branch coverage are closely-related forms of structural coverage analysis.

Decision coverage is referenced by DO-178B/DO-178C whereas branch coverage is referenced by ISO 26262.

Branch coverage requires every exit from a conditional source code statement to be executed.

Thus, for an if statement, branch coverage requires the then part and the else part to be executed (if there is no else part, the if statement should still execute the decision as true and false).

For decision coverage, the DO-178B/DO-178C definition of decision covers conditional statements, in the same way as branch coverage, but it also includes assignments of Boolean variables, for example:

a := b or (c and d); (Ada)
a = b || (c && d); (C/C++)

In this case, decision coverage would require tests for the above assignment making a both true and false.

Moreover, given the same source code and tests to exercise it, the percentage of coverage reported may be different between branch and decision coverage.

For example, if 3 out of the 4 branches of a switch statement are executed, the branch coverage would be reported as 75%, but for decision coverage, a decision is considered covered only if all its branches are covered, so the coverage of the switch statement would be reported as 0%.
Örnek
Level B için örnek vermek gerekirse
if (A== 0 and B < 2) {
//True
}
else {
//False
}
kod parçası için True ve False koşullarını sağlayan iki test yeterli. A ve B'nin alabileceği kombinasyonlara bakılmaz. İlk koşul için (TT) değerleri ile test etmek yeterli. Else koşulu için (TF), (FT), (FF) girdilerinden birisi kullanılabilir. Eğer FT veya FF seçilirse B'nin etkisi test edilmemiş olur.

16 Ağustos 2022 Salı

Business Exceptions

Giriş
Şöyle bir kural var deniliyor
Try not to create new custom exceptions if they do not have useful information for client code.
Ancak ilave bilgi içermiyor diye sadece düz Exception fırlatmak bence doğru değil. Sebebi şöyle. Çünkü  düz exception fırlatırsak bu durumda JVM'den veya bizim kodumuzdan gelen exceptionları ayırt edemiyoruz.  Bu yüzden boş ta olsa kendi Business Exception ata sınıfımızı tanımlamakta fayda var
Do not throw just an Exception! It means you have to catch Exception, which in turn means you also catch all RuntimeExceptions, therefore all NPEs etc!
Peki Neden Ayırt Etmek Lazım?
Örnek
Bir seferinden şöyle bir şey gerekmişti. Kod hem veri tabanına hem de farklı bir yere veri yazıyordu. Eğer her hangi bir hata varsa işlemi iptal etmek gerekiyordu. Bir tane AbortException tanımlandı. Bu sınıf şöyledi. İlave bir üye alan veya bilgi içermemesine rağmen, işlemin iptal etmesini sağlıyordu.
public class AbortException extends Exception {}
Dolayısıyla illa ilave bilgi içermersine yani şöyle olmasına gerek yok
public class DuplicateUsernameException extends Exception {
  public DuplicateUsernameException (String username){....}
  public String requestedUsername(){...}
  public String[] availableNames(){...}
}

Kütüphaneler
Bir çok kütüphane, plugin kendi exception hiyerarşisini sunuyor ve geliştiricilerin bu hiyerarşiden kalıtmasını istiyor
Örnek
Bir keresinde şöyle bir kod vardı
public class ServiceException extends Frwxception {
  ...
}


10 Ağustos 2022 Çarşamba

SOI-2 - Development Review - Geliştirme Bitmeden Önce Yapılır

Giriş
Açıklaması şöyle. Yani geliştirme başladıktan sonra ancak bitmeden önce yapılması iyi olur
How to approach SOI#2 in your DO-178C project...


The Development milestone (SOI#2)

Before you have finished your Development, but when you have examples of each of your Development artifacts (typically 60%-80% of your total expected artifacts), you should conduct SOI#2 with your certification authority.

SOI#2 focuses on the development process and artifacts, but the review also considers verification processes that should be running concurrently with Development – specifically, the review activities being implemented.

SOI#2 may also look forward to the verification phase to see if there are any examples where verification activities have provided feedback to development activities.

This may include, for example, test case development or test environment development providing feedback to your requirements and design processes to ensure that test activities can completely verify the functionality expressed in your requirements and design.
DER gereksinim dokümanlarını, bu dokümanların testini, test sonuçlarını, gereksinimi karşılayan kodları inceler ve sorgular. Örneğin bunlar arasındaki izlenebilirliğe bakabilir.

Kullanılan araçların versiyon listesine bakabilir. Testler için robustness var mı diye sorgulayabilir.  Bu testler varsa hangi gereksinimlere izlenebilirliği olduğuna bakılır. Eğer çok ciddi bir problem yoksa ufak tefek sıkıntılar "finding" (bulgu) olarak kaydedilir ve bir sonraki aşamada düzeltilmesini isteyebilir.

2 Ağustos 2022 Salı

CLH (Craig, Landin, and Hagersten) lock

Giriş
Bir çeşit spin lock. Açıklaması şöyle. java.util.concurrent.locks.AbstractQueuedSynchronizer.Node buna benzer bir mantık kullanıyor
The CLH lock is a scalable, high-performance, and fair spin lock based on a linked list. The application thread only spins on local variables. It always reads the state of the pre-node. If it finds that the pre-node releases the lock, it ends from spin
CLH Lock'a gelmeden Önce

1. Test And Set  Lock
Şöyle yaparız
public class TASLock implements Lock {
AtomicBoolean state = new AtomicBoolean(false); public void lock() { while (state.getAndSet()) {} } public void unlock() { state.set(false); } }
2. Test&Test&Set Lock
Şöyle yaparız
public class TTASLock implements Lock {
  AtomicBoolean state = new AtomicBoolean(false);
  public void lock() {
    while (true) {
      while(state.get()) {}
      if(!state.getAndSet())
        return;
     }
 }
 public void unlock() {
   state.set(false);
 }
}
Kuyruk Kullanan Kilitler
Bu kilitler FIFO fairness, fast lock release, low contention gibi iyi özellikler sunuyorlar, ancak abort işlemini iyi desteklemiyorlar

3. Anderson queue lock (ALock)
Açıklaması şöyle
ALock: Acquiring the Lock

• To acquire the lock, each thread atomically increments the tail field
• If the flag is true, the lock is acquired
• Otherwise, spin until the flag is true

ALock: Contention

• If another thread wants to acquire the lock, it applies get&increment
• The thread spins because the flag is false

ALock: Releasing the Lock

• The first thread releases the lock by setting the next slot to true
• The second thread notices the change and gets the lock

Örnek
Şöyle yaparız. Burada atomic olan sadece AtomicInteger yani benim kuyruktaki yerimi gösteren sayaç. 
public class Alock implements Lock {
//One flag per thread boolean[] flags = {true,false,...,false}; AtomicInteger next = new AtomicInteger(0); //Thread-local variable ThreadLocal<Integer> mySlot; public void lock() { //Take the next slot mySlot = next.getAndIncrement(); while (!flags[mySlot % n]) {} flags[mySlot % n] = false; } public void unlock() { //Tell next thread to go flags[(mySlot+1) % n] = true; } }
CLH Lock Gerçekleştirimi
Açıklaması şöyle. Burada Anderson kilidinden farklı olarak kilitlemek için benden önceki düğümün bayrağı üzerinde bekliyorum. 
The threads could update own flag and spin on their predecessor’s flag
This is basically what the CLH lock does, but using a linked list instead of an array
Örnek
Şöyle yaparız
static class CLHLock implements Lock {
    AtomicReference<QNode> tail;
    ThreadLocal<QNode> myNode, myPred;

  public CLHLock() {
    tail = new AtomicReference<QNode>(new QNode());

    this.myNode = new ThreadLocal<QNode>() {
      protected QNode initialValue() {
        return new QNode();
      }
    };

    this.myPred = new ThreadLocal<QNode>() {
      protected QNode initialValue() {
        return null;
      }
    };
  }

  public void lock() {
    QNode qnode = this.myNode.get();
    qnode.locked.set(true);  

    QNode pred = this.tail.getAndSet(qnode); //Add myself to tail. Tail is AtomicRef.
    myPred.set(pred); //Save my predecessor
    while (pred.locked.get()) {} //Wait if my predecessor is locked
  }

  public void unlock() {
    QNode qnode = this.myNode.get(); 
    qnode.locked.set(false); //Tell next thread to go      
    this.myNode.set(this.myPred.get()); 
  }

  static class QNode {  
    public AtomicBoolean locked = new AtomicBoolean(false);
  }
}