Kategori arşivi: Programlama

Programlama hakkında türkçe bilgiler, ipuçları, kod örnekleri, örnek projeler, sorunlar ve çözümler, fikir alışverişi, düşünceler ve daha fazlası

Rust Yeni Bir Programlama Dilinin Doğuşu

Öncelikle geleceğin yazılım diline hoşgeldiniz rust programlama dili geliştirileli yaklaşık 6 yıl kadar oluyor. Karşımıza ilk olarak 2010 yılında Mozilla tarafından duyurulması ile birlikte çıktı. İnanmayabilirsiniz ama uygulama 2011 yılında kendi kendini compile ederek self hosted bir şekilde piyasaya sürüldü

Çok değil sadece 1 yıl kadar önce ise kararlı sürümünün yayınlanması ile hayatımıza tam anlamıyla giriş yaptı yaklaşık 5 yıl kadar bir süre geliştirilmeye devam etti ve pek çok dilin artı yanlarını alan bir dil oldu bahsedeceklerim sizi biraz şaşırtabilir ancak rust tam olarak orjinal bir dil değil bunun en büyük özelliği yukarıda bahsetmiş olduğum dillerin güzel özelliklerini içinde barındırıyor olmasıdır.

Peki Rust hangi dillerden özellik alarak ortaya çıktı bildiklerimi yazmakla başlayayım C#, C++, Python, Ruby, Go Gibi bu dillerden tam olarak hangi özellikleri aldı işin doğrusu tam olarak bilmiyorum çünkü gerekli olmadığını düşünüyorum kısa bir şekilde bilsek bize yeter. Uzatmadan rust hakkında bir kaç güzel özelliktende bahsedelim;

Rust bellek güvenliğinide beraberinde getiren bir dildir. Ram de her hangi bir taşmaya sebebiyet vermemektedir. Bunun en büyük artısı oluşturulan uygulamalar çok fazla işlem yapsa dahi sistem belleğini sömürmemesidir.

Buna en iyi örnek Rust dili ile geliştirilen ve gelecek yıllarda yerini alacak olan Servo Tarayıcısı çok güzel gösterilebilir. Bu blog yazısından yaklaşık 8 ay önce yayınlanan servo sürümü ile 8 ay sonra ki yayınlanan sürümde oldukça farklılıklar bulunmakta sorunsuz bir şekilde çalışmakta ve siz internet’te gezerken bu kararsız haliyle bile sadece 20 MB ram tüketmektedir. CPU ise sadece 0,1 kullanır.

Hal böyle olunca dili geliştiren arkadaşlar buna Borrowing demişler ve çok cici bir şekilde dokümantasyona eklemişler. Bu özellik sayesinde ramde tutulan pointerlar yeri geldiğinde boşaltılabilmekte böylelikle ram kullanımında ciddi anlamda düşüşler görünecektir.

Şimdi dokümantasyonu okuyan arkadaşlar olacaktır ve diyeceklerdir ya bu dil nesne yönelimli bir dil değil bize sıkıntı çıkartmasın geride kalmadı mı bunlar ya… Evet kalmadı çünkü rust bunu göz önüne alıp dili ona göre geliştirmiş ve size bir sıkıntı çıkartmayacak şekilde dizayn edilmiş.

Rust dili compiler oldukça güzel bir şekilde dizayn edilmiştir ki siz derleme komutunu verdiğiniz andan itibaren kodu denetler her dilde olduğu gibi ilginç derleme hataları almazsınız oldukça açıklayıcı ve neyin nerede yanlış gittiğini açıklayan hata kodları döndürür size. Örnek olarak aşağıdaki hata formatı gösterilebilir. 1.12 Sürümü ile birlikte dahada güçlendirilmiştir.

mismatched-trait-error

Şimdiden belirtmekte fayda var Rust bildiğiniz tüm dillerin dışında bir yapıya sahiptir. Şaşırabilir hatta program yazamayabilirsiniz korkmayın alışma ile alakalı bir durum dokümanlarına göz attıysanız bununda üstesinden gelebilirsiniz. C ve C++ ile uğraşamadıysanız syntax size biraz farklı gelebilir.

Ben linux dağıtımı kullandığım için kurulumu kendimce(tabi onurunda yardımları oldu bazı aşamalarda) anlatacağım özellikle geliştiriciler için yayınlanan gecelik sürümü kullanacağız bunun en büyük artılarından bir tanesi elimizde her daim güncel bir dilin derleyicisi olacak ayrıca rust da yazılan pek çok uygulama gecelik derlemeyi yani geliştirici sürümünü kullanmaktadır.

Linux için kurulum aracımıza geçiyoruz.(Bu işlemi root kullanıcısı ile yapmayınız normal kullanıcı ile kurulumu yapmanız gerekmektedir.)

curl https://sh.rustup.rs -sSf | sh

Bu uygulama beta olmasına rağmen bize oldukça tatlı özellikler sunacak sürüm seçebilmekte bunlardan bir tanesi

Gelen ekranda siz direk olarak 2 seçeneğini seçiyorsunuz ilk gelen host triple seçeneğini boş bırakıyorsunuz ardından gelen sürüm bilgisinde ister stable kurabiliriz istersek de nightly sürüm kurabilirsiniz. Korkmayın gecelik sürüm bile stable kalitesindedir.

Seçiminizi tamamladığınızda PATH ayarlamanız için bir soru soracak y deyip devam ediyorsunuz. Biraz beklediğinizde rust sisteminize kurulmuş olacak

Bu kurulum aracının güzelliği her gün yayınlanan yeni sürümleri sisteminize kurma imkanı sağlamasıdır.

Kurulum aracının özellikleri bunlarla sınırlı değildir. rustup -h komutu ile çok rahat bir şekilde özelliklerine bakabilirsiniz. Aşağıdaki gibi bir çıktı verecektir size

rustup 0.6.3 (a0e2132 2016-08-28)
The Rust toolchain installer

USAGE:
    rustup [FLAGS] [SUBCOMMAND]

FLAGS:
    -v, --verbose    Enable verbose output
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    show         Show the active and installed toolchains
    update       Update Rust toolchains
    default      Set the default toolchain
    toolchain    Modify or query the installed toolchains
    target       Modify a toolchain's supported targets
    component    Modify a toolchain's installed components
    override     Modify directory toolchain overrides
    run          Run a command with an environment configured for a given toolchain
    which        Display which binary will be run for a given command
    doc          Open the documentation for the current toolchain
    man          View the man page for a given command
    self         Modify the rustup installation
    set          Alter rustup settings
    help         Prints this message or the help of the given subcommand(s)


rustup installs The Rust Programming Language from the official
release channels, enabling
you to easily switch between stable, beta,
and nightly compilers and keep them updated.
It makes cross-compiling
simpler with binary builds of the standard library for common
platforms.

If you are new to Rust consider running `rustup doc --book`
to learn Rust.

Burada kullandığınız mevcut sürümü görebilir ve kurulumları güncelleyebilir yada kurulumu tekrar düzenleyebilirsiniz. Rust’ın resmi sitesinde bu kurulum şuan bulunmadığını fark ettim oradan kurarsanız da telaşlanmayın silip tekrar yükleyebilirsiniz veya tekrar aynı komut ile yeni sürümü kurabilirsiniz

Rustup ile sürüm güncellemek

rustup update

Sürüm bilgisine ulaşmak

rustup show

Kullanılan sürümleri değiştirmek

rustup toolchain

Kurulum aracının dışında sistemde bulunan paketlerden kurabilirsiniz özellikle debian kullanan arkadaşlar için güzel olacaktır.

apt-get install rustc cargo

Yukarıda kurulumda gördüğünüz cargo nedir diyecekseniz demeyin bu rust için geliştirilmiş bir paket yöneticisidir. Aynı zamanda proje oluşturup üzerinde çalışmanızada izin verir. Ayrıca binary olarakta uygulamaları kurabileceğiniz bir ortamdır.

cargoda ne yapabileceğinize kısaca bir göz atalım

Rust's package manager

Usage:
    cargo <command> [<args>...]
    cargo [options]

Options:
    -h, --help          Display this message
    -V, --version       Print version info and exit
    --list              List installed commands
    --explain CODE      Run `rustc --explain CODE`
    -v, --verbose ...   Use verbose output
    -q, --quiet         No output printed to stdout
    --color WHEN        Coloring: auto, always, never
    --frozen            Require Cargo.lock and cache are up to date
    --locked            Require Cargo.lock is up to date

Some common cargo commands are (see all commands with --list):
    build       Compile the current project
    clean       Remove the target directory
    doc         Build this project's and its dependencies' documentation
    new         Create a new cargo project
    init        Create a new cargo project in an existing directory
    run         Build and execute src/main.rs
    test        Run the tests
    bench       Run the benchmarks
    update      Update dependencies listed in Cargo.lock
    search      Search registry for crates
    publish     Package and upload this project to the registry
    install     Install a Rust binary

See 'cargo help <command>' for more information on a specific command.

bunların bazılarını açıklamak gerekirse

cargo install mdbook

Bu komut ile hem uygulamanın çalışması için gerekli olan tüm bağımlılıklar indirilecek hemde bu indirilenler derlenip size bir binary hazırlanacak ve sisteminizde bunu kolaylıkla kullanabileceksiniz

Bu kurulan uygulamalar kullanıcı adınızın altında bulunan .cargo klasörü içerisinde olacak silmek istersenizde bu klasörü kaldırarak uygulamayı temizleyebilirsiniz.

cargo new test_uygulama --bin

Yeni bir proje oluştururken bu komutu ullanıyoruz. --bin binary olduğunu ifade etmektedir. Binary çalıştırılabilir dir dosya olduğunu ifade edip uygulamayı ona göre oluşturmayı sağlar eğer kütüphane için bir proje oluşturacaksanız o zaman --bin kullanmamanız gerekiyor böylelikle src dizini içerisinde sadece lib.rs olacak

İçerisinde src dizini haricinde Cargo.toml adlı bir dosya bulunmaktadır. Bu dosya sizin projeyi derleyebilmeniz için gerekli olan meta dataları tutacak olan bir dosyadır. Yazdığınız uygulamayı ise

cargo build

Komutu aracılığı ile kolaylıkla derleyebilirsiniz. Derleyip daha sonra çalıştırmak zorunuza gidiyor ise bunun için direk olarak

cargo run

Komutunu kullanmanız işinizi görecektir. Derlendikten sonra otomatik olarak uygulama çalıştırılacaktır.

Burada dikkat etmeniz gereken bir şey bulunuyor derleme işleminden sonra aynı proje dosyası içerisinde Cargo.lock adında bir dosya oluşturuğunu göreceksiniz bu dosya bağımlılıklar hakkında tam kaydı tutmaktadır. El ile kesinlikle düzenlemeyin, bu iş için Cargo.toml kullanılacaktır uygulamanızı geliştirirken lütfen hataya düşmeyin

Bağımlılıkları güncellemek

cargo update

var olan bir uygulamayı test etmek istiyorsanız aşağıdaki komutu kullanabilirsiniz daha detaylı kullanım örnekleri için Testing dokümantasyonuna göz atmayı unutmayın.

cargo test

Rust dili ile uygulama yazarken lütfen kodunuzun içerisine yorumlar eklemeyi ve neyin ne işe yaradığını yazmayı unutmayın. Bu rust için oldukça önemlidir işte bu yüzden de açık kaynak kodlu dokümantasyon işlemi için Onur Aslan tarafından geliştirilmiş Docs.rs işinizi fazlasıyla görecektir.

Geleceğin yazılım diline hoşgeldiniz

dipnot: Bu makele rust dilini kısa bir şekilde tanıtmak için yazılmıştır. Hatalar olabileceği gibi eksikliklerinde olması doğaldır.

Temel MYSQL Komutları

Yaklaşık olarak 9 ay önce MySQL için hazırlanmış olan temel komut ve kısayolları içermektedir. Giriş seviyesinde öğrenmeniz gereken her şey bulunmaktadır. Okullarda hocaların genel olarak üzerinde durdukları konulara göre düzenlenmiştir.

Ayrıca Github üzerinden bulabilir. Örnek veritabanlarına ulaşabilirsiniz.

Ulaşmak İçin Tıklayın

Veritabanı ile bağlantı kurma

Local sunucuda kurulu olan MySQL komut satırı aracılığı ile bağlanabilmek için aşağıdaki komutu kullanmanız yeterlidir.

mysql -u root -h 127.0.0.1

Mevcut Veritabanlarını Listeleme

Aşağıdaki komut aracılığı ile veritabanındaki mevcut veritabalarını listeleyebilirsiniz.

SHOW DATABASES;

Veritabanı Oluşturma

Aşağıdaki komut aracılığı ile istediğiniz bir isim ile veritabanı oluşturabilirsiniz.

CREATE DATABASE [veritabanıadı];

Oluşturulan Veritabanını Kullanma

Aşağıdaki komut aracılığı ile oluşturulan veritabanı içerisinde istediğiniz komutları kullanma imkanı tanınır.

USE [veritabanıadı];

Tablo Oluşturma

Aşağıdaki komutu kullanarak veritabanı içerisinde tablo oluşturabilirsiniz.

CREATE TABLE [tabloadı] ([kolon] VARCHAR(120), [birsonrakikolon] DATETIME);

Tabloları Gösterme

Veritabanı içerisinde oluştruduğunuz veya varolan tabloları göstermeye yarar.

SHOW TABLES;

Tablo Detaylandırma

Veritabanı içerisindeki tabloları ve bu tablolara ait olan değerlerin tanımlamalarını göstermektedir.

DESCRIBE [tabloadı];

Tabloya Veri Ekleme

Veritabanı içerisinde bulunan herhangi bir tabloya veri girişine imkan tanır.

INSERT INTO [tabloadı] ([kolon], [birsonrakikolon]) VALUES ('[deger1]', [deger2]');

Tabloya kolon Ekleme

Veritabanı içerisinde bulunan ve seçtiğiniz tabloya kolon eklenilmesine imkan verir.

ALTER TABLE [tabloadı] ADD COLUMN [kolon] VARCHAR(120);

Veritabanı içerisinde benzersiz kimlikli ve otomatik artan kolonlar oluşturmanıza imkan tanır.

ALTER TABLE [table] ADD COLUMN [column] int NOT NULL AUTO_INCREMENT PRIMARY KEY;

SQL İfadeleri


Tablodaki Kayıtları Gösterme

Veritabanı içerisinde bulunan tablolar içerisindeki kayıtları ekrana getirir.

SELECT * FROM [tabloadı];

Veritabanında bulunan tablolar içerisinde ki kayıtları parça parça ekrana getirirmenize olanak sağlar

SELECT [kolon], [birsonrakikolon] FROM [tabloadı];

Tablodaki Kayıtların Sayısını Gösterme

Tablo içerisinde belirtilen kolona ait kaç adet kayıt olduğunu gösterir

SELECT COUNT([kolon]) FROM [tabloadı];

Tablodaki Kayıtları Sayma ve gruplandırılmış kayıtları seçme

Kayıtları sayar ve gruplandırılmış bir şekilde kayıtları gösterir.

SELECT *, (SELECT COUNT([kolon]) FROM [tabloadı]) AS count FROM [tabloadı] GROUP BY [kolon];

İçeren kayıtları getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '%[deger]%';

[deger] ile başlayanları getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '[deger]%';

deg ile başlayan ve er ile bitenleri getir

SELECT * FROM [tabloadı] WHERE [kolon] LIKE '[deg_er]';

Bir Aralık Seçme

SELECT * FROM [tabloadı] WHERE [kolon] BETWEEN [deger1] and [deger2];

Özel Sırayla ve Limitli Bir Şekilde Seçim

SELECT * FROM [tabloadı] WHERE [kolon] ORDER BY [kolon] ASC LIMIT [deger];

Kayıt Güncelleme

UPDATE [tabloadı] SET [kolon] = '[guncellenencek-deger]' WHERE [kolon] = [deger];

Kayıt Silme

DELETE FROM [tabloadı] WHERE [kolon] = [deger];

Tablonun kolonunu silme

ALTER TABLE [tabloadı] DROP COLUMN [kolon];

Tablo silme

DROP TABLE [tabloadı];

Veritabanı Silme

DROP DATABASE [veritabanıadı];

Özel Kolon isimleri tanımlama

SELECT [kolon] AS [özel-kolon-adı] FROM [tabloadı];

Veritabanının Yedeğini Alma

mysqldump -u [kullanıcıadı] -p [veritabanıadı] > yedekadi.sql

Veritabanının Yedeğini Yükleme

mysql -u [kullanıcıadı] -p -h localhost [veritabanıadı] < yedekadi.sql

Matematiksel Fonksiyonlar


Yineleme Olmadan Seçim

SELECT distinct name, email, acception FROM owners WHERE acception = 1 AND date >= 2015-01-01 00:00:00

Kayıtların Toplam Sayısını Hesaplama

SELECT SUM([kolon]) FROM [tabloadı];

Toplam [sütun] sayısını alma ve grublama [ara kolonlu]

SELECT [arakolon], SUM([kolon]) FROM [tablo] GROUP BY [arakolon];

Kolondaki en büyük değer

SELECT MAX([kolon]) FROM [tabloadı];

Kolondaki en küçük değer

SELECT MIN([kolon]) FROM [tabloadı];

Kolon Ortalaması

SELECT AVG([kolon]) FROM [tabloadı];

Yuvarlanmış ortalama değer ile gruplama

SELECT [carakolon], ROUND(AVG([kolon]), 2) FROM [tabloadı] GROUP BY [arakolon];

Kullanıcı Komutları


Kullanıcı Oluşturma

CREATE USER 'kullanıcı_adı'@'localhost' IDENTIFIED BY 'şifresi';

Kullanıcı Yetkilendirme

GRANT ALL PRIVILEGES ON * . * TO 'kullanıcı_adi'@'localhost';

veya

GRANT ALL ON veritabanı_adı.* TO 'kullanıcı_adı'@'localhost';

Github’da GPG Kullanımı

Github Bir süre önce sisteme GPG özelliğini eklemiş ve duyurmuştu bu özellik sayesinde yaptığımız commit işlemlerini basit bir şekilde onaylı hale getirebiliyor ve imzalıyoruz. Böylelikle commiti sizin yaptığınız sistemde güzel bir şekilde onaylanmış oluyor. Kontrol sistemi olarak getirmişler zaten

Şimdi GPG yardımıyla yeni bir anahtar oluşturmamız gerekiyor.

gpg --gen-key

Komutundan sonra size bol miktarda sorular soracak bunları aşağıdaki örneğe göre düzenleyin. Size Mail sorduğu zaman github da üye olurken kullandığınız ve sistemde onaylı olan maili yazmayı unutmayın. Github tarafından önerilen anahtar uzunluğu 4096 bit lütfen daha aşağılarını seçmeyin

Ayrıca size oluşturma sırasında passphrase soracak bu sizin gizli parolanız bunu hatırlayabileceğiniz bir şeyler yapmanızda fayda var sakın ola ki boş geçmeyin mutlaka parolanızı oluşturun.

gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      &lt;n&gt;  = key expires in n days
      &lt;n&gt;w = key expires in n weeks
      &lt;n&gt;m = key expires in n months
      &lt;n&gt;y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) &lt;heinrichh@duesseldorf.de&gt;"

Real name: Mertcan Gökgöz
Email address: mertcan.gokgoz@gmail.com
Comment: Github GPG
You are using the `utf-8' character set.
You selected this USER-ID:
    "Mertcan Gökgöz (Github GPG) &lt;mertcan.gokgoz@gmail.com&gt;"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

Anahtarınız sisteminizin kriptografik işlemleri yapabilme kabiliyetine göre değişiklik gösterecek süre bakımından bir şey söyleyemem ama 1 dk yı geçeceğini de hiç sanmam

Anahtarın uzun İD bilgisini döndürmemiz gerekiyor bunun için

gpg --list-secret-keys --keyid-format LONG

Çıktısı aşağıdaki gibi olacaktır.

/home/mertcan/.gnupg/secring.gpg
--------------------------------
sec   4096R/EF64ED4FF0199111 2016-08-25
uid                          Mertcan Gökgöz (Github GPG) &lt;>
ssb   4096R/A1BDA15B77CF194F 2016-08-25

Şimdi burada alınması gereken şey sec kısmındaki uzun olan id yi almak ve şu şekilde düzenlemek

gpg --armor --export EF64ED4FF0199111

Size -----BEGIN PGP PUBLIC KEY BLOCK----- ile başlayan ve -----END PGP PUBLIC KEY BLOCK----- ile biten bir dosya döndürmüş olacak başlangıç ve bitiş tagları ile birlikte kopyalayıp github’da ayarlar sekmesinde yer alan GPG keys kısmına gireceksiniz.

Şu şekilde yapabilirsiniz. Sistem anahtarınızı onayladığında ise commit işlemlerinizi artık bu anahtar ile yapabileceksiniz.

Kullanacağınız github reposuna geçiş yapıyorsunuz değişikliklerinizi uyguladıktan sonra normal commit parametrenize -S ekliyorsunuz ve commit işlemini başlatıyorsunuz.

git commit -S -m "mesajınız"

Bu aşamada aşağıdaki gibi bir hata vermesi lazım çünkü anahtarımızı tanıtmadık

gpg: skipped "MertcanGokgoz &lt;>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

Anahtarı bana tanıtmadın ki sen nereye ekleme yapmaya çalışıyorsun birader diyor bize bizde bu aşamayı şu şekilde geçiyoruz.

git config --global user.signingkey EF64ED4FF0199111
git config --global commit.gpgsign true

Artık bu sorunu da çözdüğümüze göre normal bir şekilde commit işlemini gerçekleştirebiliriz. GPG anahtarını oluştururken girmiş olduğunuz şifre ile onaylama işleminizde gerçekleştirerek. Hemen ardından git push komutu ile değişiklikleri sisteme işleyeceğiz.

Gönderdiğiniz her yeni commit mesajında commits kısmında şu şekilde gözükecek.

signedcommit

PostgreSQL Komut ve Kısayolları

PosgreSQL ile uğraşırken kurcaladıklarım ve öğrendiklerim oldu unutmak istemediğimden bende bir referans kartı oluşturmaya karar verdim. Bir kaç projede kullandım pekiştirme fırsatı buldum. Denedim çalışma mantığını gözlemledim güzelliklerini gördüm oldukça hoşuma gitti

Girişimizi yapalım postgres kullanıcısı ile

sudo -u postgres psql postgres

daha sonra postgres=# olarak konsolda görebileceksiniz aşağıdaki komutları çalıştırmanız yeterli

KomutAçıklama
qÇıkış
conninfoveritabanı bağlantı bilgisi
c [veritabani]Veritabanı bağlantısı
d+ [tabloadi]Tablonun tanımı
dt *.*Tüm veritabanındaki tabloları gösterir
lVeritabanlarını listeler
l+Veritabanlarını detaylı listeler
dnŞemalar listelenir
dfFonksiyonlar listelenir
dvİlişkiler listelenir
df+Fonksiyon’un detayları
xÇıktıları güzelleştirir.(önerilir)
dx+Eklentileri listeler
encodingTanımlı olan karakter kodlaması
duKuralları listeler

PostgreSQL Servislerinde yapılabilecekler

sudo service postgresql stop
sudo service postgresql start
sudo service postgresql restart

Yeni kural oluşturma

CREATE ROLE kural1 WITH LOGIN ENCRYPTED PASSWORD 'sifre' CREATEDB;

Sadece kural seti olarak veritabanı oluşturmaya izin verdik diğer kurallar için durum şu şekilde;

CREATE ROLE kural1 WITH LOGIN ENCRYPTED PASSWORD 'sifre1' CREATEDB CREATEROLE REPLICATION SUPERUSER;

Çalıştırma planı

EXPLAIN SELECT * FROM pg_class;

Çalışma zamanı parametreleri

SHOW ALL;

tanımlanan kuralı silme

DROP ROLE kural1;

Veritabanı oluşturma

CREATE DATABASE test_db WITH OWNER kural1 ENCODING 'UTF8';

Yetkilendirme

GRANT ALL PRIVILEGES ON DATABASE test_db TO kural1

Veritabanını silme

DROP DATABASE test_db;

Tablo oluşturmak

CREATE TABLE tablo_adi (
 id serial PRIMARY KEY,
 name varchar(20) UNIQUE NOT NULL,
 dateCreated timestamp DEFAULT current_timestamp
);

Birincil anahtar ekleme

ALTER TABLE tablo_adi ADD PRIMARY KEY (id);

indis oluşturmak

CREATE UNIQUE INDEX indexName ON tableName (columnNames);

ilk 10 kayıt

SELECT satır FROM tablo LIMIT 10;

regexp kullanarak kayıt getirme

SELECT satır FROM tablo WHERE column ~ 'test.*';

sayfalayarak kayıtları getirme

SELECT cols FROM table LIMIT 10 OFFSET 30;

tablodaki tüm kayıtları getir

SELECT * FROM tablo;

yeni kayıt girme

INSERT INTO tablo (satır1,satır2) VALUES (4, 'testveri');

satır güncelleme

UPDATE tablo SET test = 'test2' WHERE id = 4;

kayıt silme

DELETE FROM tablo WHERE id = 4;

Lag replication kontrol

SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::INT;

Devam eden sorguların kontrolü

SELECT datname,usename,client_addr,waiting,query_start FROM pg_stat_activity WHERE query_start < NOW() + INTERVAL '5 seconds';

En büyük boyutlu veritabanı tablosunu bulma

SELECT table_name, pg_relation_size(table_name) FROM information_schema.tables WHERE table_schema = 'public' ORDER BY 2;

Veri bekleyen tüm sorgular

SELECT * FROM pg_stat_activity WHERE waiting='t';

Veritabanı toplam boyutu

SELECT pg_size_pretty(pg_database_size('veritabanı_adı'));

Yazıcılar İçin CSS Düzenlemeleri

Normal şartlar altında css yazmayı sevmem çünkü bir yerini düzeltirken aynı zamanda bir başka yeri bozabiliyorsunuz.Yazıcılar için ise CSS yazmak oldukça zevkli çünkü sadece CTRL + P tuş kombinasyonu ile çalıştırabilirsiniz veya javascript ile tetikleyebileceksiniz.

Çıktısının alınmasını istediğiniz sayfalarınıza aşağıdaki gibi bir css dosyası ekliyoruz.Bunu ayrı tutacağız hem bizim açımızdan işler kolay olacak hemde tarayıcıya yol göstermiş olacağız

<link rel="stylesheet" type="text/css" media="print" href="/assets/css/print.css">

Şimdi belirli standartlara göre düzenlemeler yapmamız gerekiyor yapacağımız bu düzenlemeler akademik makalelerde kullanılan bir şablona göre.Birebir tabi ki de aynı değil çünkü birebir aynısını yaptığımız zaman oldukça fazla sayfa oluşuyor bunun nedeni sayfanın 4 bir yanından içeri 3 cm kadar girinti yapmamız olurdu biz bu şekilde bir düzenleme yapmayacağız.Ama sayfada yazdırırken görüntüsü oldukça hoşunuza gidecek

/*Print.css
Copyleft © Mertcan GÖKGÖZ 2016*/

@media only print {

  @page { size: A4; margin: 1.5cm !important; }

  body {
    width:100% !important;
    margin:0 !important;
    padding:0 !important;
    filter:none !important;
    -ms-filter: none !important;
    border-top: none;
    background: none;
    color: black;
    text-align: justify;
    font-family: Garamond, 'Times New Roman', serif;
    line-height: 1.45;
    font-size: 14pt;
    word-spacing: 1px;
    letter-spacing: 0.2px;
  }

  *,
  *:before,
  *:after,
  *:first-letter,
  *:first-line {
    background: transparent !important;
    color: #000 !important;
    box-shadow: none !important;
    text-shadow: none !important;
    border-bottom: none;
  }

  h1,h2,h3,h4,h5,h6 { page-break-after:avoid; page-break-inside:avoid; }
  h1,h2,h3 { text-transform: capitalize; }
  h1 { font-size:19pt; }
  h2 { font-size:17pt; }
  h3 { font-size:15pt; }
  h4,h5,h6 { font-size:14pt; }

  p, h2, h3 { orphans: 3; widows: 3; }

  .content h1 { text-align: center; }

  .content {
    background: transparent;
    border-left: none;
    width: 100%;
    margin: 0;
    padding: 0;
    color: black;
    float: none !important;
  }

  table { margin: 1px; text-align:left; }
  th { border-bottom: 1px solid #333;  font-weight: bold; }
  td { border-bottom: 1px solid #333; }
  th,td { padding: 4px 10px 4px 0; }
  tfoot { font-style: italic; }
  caption { background: #fff; margin-bottom:2em; text-align:left; }
  thead {display: table-header-group;}
  img,tr {page-break-inside: avoid;}

  pre, blockquote, table { page-break-inside: avoid; }

  pre { padding-left: 0.8cm; color: #FE7FAC !important; white-space: pre-wrap; word-wrap: break-word; }
  code { font: 12pt Courier, monospace; }
  blockquote { margin: 1.2em; padding: 1em;  font-size: 12pt; }

  ul, ol, dl { page-break-before:avoid }

  img { float: left; margin: 1em 1.5em 1.5em 0; max-width: 100% !important; }
  a img { border: none; }
  /* gözükmesini istemediginiz idlerimiz */
  #nav, #sidebar, #paylasim, #related, #disqus_thread{ display: none; }
  /* gözükmesini istemediğiniz classlarımız */
  .sidebar, .disclaimer, .meta, .seo, .pagination, .menuM{ display: none; }

  hr { display: none; }

  a:link, a:visited { background: transparent; font-weight: 700; text-decoration: underline;color:#333; }

  a[href]:after { content: " (" attr(href) ")"; }

  abbr[title]:after { content: " (" attr(title) ")"; }

  .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after { content: ""; }

  aside { display:block; page-break-before: always; }
}

Bu CSS kodlarını sitenize bahsettiğim şekilde eklediğiniz anda yazıcılar için güzel bir düzen elde etmiş olacaksınız.Kodlarda belirtiğim yerleri sayfanızda yazdırılmasını istemediğiniz alanların class ve id lerini ekleyerek düzenleyebilirsiniz.

GitHub LFS Nasıl Kullanılır

Geçtiğimiz günlerde okulda görmüş olduğumuz derslere ait notları ve yapmış olduğumuz ödevleri internete yükledim ve özgürce herkesin kullanabilmesini amaçladım bilenler vardır belki daha öncede FTP üzerinden bu işlemi yapıyordum ancak daha sonradan Github Pages geçmem ile birlikte biraz alan sıkıntısı çektim ve kaldırmak zorunda kaldım hemde toplu bir şekilde indirme işlemi yapılamıyordu çünkü yüklü miktarda trafik harcıyor ve sunucuyu yoruyordu.

Hemen kolları sıvadım ilk olarak Github hesabımdaki yere baktım benim LFS kullanılabilir alanım 1 GB olarak gözüküyordu ücretsiz olarak haliyle yer yetmeyecekti ,elimdeki dosyada 2.2GB olduğu için ve daha sonradan kullanabileceğimi düşündüğüm için hemen kredi kartımı girdim ve 5 dolar karşılığında alanı 50GB çıkarttım.

ardından resmi sitesinden gerekli olan uygulamayı indirdim.

cd /home/mertcan/Downloads/
aria2c -x6 https://github.com/github/git-lfs/releases/download/v1.2.0/git-lfs-linux-amd64-1.2.0.tar.gz
tar -xzvf git-lfs-*

Bu aşamadan sonra kurulum için root olmam gerekiyordu ve hemen panele girip su komutumu verip şifremi girdim. Bu aşamadan sonra sadece dosya içerisinden çıkan install.sh çalıştırmam yeterliydi

./install.sh

kurulum tamamlandıktan sonra test için aşağıdaki adımı uygulayınız yazıyodu o yüzden şu şekilde bir komut verdik

git lfs install

Bu komutun ardından sistemde bize Git LFS initialized. çıktısını vermesi gerekiyor. Eğer bu çıktıyı almışsanız kurulumunuz tamamlanmış demektir. Geriye LFS kullanmamız kalıyor. Bunun içinde ilk önce izlenecek olan dosyaları tanımlamamız gerekiyor repo muza bunun için

git lfs track "*.psd"
git lfs track "*.png"
git lfs track "*.rar"
git lfs track "*.zip"
git lfs track "*.tar"
git lfs track "*.pptx"
git lfs track "*.ppt"
git lfs track "*.doc"
git lfs track "*.jpeg"
git lfs track "*.jpg"
git lfs track "*.docx"
git lfs track "*.txt"

Eklendi diyecek her biri için siz başka uzantıda dosya atacaksanız bunlarıda tanımlamanız gerekiyor. Ardından bunları repomuza gönderelim

git add .gitattributes

Bu işlem githuba kardeş ben şu şu uzantılı dosyaları gönderiyorum sen bunları benim LFS hesabıma koy ki sıkıntı çekmeyelim diyorsun. Geri kalanıda normal Github a ekleme işlemi

git add .
git commit -m "Note"
git push -u origin master

Dosya boyutunuza göre yükleme işlemi baya bir zamanınızı alacaktır. Özellikle Türkiye gibi bir ülkede upload hızımızın düşük olduğunu da düşünürsek şimdiden kolay gelsin.Ayrıca yüklediğim dosyaları sonradan nasıl görürüm diyorsanız onunda kolayı var

git lfs ls-files

Whatsapp Tüm Resimleri İndirme

Whatsapp Web çıktı çıkalı resimleri telefon dışında indirmek pek mümkün değil sırf insanlara zorluk çıksın diye sanki bilgisayara indirmeyi buton ile yapmışlar ve otomatik olarak hepsini ne indirebiliyorsunuz nede gösteriyor.

Ancak yapabileceğiniz ufak bir yöntem ile bundan kurtulmak mümkün tek yapmanız gereken aşağıdaki kodu kullanmak ve konuşma içerisindeki tüm resimleri indirmek

var img_dom = document.getElementsByClassName('image-thumb-body');
var links = [];

for (var i = 0; i< img_dom.length;i++){
 links.push(img_dom[i].src);
}


function downloadAll(urls) {
  var link = document.createElement('a');

  link.setAttribute('download', null);
  link.style.display = 'none';

  document.body.appendChild(link);

  for (var i = 0; i < urls.length; i++) {
    link.setAttribute('href', urls[i]);
    link.click();
  }

  document.body.removeChild(link);
}
downloadAll(links);

Bu kodu direk olarak F12 aracılığı ile geliştirici kısmında çalıştırıyorsunuz ve o konuşma içerisindeki tüm resimler otomatik olarak tarayıcınızda önceden belirttiğiniz bölüme iniyor.

Otomatik MySQL Veritabanı Optimizasyonu

MySQL nadirende olsa sıkıntı çıkartabiliyor bunu çözmek adına ise yapabileceğimiz bir kaç işlem var günlük yada haftalık olarak veritabanında bulunan tabloları kontrol edebilir ve daha sonrasında tamamen onarabilir yada optimize edebiliriz.

ilk olarak bir kullanıcı oluşturuyoruz yetkileri diğerlerinden farklı olacak

create user 'optimise'@'localhost';
grant select,insert,reload on *.* to 'optimise'@'localhost';
flush privileges;
exit

Oluşturduğumuz bu kullanıcı ile gereken işlemimizi yapıyoruz herhangi bir kuruluma gerek yok MySQL içerisinde hali hazırda bulunan uygulamayı kullanacağız

    mysqlcheck -u optimise --optimize --all-databases

Sonrasında tüm veritabanınız otomatik olarak denetlenecek ve onarılacak komut satırından hangi veritabanlarında düzenleme yaptığını görebilirsiniz.

Komut Satırı ile MySQL Kullanıcı Oluşturma

Web Serveri kurduğunuzu varsayıyorum ve veritabanınıza kullanıcı eklemeniz gerekiyor. Panel yada herhangi bir arayüz kullanmadığınızı düşünelim mysql veritabanında kullanıcı oluşturmanız oldukça zor geliyor olabilir. Zor bir yanı yok aşağıdaki komutları uygulayarak kolaylıkla veritabanınıza kullanıcı ataması yapabilirsiniz.

MySQL root olarak giriş yapalım

mysql-u root -p

Aşağıdaki komutları oluşturacağınız kullanıcıya düzenleyebilirsiniz.

create database database_name;
CREATE USER 'database_user'@'localhost' IDENTIFIED BY 'database_password';
GRANT ALL PRIVILEGES ON * . * TO 'database_user'@'localhost';
FLUSH PRIVILEGES;
exit

Javascript’de For ile Tablo Oluşturma

Javascript for döngüsünü kullanarak satır ve sütun sayısı belirli olan herhangi bir tabloyu yapabilirsiniz.Kod yazarken size kolaylık sağlayacaktır. içerisine gerekenleri ekleterek zamandan ve koddan tasarruf edebilirsiniz.Programa kaç satır ve kaç sutun olacağını belirtmeniz yeterli.

<script>
    var a = parseInt(prompt("Kaç Satır Olacak?"));
    var b = parseInt(prompt("Kaç Sutun Olacak?"));
    document.write("<table border='1'>");
    for (var i = 1; i <= a; i++) {
        document.write("<tr>");
        for (var j = 1; j <= b; j++) {
            document.write("<td>" + i + ". * " + j + ". </td>");
        }
        document.write("</tr>");
    }
    document.write("</table>");
</script>

Javascript ile Toplama ve Ortalama Bulma

Javascript dilinde basit algoritmaları gerçekleştirmek oldukça kolaydır.Pek çok dilde olduğu gibi javascriptdede yazacağız artık standartlaşmaya başladı diyebiliriz.Kullanıcıdan sayıları alabilmek adına prompt komutunu kullanacağız for döngüsü ile yaklaşık kaç adet sayı gireceğini kullanıcının belirlemesini istiyorum.Örnek kodumuz ise aşağıdaki gibidir.

<script>
    var sum = 0;
    var count_for = parseInt(prompt("Kaç Tane Sayı Toplanacak"));
    for (var i = 1; i <= count_for; i++) {
        var number = prompt(i + ".Sayi");
        document.write(i + ".number = " + number + "<br />");
        sum = sum + parseInt(number);
    }
    avg = parseInt(sum) / count_for;

    document.write("<br />Sum : " + sum);
    document.write("<br />Avg : " + avg);
</script>

PHP ile Cross-Origin Etkinleştirme

CDN yada uzak dizinden dosya kullandıran sitelerdeki en büyük sorun tarayıcıların uzak dizin hatası vermesidir. CDN tarafında tuttuğunuz dosyaları kullanıcılara bu hata yüzünden gösterilmez tarayıcı güvensiz gibi görüp kaynağa ulaşmaz bunu çözmek için ise ya Nginx kurallarına ekleme yapmanız gerekir.

Çoğu zaman bu ekleme bile yeterli gelmez yada çalışmaz header bilgisine tanımladığınız uzak dizin kullanımı tanımı geçmez bu gibi durumlarda PHP kullanarak istenilen domain adreslerinden uzak dizini kabul ettirebiliriz.

<?php
/**
 * Created by PhpStorm.
 * User: mertcan
 * Date: 28.11.2015
 * Time: 22:38
 */

// allowed origins
$allowedOrigins = array(
    '(http(s)://)?(www\.)?my\-domain\.com',
    '(http(s)://)?(www\.)?my\-domain\.com',
    '(http(s)://)?(www\.)?my\-domain\.com'
);

if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] != '') {
    foreach ($allowedOrigins as $allowedOrigin) {
        if (preg_match('#' . $allowedOrigin . '#', $_SERVER['HTTP_ORIGIN'])) {
            header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
            header('Access-Control-Allow-Methods: GET, PUT, POST, OPTIONS, DELETE');
            header('Access-Control-Max-Age: 1728000');
            header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
            break;
        }
    }
}

PHP sayesinde header bilgisine belirttiğiniz originsleri ekleyebilirsiniz birden çok domain tanımlaması yapabilirsiniz. Kullanıcılarınız içeriklerinizi sıkıntısız bir şekilde görebilirler