Steem Guess Test Yayınında!

6 Aylık sürecin sonunda Steem Guess nihayet test yayınında!

Block zincirine yazma ve okuma, SSL, eş zamanlı çalışma, steem connect tokenları, çerezler, jquery atraksiyonları, mantıksal sınamalar ve elbetteki css/photoshop eksenli tasarımlar.. nihayetinde hepsi birleşip SteemGuess.com oldu.

Yarın bir başkası da benzer yollardan geçmek isterse diye; zaman zaman bahsi geçen konulardan bazılarını akışımda/sitemde misafir etmemin sebebi de buydu aslında. Tek tek bakınca bir birinden kopuk ögeler gibi dursa da bu tür bir işe niyet eden birisi için yoldaki ışıklı taşlardan olabilir.


görsel

Bu süreçte; finalde ortaya çıkmasını istediğimiz işin güzelliği umudu ve 24 saatlik zamanı öylece T=T0(1-v2/c2) formülünü yazıp bükemediğimiz için yazı ve yorumlarımın sayısında bir takım düşmeler olduğunu kabul ediyorum.

Fakat şükür ki bu kayıplara karşılık, Steem Guess için public beta aşamasına gelebildik.


 

Steem Guess Ne ki?

Yeğenim Rıdvan ile birlikte geliştirdiğimiz,
Bitcoin fiyatını tahmin yarışması.

Ama kuru kuruya değil; kazanan, kaybedenlerden tatlısını alır modunda 

Sistem –UTC saatine göre- her 4 saat saatte bir otomatik turnuva düzenliyor. Bitcoin fiyatını tahmin etmek isteyen herkes, seçtiği zaman(lar)a ait tahminlerini girerek tura katılıyor.
İlgili saat geldiğinde, en yakın tahminde bulunan kişi turu kazanıyor.

Her tahmin Steem Block Zincirine yazılıyor. Kazananı belirlemek için de yine Block Zincirinden okuma yapılıyor. Yani SteemGuess’e ait merkezi bir veri tabanı yok.

Bitcoin fiyatı ise bağımsız ve halka açık başka bir kaynak olan BitFinex üzerinden alınıyor.


 

görsel


Notlar:

— 8511.44 tahmini, beta süreci boyunca sadece görsel (html) olarak orada. Herhangi bir tura katılımı yok.

— Örnek:
Saat 16:00 için
Azra’nın tahmini 12500.50
Esra’nın tahmini 13222.44
Berk’in tahmini 14567.89
Jane’in tahmini 12345.67
Nuri’nin tahmini 12990.00
Heri’nin tahmini 14200.14

Bu kişiler, *En geç* saat 15:00’e kadar bu tahminlerini yazıp tura katılabilirler.
Saat 16:00 olduğunda sistem BitFinex’teki Bitcoin fiyatını okur ve diyelim ki fiyat 13220.15 olmuş.

Bu durumda sistem 2 SBD ile turnuvaya katılan Esra’ya 10.20 SBD ‘lik ödülünü gönderir. (2 x 6 x 0.85 //evet %15 SteemGuess’e kalıyor)

— Aklımızdaki turnuvaya katılım bedeli 2 SBD ancak şu anda tr içinde biz bize 😉 test ederken 0.20 SBD

— Şimdiden geçmişe doğru cüzdanda görebileceğiniz isimler qbdp, sgtest, ayhan, murat, ünver(ler).. ve işlemlerin hepsi, işleyişi test için.

— Beta süreci ve sonrasında da elbette manuel kontrollerimiz de olacak

— Evet, Popup ortalama, buton kenarı yuvarlama, font büyüklüğü ve benzeri ufak tefek yapılacak şeyler var

— Şimdiden rekabetçi ve eğlenceli başka kullanım modellerimiz de mevcut ancak önce hali hazırdaki durumun pişmesi daha sağlıklı geliyor.

— “En iyi eforu sarf etme” sözü vererek, varsa kritik öneme sahip eleştirilere açığız.

— Sistem gayet sade ama yine de tutorial ve video açıklamalar da gelecek.

— “Hemen yapalım” sözü vermemekle birlikte, her türlü öneriye açığız.


kapak görseli
Genel olarak ne dersiniz? Sizce nasıl olmuş?
İngilizce tanıtımlar sonrası global Steemit topluğunda makul bir dönüş alır mı?

 

İnsan Zekası Ne Kadar Zeki?

Size bazı resimler göstermek istiyorum..

Her bir resme bir kaç saniye bakın ve hakkında yorum yapın.. sonra diğer resim, sonra diğeri..

 

        

neler düşündünüz?

saçları güzelmiş, güzel gülüyor
İngiliz bir babaanne herhalde
bu kumral belki Türkiye’de olabilir, konferans salonu gibi bi yerde galiba
Japon ya da Koreli kesin, beyaz tene pembe ruj iyi durmuş da, başındaki ne
bizim komşunun çocuğuna benziyor, tipi yaramaz duruyor
sarı saç mavi göz, Almanya bebesidir bu, mızıldamasa bari
tam Tahsin amca, ağır görünüşünün altında muziplik gizli
Alabama’lı kızlar neşeli oluyor galiba..

buna benzer ya da tamamen alakası başka şeyler..

Peki bunların herhangi birisinin İnsan olmadığına dair aklınızdan bir şey geçti mi?

O zaman soru gelsin.. tekrar yukarı çıkın ve hangisi gerçek insan değil bakın..

Hangisi?

İngiliz teyze mi? Koreli Arkadaş mı? Yoksa Tahsin amca mı?

-Hiçbirisi!

Hiç biri gerçek insan değil.

İnanamayanlar için Nvidia’nın yayınlamış olduğu videoya bakalım:

 

Videoyu izlerken bile insan beyni gördüklerinin gerçek insanlar olduğunu iddia edebilir ne var ki hepsi Yapay Zeka’nın üretmiş olduğu insanlar.

Bir şeyin, hatta kendisi gibi bir canlının gerçek olup olmadığını anlayamayan zekaya zeki denir mi?

Burada Yapay Zeka Algoritmasının yaptığı şey; Evet, çok gerçekçi görüntüler üretmek ama bunu yaparken arka planda gerçekleşen bir fiil daha var: İnsan Zeka’sının ipliği pazara çıkıyor.

EN zeki olmakla övünen insan oğlu, bas baya kandırılıyor. İtiraf etmek gerekirse buna hayli seviyorum zira; Kendini EN tepeye ve dahi Evrenin EN Merkezine koyma Ukalalığı için afilli bir tokat yemiş oluyor.


Bilgisayarlar onlarca yıldır var, nasıl oldu da bu kadar gerçekçi sonuçlar görebiliyoruz.

Bu konu özelinde olay, parlak bir kaç fikrin hayat bulması sonrası ortaya çıkmış durumda.

Makina öğrenmesinde, Denetimli öğrenmenin yanında “Denetimsiz Öğrenme”nin de eklenmiş olması
artı
İki yapay zekanın bir birlerini test ederek, kendilerini eğitmeleri

Teknik adıyla Generative Adversarial Networks (GANs) / Rekabetçi-Çekişmeli Üretici Ağlar

Kısaca, AliAI bir veri setindeki verileri kullanıp yeni bir şey ortaya çıkarıyor. ZeynepAI ise AliAI’nin ürettiğini verilerle kıyaslayıp AliAI’ye bir puan veriyor. AliAI aldığı puana bakıp yeniden üretim yapıyor. ZeynepAI yeniden puan veriyor.. bu arada AliAI de ZeynepAI’nin yaptığı puanlama için puan veriyor.. bu şekilde süre giden bir döngü içinde takılıyorlar 🙂

Ve nihayetinde öyle yeni bir ürün ortaya çıkıyor ki, gerçekleri kadar gerçekçi..

devam edecek..

 


görsel

ileri okuma:  Çekişmeli Üretici Ağlar Üzerine

Dijital Ay Çiçeği #3 Dön Bebeğim

Tarkan’ın Mavi Ceketli olduğu zamanlar vardı.. Efendi, uslu, musikişinas bir topluluğun seveceği Türk Sanat Müziği söylediği zamanlar..

Sonra parladıkça parladı..

Dön Bebeğim parçası önceki ve sonraki iki dönem arasında bir yerlere tekabül ediyor sanırım. Zira klipten anlıyoruz ki, artık çekimler yurt dışında yapılıyor, Mavi ceket hala var ama bir yandan da muzırlıklar başlamış..

 


 

Klipteki müzik kutusu balerini nasıl dönüyorsa bizim de elimizdeki güneş panelini döndürmemiz lazım 😉

Birinci yazında hazırlık yapmış, ikinci yazıda da cihaza elektrik geldiğinde ilk defa -ve bir defa- çalışacak olan Setup() fonksiyonumuzu yazmıştık.

Toplu ve sadeleşmiş hayliyle şöyle:

Burada, sadelik açısından kodların sadece tek ekseni kapsadığını hatırlatmak isterim. Güneşi doğudan batıya takip etmek elbetteki güzel. Ancak İDEAL bir sistem için yeterli değil. Panel, doğu-batı ekseninde dönerken aynı zamanda panelin yüzeyini yukarıya ve aşağıya bakacak şekilde de hareket ettirmemiz lazım.

Öğlen vakti sadece güney dönmüş bir paneldense, güneye ve yüzeyi yukarı bakan bir panel çok daha verimli olacaktır. Bu yüzden ideal bir sistemde aşağıdaki xMotor.attach(6); // Tek motor için
xMotor.write(aci); 
 kısımlarından birer tane daha olmalı 😉


#include
Servo xMotor;
const byte ldrSag=A1;
const byte ldrSol=A3;
byte aci=90;
int gunesSag, gunesSol;
void setup() { Serial.begin(9600);
// servo için PWM pinleri 3-5-6-9-10-11 olabilir
xMotor.attach(6); // Tek motor için
xMotor.write(aci);
}

 


Güneş (dünya) sürekli hareket halinde olduğuna göre, bizim de sürekli güneşin yerini bulmamız gerekiyor.

Bu yüzden iki ayrı koldaki IŞIK Şiddeti değerlerini karşılaştıracağız ve Sonsuz bir döngü içinde olacak.

 

Şimdii..
Diyelimdeki Sağ taraftaki ışık soldakinden fazla.

Motorun Sağa dönmesi lazım değil mi.. //ki Ay çiçeği olsun 😉

O zaman şöyle bir şeyler yazalım:

if (gunesSag > gunesSol) {
gunesSag = analogRead(ldrSag); gunesSol = analogRead(ldrSol);
Serial.print("sag"); Serial.print(gunesSag);
Serial.print(" Sol"); Serial.println(gunesSol);
aci = aci + 1;
xMotor.write(aci); delay(100);
}

Görüleceği üzere
güneşSağ>güneşSol İSE,
AÇI değerimizi bir arttırıyor ve Motor’a bu açıyı gönderiyoruz.

Motor o esnada atıyorum 27 derecelik konumda ise 28 dereceye dönüyor.

–E ama 1 dereceden ne olacak ki? 

Evet. İşte bu yüzden Loop() içinde, yani;
100 mili saniye sonra diğer IF‘e geçecek, ( delay(100) )
ve kabaca yarım saniye içinde Işık değerlerini yeniden okuyacak ve gerekiyorsa 1 derece daha dönecek.


Pek tabi iki taraftaki ışık değeri eşit ise, güneşi bulduk demektir. Dilerseniz burada bir süre (10 saniye 10 dakika..)  bekleyebilirsiniz.

1 dakika beklesin / dakika da bir kontrol edip o zaman dönsün derseniz; delay(1000*60) 
5 dakikada bir kontrol etsin derseniz;  delay(1000*60*5) kullanabilirsiniz 😉

 


Görsel

 

Dijital Ay Çiçeği: Güneşe Dik

Bkz 1. Bölüm:  Dijital Ay Çiçeği #1 // 8000$ Değerinde post


Önceki bölümde, olayın genel mantığından bahsetmiş ve kodlarda kullanacağımız değişkenleri tanımlamıştık.

Ardından, sadece ilk seferinde çalışacak olan setup kodlarımızı yazmıştık.

Son duruma toplu halde bakalım:

#include
Servo xMotor;
const byte ldrSag=A1;
const byte ldrSol=A3;
byte aci=90;
int gunesSag, gunesSol;
void setup() { Serial.begin(9600);
// servo için PWM pinleri 3-5-6-9-10-11 olabilir
xMotor.attach(6); // Tek motor için
xMotor.write(aci);
}

Burada void Setup içinde, Serial.begin ile seri portu ekranda görme işlemini başlatmış oluyoruz.

Isim.attach(6) ile de 2. satırdaki xMotor adıyla oluşturduğumuz Servo nesnesine PİN numarasını bildiriyoruz.

Yani fiziksel olarak Servo Motor’u bağlayacak olduğumuz pin 6 nolu dijital pin. 6 yerine yukarıda PWM olarak belirtilen diğer pinler de olabilir.

İşin icraat kısmında ise İLK eylem olarak yaptığımız şey, Servo Motor’a SIFIR açısına gitmesini söylemek:

Ancak görüleceği üzere xMotor.write(0) yazmak yerine xMotor.write(aci) yazdık.. Neden?
Çünkü ilk bölümdeki tanımlamalar kısmında aci=0 değerini vermiştik.

x, y, aci ve benzeri değişken kullanmak bize “aci+15” örneğinde,
60+15 gibi sabit bir sonuç vermek yerine “daima mevcut açının 15 fazlası” şeklinde esneklik sunacak.


:)) ünlü düşürler


Sürekli dönecek olacak loop() fonksiyonumuzu yazalım:

Temel amacımız: Güneşe Dik olmak.

O halde şöyle bir kurgu yapabiliriz;
Bir elim pencereye bir elim odanın içine doğru olacak şekilde iki kolumu açsam.. Camdan taraftaki elime daha çok ışık düşecektir. Kollarımı bozmadan yüzümü pencereye doğru dönsem.. iki elimi birleştiren eksen, pencerenin olduğu duvar ile paralel konuma geldiğinde.. İki elime düşen ışık miktarı eşit olacaktır.

O halde, güneşe dik olmak demek, İki elime de düşen ışık miktarının eşit olması demek.

Peki ışık miktarını nasıl ölçeceğiz?

LDR: Işığa duyarlı direnç ile.

Aslında en temelde ilköğretim gördüğümüz Direnç ölçümü yapacağız. Sadece elimizdeki direnç, üzeri renkli çizgilerle kaplı olan direnç olmayacak da, üzerine düşen ışığa göre direnç (ohm) değeri değişen bir direnç olacak.

Hani karanlıkta yanan küçük gece lambalarının yanmasını sağlayan minik şey.


roboturka

Teoriden pratiğe gelirsek; Güneş panelimizin ön yüzünde, karşılıklı iki ayrı kenara birer tane LDR koyacağız.

Bunlara düşen ışık miktarını okuyacağız ve bunların eşit olmasını sağlamak için Servo Motor’un dönmesini (paneli döndürmesini) tetikleyeceğiz 😉


Görsel

Dijital Ay Çiçeği #1 // 8000$ Değerinde post :)

İtiraf: Güneş takip sistemini tarif etmek için Digital Ay Çiçeği tabiri çok hoşuma gidiyor. Yazının kapak resmi olması için bununla ilgili bir şeyler ararken, karşıma görseldeki Robotic Sunflower Umbrella diye bir şey çıktı. Ve değeri 8000$ mış. Ben de başlığa bunu ilave ettim 

Biz güneş panellerini daha verimli kullanmak için, güneşi takip ettireceğiz. Onlar da güneşi takip ettirmiş ancak şemsiye yön vermek amacıyla. Bu da çok güzel fikirmiş! Alkışlıyorum.

Malumunuz Dünya, Güneşin etrafında dönerken “mükemmel çember” yerine Elips bir yörüngede dolanıyor.


wikipedia 0

Ve bu yüzden küçükken kışların; dünyanın güneşe uzak olduğu zamanlar,
yazların ise dünyanın güneşe yakın olduğu zamanlar gerçekleştiğini sanırdım.

Yukarıda görselde de görüleceği üzere: Asıl etkili mesele bu değil. En uzak olduğundaki aylardan biri Temmuz, en yakın olduğu tarih ise 3 Ocak.

— Ee? O zaman -40°C ile +40°C gibi 80 dereceye varan farklar nasıl oluşuyor?

— AÇI.

Güneş’in açısı ne kadar DİK AÇI ile gelirse o kadar sıcak oluyor.

Özetle;
27 derecelik açı, 5 milyon kilometre mesafeden daha etkili.

[Bu arada “dünya güneşe 10 cm daha uzak/yakın olsa, hayat olmazdı” sözünün ne kadar Hurafe olduğu aşikar.]

Bu durumda, öylesine güneye bakan güneş panelleri yerine, gün içinde güneşle birlikte hareket ederek daima dik açıyı yakalamaya çalışmak, yazla kış farkı kadar önemli.

Let’s do it

NŞA’da paneller çift eksende hareket etmeli. Ama karışık olmaması için tek motorla gidelim..

Burada sadece xMotor kullanacağız.

Benzer şekilde daha iyi anlaşılması için aşağı yukarı eksenlerini şimdilik pas geçeceğiz ama mantığın aynı olduğunu sanırım söylememe gerek yok. Sağdan sola doğru dönen, elimize alıp motoru çevirdiğimizi düşünün. Bu kez de yukarıdan aşağıya yahut çapraz dönecektir.

Sadeleşmiş halleri şöyle;

#include <Servo.h>
Servo xMotor;
const byte ldrSag=A1;
const byte ldrSol=A3;

#include Servo.h kısmı, Servo motorun sürücüsünü içeri çağırdığımız kısım.

ldrSag, Güneş Panelimizin sağ tarafına yerleştireceğimiz Işık Sönsörü (LDR) ‘yi bağlayacağımız Analog Pin

ldrSol da diğer taraftaki için.

Şimdi de panelin Dönüş Açısı ve bunu hesaplamak için kullanacağımız değişken tanımlarını ilave edelim.

Ok.
Cihazımıza ilk elektrik geldiğinde BİR sefer çalışacak olacak, Setup() fonksiyonumuzu yazalım.

Sade bir kullanım isteyenler dikey-yatay eksen kodlarını kullanmayabilir. Yani sadece tek eksen için şunlar yeterli:

void setup() { Serial.begin(9600);
// servo için PWM pinleri 3-5-6-9-10-11 olabilir
xMotor.attach(6); // Tek motor için
xMotor.write(aci);
}

Burada dikkat edilmesi gereken bir nüans var: Servo motorun bağlanacağı pinler, PWM özelliğine sahip pinler olmalı. Kullandığınız karta göre göre bu değişebilir. Bizim örneğimizde yukarıda açıklama kısmında geçen pinler kullanılabildiği için bunlardan bi tanesini (6 nolu pini) seçtik.

Hazırlıklarımız hazır.

Devam eden yazıda,
Ay Çiçeği mantığının nasıl işlediğini buna benzer bir algoritmayı bizim nasıl kurgulayabileceğimize bakacağız ve bakmakla kalmayıp panelimizi ay çiçeği gibi güneşe döndürecek kodlarımızı da yazacağız.

 

NodeJS’de Pixel Pixel Resim Oluşturma

Bilen biliyor ki NodeJS ısınılası bir bir şey değil. “Şifre yanlış olunca sayfayı yenilemeden, inputbox’a renk vermek ne demek, Javascript ile web sayfası üzerinde koşan oyun yapıyorum, websoket üzerinden Coin borsaları arasında Asenkron arbitraj yaptırttırıyorum” diyecek birisi için güzel olabilir. Ama ortalama bir sunucu için Python ve Flask/Boiler/Django gibi sade ve işlevsel aksiyonlar varken node biraz maliyetli bir araç.

Hem Callback de bi nevi Senkrona zorlama değil mi sonuçta.
Netflix yapıyorsan, aynı ada 100’lerce kişi makinana bağlanıyor ve her biri uzun işlem öbekleri çalıştırıyorsa eyvallah, çok güzel. Ama orta halli ihtiyaçlar için callback cehennemlerinde beyin yakmanın alemi yok 

Node için hislerimi bi kez daha anlattığıma göre devam edebiliriz 😉

Geçen gün etasarim hocamla yorumlaşırken bir site geçmişti: Coolors.co

Çok tatlı ve güzel bir site. Klasik renk paletleri yerine Hue, Saturation ya da tek tıkla ana rengi kaybetmeden tonlarını veriyor olması da hayli kullanışlı.

 

Sitede hayli vakit geçirince, ister istemez üzerinde çalıştığım işe de bir şeyler sirayet etti 🙂

Şöyle Coolors.co tasında, öndeki her bir Rakamın değerine göre Otomatik Arka Plan Resmi oluştursak?

OMG! Çok güzel olabilir! Ama yine bir hafta+ daha atabilir :/S

Ne demişler;

Önemli olan, delin aklına taşı getirmek 🙂

Her bir Pixel’i kontrol edebileceğim bir şeyler lazımdı. Bolca ve bolca npm paketleri baktım.. Çoğunu denedim ve çoğu daha read.me sayfasındaki kodlarda bile hata verdi. Bazıları fazla lüx, bazıları da komplike geldi. Her şey göz önünde,  sade ve kullanışlı bir şey arayışıma en yakın cevabı pngjs-image kütüphanesi verdi.

Node ve nmp kurulu olduğunu varsayarsak,

npm install pngjs-image --save 
yazarak paketi indiriyoruz.

Ve başlayalım

Open’a aslında gerek yok ama biraz fantazi yapıp, resim oluştuğunda hemen bunu göstermesi için bunu da indirelim ve çağıralım.

npm install open --save 

İşin mantığında gelince, çok tatlı bir şekilde şöyle yazıyoruz:

Resmin X olarak 1. ve Y olarak 1. koordinatındaki Pixel’i
şu renk RGB(118,182,77)  yap.

Data Array’lar, Rowlar, satır sonu kontrolleri.. olmadan gayet anlaşılır ve kullanışlı.

Elimde şöyle noktalar var:

∙ ∙ ∙ ∙ ∙ ∙ ∙ ∙

Bunların her birinin yerini ve rengini söylersek istediğimiz resmi pixel pixel oluşturabiliriz 😉

∙ ∙ ∙   ∙ ∙ ∙

       

∙ ∙ ∙   ∙ ∙ ∙ 

Her pixelin (daha doğrusu pixel gurubunun) Rengini de  bahsi geçen Rakam’lara göre ayarladık mı tamamdır, hedefe gidebiliriz 😉

Mesela yukarıdaki gibi Kahve – Su yeşili – Mavi kombini yapmak istiyorsak; pixelleri şöyle ayarlayabiliriz:

Kahve Kahve Kahve Su yeşili Su yeşili Su yeşili Su yeşili  Mavi Mavi Mavi
Kahve Kahve Kahve Su yeşili Su yeşili Su yeşili Su yeşili  Mavi Mavi Mavi
Kahve Kahve Kahve Su yeşili Su yeşili Su yeşili Su yeşili  Mavi Mavi Mavi
Kahve Kahve Kahve Su yeşili Su yeşili Su yeşili Su yeşili  Mavi Mavi Mavi

yani X koordinarlarından yan yana 3-4 tane Kahve, ardından 4-5 tane Su yeşili ve 3-4 Mavi

image.setAt(1, 1, { red:214, green:189, blue:167, alpha:1000 });
image.setAt(2, 1, { red:214, green:189, blue:167, alpha:1000 });
image.setAt(3, 1, { red:214, green:189, blue:167, alpha:1000 });
image.setAt(4, 1, { red:214, green:189, blue:167, alpha:1000 });

sonra 4 defa Su Yeşili  yani: rgb(211,255,244)
image.setAt(5, 1, { red:214, green:189, blue:167, alpha:1000 });
image.setAt(6, 1, { red:211, green:255, blue:244 , alpha:1000 });
image.setAt(7, 1, { red:211, green:255, blue:244 , alpha:1000 });
image.setAt(8, 1, { red:211, green:255, blue:244 , alpha:1000 });

Dikkat:  X koordinatı 5,6,7,8 olurken Y koordinatı hala 1
yani incecik yatay bir çizgi çiziyoruz.

sonra bu yatay çizgilerden 100 tane alt alta koyarsak 100 pixel yüksekliğinde bir resim elde etmiş olacağız 😉

600×600’lük bir resimde 360.000 pixel olduğunu sanırım söylememe gerek yok ve elbette tek tek elle yazmak yerine hayalimizdeki resme göre Döngüler oluşturabilir, içine otomatik artan X değerini ve Y değerini koyabiliriz.

Benim ilk denemelerim şöyle oldu 


Görsel

openSSL echo hatası verirse

SSL’in Open SSL olabiliyor olması windows kullanıcıları açısından pek de iyi olmamış. Zira çoğu durum ya da çoğu program windowsa göre değil Linux’e göre düzenlenmiş ve anlatılmış.

Böyle bir durumda Arama-Bulma Kabiliyeti diye bir şey varsa,
(-ki bence var; ve aranacak terimleri değil, çıkacak sayfada cevap için geçmesi beklenen olası terimleri gogıllamakla gelişen bir kabileyet. tabi yanında zaman aralığı, site: title: eksi- vb.. araçlarla kombin yapmak da buna dahil-)

bu kabileyeti hakkını vererek kullanmak gerekiyor.


Önceki yazılar: HttpS openSSL NodeJS Windows, SSL Sertifikacı Sertaç’a Güven(dir)mek, Görsel


İkinci yazıdaki pek çok şey olduktan sonra ya da ilk bazı da ilk adımlar gerçeleşip sonrakiler gerçekleşmediğinde

subjectAltName = @alt_names

[alt_names]

ile ilgili sorun yaşıyor olabilirsiniz.

Ve genelde konsoldan openSSL komutları verirlen “echo” hatasıyla birlikte kendini gösterebilir.

Bu durumda komut satırına yazılacak komutları da çok uzatmayacak şekilde v3.ext dosyası oluşturmak belki çözüm olabilir.

Bi text editörü açıp içine şunları yazın ve v3.ext adıyla kayıt edin.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost

Ardından cmd konsolda şunları yazıp enterlayın;

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config cat server.csr.cnf

 

Sıra geldi az localhost için yukarıda kayıt etmiş olduğumuz v3.ext dosyasını belirerej server.crt dosyasını oluşturmaya. Bunun için yine konsolda şu kodları yazalım:

server.crtopenssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Önceki adımlarda girdiğimiz şifreyi istedikten sonra .crt dosyamız hazır olacak.
yani localhostumuza özel sertifika dosyamız.


Yey!.

Dosyamız var tamam da, webden istek gelen portları dinleyen programımıza da bunu söyleyelim ki,
kullanıcının tarayıcısına bunu bildirsin, karşılıklı doğrulama yapılsın ve Yeşil Kilit simgesi çıksın 😉

// Tabi bu genel mantık olarak, güvenli bir şeyler yapmaya çalıştığımız için küçük de olsa bazı nüsanslarda hata çıkması gayet olası.

var fs = require('fs')
var https = require('https')
var express = require('express')
var cOptions = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt')
}
var app = express()
var server = https.createServer(cOptions, app).listen(443)

Bu örnekteki sunucu programımız NodeJS. O yüzden app.js ya da root için hangi ismi kullanıyorsanız o dosyaya yukarıdaki kodları eklediğinizde -ve her şey yolunda gittiyse-;

http://locolhost adresine girdiğinizde hem Kilit hem de SSL sertfikanız görünüyor olacak 😉

Mail’den taşan Name Server

Şu adrese gir: http://98.137.246.8
ve
şuna http://216.58.212.3
ve
şuna da http://185.122.201.130

NŞA‘da sitelere bu şekilde girmemiz gerekiyor
Herkesin telefonunu akılda tutmak gibi zor

Bu yüzden
google.com gibi akılda kalıcı bir şey yazsam da o yine
http://216.58.212.3 adresine gitse..
ya da
raspberrypi.org yazınca http://93.93.130.214 adresine gitse..

Güzel.
Ama zilyon tane site adı ve adresi var.
hangi isime hangi ip karşılık geliyor
bunun bir listesi olması lazım.
İşte bu isim/domain yazınca ip adresini söyleme işi “name servis etme” işi oluyor.

 

 

raspberrypi.org yazıp enterlayınca
önce benim bilgisayarıma soruyoruz. raspberrypi’in adresi ne?
o bilmiyorsa, “pc’nin bağlı olduğu yerel ağa/routera” sor diyor.
yerel ağ router kendisi bilmiyorsa, “TurkTelekom/SuperOnline”a sor diyor
Telekom’a soruyoruz, o da bilmiyorsa ROOT isim sunuculara sor diyor.
Root isim sunucular .com .uk .tr gibi top levellerine göre
second level sunuculara yönlendiriyor. onlara soruyoruz.
diyor ki NS1.GuzelHosting.com ‘a sor
GuzelHosting soruyoruz. “raspberrypi.org’un ip adresi ne?”
“haçan ben biliyrim onu” diyor.  “93.93.130.214 adresine git.”

tabi bunlar ping saniyeleri içinde olup bitiyor.
93.93.130.214 artık bağlanacağımız makina.

Bu IP, çok çoğu zaman Hosting şirketindeki, sitenin bulunduğu makinanın IP adresi.
nadir durumlarda benim şu an üzerinde yazıp çizdiğimiz laptop’un ip adresi de olabilir 😉

====================
ben olsam şu ana kadar anlatılanları kağıda/telefona çizerdim..
üşenme, “şimdi” çiz yani 😉
====================

 

 

 

 

 

 

 

buradan sonrasını çizdikten sonra devam et.

 

 

 

 

 

 

Atıyorum a2hosting.com yüzlerce makinasından birisini ya da çoğu zaman birisinin 50’de birini bana kiralıyor. index.html dosyalarım, sitedeki resimler o makinanın harddiskinde duruyor.


farkında olduğumuz ama şöyle söyleyince daha afiLLi duran olay:
dünya üzerinde -paylaşıma açık olan- tek tek her bir resmin ulaşılabilir bir adresi var (sen çok yaşa Tim Berners Lee). Ve kaç nolu makinanın içinde olduğunu bilmesem de adresini bildiğimde ona ulaşabiliyorum.

DNS – DomainNameServer’lar; raspberrypi.org için ns1.a2hosting.com ‘a sorun dediğinde
ns1.a2hosting.com makinası (ya da  yedeği olan n2..) raspberrypi.org a karşılık gelen ip’yi
kullanıcıya gönderiyor.
kullanıcı artık diğerlerine uğramadan direk 93.93.130.214 ile iletişim kuruyor.

Diğer taraftan
Sen de kendi kendi bilgisayarının ip adresini kolayca 93.93.130.214 yapabilirsin.
http://bit.ly/ipgirme

Böylece ben adres satırına raspberrypi.org yazdığımda direk senin bilgisayara bağlanmış olurum.
localhost gibi bir site sunuyorsan, onu görürüm.

hatta 93.93.130.214:5000 ile 5000. porttan, Arduio ile ölçütüğün, sıcaklık ya da nabız
bilgilerini yayınlıyorsan;
evinin sıcaklığını ve kalbinin atışını görürüm 😉
//çok romantik oldu 🙂

Bi dakka!
Elektrik gider gelir ve/ya modem resetlenirse?
-Telekom/Superonline’dan Sabit IP hizmeti almadı isen-
Evet IP adresin değişir.

Ama DNS sunucuların yeni IP adresini bilmesi lazım. (ki doğru yönlendirme yapsın)

Bu durumda No-IP, DNYU, afraid.org gibi servislere kayıt olup olabilirsin. Verdikleri programı yüklediğinde, IP adresin değiştiğinde program, hemen bunu adana merkeze 🙂 bildiriyor. Onlarda raspberrypi.org  93.93.130.214’te demek yerine yeni IP adresin olan  182.92.236.130 ‘u söylüyorlar.

Dolayısı ile domain adresinin NameServer bilgilerine buralardan alacağın
n1.no-ip.com , n2.dnyu.com gibi..
name-serverları girersen, onlar da pc’de kurulu olan programlarından öğrendikleri senin güncel ip
adresine yönlendirecekler.

TaTa!
Kendi sunucun hazır 😉


Blog yazısı gibi olmadı biliyorum. Zira sevdiğim birisinin sorusuna cevap emaili yazarken, yazı gelişince nette de bulunsun istedim 😉
Görsel

SSL Sertifikacı Sertaç’a Güven(dir)mek

Çocukluğu ya da gençliği, klasik telefonların doğasını merak etme zamanına denk gelenlerin bileceği üzere; Telefon sesi, maraton başlama düdüğü gibidir. Bu yüzden telefon çaldığında herkes depara çıkardı 🙂 Kısa bir süre sonra -hat ile telefon’un başka şeyler olduğu anlaşıldığında- telefon çeşitleri ve renkleri çoğaldı. Evin diğer odalarında 2. telefonlar belirmeye başladı. Ve şöyle, grup diyalogları türedi:
#Alo
+Alo, -Alo
#Selam ben Rıza
-Selam Rıza abi, ne var ne yok? +Rıza dayı selam nasılsın?
-Fulya sen kapat kızım baktım ben +Tamam anne, dayıcım görüşürüz
#Fulya’cım görüşürüz, iyi bak kendine

Bu evdeki ikinci telefon misali, dışarıdan birilerinin telgraf hatlarına dahil olduğunu düşünün. Ve.. Hacker’lığın icadı. Evet, yakın tarihteki ilk Hacker’ların işi telgraf ardından telefon hacklemekmiş.


görsel


 

Yukarıdaki konuşmaya dışarıdan birinin katılmasını istemediğimiz gibi, Bankamızın ya da Borsamızın web sitesine girerken de üçüncü kişilerin aradaki diyaloğu görmesini istemeyiz. Hatta bunun öncesinde, bankamızın adresi  diye girdiğiniz yerin Gerçekten bankamızın sitesi olduğundan emin olmak isteriz.

Haliyle tarayıcıdaki adresin httpS ile başladığını görüp, iletişimin şifreli olarak gidip geldiğini,
Sertifika alıp almadığına göre de, gerçek banka ile temasta olup olmadığımızı kontrol etmemiz gerekir.


Peki, bu tür güvenli olması istenilen siteyi, siz yapıyorsanız?
Doğal olarak, ilgili kodlarınız/kütüphaneleriniz, TEST ve Geliştirme esnasında bile güvenli bağlantı gerektiriyorsa?

o halde önceki yazıdan devam edelim.

Son durumda elimizde şunlar vardı:

Test ortamımızı oluşturmak için bir nevi şunu yapacağız. RapidSSL, GeoTrust ya da Comodo gibi şirketlerin yanına biz de “Sertifikacı Sertaç Ltd.” yi kurmuşuz da biz de sertifika veriyor gibi bir sertifika üreteceğiz. Ve pc’ye/tarayıcıya, Sertaç’ın sertifikasına güven diyeceğiz.

Bunun için rootSSL.pem doyasını yönetim konsoluna tanıtacağız.

Adımlarımız şöyle;

başlat > mmc > enter

Konsol ekranı açılacak

 

Dosya > Ek bileşen ekle kaldır >

Listeden Sertifikalar > Ekle

Bilgisayar hesabı > ileri >

Yerel bilgisayar > Son

Bu işlemin ardından Sağ bölmedeki Konsol Kökü listesi altına
Sertifikalar (YerelBilgisayar)
gelmiş olmalı. Öyle iste Tamam’a tıklayalım.

Solda sadece +Sertifikalar (Yerel Bilgisayar) yazıyorsa, başındaki artı + işaretine basarak genişletelim.
Ardından Güvenilir Yayımcılar > sağ tık > Tüm görevler > Al..

Sihirbaz(?) başlayacak..
dosyamızın yerini göstermemiz lazım.

Dikkat! Gözat.. a tıkladığımızda, varsayılan olarak gelen türler .cer ve .crt bu yüzden önce Tüm Dosyalar’ı seçelim

Ve projemizin olduğu klasöre gidip, rootSSL.pem dosyasını seçelim.

Tamam/Aç’a tıklayıp, ardından İleri >

Tüm Sertifikaları aşağıdaki depolama alanına yerleştir:
Güvenilir Yayımcılar
İleri >

 

Son

~”Sertifika Alma Başarılı” mesajını görmemiz lazım.
Öyle ise, ne mutlu 😉 Sonraki yazıda görüşüz..
Değilse.. Start pain! pardon, start again 🙂

HttpS openSSL NodeJS Windows

Çok sevdiğiniz bir arkadaşınız var diyelim. Onu görmek için bir şeyleri bahane edip şehirler arası ya da ülkeler arası  yolculuklar yapabilirsiniz. Hatta hafta içi bir günde Çatalca’dan Pendik’e gitmeyi bile göze alabilirsiniz o derece.

Lakin arkadaşınızın ailesi çok ters kafa insanlar. “Keşke.. ” caps’lerine kapacak olacak cinsten.

Yeğenimle çok keyifli bir şeyler için uğraşıyoruz. Fakat uğraştığımız şey caps’lik aile birlikte paket olarak geliyor: Malesef NodeJS gerektiriyor.

“Ne var canım bunda, internet diye bir şey var. Öğrenmeyi bilen herkes biraz gayretle yeni bir programla dili de öğrenir Japonca da öğrenir..” denilebilir. Evet öyle ama öğrenmeye çalıştığınız dil de kelimeler ve cümleler farklı olsa tamam ama ya zaman algısı farklı ise..

tomorrow demekle now demek aynı kapıya çıkıyorsa?

Zaman kavramı karışınca  işlerin nasıl karıştığına bi örnek daha vereyim;

Soğanlar pembeleştikten SONRA, içinden 100’den GERİYE doğru say sıfıra GELİNCE, ÖNCE tarhanayı koy SONRA 2 bardak su ilave et.

Şimdi yeniden sorayım; tomorrow demekle now demek aynı kapıya çıkıyorsa, Tarhana çorbasını Nasıl yaparsınız?


Çoğu Normal dilde 26. adımdaki işlem, 26. adımda gerçekleşirken NodeJS’de bu yok. O yüzden sıralı bir şeylere ihtiyacınız varsa -ki %98 böyle- sürekli iç-içe-iç-içe-iç-içe-iç-içe fonksiyonlar kullanmalısınız.

Böyle bir ortamda iken bir de SSL+HttpS+NodeJS üçlüsünün çalışması için gibi bir internetteki kaynakların %90’nın Linux’a göre anlatım yaptığını sizin de Windows sunucuda çalıştığınızı düşünün..

 

 


Notlar:

–NodeJS indir kur

–Windows için -32/64bite göre-,  “openssl windows 32bit” tarzı aramalar yaparak openSSL’in güncel versiyonunu indir.

–Kurulum olduğu klasörde C:\OpenSSL-Win32\ bulunan dosyalar arasında \bin\ klasörü içinde
openssl.cfg ya da openssl.cnf dosyası bulunduğundan emin ol. Yoksa başka kaynaklardan yeniden indir.

–OpenSSL’in yer konum altından çalışabilmesi için, Ortam değişkenlerine PATH ekle.
Bilgisayarım > sağtık > özellikler > gelişmiş > Ortam değişkenleri > Sistem değişkenleri > Path > Düzenle
Satır sonuna ;C:\OpenSSL-Win32\  ekle.

–ilgili proje klasörüne Shift+Sağtık > Komut penceresini burada aç, diyerek konsolu aç

–RootSSL.key oluşturmak için şunu yaz
openssl genrsa -des3 -out rootSSL.key 2048

Sonrasında şifre soracak, iki defa şifre gir.

bu işlemin sonunda ilgili klasörde rootSSL.key dosyası oluşmuş olacak.

Bunun içinde az önce üretmiş olduğumuz Özel Anahtar bulunuyor olacak.

 

–Şimdi bu özel anahtarı kullanarak rootSSL.pem dosyası üretelim.

openssl req -x509 -new -nodes -key rootSSL.key -sha256 -days 1024 -out rootSSL.pem

ve pem dosyamız oluuşş..a madı.

–Konsolda şunu yazıp bulamadığı dosyanın yerini tarif edelim:
SET OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg

Sessizce ve tepkisizce çalışmış olmalı.

–Bir üstteki .pem üretme kodumuzu yeniden deneyelim:

–Common Name kısmında server/domain adı yerine localhost girilebilir.

Böylece klasörümüzde şu dosyalar mevcut olacak.

 

Macera ne yazık ki buradaki tıkır tıkır işlemeyebilir. Zira netteki hiç bir tutorial bana uymadı. Olayın mantığını kavrayıp; ne lazım ve bunun için nerede ne yapılması gerekiyor buna göre işlemleri yapmak en sağlıklısı.

–devam edecek–
görsel

AHMT: Kombi() fonksiyonu upgrade

Yürüyen İnternet yazısı ile uçuşa geçip 🙂 HTTP benzeri ya da ötesi kendi protokollerimizi yapabileceğimizden bahsetmiştik.

Yeniden AHMT’e dönelim. Hareket algılayıcı taraf ile direk kombiyi kontrol edecek tarafın, Radyo sinyalleriyle Kablosuz haberleşmesi için AHMT’e nRF2401L ilave etmiştik.


Bkz: #1, #2, #3#4#5#6#7#8#9#10#11#12#13#14, yürüyen internetgörseller


 

Kütüphane kısımını düzenledik ama Fonksiyonları da buna göre düzenlememiz lazım ki bir bütün olarak sistemimiz sağlıklı bir şekilde çalışabilsin.. // madem öyle ilgili kısımlara bütün olarak bakalım..

Let we do

Tanımlama kısmında şu kodları ekleyelim:

#include
#include
RH_NRF24 nrf24;

void setup(){ içine } şunları ekleyelim:

while (!Serial); // Leonardo için
if (!nrf24.init())
Serial.println("kurulum hatasi");
// Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
if (!nrf24.setChannel(1))
Serial.println("radyoKanali hatasi");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("nRFhiz hatasi");

Kombi fonksiyonumuzu şu şekilde yeniden düzenleyelim:

void kombi ( byte alt, byte ust ) { /* alt ve üst sıcaklık değerlerini kullanıyoruz */
byte dereceDeger = derece();
if ( dereceDeger < alt ) { yanson(2); Serial.print("kombi Yandi: "); uint8_t data[] = "AC"; Serial.print( "AC" ); nrf24.send ( data, sizeof( data ) ); nrf24.waitPacketSent(); /* Radyo sinyali olarak gonderelim */ /* digitalWrite (role, LOW); */ } else if ( dereceDeger >= ust ) {
Serial.print( "kombi Sondu: ");
uint8_t data[] = "KAPA"; Serial.print( "KAPA" );
nrf24.send( data, sizeof ( data ) );
nrf24.waitPacketSent();
/* digitalWrite ( role, HIGH ); */
}
else {
yanson(30);
Serial.print( "-kombi else-" ); /* digitalWrite ( role, LOW) ; */
}
}

 


kombi() fonksiyonu içindeki digitalWrite ( role, LOW ) ve digitalWrite ( role, HIGH ) kısmı, inceleyen gözle bakan birisi için ters gelmiş olmalı.

Gelmediyse de açıklama yapayım 🙂
Zira bu basit terslik yüzünden başka bir projede bir kaç gün kaybetmiştik.

Aslında orta okulda öğrenmiştik..

“Hojcaam bu gerçek hayatta ne işimize yarayacak kii” sesleri eşleğinde öğretmenler şunu hemen hepimize anlatmıştı:
Bunun gibi __/ __  bir devre açık demek.. ama bu aynı zamanda elektrik geçmediği için lamba kapalı demek. Lambayı açmak için devreyi kapatmamız lazım.

Dolayısıyla, Role’ye LOW gönderiyoruz.
yani içindeki mıknatıs-devre düzeneğini kapatacak,
veyani üzerinden elektrik geçmeye başlayacak,
veyani röleye bağlı olan kombi çalışmaya başlayacak 😉

HIGH durumu için de tersi elbette..

Yürüyen İnternet

Hareketi/sıcaklığı/zamanı algılayıp bunlara göre kombiyi yönetebilmesi için AHMT‘i,  Hareketin bulunduğu mekana koyalım demiştik. Ve bu durumda Balkondaki kombi ile iletişim sorunu çıkmıştı.

Biz de asırlık  bir teknolojiyi, Radyo frekanslarını kullanarak çözüme gitmiş. AHMT’e bir de radyo frekans modülü (nRF2401L) eklemiştik. [Ya Evde Yoksan? + Radyo’dan Haberleşme]

Fakat o da ne modülün kütüphane kodlarında garip bir şey vardı..

Görsel1 Görsel2

Saniyede 2 Megabit’lik bir hızdan bahsediyor.

nRF modülü için teorik olarak 500 metre – 1000 metre gibi rakamlar söz konusu olsa da; şehir içi evler ve yollar gibi gerçek hayat ortamlarında bizzat test ettiğimizde, açık alanda 200 metre civarında, arada en fazla bir duvar olmak şartıyla ev içi ortamlarda az bir kayıpla haberleşebiliyor.

Bu mesafe Bluetooth’un 10-15 katı, Wifi modemlerin 2-3 katı bir uzaklık demek. Üstelik hız da; -şimdilerde vatandaşlık maaşı deneyleri yapan- Finlandiya’nın, daha önce Geniş Bant İnterneti İnsan Haklarına Dahil Edip ardından tüm vatandaşlarına ücretsiz olarak sunduğu 1 Mbit hızın iki katı.

Diyorum ki;
Yürüyen uçak yapabiliriz 

Kendi Kablosuz İnternet Protokollerimizi bile geliştirebiliriz.

E hadi standart demeyelim ama kendi özel iletişim sistemlerimizi kurabiliriz pek ala. “Uçuyorsun..” diyeceklere şöyle yanıt vermek isterim:  Düne kadar (1992) ASCII  varken, Bob ve Ken kafa kafaya verip UTF-8’i çıkardılarsa, yeni bir tanesi daha neden olmasın?

Atıyorum;
Daha önce geçtiği üzere bazı kelimeler daha çok kullanılıyor. [Steemit’te En Çok Kullanılan Kelimeler]

Çok basit 3-5 analiz ile Türkçe’de en sık kullanılan kelimeleri bulmak pek ala mümkün. Kaldı ki UTF8’in sunduğu  2,097,152 karakter sayısı hacmine, Türkçe’deki 616.767 kelime+deyimin 3.4 katı sığdırılabilir. (ekler ve tanınmayan heceler için öyle zemberek vari kelime yorumlama işlemlerine hiç girmeden basit formüller bulunabilir)

Yani?

İki saniye şuraya bi bakalım:
https://onlineutf8tools.com/convert-utf8-to-binary

“yağmur yağacak” yazabilmek için 32 byte harcadım.
bize hayli yetecek şekilde her kelimeyi 4 byte ile kodlamış olsak, 8 byte ile aynı iletişimi kurabiliriz. Yani şöyle:

y = 0111101
yerine
yağmur = 0111101

Abartırsak, bu sistem, web sitesi tarzı 4000X adet sunucu sayısının, 1000X adete düşmesi demek aynı zamanda text bazlı internetin 4 kat hızlanması demek.

Hatta yukarıdaki kelime öbeğindeki gibi sık kullanılan kelimeler ilk 1-2 byte içine oturacak şekilde ayarlanırsa çok daha optimize bir sistem ortaya çıkabilir.

Dünya Kabul Edecek mi?

AHMT’in Kombi haberleşmesi için Radyo frekans 1/0-AÇ/KAPA gönderebiliyorsak,
0111101 gönderince, arkadaşımın cihazının ekranına y yazdırmak yerine yağmur yazdırmak çok mümkün. Anteni biraz güçlendirince, toplasan 3-4-5 hava alanı kadar yer kaplayan Uşak’ta bizim işimizi hayli hayli görür..

Dünya kendi bilir