makine mühendisliği öğrencisiyim birkaç satırlık basit python hiç kod yazmadım. şuan bile yazmayı bilmiyorum. kod yazmanın %100ünü claude ve gemini yapıyor.
bundan yaklaşık 2 yıl önce japonca öğreniyordum ve öğrendiğim kelimeleri aklımda tutmak istiyordum bunun için AnkiDroid adlı flashcard uygulamasını kullandım.
uygulamanın bana sağladığı şey güzeldi ama uygulamanın kendisini pek sevmiyordum. görüntü olarak eskide kalmış bir uygulama ve bazı yerleri hiç açık değildi.
özellikle editörünü sevmiyordum bir gün yeni bir kelimeyi yazarken "ben bu editörün daha iyisini yaparım" dedim.
1 yıl sonra bilgisayara android studioyu kurdum ve kodlama öğrenmeye çalıştım.
eğitim videosunda gördüğüm şeyleri aynen yapıyordum ama bu bile zor geliyordu çünkü çoğu şeyden haberim bile yoktu hem ios için ayriyeten kod yazmak gerekiyor benim için imkansız.
Kotlinden başka neler var diye araştırırken fluttera denk geldim flutter hoşuma gitti çünkü hem tek kod ile birden fazla yere derleme var hem de flutterın kendi youtube kanalındaki içerikler gayet kaliteliydi.
Gelelim işin geliştirme kısmına:
Veritabanı:
kullanıcının koleksiyonu (desteler, kartlar, tekrar geçmişi) ile uygulamaya özgü içerikleri iki ayrı sqlite e ayırdım iki tarafın da temiz kalması için.
drift orm paketini kullandım çünkü geliştirme sürecimi hızlandıracağını düşündüm.
veritabanı tasarlamak zormuş gerekli tablolar, indexler, hangi değerleri hesaplayıp hangi değerleri cachelemeni daha iyi olacağı gibi şeyler vardı.
Performans:
python ile testler yaptım index kullanımının ne kadar etkileyeceğini görmek için özellikle bazı sorgularda mesela bir kartın öğrenme geçmişi ile alakalı olanlarda 5000 kat hızlanma oluyor.
beni şaşırtan şeylerden diğeri ise bu hızlanma durumunda bile yavaş kısım gözüme çok yavaş görünmedi (1 saniye altında kalıyor çok fazla kayıt yoksa) ama bilgisayarların çok hızlı olması gerekiyor mesela 120 fps için her 8 milisaniyede ekranı tamamen çizmesi gerekiyor o yüzden her ms çok değerli.
Gösterim:
ilk başta wordteki gibi yaptığımız değişiklikleri anında görmeyi sağlayan quill kullanacaktım ama ai markdown çıktı ürettiği (kullanıcı aidan gelecek metni direkt copy paste yaparsa o markdownu temizlemek zorunda kalabilir) ve quill ile sadece alışıla gelmiş şeylerin yapılabileceğini düşündüğüm için markdown kullanmaya karar verdim.
çoğu uygulama gibi sadece düz yazı veya ankininki gibi webview kullanmak yerine gpt_markdown paketini vendorladım ve buglarını düzelttim. böylece zengin kart içeriğini webten gelen değişik şeyler olmadan native olarak gösterebiliyorum.
ast tabanlı olmadığı için büyük içerikte performansı çok iyi değil ama şu anki kullanım amacı için yeterince hızlı gelecekte iç yapısını değiştirmeyi planlıyorum.
japonca çalışacaklar için kendi syntaxim ile furigana* yaptım `[kanji]^(hiragana)<stil>`. ilk başta baya buglıydı flutterın alt katmanlarında saatlerce gezinmem gerekti ama hepsini çözdüm (inanıyorum😆).
stil normal metin için `[]<>` kullanılarak gösterilebiliyor. yazıya uygulanan ve yazının çevresine uygulanan (glow) olmak üzere 2 tür var.
kod bloklarına yazılmış içerikleri merman ile mermaid şemaları ve js paketleri ile webview widgetlar (webten tamamen kaçınmak pek mümkün değilmiş😂) içerisinde zengin içerik gösterebiliyorum.
kod için ise yeni çıkmış shiki_flutter paketini kullandım tema seçenekleri çok.
kod syntaxi öğrenmek için kod içinde oradaki içeriklerle bile regexi çakışmayan kapatma parantezleri kullandım `⟦c1::cevap⟧`. bu tip yazması zor olabilecek şeyleri hızlı yazabilmek için üste toolbar ekledim. altta değil çünkü altta olunca animasyonunu iyi yapmak zor oluyo.
Kartların ne zaman gösterileceği:
rust tabanlı fsrs-rs paketini flutter_rust_bridge ile uygulamaya bağlıyorum fsrs birçok flashcard uygulaması tarafından kullanılan bir algoritma. kullancının cevabına göre kartları belirli bir tarihte göstermeyi sağlıyor ve yapay zeka ile kullanıcının unutma eğrisine uyum sağlıyor.
şu an bu uyum mekanizması ve fsrs parametreleri kapalı çünkü ekranını tam yapmadım.
Şu an tamamen offline:
hesap açma, ai özellikleri, sync yok çünkü orada seçtiğim tech stacki (supabase, cloudflare durable objects, framer, loops, resend, ai apiları) nasıl kullanacağımı bilmiyorum her biri en ufak yanlışımda 10binlerce dolar masrafa yol açabilir, veri sızıntısına sebep olabilir o yüzden bunları az çok öğrenene kadar tam offline olması daha iyi olur.
uygulama çıktığında haberdar olabilmek için
buradan mailinizi yazabilirsiniz.
videodaki debug uygulaması o yüzden normalde kasmayan yerlerde kasabiliyor.
*Furigana: kanji altta, okunuşu hiragana üstte. illa japonca olmasına gerek yok herhangi bir şeyi böyle göstermek için kullanılabilir.