29 Mart 2020 Pazar

X11 İstemcisi - Client

X11 Kütüphanesi
Şu satırı dahil ederiz. Kütüphanenin ismi xlib
#include <X11/Xlib.h>
X11'in API'si oldukça zor. Direkt X11 kodlaması yerine QT, GTK gibi kütüphaneler tercih edilmeli.
Açıklaması şöyle.
Libraries such as qt, gtk, sdl, are next — they make it easier to use X11, and work on other systems such as wayland, Microsoft's Windows, or MacOS.
Xlib ile ilgili bazı eleştiriler şöyle
Xlib is an excellent piece of work, but there are applications for which it is not ideal, for example:

- Small platforms: Xlib is a large piece of code, and it's difficult to make it smaller
- Latency hiding: Xlib requests requiring a reply are effectively synchronous: they block until the reply appears, whether   the result is needed immediately or not.
- Direct access to the protocol: Xlib does quite a bit of caching, layering, and similar optimizations. While this is   normally a feature, it makes it difficult to simply emit specified X protocol requests and process specific responses.
- Threaded applications: While Xlib does attempt to support multithreading, the API makes this difficult and error-prone.
- New extensions: The Xlib infrastructure provides limited support for the new creation of X extension client side code.
Window Manager
X Client'ın çalışması için Window Manager şart değil. Açıklaması şöyle
No, you don't need to be running a window manager to allow an X client to work. Some systems provide an option to just run a terminal at startup, and from that you can start additional programs, including window managers. Some kiosk setups which only want one application to run don't need a window manager. Some implementations of X for microsoft windows avoid an X window manager by letting the OS manage the windows.

Without a window manager you typically need to specify the geometry to the programs so you don't have everything placed in the top left corner.
Java Swing ve Window Manager
Açıklaması şöyle. Yani Java Swing uygulamaları için Window Manager gerekir.
@StephenKitt Java apps (swing) steal the focus upon starting, which means that they completely break any focus-follows-mouse model, unless treated specially. Just like Firefox, java apps need special assistance from the window manager, otherwise drop-down menus won't open, entry boxes won't focus, etc. I don't know if that's still the case, but java was assuming that a window manager is reparenting, unless it was named "LG3D" or similar (java library had a select list of non-parenting WMs, and all the other non-reparenting WMs had to lie about their name ;-))
...
@mosvy that's still the case, at least for openjdk. E.g. in xmonad, you have to configure "LG3D" as window manager-name. Otherwise java-applications with a gui won't work
X11 İstemcileri Birbirleri İle Etkileşebilirler
Açıklaması şöyle.
All the X11 clients on a desktop can access each other in depth, including getting the content of any window, changing it, closing any window, faking key and mouse events to any other client, grabbing any input device, etc.

The X11 protocol design is based on the idea that the clients are all TRUSTED and will collaborate, not step on each other's toes (the latter completely broken by modern apps like Firefox, Chrome or Java).

dig komutu

Giriş
DNS sorgusu için kullanılır. 

DNS Sorgusu Araçları
DNS sorgusu için kullanılabilecek araçlar şöyle 

dig komutu
host komutu
nslookup komutu (çok eski)

dig tüm DNS sorgusunun detaylarını gösterir. host ve nslookup ise DNS sorgusu sonucunu gösterir.

Komut Çıktısı
Komut çıktısında komutun sürüm numarası + Özet Bilgi + Sectionlar vardır

Sectionlar
Komut çıktısında şu section'lar var
;; OPT PSEUDOSECTION:
;; QUESTION SECTION:
;; ANSWER SECTION:
;; AUTHORITY SECTION:

Örnek
Komut çıktısı şöyledir
$ dig @192.168.1.2 exodus.babeldat.com

; <<>> DiG 9.16.8-Debian <<>> @192.168.1.2 exodus.babeldat.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 58608
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;exodus.babeldat.com.       IN  A

;; ANSWER SECTION:
exodus.babeldat.com.    41  IN  CNAME   104.248.81.197.

;; AUTHORITY SECTION:
.           3357    IN  SOA a.root-servers.net. nstld.verisign-grs.com. 2020112400 ...

;; Query time: 0 msec
;; SERVER: 192.168.1.2#53(192.168.1.2)
;; WHEN: Tue Nov 24 10:12:40 CET 2020
;; MSG SIZE  rcvd: 148
Örnek
$ dig google.com

; <<>> DiG 9.16.1-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32427
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             276     IN      A       142.250.71.14

;; Query time: 1437 msec
;; SERVER: 192.168.225.1#53(192.168.225.1)
;; WHEN: Sun May 15 23:49:53 IST 2022
;; MSG SIZE  rcvd: 55

;; ANSWER SECTION Sütunları
- Birinci sütun sorgulanan DNS ismidir

- İkinci sütun "Time to Live" anlamına gelir. Cevabın kaç saniye bellekte saklanacağını belirtir. Bu süreden sonra tekrar sorgulamak gerekir.

- Üçüncü sütun her zaman IN değerini taşır. Eskiden başka değerler de içerirmiş ancak b değerler artık kullanılmıyor. Açıklaması şöyle.
IN stands for ‘Internet’. Like so much of this, the field dates back to an era when there were several competing computer networks which needed to interoperate. Other potential values were CH for the CHAOSNET or HS for Hesiod which was the name service of the Athena system. CHAOSNET is long dead, but a much evolved version of Athena is still used by students at MIT to this day. You can find the list of DNS classes on the IANA website, but it’s no surprise only one potential value is in common use today.
- Dördüncü sütun DNS kayıt tipini gösterir. A, CNAME, MX gibi, bir şey olabilir.

Örnek
Şöyle yaparız. DNS cevabı 26151 saniye boyunca önbellekte saklanır.
$ dig example.com

;; ANSWER SECTION:
example.com.        26151   IN  A   93.184.216.34
Örnek
Şöyle yaparız.
$ dig very.deep.host.with.no.immediate.parents.teaparty.net
[...]
;; ANSWER SECTION:
very.deep.host.with.no.immediate.parents.teaparty.net. 3599 IN A 172.16.34.56
Kullanım Seçenekler

@ seçeneği

Sorgulama için kullanılacak DNS sunucusunu belirtir.
Örnek
Şöyle yaparız.
dig +short www.superonline.com @8.8.8.8.
Örnek
Şöyle yaparız.
# dig @1.1.1.1 serverlessdaystlv.io

...

;; ANSWER SECTION:
serverlessdaystlv.io.   60      IN      A       13.32.67.21
serverlessdaystlv.io.   60      IN      A       13.32.67.27
serverlessdaystlv.io.   60      IN      A       13.32.67.97
serverlessdaystlv.io.   60      IN      A       13.32.67.122
serverlessdaystlv.io.   60      IN      A       13.32.67.141
serverlessdaystlv.io.   60      IN      A       13.32.67.159
serverlessdaystlv.io.   60      IN      A       13.32.67.201
serverlessdaystlv.io.   60      IN      A       13.32.67.216
a seçeneği - Address Record
Örnek
Şöyle yaparız.
dig www.whitehouse.gov a
Örnek
Şöyle yaparız
dig @nsX.maccentrecloud.com.au elyseecollective.com.au A
mx seçeneği - MX Record
MX (e-posta) kayıtlarını görmek için kullanılır. -t ile de kullanılabilir.

Örnek
Şöyle yaparız.
$ dig mx example.com
;; ANSWER SECTION:
example.com.        859     IN      MX      25 mail05.example.com.
example.com.        859     IN      MX      20 mail11.example.net.
Örnek
MX kayıtlarını yani e-posta sunucusunu öğrenmek için şöyle yaparız
dig MX smtp.companyname.co.th
+dnssec seçeneği
DNSSEC'i etkinleştirmez ancak DNSSEC sonuçlarını da gösterir. 
Örnek 
Şöyle yaparız
$ dig dwewgewfgewfee-32cewcewcew-2284.cloudflare.com @ns3.cloudflare.com. +dnssec
+nocmd seçeneği
Normalde dig komutu çıktısında kendi sürüm numarasını yazar. Bunu görmemek için +nocmnd seçeneğini kullanıırz.

Örnek
Şöyle yaparız.
% dig +nocmd +nocomments @one.one.one.one archive.is
;archive.is.                    IN      A
archive.is.             49050   IN      A       127.0.0.3
;; Query time: 139 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Oct  3 17:12:50 2019
;; MSG SIZE  rcvd: 44

%
+short seçeneği
Çıktıyı kısa verir.
Örnek
Şöyle yaparız
dig +short www.superonline.com
Çıktı olarak şunu alırız.
213.14.196.1
-t seçeneği - Query Type
Kayıt tipini belirtmek için kullanılır.

Örnek
Şöyle yaparız.
% dig +short @8.8.8.8 -t TXT google.com
"v=spf1 include:_spf.google.com ~all"
% dig +short @8.8.8.8 -t SOA google.com
ns2.google.com. dns-admin.google.com. 103585632 900 900 1800 60
Örnek
Şöyle yaparız
$ dig txt toafinish.com +short
"v=spf1 a mx include:e2ma.net ~all"
"spf2.0/pra a mx include:e2ma.net ~all"
+ trace seçeneği
Örnek
Şöyle yaparız.
$ dig google.ca +trace

; <<>> DiG 9.11.5-P4-5.1-Debian <<>> google.ca +trace
;; global options: +cmd
.                       68215   IN      NS      h.root-servers.net.
.                       68215   IN      NS      k.root-servers.net.
.                       68215   IN      NS      i.root-servers.net.
.                       68215   IN      NS      g.root-servers.net.
.                       68215   IN      NS      a.root-servers.net.
.                       68215   IN      NS      b.root-servers.net.
.                       68215   IN      NS      d.root-servers.net.
.                       68215   IN      NS      f.root-servers.net.
.                       68215   IN      NS      l.root-servers.net.
.                       68215   IN      NS      e.root-servers.net.
.                       68215   IN      NS      j.root-servers.net.
.                       68215   IN      NS      m.root-servers.net.
.                       68215   IN      NS      c.root-servers.net.
;; Received 553 bytes from 192.168.2.5#53(192.168.2.5) in 31 ms

ca.                     172800  IN      NS      c.ca-servers.ca.
ca.                     172800  IN      NS      x.ca-servers.ca.
ca.                     172800  IN      NS      any.ca-servers.ca.
ca.                     172800  IN      NS      j.ca-servers.ca.
;; Received 626 bytes from 202.12.27.33#53(m.root-servers.net) in 24 ms

google.ca.              86400   IN      NS      ns1.google.com.
google.ca.              86400   IN      NS      ns2.google.com.
google.ca.              86400   IN      NS      ns3.google.com.
google.ca.              86400   IN      NS      ns4.google.com.
;; Received 603 bytes from 199.253.250.68#53(x.ca-servers.ca) in 42 ms

google.ca.              300     IN      A       172.217.16.163
;; Received 54 bytes from 216.239.32.10#53(ns1.google.com) in 22 ms
-x seçeneği
Reverse DNS içindir. IP adresini sunucu ismine çevirir.

Örnek
Şöyle yaparız
$ dig -x 142.250.71.14

; <<>> DiG 9.16.1-Ubuntu <<>> -x 142.250.71.14
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61497
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;14.71.250.142.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
14.71.250.142.in-addr.arpa. 67394 IN    PTR     maa03s34-in-f14.1e100.net.

;; Query time: 15 msec
;; SERVER: 192.168.225.1#53(192.168.225.1)
;; WHEN: Sun May 15 23:52:46 IST 2022
;; MSG SIZE  rcvd: 83



27 Mart 2020 Cuma

scp komutu - secure copy

Giriş
Açıklaması şöyle. scp yerine sftp komutu da kullanılabilir.
scp copies files between hosts on a network. It uses ssh(1) for data transfer, and uses the same authentication and provides the same security as ssh(1).
scp yerine ssh kullanmak istersek şöyle yaparız. Dosyayı stdout'a yazar. Onu da ssh okur ve cat komutuna verir.
gzip -c file.txt | ssh user@ip "cat > destfile.gz"
Örnek
Uzak bilgisayardaki belli uzantılara sahip dosyaları kendime kopyalamak için şöyle yaparız.
scp user@someRemoteHost.com:'/folder/*.{jpg,png}' .
-3 seçeneği
Açıklaması şöyle
-3 Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts. [...]
Açıklaması şöyle
 Very recent versions of scp have -3 enabled by default since 9 August 2021, and to disable it one must now specify -R.
Elimizde 3 tane sunucu olsun. A, B, C. C sunucusuna herkesin erişimi olsun ancak A ve B birbirleriyle iletişim kuramıyor olsunlar. A'dan B'ye dosya kopyalamak için şöyle yaparız
scp -3p serverA:path/to/file(s) serverB:/path/to/destination
-J seçeneği
ssh ile bir sunucuya bağlanıp daha sonra sunucundan bir başka bilgisayara bağlanıp dosyayı kendi bilgisayarıma indirmek içindir. Yani ProxyJump için şöyle yaparız.
scp -J user@intermediate user@target:/path
-o seçeneği
ProxyJump
Açıklaması şöyle. Eğer -J seçeneğini destekleyemeyen daha eski bir sürüm kullanıyorsak.
ProxyJump
Specifies one or more jump proxies as either [user@]host[:port] or an ssh URI. Multiple proxies may be separated by comma characters and will be visited sequentially. Setting this option will cause ssh(1) to connect to the target host by first making a ssh(1) connection to the specified ProxyJump host and then establishing a TCP forwarding to the ultimate target from there.
Şöyle yaparız.
scp -o ProxyJump=user@intermediate user@target:/path
-P Seçeneği
Port numarasını belirtir. 
Örnek
Şöyle yaparız
scp -P 31107 adv@172.18.16.213:/var/tmp/AdvCollectedTraces.0000.tar .
-r seçeneği
Recursive anlamına gelir.
Örnek
Bulunduğum dizinin tamamını kopyalamak istersem şöyle yaparız
scp -r "${PWD}" ${remote}:${dst_path}
scp "." yani bulunduğum dizin karakterini anlamıyor. Bu yüzden PWD kullanılıyor. Şu komut hata veriyor. Çıktı olarak şunu verir. scp: error: unexpected filename: .
scp -r . host:new-name

25 Mart 2020 Çarşamba

bash kodlama $@ gömülü değişkeni - All the positional parameters (as separate strings)

Giriş
Açıklaması şöyle. Aslında Java'daki main metodundaki String[] argv olarak düşünülebilir.
Special Parameters
  The shell treats several parameters specially.  These parameters may  only
  be referenced; assignment to them is not allowed.
       
  @      Expands  to the positional parameters, starting from one.  When the
         expansion occurs within double quotes, each parameter expands to  a
         separate  word.   That  is, "$@" is equivalent to "$1" "$2" ...  If
         the double-quoted expansion occurs within a word, the expansion  of
         the first parameter is joined with the beginning part of the origi‐
         nal word, and the expansion of the last parameter  is  joined  with
         the  last  part of the original word.  When there are no positional
         parameters, "$@" and $@ expand to nothing (i.e., they are removed).
Örnek
En son parametreyi çıkartmak için şöyle yaparız
local argv=( "$@" )
last=${argv[-1]}
unset 'argv[-1]'
Örnek
Şöyle yaparız.
xdg-open "$@">/dev/null 2>&1
Örnek
Komutumuzu şöyle çağıralım.
mycommand -a "foo bar"
Parametreleri bir başka array değişkene atamak istersek şöyle yaparız.
args=("$@")
Daha sonra değişkeni kullanmak için şöyle yaparız. Burada "${arr[@]}" ile tüm dizi dolaşılıyor ve git komutuna ilave ediliyor. Dizi dolaşmak için bash kodlama - array yazısına bakabilirsiniz.
elif [[ $commit == true ]]; then
    git commit "${args[@]}"
elif [[ $checkout == true ]]; then
    git checkout "${args[@]}"
else
Böylece git komutu şöyle çağrılır. Array'imiz iki tane elemana sahiptir.
git commit -a "foo bar"
Eğer girdiyi array yerine tek bir string'e atasaydık yani şöyle yapsaydık
args=$@
Ve bu değişkeni "$args" olarak kullansaydık bu durumda çıktı olarak şunu elde ederdik ve bu yanlış olurdu.
git commit '-a foo bar'

23 Mart 2020 Pazartesi

inotifywait komutu - inotify-tools Paketi

Giriş
Bu komut inotify-tools paketi ile geliyor.

-e seçeneği
İzlenmesi istenen olayları belirtir. create, moved_to, move_from, close_write vs olabilir.
Örnek
Açıklaması şöyle
you can have a program in the background that updates the symlink using inotify and the fact that later files sort as being later with LC_COLLATE=C:
Şöyle yaparız./path dizininde bir değişiklik olursa bu dizindeki dry-run ismi ile başlayan dosyalar bulunur. En sonra dosya latest ismi ile soft link oluşturulur. Yani /path/latest en son oluşturulan örneğin dryrun-161134-abc.txt isimli dosyaya işaret eder.
#!/bin/bash -e

export LC_COLLATE=C
shopt -s nullglob

base=/path

while inotifywait -e create \
                  -e moved_to \
                  -e moved_from \
                  -e close_write "$base" > /dev/null; do
    dirs=("$base"/dryrun-[0-9]*/)
    (( ${#dirs[@]} )) && ln -sfn -- "${dirs[-1]}" "$base"/latest
done
Örnek
Şöyle yaparız. /tmp dizininde yeni bir dizin yaratılırsa bu yeni dizin izlenir ve içindeki dosyalar başka bir yere kopyalanır
#!/bin/sh

TMP_DIR=/tmp
CLONE_DIR=/tmp/clone
mkdir -p $CLONE_DIR

wait_dir() {
  inotifywait -mr --format='%w%f' -e create "$1" 2>/dev/null | while read file; do
    echo $file
    DIR=`dirname "$file"`
    mkdir -p "${CLONE_DIR}/${DIR#$TMP_DIR/}"
    cp -rl "$file" "${CLONE_DIR}/${file#$TMP_DIR/}"
  done
}

trap "trap - TERM && kill -- -$$" INT TERM EXIT

inotifywait -m --format='%w%f' -e create "$TMP_DIR" | while read file; do
  if ! [ -d "$file" ]; then
    continue
  fi

  echo "setting up wait for $file"
  wait_dir "$file" &
done

-m seçeneği - monitor
Sonsuza kadar çalış anlamına gelir.
Örnek
Şöyle yaparız.
#!/bin/bash
DIRECTORY="your_directory_path"
inotifywait -m -r -e create --format '%w%f' "${DIRECTORY}" | while read NEW
do
        ls -hltr
done
-t seçeneği
Şöyle yaparız
touch $HOME/.cache/sentinel
inotifywait -t 300 $HOME/.cache/sentinel
Dosyadaki değişikliği tetiklemek için şöyle yaparız
touch $HOME/.cache/sentinel