Kategori: Yazılım

  • Expo iOS “Connection Offline” Hatası ve Çözümü

    Expo iOS “Connection Offline” Hatası ve Çözümü

    React Native ile uygulama geliştirirken genelde testlerimi Android emülatör veya fiziksel bir Android cihaz üzerinde yapıyorum. Geçtiğimiz günlerde projeyi iOS (iPhone) üzerinde test etmek istediğimde Android tarafında sorunsuz çalışan uygulamanın iOS tarafında açılmadığını fark ettim.

    Karşılaştığım hata ekranı tam olarak şuydu:

    “There was a problem running the requested app.”

    Unknown error: The Internet connection appears to be offline.

    exp://192.168.1.101:8081

    Sorunun Tespiti

    İlk başta sorunun internet bağlantısından veya sunucudan kaynaklandığını düşündüm. Ancak modem arayüzünü ve bilgisayarı kontrol ettiğimde internette bir kesinti yoktu. Daha da ilginci, aynı saniyede Android cihazımdan projeyi açtığımda (QR kodu okuttuğumda) uygulama sorunsuz çalışıyordu ve sunucuya erişebiliyordu.

    Sorun kodda değildi, sunucuda değildi. Sorun spesifik olarak iPhone’un, bilgisayarımdaki yerel sunucuyu (localhost:8081) görememesiydi.

    Biraz araştırma yaptığımda sorunun Apple’ın iOS 14 ve sonrası sürümlerle getirdiği gizlilik özelliklerinden kaynaklandığını anladım. iOS, uygulamaların kullanıcının izni olmadan yerel ağdaki (Local Network) diğer cihazları taramasını ve bağlanmasını engelliyor.

    Çözüm: Yerel Ağ İznini Açmak

    Bu sorunu çözmek için bilgisayar tarafında veya kod tarafında bir değişiklik yapmanıza gerek yok. Çözüm tamamen iPhone ayarlarında bitiyor.

    Takip etmeniz gereken adımlar:

    1. iPhone’unuzda Ayarlar (Settings) menüsüne girin.
    2. Uygulama listesinde aşağılara inerek Expo Go uygulamasını bulun.
    3. Ayarlar içerisinde “Yerel Ağ” (Local Network) seçeneğinin kapalı olduğunu göreceksiniz.
    4. Bu seçeneği aktif hale getirin.

    Bu ayarı açtıktan sonra Expo Go uygulamasını arka plandan tamamen kapatıp tekrar açın. Projenizin QR kodunu tekrar okuttuğunuzda hata almadan uygulamanın yüklendiğini göreceksiniz.

    Alternatif Çözüm (Tünel Bağlantısı)

    Eğer yukarıdaki yöntem işe yaramazsa veya kurumsal bir ağdaysanız (okul, ofis vb. kısıtlamalar varsa), Expo’nun trafiği yerel ağ yerine internet üzerinden dolaştırmasını sağlayabilirsiniz.

    Bunun için projeyi başlatırken şu komutu kullanmanız yeterli:

    Bash

    npx expo start --tunnel
    

    Bu komut yerel ağ sorunlarını bypass eder ancak bağlantı hızı yerel ağa göre biraz daha yavaş olabilir. Benim tavsiyem ilk yöntemi uygulamanızdır.

    Umarım faydalı olur, iyi çalışmalar.

  • DevFest 2025 Gaziantep: Yapay Zeka Çağında Yazılımcı Olmak

    DevFest 2025 Gaziantep: Yapay Zeka Çağında Yazılımcı Olmak

    Bugün GDG Gaziantep’in düzenlediği DevFest 2025 etkinliğindeydim. Üç farklı konuşmacıdan dinlediklerim ve sorduğum sorulardan çıkardığım notları sizlerle paylaşmak istedim. Özellikle yapay zeka çağında yazılımcı olarak kendimizi nasıl konumlandırmalıyız, hangi teknolojileri tercih etmeliyiz ve günlük işlerimizi nasıl daha verimli hale getirebiliriz gibi sorulara yanıt aradım.

    AI Öncesi ve Sonrası: Uğur Umutluoğlu’ndan Çıkarımlar

    Uğur Umutluoğlu’nun sunumunda en dikkat çekici kısım, yapay zekanın junior seviyesindeki işleri başarıyla yapabildiği gerçeğiydi. Sunumunda paylaştığı “AI Öncesi ve Sonrası” tablosu durumu çok net özetliyordu.

    Yapay zeka günümüzde CRUD işlemleri, basit MVP projeleri gibi temel seviye görevleri oldukça başarılı bir şekilde gerçekleştirebiliyor. Bu da junior geliştiricilerin geleneksel olarak yaptığı işlere denk geliyor. Ancak burada önemli bir nokta var: Junior’ların kendilerini farklılaştırması gerekiyor.

    Tabloda gösterdiği “Geliştirme İşlerinde Junior Etki Alanları” başlıklı bölüm çok önemliydi. Yapay zekanın henüz başaramadığı, junior geliştiricilerin öğrenmesi gereken kritik alanları gösteriyordu. Maalesef telefon kamerasıyla çok net çekemediğim için detayları tam okuyamadım, ancak bu tabloyu isteyip yazıya ekleyeceğim. Bu alanlara hakim olan junior geliştiriciler, piyasada kendilerini farklılaştırabiliyorlar.

    Backend dilleri konusunda sorduğum soruya verdiği cevap oldukça aydınlatıcıydı: Java, .NET ve Node.js arasında tercih yaparken piyasayı iyi analiz etmek gerekiyor. Ülkemizde ve Avrupa’da Java ile .NET daha yaygın. Özellikle bankalar ve kurumsal firmalar Java tercih ediyor. Amerika’da ise Node.js daha popüler – bunun sebebi startup ekosisteminin daha yoğun olması. Java ile iş bulma süreci .NET’e göre biraz daha zorlu olsa da, bulduğunuzda karşılığı genellikle daha yüksek oluyor. Piyasada az Java yazılımcısı var ama yazanlar değerli kabul ediliyor.

    Üniversite boyunca nasıl bir yol izlemeli konusundaki düşüncesi çok pratikti: İlk iki yıl temellere odaklanmalı, yazılımı öğrenmeli ve altyapıyı sağlam kurmalıyız. Son iki yıl ise yapay zeka ile entegre çalışmalı, pair programming yapmalıyız. AI’ı bir çalışma arkadaşı gibi kullanmak en mantıklı yaklaşım.

    Öne çıkmak için yapay zekanın yapamadığı işlere odaklanmalıyız: karmaşık mimari kararlar, sistem tasarımı, optimizasyon ve problem çözme yetenekleri. Ve tabii ki, sürekli proje geliştirmeliyiz.

    n8n ile Otomasyon: Semih Kışlar’dan Öğrendiklerim

    Semih Kışlar’ın n8n sunumu, etkinliğin en pratik çıktılarından biriydi. Vodafone’un n8n kullanarak siber güvenlik tarafında 2.2 milyon sterlin tasarruf etmesi, bu aracın potansiyelini göstermesi açısından etkileyiciydi.

    Paylaştığı kullanım senaryoları oldukça ilginçti. İki farklı workflow’dan bahsetti:

    İlki commit mesajlarıyla ilgili: Biliyorsunuz, bazen “fix” veya “update” gibi belirsiz commit mesajları atıyoruz. GitHub’a push yapıldığında tetiklenen workflow, bu commitleri analiz ediyor ve daha anlamlı hale getiriyor. Commit mesajlarını düzenliyor, hatta gerektiğinde README dosyalarını bile otomatik güncelleyebiliyor.

    İkincisi ise release süreçleriyle ilgili: Yeni sürümler yayınlandığında, şirketteki tüm birimlere neler değişti, neler eklendi bunları iletmek zor olabiliyor. n8n workflow’u bu sorunu çözüyor. Her birime göre özelleştirilmiş açıklamalar hazırlıyor – teknik ekibe teknik detaylarla, diğer birimlere ise o birimin seviyesine göre daha anlaşılır bir dille. Böylece herkes kendi ihtiyacına göre bilgilendiriliyor.

    Kişisel kullanımı da dikkatimi çekti. Sabah rutini için kurduğu workflow var: Sabah uyandığında Gmail ve takvim entegrasyonu sayesinde günün toplantılarını, konularını ve etkinliklerini özetlenmiş bir şekilde alıyor.

    n8n’in rakiplerine göre avantajları var tabii. En büyük eksi yanı credentials (kimlik bilgileri) ekleme sürecinin başta biraz zorlayıcı olması. Ancak bir kere ekledikten sonra diğer workflow’larda kolayca kullanabiliyorsunuz.

    İş başvuruları konusunda verdiği tavsiye çok değerliydi: Teknasyon olarak gelen başvurulara baktıklarında GitHub’da yarım bırakılmış projeler görüyorlarmış. “Tam bitirilmiş projeler yapın” dedi. Mobile geliştirmeye başlayacak biri için önerisi ise projelerinizi mümkünse store’a yüklemek. Bazı iş ilanlarında “store’da uygulaması olan” şartını görüyorsunuz çünkü. Şirketler bu süreci deneyimlemiş kişileri arıyor.

    Teknoloji yığınları konusunda sorduğum soruda Teknasyon’da PHP, Node.js ve Go kullandıklarını öğrendim. Veritabanı tarafında PostgreSQL kullanırken, bir projede veri büyüklüğünden dolayı MongoDB’ye geçiş yapmışlar.

    Temeller Her Zaman Önemli: Mert Cobanov ile Sohbet

    Mert Cobanov’un veri bilimi ve istatistik sunumunun bir kısmını dinledikten sonra kendisiyle konuşma fırsatı buldum. En çok konuştuğumuz konu, kaynak seçimi konusundaki yaklaşımıydı: Udemy veya Coursera yerine kitap okumasını öneriyor. Kendisi de aktif olarak kitap yazıyormuş şu an.

    “Kitaplar güncel değil gibi durmuyor mu?” diye sorduğumda hayır cevabı aldım. Gösterdiği kitapların oldukça güncel olduğunu, hatta bazı kitapların farklı kütüphanelere göre güncellenen versiyonlarının olduğunu anlattı. Bu yaklaşım, temelleri sağlam öğrenmek için gerçekten mantıklı.

    Yazılımcı sağlığı konusunda açıldım kendisine. Eskiden spor yapıyormuş ancak bel ve bilek rahatsızlıkları nedeniyle bırakmış. Şimdi sadece yürüyüşe çıkıyormuş. Bu aslında bizim sektörde çok yaygın bir sorun – masa başında geçen uzun saatler bedeni zorluyor.

    LLM ve yapay zeka projeleri üzerine konuşmamız oldukça teknik geçti. Local olarak Ollama’da DeepSeek 7B parametreli modelini RTX 3080’de kullandığımızı söyledim. ChatGPT kullanıyoruz ama ücret yerine local’de daha düşük maliyetli bir çözüm olup olmadığını sordum.

    Öğrenme yolu konusunda da önemli bir noktaya değindi: Roadmap.sh gibi sitelerdeki roadmap’lerin çok karmaşık ve yoğun olduğunu, bunların insanın gözünü korkutabileceğini söyledi. Gerçekten de o roadmap’lere baktığınızda öğrenilmesi gereken o kadar çok şey var ki, nereden başlayacağınızı bilemeyebiliyorsunuz. Bu yüzden adım adım, temelden ilerlemek ve kendini bu karmaşıklığa kaptırmamak önemli.

    RTX 3080’de DeepSeek 7B gibi modeller performans açısından sınırlı kalıyor. ChatGPT API’nin fiyat-performans açısından çok daha mantıklı olduğunu, GPT’nin birçok ihtiyacı karşılayabildiğini söyledi. Tabii daha güçlü ekran kartlarında durum değişebilir diye düşünüyorum ben de, ama şu anki donanımımızla API kullanmak gerçekten daha akıllıca görünüyor.

    Sonuç

    DevFest 2025, bana sadece teknik bilgiler değil, aynı zamanda kariyerimde nasıl yol alacağıma dair pratik ipuçları da verdi. Yapay zeka ile nasıl yan yana çalışabileceğimizi, otomasyon araçlarıyla nasıl verimli olabileceğimizi ve hangi kaynaklara odaklanmamız gerektiğini öğrendim.

    En önemli çıkarımım şu: Teknoloji hızla değişiyor, ama temeller sağlam olduğunda ve sürekli öğrenmeye açık olduğumuzda her değişime adapte olabiliyoruz. AI’ı bir tehdit olarak değil, bir çalışma arkadaşı olarak görmeli ve kendimizi sürekli geliştirmeliyiz. Tam bitirilmiş projeler yapmalı, kitap okumalı ve sağlığımızı ihmal etmemeliyiz.

    GDG Gaziantep ekibine böyle değerli bir etkinlik için teşekkürler!

  • Debian 12’de WiFi Hız Dengesizliğini Nasıl Çözdüm

    Debian 12’de WiFi Hız Dengesizliğini Nasıl Çözdüm

    ThinkPad 21JR009TX modele sahip bilgisayarımda Ocak ayından itibaren Debian 12 kullanıyorum (Bir ara windows’a geçip 1-2 hafta takılmış olsam da neredeyse 6 aydır aktif kullanıyorum).

    Evde 100 Mbps fiber internet kullanmama rağmen bilgisayarda bazen anlamsız yavaşlıklar, 2 oda ilerideyken YouTube videolarında takılmalar oluyordu. Başlarda çok önemsemedim fakat modeme yakın olsam da aynı sorunları yaşayınca sorunun üzerine gittim.

    Sorun için Debian kaynaklı olabilir dedim fakat bu zamana kadar sorun olmamıştı, bilgisayardan kaynaklı diye düşündüm o da aynı şekilde bu zamana kadar sorun çıkartmamıştı. Sorunu çözmek için bilgisayarda WiFi’ı kapatıp açıyordum ve hız düzeliyordu. Anlam veremedim. DNS vs gibi tanımlamaları kontrol ettim ek ayar yoktu VPN kapalıydı. Mobil cihazımda browser üzerinde yaptığım testte gayet iyi bir hız alırken bilgisayarımda 15-18 arası hız görüyordum.

    Tüm olay 2.4 GHz ve 5 GHz frekanslarının ayrılmaması ve cihazın 5 GHz yerine 2.4 GHz frekansını kullandığını “iw dev” komutu ile tespit ettim. Sanırım modemden uzaklaştığım zamanlarda 2.4 GHz frekansa geçiyor ve yakınına geldiğimde 5 GHz frekansa geçiş yapmıyordu hız ise yine düşük kalıyordu. Bu arada WiFi listesinde görünen 2.4 GHz frekansında yayın yapan komşu modemleri de dahil ettiğimizde benim modemde çakışmalardan ötürü 2.4 GHz hız daha da düşmüş oluyordu.

    Bu sorun için aslında iki farklı çözüm vardı. Birincisi modemi 2.4 GHz ve 5 GHz olarak ayrı WiFi dağıtımını sağlamak. İkincisi ise Debian’da bu ağ için sürekli 5 GHz bağlantıyı tercih etmesini sağlamak. Ben çözümü Debian tarafında yapıp modeme karışmadım. Hangisi daha doğru çözüm olur o konuda net düşüncem olmadı henüz.

    Çözüm: Cihazı belirli ağ için 5 GHz frekansa bağlanmaya zorlamak

    Terminal (uç birim) üzerinden “iw dev” komutu ile bağlı olduğu ağın frekansını anlamaya çalıştım. Değerin 2442 MHz frekans ile 2.4 GHz ağına bağlı olduğunu kanalın ise 7 olduğunu gördüm.

    Debian’da cihazı belirli bir ağa sadece 5 GHz üzerinden bağlanmaya zorladım. Bu işlem için NetworkManager aracını kullandım. İlk olarak bağlı olduğum ağın adını (SSID) öğrenmek için:

    nmcli connection show

    Komutunu çalıştırdım ve örnek olarak şöyle bir çıktı aldım:

    SUPERONLINE_WiFi_B0A6

    Bu ağa sadece 5 GHz bandında bağlanması için şu komutu kullandım:

    nmcli connection modify "SUPERONLINE_WiFi_B0A6" wifi.band a
    

    (WiFi adınızı kendi WiFi adınıza göre değiştirin.)

    "a" parametresi, 5 GHz (802.11a/ac/ax) bandını temsil eder.

    Bu adımlardan sonra WiFi bağlantısını yeniden başlattım.

    nmcli connection down "SUPERONLINE_WiFi_B0A6"
    nmcli connection up "SUPERONLINE_WiFi_B0A6"

    Bu işlemden sonra Debian 12 kullandığım ThinkPad cihazım artık bu Wi-Fi ağına yalnızca 5 GHz üzerinden bağlanıyor. Yine “iw dev” komutu ile frekansı kontrol ettiğimde artık “2442 MHz” gibi 2.4 GHz değerler yerine “5180 MHz” gibi 5 GHz frekanslar görmeye başladım.

  • .net Core ve EF Core ile MSSQL Bağlantısı Nasıl Yapılır?

    Merhabalar bu yazı ile .net core projelerinize veri tabanı bağlantısını nasıl yapacağınızı basit ve sade bir şekilde anlattım umarım işinize yarar.

    Takip edeceğimiz adımlar:

    1. Veri Tabanı Oluşturma
    2. Gerekli Paketleri Ekleme
    3. Context Dosyasının Oluşturulması
    4. Veri Tabanı Bağlantı Stringi
    5. Bağlantıyı Yapılandırma

    1. Veri Tabanı Oluşturma

    MSSQL üzerinde projeniz için bir veri tabanı oluşturun. Bunu MSSQL’i yönettiğiniz (MSSQL Management Studio, Azure Desktop vb.) herhangi bir uygulama ile yapabilirsiniz.

    Database oluşturmak için Query:

    2. Gerekli Paketleri Ekleme

    NuGet paket yöneticisi veya terminal yardımı ile projenize Entity Framework Core‘u dahil etmemiz gerekiyor.

    Entitiy Framework Core Nedir?

    Entity Framework Core, ORM(object relational mapping) aracıdır. Veritabanı ile OOP arasındaki bağlantıyı sağlar. Karmaşık uzun SQL sorgularından kurtulur ve SQL sorgusu yazmadan program içerisindeki kodlar ile SQL üzerinde CRUD işlemleri yapabilirsiniz.

    NuGet Paket Yöneticisi ile

    NuGet Paket Yöneticisine kullandığınız IDE’ye göre farklı yollarla ulaşabilirsiniz.

    Ben aktif olarak kullandığım Jet Brains’in Rider IDE’si üzerinden göstereceğim. Sol altta bulunan ikonlardan görselde mavi renk ile görünen ikon NuGet paket yöneticimiz.

    Burada arama kısmına paket isimlerini tek tek yazıyoruz ve sürüm olarak Preview(Önizleme) sürümler dışındaki en son sürümü seçip paketleri kuruyoruz.

    Yüklenmesi gereken paketler:

    Terminal ile

    dotnet add package Microsoft.EntityFrameworkCore.sqlserver
    dotnet add package Microsoft.EntityFrameworkCore.Design
    dotnet add package Microsoft.EntityFrameworkCore.Tools
    

    3. Context Dosyasının Oluşturulması

    Veri tabanı işlemlerinin yapıldığı dosyaya Context denilmektedir. Projemizde veri tabanı işlemlerini yapmak için bir context dosyası oluşturacağız ve bu context dosyası DbContext sınıfından miras alacak. Bu sayede bu class üzerinden veri tabanı işlemlerimizi yapacağız.

    Projemizin içerisine Data adında bir klasör açıyoruz. Burada klasörümüze sağ tıklayıp “New File” veya Class diyerek yeni dosya oluşturuyoruz. Dosya adına AppDbContext.cs yazıyoruz İsterseniz Models klasörü altında da dosyamızı oluşturabilirsiniz.

    Dosyamızın içerisine ise bu kodları yazacağız. (Data klasörünün altında oluşturduysanız proje adınızdan sonra “.Data” eklemeniz gerekiyor. Dosya adı olarak AppDbContext belirlemiştik. Farklı isim belirlediyseniz kod içerisinde düzeltmenizi yapın. Proje adınızı da değiştirmeyi unutmayın.

    4. Veri Tabanı Bağlantı Stringi

    MSSQL’ e bağlanmak için bir connection stringe ihtiyacınız var. Bu bağlantı stringi için buradan yardım alabilirsiniz.

    Projemizdeki appsettings.json dosyasına bağlantı stringimizi { parantezinden hemen sonra şu şekilde ekliyoruz. Burada SqlCon daha sonra program.cs de belirteceğimiz isim olacak istediğiniz isimlendirmeyi yapabilirsiniz.

    Benim bağlantı stringim “Server=localhost;Database=VeriTabaniAdi;Integrated Security=false;Encrypt=false;TrustServerCertificate=false;User Id=sa;Password=1234;”

    5.Bağlantıyı Yapılandırma

    SQL bağlantısını proje başlangıcında sağlamak için projemizde bulunan program.cs dosyasında “var builder = …” satırının altına bu kodu ekliyoruz. Bu kod da yer alan SqlCon bir önceki adım da eklediğimiz stringin adını temsil ediyor. Eğer ismi değiştirdiyseniz sizde ona göre burada değiştirmelisiniz. Aynı şekilde AppDbContext dosyasında farklı bir isim kullandıysanız onu da yine değiştirmeniz gerekiyor.

    Bu kod EntityFrameWorkCore ile veri tabanı bağlantısını oluşturmamızı sağlıyor.

    Projemiz artık MSSQL’e sorunsuz bir şekilde bağlanabilir. Bu bağlantıyı ve EF Core’u kullanarak CRUD (Create, read, update, delete) işlemlerini yapabilirsiniz.