<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Enes Gerem</title>
    <description>The latest articles on DEV Community by Enes Gerem (@enesgerem).</description>
    <link>https://dev.to/enesgerem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F657111%2F28addf62-f5f3-478b-aa58-449cec6babef.jpeg</url>
      <title>DEV Community: Enes Gerem</title>
      <link>https://dev.to/enesgerem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/enesgerem"/>
    <language>en</language>
    <item>
      <title>Software Testing</title>
      <dc:creator>Enes Gerem</dc:creator>
      <pubDate>Mon, 28 Jun 2021 07:30:32 +0000</pubDate>
      <link>https://dev.to/enesgerem/software-testing-394a</link>
      <guid>https://dev.to/enesgerem/software-testing-394a</guid>
      <description>&lt;h2&gt;
  
  
  What software testing is and is NOT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Testing is to execute a program with the intent of finding as many defects as possible and/or gaining sufficient
confidence in the software system under test&lt;/li&gt;
&lt;li&gt;Testing is not cut-and-fit improvement of a user interface or requirements elicitation by prototyping.&lt;/li&gt;
&lt;li&gt;Testing is not the verification of an analysis or design model by syntax checkers or simulation.&lt;/li&gt;
&lt;li&gt;Testing is not the scrutiny of documentation or code by humans in inspections, reviews, or walkthroughs.&lt;/li&gt;
&lt;li&gt;Testing is not static analysis of code using a language translator or code checker.&lt;/li&gt;
&lt;li&gt;Testing is not the use of dynamic analyzers to identify memory leaks or similar problems.&lt;/li&gt;
&lt;li&gt;Testing is not debugging, although successful testing should lead to debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Some Definitions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error
&lt;/h3&gt;

&lt;p&gt;The very root cause. Errors are committed by people.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fault
&lt;/h3&gt;

&lt;p&gt;A fault is the result of a human error in the software documentation, code, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failure
&lt;/h3&gt;

&lt;p&gt;A failure occurs when a fault executes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incident
&lt;/h3&gt;

&lt;p&gt;Consequences of failures; failure occurence may or may not be apparent to the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Defect
&lt;/h3&gt;

&lt;p&gt;Any of the above, usually a fault, aka bug.&lt;/p&gt;

&lt;h4&gt;
  
  
  The fundamental chain of SW dependability threats:
&lt;/h4&gt;

&lt;p&gt;Error----propagation----&amp;gt;Fault----causation----&amp;gt;Failure----results in----&amp;gt;Incident&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Test Case and Test Suite (Test Set)?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A test case is set of inputs and the expected outputs for a unit/module/system under test.&lt;/li&gt;
&lt;li&gt;A test suite (test set) is set of test cases (at least one)&lt;/li&gt;
&lt;li&gt;Without the expected outputs, a test case is not complete.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Types of Test Activities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exploratory (Human Based)
&lt;/h3&gt;

&lt;p&gt;Design test values based on domain knowledge of the program and human knowledge of testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criteria-based
&lt;/h3&gt;

&lt;p&gt;Design test values to satisfy coverage criteria, covering all lines of codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Automation
&lt;/h3&gt;

&lt;p&gt;Embed test values into executable scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Execution
&lt;/h3&gt;

&lt;p&gt;Run tests the on the software and record the results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Evaluation
&lt;/h3&gt;

&lt;p&gt;Evaluate results of testing, report to developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Testing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Functional testing is testing the functional requirements.&lt;/li&gt;
&lt;li&gt;Non-functional testing is testing the non-functional requirements. Such as,

&lt;ul&gt;
&lt;li&gt;Performance, Load, Endurance, Localization, Recovery, Security, Stress etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exhaustive Testing
&lt;/h3&gt;

&lt;p&gt;Testing a software system using all the possible inputs, not possible mostly.&lt;/p&gt;

&lt;p&gt;For example exhaustive testing of a compiler program would be compiling all possible codes, which is not possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  When can we say testing is enough?
&lt;/h2&gt;

&lt;p&gt;A test-adequacy criterion leads to test obligations. Test coverage is the percentage of obligations that are met.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Functional tests black-box, Structural tests are white-box&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specification -&amp;gt; Black-Box Testing&lt;/li&gt;
&lt;li&gt;Implementation -&amp;gt; White (glass)-Box Testing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing functionallities cannot be revealed by white-box techniques. -&amp;gt; at Spesification&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unexpected functionallities cannot be revealed by black-box techniques. -&amp;gt; at Implementation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing throughout the SDLC - in Waterfall
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SDLC: Software Development Life Cycle&lt;/li&gt;
&lt;li&gt;Much of the life-cycle development artifacts provides a rich source of test data.&lt;/li&gt;
&lt;li&gt;Identifying test requirements and test cases early helps shorten the development time.&lt;/li&gt;
&lt;li&gt;They may help reveal faults.&lt;/li&gt;
&lt;li&gt;It may also help identify early low testable specifications or design.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Analysis --- Design --- Implementation --- Testing:
&lt;/h4&gt;

&lt;p&gt;Preparation for Test --- Preparation for Test --- Unit Testing --- Acceptance system Testing&lt;/p&gt;

&lt;h2&gt;
  
  
  Black-Box Testing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Based on the definition of a program's specification, as opposed to its structure (code, interface)&lt;/li&gt;
&lt;li&gt;The notion of complete coverage can also be applied to function (Black-box) testing.&lt;/li&gt;
&lt;li&gt;Rigorous specifications have another benefit, they help black-box testing, e.g., categorize inputs, derive expected
outputs.&lt;/li&gt;
&lt;li&gt;In other words, they help test case generation and test oracles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Different Techniques
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Equivalence Class Testing
&lt;/h4&gt;

&lt;p&gt;We would like to have a sense of complete testing and we would hope to avoid test redundancy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Equivalence classes partitions of the input set in which input data have the same effect on the program. (e.g. the
result in the same output).&lt;/li&gt;
&lt;li&gt;Entire input set is covered in testing, completeness.&lt;/li&gt;
&lt;li&gt;Disjoint classes to avoid redundancy.&lt;/li&gt;
&lt;li&gt;Test cases one element of each equivalence class.&lt;/li&gt;
&lt;li&gt;Guessing the likely system behaviour might be needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Boundary-Value Analysis
&lt;/h4&gt;

&lt;p&gt;In equivalence class testing, we partitioned input domains into equivalence classes, on the assumption that the behavior&lt;br&gt;
of the program is similar for all input values of a equivalence class.&lt;/p&gt;

&lt;p&gt;Above assumption may not ve true in all cases as some typical programming errors happen to be at the boundary between&lt;br&gt;
different equivalence classes.&lt;/p&gt;

&lt;p&gt;This is what boundary value testing focuses on, simpler but complementary to equivalence class testing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Catergory-Partition Testing
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The system is divided into individual functions that can be independently tested.&lt;/li&gt;
&lt;li&gt;The method identifies the parameters of each function and, for each parameter, identifies distinct categories.&lt;/li&gt;
&lt;li&gt;Besides parameters, environment characteristics, under which the function operates (characteristics of the system
state), can also be considered.&lt;/li&gt;
&lt;li&gt;Categories are major properties or characteristics for each parameter&lt;/li&gt;
&lt;li&gt;The categories are further subdivided into choices in the same way as equivalence partitioning is applied (possible
“values”).&lt;/li&gt;
&lt;li&gt;A broader idea compared to Equivalence-Class Partitioning.&lt;/li&gt;
&lt;li&gt;In essence: Category-partition testing integrates equivalence class testing, boundary analysis, and adds a few
refinements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Decision Tables
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;To help express test requirements in a directly usable form.&lt;/li&gt;
&lt;li&gt;Easy to understand and support the systematic derivation of test cases&lt;/li&gt;
&lt;li&gt;To support automated or manual generation of test cases.&lt;/li&gt;
&lt;li&gt;A particular response or response subset is to be selected for testing by evaluating many related conditions&lt;/li&gt;
&lt;li&gt;Ideal for describing situations in which a number of combinations of actions are taken under varying sets of
conditions, e.g., control systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cause-Effect Graphs
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Graphical technique that helps derive decision tables&lt;/li&gt;
&lt;li&gt;Aims at supporting interaction with domain experts and the reverse engineering of specifications, for the purpose of
testing.&lt;/li&gt;
&lt;li&gt;Identify causes (conditions on inputs, stimuli) and effects (outputs, changes in system state).&lt;/li&gt;
&lt;li&gt;Causes have to be stated in such a way to be either true or false.&lt;/li&gt;
&lt;li&gt;Can be used to explicitly specify constraints on causes and effects.&lt;/li&gt;
&lt;li&gt;They can help select more “significant” subset of input/output combinations and build smaller decision tables.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>YAML</title>
      <dc:creator>Enes Gerem</dc:creator>
      <pubDate>Mon, 28 Jun 2021 07:22:18 +0000</pubDate>
      <link>https://dev.to/enesgerem/yaml-1men</link>
      <guid>https://dev.to/enesgerem/yaml-1men</guid>
      <description>&lt;p&gt;YAML yazılım dünyasında artık her yerde karşımıza çıkan bir dosya formatı ve configürasyon dosyası alternatifi haline geldi. Fakat nedir bu YAML?&lt;/p&gt;

&lt;p&gt;YAML (YAML Ain't Markup Language) dil bağımsız bir veri değişim formatıdır. Herhangi bir programlama dili ile oluşturulan nesneler, YAML formatında kolaylıkla temsil edilebilmektedir. YAML geniş veri tipi desteği sayesinde tüm diller arasında ortak olarak kullanılabilir olmakla birlikte, ayrıca insan gözüyle bakıldığında kolay okunabilir bir yapısı mevcuttur.&lt;/p&gt;

&lt;p&gt;YAML, konfigürasyon dosyaları için ve verilerin depolandığı veya iletildiği uygulamalarda yaygın olarak kullanılır. XML(Extensible Markup Language)'in kullanıldığı uygulamaların çoğunu hedefler ancak SGML(Standard Generalized Markup Language)'den kasıtlı olarak farklı olan minimal bir sözdizimine sahiptir.&lt;/p&gt;

&lt;h2&gt;
  
  
  YAML Syntaxı
&lt;/h2&gt;

&lt;p&gt;YAML Nested yapısını belirtmek için Python tarzı girintiyi, listeler için köşeli parantezleri [...] ve mapler için süslü&lt;br&gt;
parantezleri {...} barındıran daha kompakt bir biçim kullanır.&lt;/p&gt;

&lt;p&gt;Bazı basit kurallar;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yapıyı belirtmek için boşluk girintisi kullanılır; ancak, bu girintinin parçası olarak sekme karakterlerine izin verilmez.&lt;/li&gt;
&lt;li&gt;Yorumlar "#" ile başlar, bir satırda herhangi bir yerden başlayabilir ve satırın sonuna kadar devam edebilir.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Bu bir yorum satırıdır.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Liste elemanları, her satırda bir eleman olacak şekilde "-" ile veya köşeli parantezlerin içine elemanları virgülle ayırarak gösterilir.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Listelerin tanımlanma şekilleri&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;A&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;B&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;C&lt;/span&gt;

  &lt;span class="s"&gt;[ A,B,C ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Dictionary yapısı "key:value" formunda her satırda bir eleman olacak şekilde listelenebilir.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Dictionary&lt;/span&gt;
&lt;span class="na"&gt;enes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enes Gerem&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;23&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Dictionary listesi aşağıdaki gibi belirtilebilir.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Dictionary listesi&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;enes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enes Gerem&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;23&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;emre&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Emre Basar&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Alternatif olarak dictionary yapısı süslü parantezlerle de belirtilebilir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"|" ve "&amp;gt;" kullanarak, tanımlar birden çok satırda belirtilebilir. Satır başı karakterini de almak istediğimiz de "|",&lt;br&gt;
tek bir satır yazacaksak ve sadece okunabilirliği arttırmak istiyorsak "&amp;gt;" kullanabiliriz.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;include_newlines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;bu String tam olarak&lt;/span&gt;
  &lt;span class="s"&gt;bu sekilde&lt;/span&gt;
  &lt;span class="s"&gt;gozukecektir&lt;/span&gt;

&lt;span class="na"&gt;fold_newlines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;bu değer aslinda&lt;/span&gt;
  &lt;span class="s"&gt;sadece bir satiri&lt;/span&gt;
  &lt;span class="s"&gt;ifade eder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;İki nokta'dan ":" sonra bir boşluk varsa bu bir dictionaryi temsil eder. Eğer iki noktayı value kısmında kullanmak istiyorsak boşluk olmadan, escape karakteriyle ya da tırnak içinde kullanmamız gerekir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Değişkenler "{var}" formatında belirtilebilir.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{variable}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Aşağıda YAML formatında hazırlanmış YAML formatı için derlenen referans dosyası incelenebilir.&lt;br&gt;
Kaynak: &lt;strong&gt;&lt;a href="https://yaml.org/refcard.html"&gt;yaml.org&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nt"&gt;%YAML&lt;/span&gt; &lt;span class="m"&gt;1.1&lt;/span&gt;   &lt;span class="c1"&gt;# Reference card&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;Collection indicators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Key indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Value indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nested series entry indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Separate in-line branch entries.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[]'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Surround in-line series branch.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{}'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Surround in-line keyed branch.&lt;/span&gt;
&lt;span class="na"&gt;Scalar indicators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Surround in-line unescaped scalar ('' escaped ').&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;"'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Surround in-line escaped scalar (see escape codes below).&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;|'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Block scalar indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Folded scalar indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Strip chomp modifier ('|-' or '&amp;gt;-').&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Keep chomp modifier ('|+' or '&amp;gt;+').&lt;/span&gt;
  &lt;span class="na"&gt;1-9&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Explicit indentation modifier ('|1' or '&amp;gt;2').&lt;/span&gt;
  &lt;span class="c1"&gt;# Modifiers can be combined ('|2-', '&amp;gt;+1').&lt;/span&gt;
&lt;span class="na"&gt;Alias indicators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Anchor property.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Alias indicator.&lt;/span&gt;
&lt;span class="na"&gt;Tag property&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Usually unspecified.&lt;/span&gt;
  &lt;span class="na"&gt;none&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unspecified tag (automatically resolved by application).&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Non-specific tag (by default, "!!map"/"!!seq"/"!!str").&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!foo'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Primary (by convention, means a local "!foo" tag).&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!foo'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secondary (by convention, means "tag:yaml.org,2002:foo").&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!h!foo'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Requires "%TAG !h! &amp;lt;prefix&amp;gt;" (and then means "&amp;lt;prefix&amp;gt;foo").&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!&amp;lt;foo&amp;gt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verbatim tag (always means "foo").&lt;/span&gt;
&lt;span class="na"&gt;Document indicators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Directive indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;---'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Document header.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;...'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Document terminator.&lt;/span&gt;
&lt;span class="na"&gt;Misc indicators&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;#'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Throwaway comment indicator.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;`@'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Both reserved for future use.&lt;/span&gt;
&lt;span class="na"&gt;Special keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;='&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Default "value" mapping key.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Merge keys from another mapping.&lt;/span&gt;
&lt;span class="na"&gt;Core types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Default automatic tags.&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!map'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;Hash table&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;dictionary&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;mapping&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!seq'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;List&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;tuple&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;vector&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;sequence&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!str'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Unicode string&lt;/span&gt;
&lt;span class="na"&gt;More types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!set'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;cherries&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;plums&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;apples&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!!omap'&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;one&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;two&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;2&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;Language Independent Scalar types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;~&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;null&lt;/span&gt; &lt;span class="pi"&gt;}:&lt;/span&gt; &lt;span class="s"&gt;Null (no value).&lt;/span&gt;
    &lt;span class="s"&gt;[ 1234, 0x4D2, 02333 ]&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;Decimal int&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Hexadecimal int&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Octal int&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;1_230.15&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;12.3015e+02&lt;/span&gt; &lt;span class="pi"&gt;]:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;Fixed float&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Exponential float&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;.inf&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;-.Inf&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;.NAN&lt;/span&gt; &lt;span class="pi"&gt;]:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;Infinity (float)&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Negative&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Not a number&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Yes&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ON&lt;/span&gt; &lt;span class="pi"&gt;}:&lt;/span&gt; &lt;span class="s"&gt;Boolean &lt;/span&gt;&lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;FALSE&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;No&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;off&lt;/span&gt; &lt;span class="pi"&gt;}:&lt;/span&gt; &lt;span class="s"&gt;Boolean &lt;/span&gt;&lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="pi"&gt;?&lt;/span&gt; &lt;span class="kt"&gt;!!binary&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;R0lG...BADS=&lt;/span&gt;
      &lt;span class="s"&gt;: &amp;gt;-&lt;/span&gt;
      &lt;span class="s"&gt;Base 64 binary value.&lt;/span&gt;
&lt;span class="na"&gt;Escape codes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Numeric&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x12&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;8-bit&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\u1234&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;16-bit&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\U00102030&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;32-bit&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;Protective&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"\"":&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;',&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;\ "&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;TAB&amp;gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TAB&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;NUL&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;BEL&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;BS&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\f&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;FF&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;LF&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;CR&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
       &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;TAB&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;VTAB&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;Additional&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;ESC&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\_&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;NBSP&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\N&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;NEL&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\L&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;LS&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;PS&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="nn"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;YAML artık birçok framework'ün tercih ettiği configuration formatı haline geldi. En popüler front-end Web framework'ü&lt;br&gt;
React'te ve mobil framework'ü Flutter'da bu yapıyı görmek mümkün.&lt;/p&gt;

&lt;p&gt;Örnek olması açısından aşağıda Flutter projelerimden birinin "pubspec.yaml" configuration dosyası incelenebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;receipt_scanner&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Receipt scanner app&lt;/span&gt;

&lt;span class="c1"&gt;# The following defines the version and build number for your application.&lt;/span&gt;
&lt;span class="c1"&gt;# A version number is three numbers separated by dots, like 1.2.43&lt;/span&gt;
&lt;span class="c1"&gt;# followed by an optional build number separated by a +.&lt;/span&gt;
&lt;span class="c1"&gt;# Both the version and the builder number may be overridden in flutter&lt;/span&gt;
&lt;span class="c1"&gt;# build by specifying --build-name and --build-number, respectively.&lt;/span&gt;
&lt;span class="c1"&gt;# In Android, build-name is used as versionName while build-number used as versionCode.&lt;/span&gt;
&lt;span class="c1"&gt;# Read more about Android versioning at https://developer.android.com/studio/publish/versioning&lt;/span&gt;
&lt;span class="c1"&gt;# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.&lt;/span&gt;
&lt;span class="c1"&gt;# Read more about iOS versioning at&lt;/span&gt;
&lt;span class="c1"&gt;# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0+1&lt;/span&gt;

&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;=2.1.0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;3.0.0"&lt;/span&gt;

&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;

  &lt;span class="na"&gt;cupertino_icons&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.1.2&lt;/span&gt;
  &lt;span class="na"&gt;firebase_ml_vision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image_picker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image_cropper&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;path_provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.6.11&lt;/span&gt;
  &lt;span class="na"&gt;mailer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^3.0.4&lt;/span&gt;
  &lt;span class="na"&gt;excel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.1.5&lt;/span&gt;
  &lt;span class="na"&gt;camera_camera&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.0.34+1&lt;/span&gt;
  &lt;span class="na"&gt;firebase_auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.16.1&lt;/span&gt;
  &lt;span class="na"&gt;cloud_firestore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.13.7&lt;/span&gt;
  &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^3.1.0&lt;/span&gt;
  &lt;span class="na"&gt;flutter_spinkit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^4.1.2+1&lt;/span&gt;
  &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.12.0+3&lt;/span&gt;
  &lt;span class="na"&gt;sqflite&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.3.1&lt;/span&gt;
  &lt;span class="na"&gt;google_sign_in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^4.5.1&lt;/span&gt;
  &lt;span class="na"&gt;camera&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.5.8+5&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.6.4&lt;/span&gt;
  &lt;span class="na"&gt;auto_size_text&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^2.1.0&lt;/span&gt;
  &lt;span class="na"&gt;flushbar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.5.0&lt;/span&gt;
  &lt;span class="na"&gt;rxdart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.24.1&lt;/span&gt;


&lt;span class="na"&gt;dev_dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter_test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;

  &lt;span class="na"&gt;flutter_launcher_icons&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^0.7.3"&lt;/span&gt;


&lt;span class="na"&gt;flutter_icons&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;android&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;ios&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;image_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assets/icon/voucher_logo.png"&lt;/span&gt;


&lt;span class="c1"&gt;# The following section is specific to Flutter.&lt;/span&gt;
&lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="c1"&gt;# The following line ensures that the Material Icons font is&lt;/span&gt;
  &lt;span class="c1"&gt;# included with your application, so that you can use the icons in&lt;/span&gt;
  &lt;span class="c1"&gt;# the material Icons class.&lt;/span&gt;
  &lt;span class="na"&gt;uses-material-design&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;

  &lt;span class="na"&gt;assets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/image/google.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/image/bg.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/files/example.xlsx&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/files/temp.xlsx&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/background/top.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/background/right.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/background/bttm.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/google.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/facebook.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/apple.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/twitter.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/receipt_logo.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/splash_screen.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/profile.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/data.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/home.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/homeon.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/dataon.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/profileon.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/user.png&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;assets/icon/lock.png&lt;/span&gt;

  &lt;span class="na"&gt;fonts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;family&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Poppins&lt;/span&gt;
      &lt;span class="na"&gt;fonts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-Black.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;900&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-Bold.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-ExtraBold.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-Light.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-Medium.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-Regular.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Poppins/Poppins-SemiBold.ttf&lt;/span&gt;
          &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;family&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Spartan&lt;/span&gt;
      &lt;span class="na"&gt;fonts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;asset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fonts/Spartan-VariableFont_wght.ttf&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Clean Code</title>
      <dc:creator>Enes Gerem</dc:creator>
      <pubDate>Mon, 28 Jun 2021 07:11:33 +0000</pubDate>
      <link>https://dev.to/enesgerem/clean-code-50k2</link>
      <guid>https://dev.to/enesgerem/clean-code-50k2</guid>
      <description>&lt;p&gt;Projelerin geliştirilme aşamasında sonrası için hayat kurtarması muhtemel olan bazı dizayn prensipleri.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;Projeleri geliştirirken kullanılan teknolojilerin dosyaları aynı uzantı ismiyle açılan paketlerde tutulması gerekir.

&lt;ul&gt;
&lt;li&gt;Örneğin /js yolu JavaScript dosyalarını içermeli, /css yolu CSS dosyalarını içermeli gibi.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Proje içerisinde değişken, fonksiyon, sınıf gibi isimlendirmeler isimlendirmeler içerik hakkında olması gerektiği kadar bilgi vermelidir.

&lt;ul&gt;
&lt;li&gt;Sınıf isimlendirmeleri o sınıftan oluşacak objeler hakkında, method isimlendirmeleri o methodun yaptığı iş hakkında,
ne çok kısaltılmış ne de çok detaya girilmiş şekilde, görüldüğünde ne işe yaradığını belirtecek kadar bilgi barındırmalı.&lt;/li&gt;
&lt;li&gt;Fonksiyon isimlendirmeleri yapacağı işlev hakkında fiil içermeli, sınıf isimlendirmeleri içermemelidir.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Koşul içerikleri çok komplike olmamalı, okuyanlar tarafından rahat anlaşılabilmeli.

&lt;ul&gt;
&lt;li&gt;İç içe koşul kontrollerinden kaçınılmalı.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Tekrar eden kodlardan kurtulunmalı. Örneğin eğer bir kod parçacığı ikiden fazla tekrar ediyorsa fonksiyon haline getirilmeli.

&lt;ul&gt;
&lt;li&gt;Fonksiyonlar karmaşık olmamalı, tek işlev için tek fonksiyon kullanılmalı.&lt;/li&gt;
&lt;li&gt;Fonksiyonların parametre sayısı mümkün olan en az sayı olmalıdır.&lt;/li&gt;
&lt;li&gt;Dilin sağladığı lambda fonksiyonları kullanmak bazen kodu uzun uzun yazmaktan daha anlaşılırdır.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Kodun içerisinde çıkabilecek hataları kontrol ederken yapılan handling operasyonlarından loglar düzgün ve anlaşılır şekilde döndürülmeli ki kodun hatası yutulmadan ve büyük problemlere sebep olmadan hata çözülsün.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Bir sınıf kendi objesinin özellikleri ve fonksiyonelliği haricinde işlev barındırmamalı ve olabildiğince minimal tutulmalı.

&lt;ul&gt;
&lt;li&gt;Sınıflar sadece bir amaca hizmet etmelidir.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;İyi yerleştirilmiş yorum satırlarının kodu okuyanlara faydalı olmasının yanında, kodun olabildiğince yorum satırı ihtiyacı ortadan kaldırılmalı. Kodun düzeni ne kadar iyi olursa o kod o kadar az yorum satırı ihtiyacı duyar.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Değişkenlerin kullanılacağı yerden çok uzakta tanımlamak kodun okunurluğunu ciddi oranda düşürür.

&lt;ul&gt;
&lt;li&gt;Kodu okuyan insanlar sanki bir makale okuyormuş gibi okuyabilmelidir.&lt;/li&gt;
&lt;li&gt;Kodun en üst kısmında algoritme ve konsept hakkında kısa bir giriş paragrafı yapılmalı.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Encapsulation mümkün olan her yerde uygulanmalı.

&lt;ul&gt;
&lt;li&gt;Modüllerin birbirilerine müdahale etmeleri kısıtlanmalı.&lt;/li&gt;
&lt;li&gt;Böylelikle gevşekçe bağlı modüller üretilmiş ve kodun anlaşılabilirliği ve geliştirilebilirliği arttırılmış olur.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Kod üzerinde yapılan testler hızlı, birbirinden bağımsız, tekrar kullanılabilir, kendini değerlendirebilen ve zamanında yazılmış olma özelliklerine sahip olmalıdır.&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Bir sistemi basit ve kolayca geliştirilebilir kılan özellikler şunlardır;

&lt;ul&gt;
&lt;li&gt;Tüm testleri başarıyla geçer&lt;/li&gt;
&lt;li&gt;Kod tekrarı yoktur&lt;/li&gt;
&lt;li&gt;Geliştiricinin niyeti kolayca anlaşılır&lt;/li&gt;
&lt;li&gt;Sınıf ve metot sayısı minimaldir&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Sistemde olabildiğince soyutlama kuralları uygulanmalıdır.

&lt;ul&gt;
&lt;li&gt;Fonksiyonel ortaklığı olmayan sınıflar birbirleriyle iletişim halinde olmamalıdır.&lt;/li&gt;
&lt;li&gt;Geliştirici doğru design patternlar kullanarak modül bağımlılığını ortadan kaldırmalıdır.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Kodun yazılış formatına her zaman dikkat edilmelidir ki okunabilirliği en çok etkileyen faktörlerden biridir.

&lt;ul&gt;
&lt;li&gt;Çalışma ortamının sağladığı formatlama fonksiyonlar bu konuda oldukça faydalıdır.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Genel dizayn kuralları,

&lt;ul&gt;
&lt;li&gt;Kodun üst tabakalarında düzenlenebilir veriler tutulmalı&lt;/li&gt;
&lt;li&gt;Dilin sağladığı şekilde kodun bağımlılığı azaltılmalı. Örneğin interface'ler kullanılarak ortak türler tanımlanmalı. Mantıksal bağımlılıklar doğru çalışan class'ları dahi zamanla zincirleme etkisi sonucu bozabilir.&lt;/li&gt;
&lt;li&gt;Mümkün olan her yerde dependecy injection yapılmalı, tekrar tanımlamadan kaçınılmalı.&lt;/li&gt;
&lt;li&gt;Dilin conventional standartları okuyanların daha rahat anlamasına yardımcı olur. Örneğin Java'da fonksiyon isimlendirmelerinin birden fazla kelime içermesi durumunda Camel Case kullanılması, Python'da ise büyük harfe yer verilmeyip birden fazla kelime içermesi durumunda alt tire karakteriyle ayrılması gibi.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cleancode</category>
    </item>
    <item>
      <title>CI/CD</title>
      <dc:creator>Enes Gerem</dc:creator>
      <pubDate>Mon, 28 Jun 2021 07:04:56 +0000</pubDate>
      <link>https://dev.to/enesgerem/ci-cd-4jh8</link>
      <guid>https://dev.to/enesgerem/ci-cd-4jh8</guid>
      <description>&lt;h1&gt;
  
  
  Continuous Integration
&lt;/h1&gt;

&lt;p&gt;Basitçe, tüm geliştiriciler tarafından yapılan işleri günde birkaç kez paylaşılan bir ana hatta birleştirme uygulaması.&lt;/p&gt;

&lt;p&gt;Kodu bir Git reposunda saklanan bir uygulama göz önüne alındığında, geliştiriciler, bir uygulama için kod değişikliklerini gün içerisinde birden çok kez pushlar.&lt;br&gt;
Repoya yapılan her pushlama için, uygulamayı otomatik olarak oluşturmak ve test etmek için bir dizi komut dosyası oluşturulabilir. Bunlar&lt;br&gt;
komut dosyaları, uygulamada hatalara neden olma olasılığını azaltmaya yardımcı olur.&lt;/p&gt;

&lt;p&gt;Bir dalda ana hatta birleşmeden geliştirme ne kadar uzun sürerse, çoklu&lt;br&gt;
geliştirici dalı sonunda tekrar birleştirildiğinde entegrasyon çakışmaları ve başarısızlıklar oluşması riski o kadar artar. Geliştiriciler kod gönderdiğinde&lt;br&gt;
kopyalarını aldıkları andan itibaren repodaki değişiklikleri yansıtmak için önce kodlarını güncellemeleri gerekir.&lt;br&gt;
Repo ne kadar çok değişiklik içeriyorsa, geliştiricilerin kendi değişikliklerini göndermeden önce o kadar çok iş yapması gerekir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HHgkpWYb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mhm8cfevoeahd4h7ub8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HHgkpWYb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1mhm8cfevoeahd4h7ub8.png" alt="ci-pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir uygulamaya gönderilen her değişiklik, otomatik ve sürekli olarak oluşturulur ve test edilir. Bahsedilen testler değişikliklerin tüm testlerden geçtiğini, kod içerisindeki yönergelerin ve kod uyumluluk standartlarının geçerliliğini kontrol eder.&lt;/p&gt;
&lt;h1&gt;
  
  
  Continuous Delivery &amp;amp; Deployment
&lt;/h1&gt;

&lt;p&gt;Sürekli Teslimat, her seferinde yalnızca uygulamanın oluşturulduğu ve test edildiği Sürekli Entegrasyonun ötesinde bir adımdır.&lt;br&gt;
kod değişikliği kod tabanına aktarılır, ancak uygulama da sürekli olarak dağıtılır. Sürekli Teslimat&lt;br&gt;
kodu otomatik olarak kontrol eder, ancak değişikliğin dağıtımı manuel olarak gerçekleşir ve stratejik olarak tetiklemek için insan müdahalesi gerektirir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QtPuuWZy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4x9g0f507egfypgztotq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QtPuuWZy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4x9g0f507egfypgztotq.png" alt="sequence"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sürekli Dağıtım, Sürekli Teslimata benzer bir başka adımdır. Aradaki fark,&lt;br&gt;
uygulama manuel olarak dağıtımının yerine, otomatik olarak dağıtılacak şekilde ayarlanmıştır, bu nedenle insan müdahalesi gerekmez. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1zLlcUsg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j2ocml4pv743ulk1xh98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1zLlcUsg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j2ocml4pv743ulk1xh98.png" alt="cd-pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deployment pipeline, yazılım kalitesini iyileştirmek, kararlılığı arttırıp kodun maliyetini düşürmek adına yapılandırma yönetimini, sürekli entegrasyonu ve dağıtım otomasyonunu bir arada birbirine bağlar.  &lt;/p&gt;

&lt;p&gt;Deploymentlarda dikkat edilmesi gerekenler;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paketleri yalnızca bir kez oluşturmak.&lt;/strong&gt; Dağıttığımız projenin deployment pipeline boyunca baştan beri test ettiğimiz projeyle aynı olduğundan emin olmak istiyoruz, böylece bir dağıtım başarısız olursa, paketleri hatanın kaynağı olarak ortadan kaldırabiliriz.&lt;/li&gt;
&lt;li&gt;Geliştirme dahil &lt;strong&gt;her ortama aynı şekilde dağıtmak&lt;/strong&gt;. Bu şekilde, dağıtım sürecini birçok kez test ediyoruz.
Herhangi bir sorun kaynağının ortadan kaldırılabilmesi için üretime geçme aşamasından önce gerçekleştirilebiliyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dağıtımlarınızı duman testi ile test etmek&lt;/strong&gt; Uygulamanın tüm bağımlılıklarını doğrulayan bir komut dosyasına sahip olun.
uygulamanın yapılandırıldığı konum, uygulamanın çalıştığından ve uygulamanın dağıtım sürecenin bir parçası olarak kullanılabilir olduğundan emin olun.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ortamları benzer tutmak&lt;/strong&gt; Donanım yapılandırmasında farklılık gösterseler de aynı
işletim sistemi ve ara yazılım paketlerinin sürümü ve aynı şekilde yapılandırılmalıdır. Günümüzde modern sanallaştırma ve kapsayıcı teknolojisi ile bunu başarmak çok daha kolay hale geldi.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  GitLab'da CI/CD
&lt;/h1&gt;

&lt;p&gt;GitLab, kendisine ait olan Sürekli Entegrasyon ve Sürekli Dağıtım sistemiyle oluşturulmuştur. Bir GitLab projesinde, projenin yapılandırılması için &lt;strong&gt;&lt;em&gt;gitlab-ci.yml&lt;/em&gt;&lt;/strong&gt; adlı bir configuration dosyası reponun içine yerleştirilir. Dosya, projede gerçekleşen her bir push komutuyla uygulamanın inşasının ve testinin tapılacağı GitLab Runner tarafından yürütülür.&lt;/p&gt;

&lt;p&gt;GitLab Runner projenin işlerini çalıştırmak ve sonuçları GitLab'a geri göndermek için kullanılan açık kaynaklı bir projedir. Bu servis GitLab'a dahil olup CI ve CD'den ardışık düzen komut dosyasını yürütmek için onunla birlikte kullanılır.&lt;/p&gt;
&lt;h2&gt;
  
  
  GitLab'da CI/CD Örneği
&lt;/h2&gt;

&lt;p&gt;Bu örnek proje bir küme yönetim sistemi olan Google Cloud Container Engine'e deploy edilecektir.&lt;/p&gt;

&lt;p&gt;Gereksinimler; Dockerfile, Kubernetes deployment.&lt;/p&gt;
&lt;h3&gt;
  
  
  Spring Boot uygulamasını Docker Container olarak paketleme
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; adoptopenjdk/openjdk11:alpine-jre&lt;/span&gt;
&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="s"&gt; /tmp&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="s"&gt; /target/cdexample-0.0.1-SNAPSHOT.jar app.jar&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Kubernetes deployment'ı tanımlama
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extensions/v1beta1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdexample&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdexample&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdexample&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry.gitlab.com/enesgerem/cdexample&lt;/span&gt;
          &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;imagePullSecrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry.gitlab.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Bir GitLab CI Pipeline oluşturma
&lt;/h3&gt;

&lt;p&gt;Yukarıdaki dosyaları commitleyip pushladıktan sonra GitLab CI Pipeline'ı tanımlamaya hazırız.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker:latest&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker:dind&lt;/span&gt;

&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;overlay2&lt;/span&gt;
  &lt;span class="na"&gt;SPRING_PROFILES_ACTIVE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitlab-ci&lt;/span&gt;

&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;package&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;

&lt;span class="na"&gt;maven-build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;maven:3.8.1-jdk-11&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mvn&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;package&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-B"&lt;/span&gt;
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;target/*.jar&lt;/span&gt;

&lt;span class="na"&gt;docker-build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker build -t registry.gitlab.com/enesgerem/cdexample .&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker push registry.gitlab.com/enesgerem/cdexample&lt;/span&gt;

&lt;span class="na"&gt;k8s-deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google/cloud-sdk&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "$GOOGLE_KEY" &amp;gt; key.json&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcloud auth activate-service-account --key-file key.json&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcloud config set compute/zone europe-west1-c&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcloud config set project cdexample&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcloud config set container/use_client_certificate True&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gcloud container clusters get-credentials cdexample&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kubectl delete secret registry.gitlab.com&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kubectl create secret docker-registry registry.gitlab.com --docker-server=https://registry.gitlab.com --docker-username=enesgerem --docker-password=$REGISTRY_PASSWD --docker-email=enesgerem@gmail.com&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kubectl apply -f deployment.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;image&lt;/strong&gt; objesi kullanmak istediğimiz Docker image'ın ismini tanımlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;services&lt;/strong&gt; objesi projeye linklenmiş kullanmak istediğimiz ek Docker image'larını tanımlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;variables&lt;/strong&gt; objesi oluşturduğumuz environment içindeki değişkenleri tanımlar.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;DOCKER_DRIVER&lt;/em&gt;&lt;/strong&gt; hangi depolama sürücülerini kullandığımızı Docker Engine'a bildirir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;SPRING_PROFILES_ACTIVE&lt;/em&gt;&lt;/strong&gt; uygulamamızın bölümlerini ayıran ve yalnızca belirli ortamlarda kullanılabilir hale getirmenin bir tolunu sağlayan Spring Profiles'ı etkinleştirir.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stages&lt;/strong&gt; objesi build'ımızın yaşam döngüsünü tanımlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;maven-build, docker-build&lt;/strong&gt; ve &lt;strong&gt;k8s-deploy&lt;/strong&gt; iş tanımlamalarıdır.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;$GOOGLE_KEY&lt;/em&gt;&lt;/strong&gt; Google Cloud serviste kullandığımız hesap anahtarımızdır, API Manager Section'daki Google Cloud Platform'dan edinilir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;kubectl create secret docker-registery ...&lt;/em&gt;&lt;/strong&gt; kodu &lt;em&gt;deployment.yml&lt;/em&gt; içinde tanımladığımız &lt;em&gt;imagePullSecret&lt;/em&gt; objesini yaratır.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Son olarak, her şeyin yolunda olduğunu kontrol etmek adına küme aşağıdaki gibi kontrol edilebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get deployments
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE    AGE
cdexample   2         2         2            2            2m

&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
cdexample-3641958612-3e5xy   1/1       Running   0          2m
cdexample-5542343546-fr4gh   1/1       Running   0          2m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ci</category>
      <category>cd</category>
      <category>gitlab</category>
      <category>github</category>
    </item>
  </channel>
</rss>
