Backend etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Backend etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

30 Haziran 2021 Çarşamba

Fazla .net core runtime ve sdk'lerini uninstall etmek

 Sık sık ihtiyacım olduğundan derli toplu burada bulundurmak istediğim tutorial'ım :) 

Eski .net core sdk ve runtime versiyonlarını zaman zaman temizlemek gerekebiliyor. Bu işlem için yardımcı bir paket çıkarmışlar. İsmi dotnet-core-uninstall . Vaat edici bir isim :) Bunu linkteki yönlendirmelere göre yükledim.

Ben genelde tüm major sürümlerin en sonuncusunu tutup gerisini silme yolunu seçiyorum. Bu nedenle önce yüklü olan tüm versiyonları listelemek için 

dotnet --info

komutunu çalıştırdım. Bu bana uzun bir liste verdi. Major versiyonlardan 2.1.x, 2.2.x, 3.1.x, 5.0.x pek çok versiyona sahiptim. Tüm versiyonların en sonuncuları dışındaki hepsini temizlemek için dotnet-core-uninstall paketinin --all-but diye bir komutu var. Bunu kullanmaya karar verdim. Bu sayede "şu şu versiyonlar kalsın gerisini yak" diyebilecektim. Ama gemileri yakmadan önce hangi gemileri yakacağımdan emin olmak için şu komutu çalıştırdım. 

./dotnet-core-uninstall dry-run --all-but 5.0.7 3.1.16 2.2.8 2.1.23 --runtime

Bu komut çıktı olarak hangi runtime versiyonlarını kaldıracağını gösteriyor. Bana şöyle çılgın bir liste verdi. Pislik içindeymiş her yer resmen. 


Baktım benim kaldırmak istemediklerim listede yok o halde kaldırabilirim. Bu işlemi yapabilmek için yetkili bir abiye benzememiz gerekiyor o halde şu komutu yapıştırabiliriz;

sudo ./dotnet-core-uninstall remove --all-but 5.0.7 3.1.16 2.2.8 2.1.23 --runtime

Emin misin? Bak son kararın mı? Parola? gibi doğrulamaları geçtikten sonra tertemiz bir runtime paket depom olmuş olduu... 

Sıra geldi sdk'lere. Çok benzer olduğu için direkt kodları yapıştırıyorum. İlk olarak hangi sdk'lerin kalkacağından emin oluruz;

./dotnet-core-uninstall whatif --all-but 5.0.301 3.1.410 2.2.207 2.1.808 --sdk

Doğrudur. O halde sdk'lerimizle de vedalaşırız; 

sudo ./dotnet-core-uninstall remove --all-but 5.0.301 3.1.410 2.2.207 2.1.808 --sdk

Artık sadece major'larımız var. 

6 Nisan 2019 Cumartesi

Firebase Cloud Functions Parsing error



Geliştirdiğim mobil uygulamanın kendine ait bir API'ı yok şuanda maalesef, başka bir uygulamanın API'ını kullanıyorum. Kendi API'ım da olacak inş ancak o zamana kadar versiyon güncellemelerini kontrol edebileceğim ufak, şirin bir metod'a ihtiyacım vardı.

Ne yapsam diye düşünürken çok yakın zamanda şirket içi eğitimde öğrendiğimiz azure'un serverless'inin function'larını kullanabilirim diye düşündüm. Sonra hali hazırda Firebase kullandığım için Firebase'in functions'ını inceledim ve direkt oraya yazayım diye karar verdim.. :)

Az yazdım, uz yazdım, dere tepe bir türlü odaklanamayarak ve uzun uzun yazdım ama sonunda bitti ve deploy aşamasına gelebildiiim :) 

Ama derin bir nefes alarak firebase deploy --only functions komutumu çalıştırdığımda başından beri yakamda olan mono lanetini yine başımda buldum. Şöyle bir hata vermekteydi;

firebase deploy --only functions

=== Deploying to 'my-api'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /Users/monolara/Desktop/git/MyAPI/functions
> eslint .


/Users/monolara/Desktop/git/MyAPI/functions/index.js
  16:36  error  Parsing error: Unexpected token =>

✖ 1 problem (1 error, 0 warnings)

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! functions@ lint: `eslint .`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the functions@ lint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/monolara/.npm/_logs/2019-04-06T13_28_06_446Z-debug.log

Error: functions predeploy error: Command terminated with non-zero exit code1

Having trouble? Try firebase deploy --help

Kızdığı şey async metodlarımdı. Ama nasıl olurdu, quickstart örneklerinde dahi async yazmışlardı ve "localimde çalışıyor"du.

Araştırdım. Ve sorunun firebase-functions'ın benim için oluşturduğu default projede ecmaVersion'ın 6 olarak geldiğini ve bu versiyonda async metodların olmadığını öğrendim. Kısaca çözüm;

.eslintrc.json dosyamızdaki ecmaVersion değerini 2017 ile değiştirmekte. Yani şöyle;
"parserOptions": { // Required for certain syntax usages "ecmaVersion": 2017 },

Bir de package.json dosyamıza şunu da eklemek gerek;
"engines": { "node": "8" },

Bir mono lanetini daha böyle aşıp güzel güzel deployumuzu yaptık. Darısı diğer lanetlere :)

19 Şubat 2018 Pazartesi

node.js ile bir de kik bot yazayım


Botları deneyimlemeye devam ederken kik bot'la devam edeyim dedim. Ben bi messenger, bi  telegram bilirdim öncesinde meğer ne channel'lar varmış :) hepsini deneyeceğimmm. En azından papağan seviyesinde denmek istiyorum hepsini projemiz için.

Bunda bot oluşturmak ve çalıştırmak workplace'deki kadar karışık olmadı. Hikaye kısmı bittiğine göree..

Öncelikle dev.kik.com adresine gittim. Log in olmaya çalıştığımda benden yuvarlak bir qr kod taramamı istedi.  Telefonuma kik uygulamasını indirip kodu taradım. Kik'ten Botsworth diye bir bot arkadaş hemen welcome dedi ve email adresimi istedi verify etmek için. bota email adresimi yazdım ve mail geldi. Böylece verify olmuş oldum.

Ardından benden username belirlememi istedi. Çok sinirlendim çünkü benim kullandığım, kullanacağım, kullanma ihtimalim olan tüm isimler mi unavailable olur arkadaş. Biz bile böyleysek gelecek nesilleri düşünemiyorum nasıl nickname, username sahibi olacaklar?.. Guid guid gezerler muhtemelen..

(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ Naber babun?)


Neyse 5000. yaratıcı denememde bir isim bulabildim şükür. user'ımdan sonra bot oluşturma aşamasına da geçtim. Aynı sorunu burada da yaşadım ama olmayacak bir isim bulup yoluma devam etmeyi seçtim.

Sonrasında dev.kik.com'a log in olduğunda şöyle sade bir ekran karşımıza çıkıyor.



Buradaki API Key ve 5000 sefer deneyerek oluşturduğumuz username'e ihtiyacımız var.

Bot oluşturma işlemimiz tamam olduğuna göre arkasını doldurma vakti.

Her zaman yaptığımız gibi, botumuz için klasör yaratıp termalden bu klasörün içine girip

npm init 

diyoruz ve project.json dosyamızı doldurmaya başlıyoruz. 

 Şimdi VS Code'dan klasörümüzü açıp app.js dosyamızı oluşturup kodlamaya başlayalım.

Öncelikle kik'in eşyasını ve kullanacağımız diğer component'leri kuralım.

npm install @kikinteractive/kik
npm install dotenv
npm install http

require('dotenv').config({
    path: 'settings.env'
});

let Bot = require('@kikinteractive/kik');
let http = require('http');

let bot = new Bot({
    username: process.env.KIK_BOT_USERNAME,
    apiKey: process.env.KIK_API_TOKEN,
    baseUrl: process.env.BOT_HOST
});

bot.updateBotConfiguration();

bot.onTextMessage((message) => {
    var replies = [message,"Hi dear..", "Let's start to learn.."];
    bot.send(replies, message.from, message.chatId);
});

let server = http.createServer(bot.incoming()).listen(process.env.PORT || 3978);

En basit anlamıyla bir papağan botu yapmak işte bu kadar kolay. 

Tabi projemizin ngrok'la tünelleme işlemini unutmuyoruz. 

ngrok http -region=eu -subdomain=kik-bot 3978

Ve bu adresi .env doyamıza ekliyoruz. 

.env dosyamızı da buraya eklersek;


Bu kadar basit, artık papağan botumuz hazır. Bunun üzerine koya koya gidebiliriz.

Gittim :)


24 Ocak 2018 Çarşamba

node.js ile de workplace botu yazayım


Hey ho,, mono in da haus

Son birkaç aydır botlarla haşır neşirlik sonucu kendime bir bot özeti, how-to'su çıkarmak ve bu özeti paylaşmak niyetiyle sayfama uğramış bulunmaktayım :)

(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ Bunun muhabbeti de hiç çekilmiyor. )

:D Konuya geçeyim.. 

Daha önce .net core'la yapmıştım ama şimdi node.js'le yaptım. Çünkü node.js de canmış. :)

Yine bir workplace botunu örnekleyeceğim.

Önce botumuzu barındıracak bir klasör oluşturup terminal'de bu klasöre giriyoruz.

npm init
 komutunu çalıştırıp istenilen bilgileri mümkün olduğunca dolduruyoruz. Bu bilgiler project.json dosyamızı oluşturuyor.

Sonrasında klasörümüzü Visual Studio Code gibi bir editörle açıp içine app.js dosyamızı ekliyoruz. Bu dosyada kodlamaya başlayabiliriz.

Ardından botbuilder paketimizi eklemek için yine terminal'de şu komutu çalıştırıyoruz;

npm install --save botbuilder

Bir dee şu paketi yükleyelim;

npm install --save restify

Şuan .net core'da yaptığımız papağan botundan yapmaya başlamak için hazırız :) Hadi yapalım.

Şöyle bir repo'muz var. Buradaki Node örnekleri gayet yeterli başlangıç için;
https://github.com/Microsoft/BotBuilder

Buradaki hello-ChatConnector örneğini alalım;

var restify = require('restify');
var builder = require('botbuilder');

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url);
});
 
// Bot Storage: Here we register the state storage for your bot.
// Default store: volatile in-memory store - Only for prototyping!
// We provide adapters for Azure Table, CosmosDb, SQL Azure, or you can implement your own!
// For samples and documentation, see: https://github.com/Microsoft/BotBuilder-Azure
var inMemoryStorage = new builder.MemoryBotStorage();

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});

// Listen for messages from users
server.post('/api/messages', connector.listen());

// Create your bot with a function to receive messages from the user
var bot = new builder.UniversalBot(connector, function (session) {
    session.send("🐦 %s", session.message.text);}).set('storage', inMemoryStorage); // Register in memory storage


Şuan aslında kod olarak hazırız. Ama bu kadarla bitmiyor. Şimdi bu botumuzu yayınlama vakti.

Öncelikle Workplace'e  botumuzu Custom Integrations'dan ekleyelim.



Create Custom Integration butonuna tıklayıp botumuzun adını ve açıklamasını girelim.



Bot oluştuktan sonra bize vermiş olduğu App Id, App Secret ve özellikle tek sefer oluşturduktan sonra kaybetmemeniz gereken Access Token bilgilerinizi güvenli bir yere kaydedelim.

Sonrasında webhook'u ayarlamak için Azure'a uğramamız gerekecek evlerden ıraak :S :D

Adresimiz portal.azure.com
Buraya azure hesabımızla giriş yapalım.

Şöyle bir Dashboard gelecek önümüze;



Öncelikle Azure'dan bir "bot channel registration" oluşturalım.



Şimdi Bot Service oluşturma ekranımız gelecek. Buradaki messaging endpoint' çalışan bir endpoint vermemiz gerekiyor. O halde çözüm neydii? Tabii ki ngrok. :)

Şu komutu çalıştıralım;

ngrok http -region=eu -subdomain=zengindomaini 3978

Artık botumuz https://zengindomaini.eu.ngrok.io adresinde geçici olarak da olsa yayında.
Şöyle görelim vs code ekranımızı. Buradaki terminalde çalışmak da pratik oluyor;

Yeniden Azure'a dönebiliriz.

Messaging endpoint'teki adres şu;
https://zengindomaini.eu.ngrok.io/api/messages

çünkü mesajları kodumuzdan da görebileceğimiz gibi şuradan dinliyoruz;

// Listen for messages from users
server.post('/api/messages', connector.listen());




 Create butonuna bastıktan sonra bot servisimiz oluşmuş olmalı.

Hayırlı olsuun artık Azure'da da bir appid'miz ve appsecret'ımız var. Peki nerede? :D Ben şahsen çok zorlanmıştım bulmak için.. Ama bu sırrı sizinle de paylaşacağım.

Azure sol menüdeki Resource Groups'dan Deployments'a, oradan da ilgili deployment'a tıklayıp bilgilerini görebiliyorsunuz.



Bulduk ama bunlarla ne yapacağız? Kodumuzdaki şu kısım vardı ya, oraya işte bunların yerleri orası. Eğer bunları yazmazsanız debugda mesaj gönderme yerine düşer ama hata bot cevap vermez. Eğer tecrübesizseniz bir saat nedenini sorgulayabilirsiniz. Tecrübe konuşuyor :P

var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID, //APPID
    appPassword: process.env.MICROSOFT_APP_PASSWORD //APPSECRET
});

Eğer bu bilgileri environment olarak ayrı bir dosyadan okumak istiyorsanız

npm install --save dotenv

paketini yükleyip projenize .env uzantılı bir dosya oluşturup bu bilgileri buraya yazıp buradan okutabilirsiniz. Hatta 2 adet .env oluşturup live ve test key'lerini ayrı ayrı tutabilirsiniz.

Ben bunu vs code'un launch.json dosyasına aşağıdaki env ayarını nakşederek yaptım. İşte şöyle;

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "${workspaceRoot}/src/app.js",
            "cwd": "${workspaceRoot}/src",
            "env" : {
                "NODE_ENV": "dev"
            }
        }
    ]
}


Sonra da bunu şöyle kullandım;

if ("dev" === process.env.NODE_ENV) {
    console.log("You are using development environments.");
    require('dotenv').config({
        path: 'settings_test.env'
    });
} else {
    console.log("You are using live environments.");
    console.log("[If you want to use dev environments. Please set environment variable 'export NODE_ENV=dev']")
    require('dotenv').config({
        path: process.env.BOT_ENV_FILE
    });
}


Son işimiz ise webhook'u ayarlayıp workplace'deki bot integration'a bu webhook adresini eklemek. Eğer isterseniz bu işlemi de Azure üzerinden, Resource Groups -> MonoBot -> Channels üzerinden channel ekleyerek yapabilirsiniz. Bunun için Channel seçimi yaptıktan sonra sizden istenen bilgileri doldurup bu bilgilerin altındaki webhook ve key bilgilerini workplace'deki yerine yapıştırmak.


Şuandan itibaren botumuz bize papağanlık yapabilir.

Referans aldığım linkler;

Bot info;
https://docs.microsoft.com/tr-tr/bot-framework/nodejs/bot-builder-nodejs-quickstart

https://github.com/Microsoft/BotBuilder

Kullanılan komponentlerin platforma göre ön izlemesini yapabileceğimiz yer;
https://docs.botframework.com/en-us/channel-inspector/channels/Facebook?f=Carousel&e=example1

Yalnız ne uzun oldu bu yazı yaaa :S :S

(Burada bir karikatür vardı ama telif yerim diye kaldırdım. Herkese dava açıyorlarmış karikatür paylaşılıyor diye. Karikatürün doğasına hiç uymuyor bence bu tavır :-/ Pişman mısın? Pişmanım gideyim mi?)