Aşağıdaki bilgilerle kayıt olmayı denedim.
{
"name": "Proto",
"surname": "Test",
"username": "prototurkebykdrms",
"email": "[email protected]",
"password": "123456"
}
Console'da şu hatayı aldım:
Access to XMLHttpRequest at 'https://socializee-backend.vercel.app/api/auth/register' from origin 'https://socializee-app.vercel.app' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Yani CORS hatası alıyorsun. Bu da isteği atan subdomain socializee-app
iken istek atılan subdomain socializee-backend
olduğu için oluyor. Localhost'ta CORS'a düşmüyor olabilirsin.
Ben bu aşamada takıldığım için cookie ile ilgili durumu gözlemleyemedim.
Bu sorunu çözmek için -backend kodunu bilemiyorum ama- kabaca aşağıdaki düzenlemeyi yapabilirsin:
const express = require('express');
const cors = require('cors');
const app = express();
// Aşağıdaki origin'den gelen isteklere izin veriyoruz:
app.use(cors({origin: 'https://socializee-app.vercel.app'}));
// ...diğer kodlar ve middleware'lar...
app.listen(80, () => {
console.log('Sunucu çalışıyor...');
});
Üst Edit: Çok uzun bir yazı oldu. Nihai düşüncem son paragrafta. Aradakiler tamamen iç dökme :)
Flutter'da durum nedir bilmiyorum ama React Native'de zırt pırt güncelleme geliyor. Kullandığınız paketler yeni sürüme destek getirinceye kadar siz uygulamanızı -azmetmezseniz- yeni sürüme geçiremiyorsunuz. Üstelik bazı sürüm yükseltmeleri öyle temelden yapılıyor ki, native kodları da düzenleyerek eklediğiniz paketlerin yeni sürümde nasıl yer edinmesi gerektiğini çözmekle uğraşıyorsunuz. Sırf bu yüzden mümkün olduğunca -hazır paket bulunmasına rağmen- ihtiyacımı kendi bileşenimi oluşturarak gideriyorum. Bu iyi de oluyor tabi. Benim kontrolümde, sadece benim ihtiyacım olan kod kalabalığına sahip bileşenlerim oluyor. Ama işin Swift veya Kotlin/Java tarafına çok hakim olmadığım için burada da kısıtlanıyorum tabi.
Yani React Native tarafında sürekli versiyon yükseltmeleri oluyor ama 3. taraf paketler buna uyum sağlayamadığından sorunlar yaşıyorsunuz.
Bunun haricinde React Native ile kod yazmak -özellikle Typescript desteğiyle- çok keyifli.
Mobil yazmaya karar verirken hem Flutter'ı hem React Native'i başlangıç düzeyinde denemiştim. Flutter'a bir türlü ısınamamıştım. En azından o dönemde, çokça çözümleri olsa bile beni aslında bu çözümler içinde bir konfor alanı yaratıp aslında kısıtlıyor gibi hissetmiştim. Aslında felsefesi hoşuma gitmişti. Aslında çok da native bileşenlere bağımlı olmayan, oluşturulan bileşenleri ekranda kendisi resim çizer gibi çizen, aslında bütün işleri web'deki bir <canvas> üzerine çizim yapar gibi halleden bir yapı kurmuşlardı. Bence bu harika bir çözümdü ve ekrana mükemmel bir hakimiyet kurmamı sağlayacağını, gerekirse kendi yamuk yumuk görünen bileşenlerimi bile oluşturabileceğimi düşünmüştüm. Yani aslında geçmişten özlediğim Flash ve ActionScript ile uygulama geliştirir gibi uygulama geliştirebileceğim bir yapı ile karşılaşacağımı ummuştum. Ama bunun yerine, hazır bileşenleri prop'lar vasıtasıyla özelleştirebileceğim bir yapı ile karşılaştım. Başlangıçta header'ı, footer'ı, yan menüsü falan olan gelişmiş bir bileşen ile başlıyordum ve bunun üzerinde geliştirmeler yapıp özelleştiriyordum. Ama bu bana bootstrap geliştirilmiş web sitesinde css ile overload yaparak geliştirme yapar gibi hissettirdi. İşin kötüsü, okuduğum dokümanlar ve izlediğim eğitim videoları bunun harika bir özellik olduğundan, işleri çok hızlandıracağından bahsediyorlardı. Evet, başlangıç düzeyinde insanı cezbediyor hızlıca gelişmiş bir görünüm elde edebilmek. Ama beni cezbetmedi çünkü beklentilerim bambaşkaydı. Ben de bu işler böyle yürüyorsa -muhtemelen yanıldım ama- Flutter'ın bana göre olmadığına karar verdim. Bu sırada React Native ise başlangıçta bana bomboş bir ekran sunuyordu. "Zaten React biliyorsundur, al web sitesi tasarlar gibi tasarla" diyordu. Ben o sırada pek React da bilmiyordum aslında ama bu boş ekranda geliştirme yapmak bana daha çekici geldi. Bu sıralarda React Native de eski class yapısından kurtulup fonksiyonel bir yapıya dönüyordu ve yeni yapısında bileşen oluşturmak sıradan bir javascript fonksiyonu oluşturmak gibi kolaydı. Bir bileşenin stateful/stateless olup olmadığını belirtmek falan da gerekmiyordu. Bir state kullanıyorsan otomatikman stateful oluyordu. Kullanmazsan stateless devam ediyordu. Çok basit, anlaşılır ve sıfırdan özelleştirilebilir bir yapı. Evet, hayal ettiğim gibi Flash rahatlığında tasarım oluşturamam belki ama neredeyse Web rahatlığındayım. Bir index.html dosyası oluşturmuşum ve imleç ilk satırda yanıp sönüyor. Buradan nereye gidebileceğim benim hayal gücüme kalmış. Flutter'da ise gelişmiş bir html istekeleti ile başlıyorum ve bunu özelleştirip nereye gideceğim yine bana kalmış. Yani birinde bana özel bir yapı kuruyorken diğerinde ihtiyacım olabilecek her şeyi barındıran bir yapıyı bana özgü hale getirmek için çalışıyorum. Kişiden kişiye değişir tabi ama ben React Native'in sunduğu yapıyı daha esnek bulduğum için o yolu tercih ettim. Dediğim gibi muhtemelen yanılmışımdır. Sadece başlangıç düzeyinde Flutter inceledim sonuçta.
ChatGPT'ye şu prompt'u verdim: "ekrana merhaba dünya yazan bir bileşenin react native ve flutter örneklerini ver."
Flutter için şu örneği oluşturdu:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Merhaba Dünya App'),
),
body: const Center(
child: Text(
'Merhaba Dünya',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
),
);
}
}
React Native için ise şu:
import React from 'react';
import { Text, View, StyleSheet } from 'react-native';
const App = () => (
<View style={styles.container}>
<Text style={styles.text}>Merhaba Dünya</Text>
</View>
);
const styles = StyleSheet.create({
container: {flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#fff'},
text: {fontSize: 20, fontWeight: 'bold'},
});
export default App;
Bu iki örneğe bakınca React Native için web'e yakın düzeyde bir tasarım esnekliğim var. Flutter'da ise elementi ortalamak için Center gibi başka bileşenler kullanmam gerekiyor. Yani ben yazının ortada değil de sağa yaslı olmasını istesem stil değiştirmek yerine bileşen değiştirmem gerekecek. Ya da adı Center olan bir bileşene, içerikleri sağa yaslı olsun diye style vermem gerekecek.
Bir de aynı iş için React Native'de kullandığım 2 bileşene karşılık Flutter'da Widget > Material App > Scaffhold > Center'ın da child prop'unu kullanarak 4 widget kullandı. Muhtemelen 1-2 widget'la da çözebilirdi aslında işi. Ama işte ChatGPT de o konfor alanında kalmayı seçti. Kodda yaratılan arrow anti-pattern durumu da -aslında böyle olmak zorunda değildi biliyorum- ama ister istemez oluşuveriyor.
Aslında bakınca Flutter'ın Center gibi bileşenler kullanması native koda yakınlık açısından çok daha doğru ve kodun native koda çevrilmesi açısından daha verimli gibi görünüyor. Ama Flutter'ın asıl felsefesi "ekrana piksel piksel çiziyorum" olduğu için bu durum bana itici geliyor. Aslında native'e uyumluluk açısından aynı şeyi React Native de yapabilirdi ama yapmamayı tercih etmişler. Böylece React Native "bırak böyle native uyumluluk gibi şeylerin hesabını ben yapayım, sen kodununun en sade haliyle işlevine odaklan" diyerek gönülümü almış oldu. Tabi dediğim gibi, belki 2 hafta daha Flutter'ın üzerine gitsem bu düşüncelerimin tamamen yanlış olduğu kanısına varırdım. Ama işte iletişimde ilk temasın önemi. :) Ben kendi adıma C# dilinin keskinliği ve Visual Studio'nun yüzlerce imkânı ile web sitesi geliştirmek yerine PHP'nin veya Node.js'in esnekliği ve Visual Studio Code'un rahatlığında web sitesi geliştirmeyi tercih ediyorum. Evet, güvenlik için belki daha çok çaba gerektiriyor. Belki performans için kodu daha dikkatli yazmam gerekiyor. Ama beni kalıplardan uzak tutuyor. PHP'de bile bir framework kullanırken Laravel yerine Codeigniter kullanmayı tercih ederdim. Çünkü Laravel'in aksine Codeigniter'da PHP özgürlüğünü hissedebiliyorsunuz. Bu tamamen yazılımcının tercih meselesi. Zaten Codeigniter da gitgide Laravel'e benzemeye başlayınca PHP'den de uzaklaşmaya başladım. Şu sıralar Node.js'çiyim diyebilirim. :) Bir de sırf makine öğrenmesi veya derin öğrenme üzerine merakım olduğundan ufak ufak Python çalışmalarım oluyor ama profesyonel anlamda web tarafında React, mobil tarafta React Native ile para kazanıyorum.
Bana sorarsan web tarafında da React yerine Svelte kullanmak çok daha heyecan verici. Ama işte Svelte'in de geliştiricisi az olduğundan pek hızlı gelişemiyor. Hatta x = x;
gibi garip kodlar yazmak gerekebiliyor ki bu benim için göz kanatan bir kod. :D Ve Svelte de bu gibi durumların önüne geçmek için günden güne React'a benzemeye başlıyor gibi bir izlenim uyandı bende.
Eskiden harika bir Flash'ımız ve ActionScript'imiz vardı. Google'ın başını çektiği bir çok firma el birliğiyle Adobe'nin bu projesini güvenlik açıkları nedeniyle durdurdular. Tarayıcılarda Flash uygulamalarını engellediler. Zamanla Flash geliştiricileri web'den el çekmek zorunda kaldı. Mobil'de Flash'la halen -özellikle oyun alanında- harika işler ortaya çıkarılabiliyordu. Şu an orada son durumu bilmiyorum ama orada da sanırım Microsoft'un Unity projesi -ki çok beğenirim kendisini- baskın geldi. Ben Google'dan Adobe'ye karşı bu tutumunun üzerine ondan daha iyisini Flutter ile başaracağını ummuştum ama umduğumu bulamadım. Flutter ile yazmak -temelde- React Native ile yazmaktan çok da farklı değildi. Birinin Component dediğine biri Widget diyordu. Flutter'da hayal ettiğim tasarım ortamını bulamadım. Hal böyleyken, yukarıda da bahsettiğim nedenlerle Flutter yerine React Native'i tercih ettim.
Aslında aklımın bir köşesinde Flutter için hep bir "acaba" var ama az önce ChatGPT'nin örneğinde gördüğüm extends StatelessWidget
ifadesi halen orada olduğu için bu acaba'yı yine ertelemek istedim mesela. React Native bu ifadeden (extends React.Component
) kurtulalı yıllar oldu. Ayrıca nesne tabanlı kod geliştirmek iyidir hoştur ama gerekli gereksiz her yerde nesne tabanlı kod yazmayı da doğru bulmuyorum. React Native de böyle düşünmüş olacak ki -zaten Javascript'e pek uygun da olmadığından- başlangıçta nesne tabanlı gitmesine rağmen sonradan fonksiyonel tabanlı bir yapıya döndüler. Ben de tam bu dönüş sırasında mobile geçiş yaptığımdan React Native beni yakalamış oldu.
Özetle, Flutter'ı pek bilmediğim için karşılaştırma yapamayacağım. Ama React Native'den, yükseltme problemleri hariç, memnunum. Kod yazarken keyif alıyorum.
Sorun bunlardan mı kaynaklanıyor bilmiyorum ama deneyebilirsin:
toolbar.js dosyasını kullanıyorsan event.preventDefault();
kodları silebilirsin.
toolbar.min.js dosyasını kullanıyorsan a.preventDefault()
yazan yerleri undefined
olarak değiştirebilirsin.
toolbar'a basılınca gerçekleşecek olayları kontrol etmek için kullanıcının yaptığı diğer tıklama olaylarını geçersiz kılıyor. Belki link'lere tıklama olayları bu yüzden geçersiz kalıyordur.
console.dir(parseveri, {depth:null});
Bu kodda kullanıcı sadece 2'ye bölünmeyen dakikalarda işlem yaparsa exit komutu işlemeyip kod devam edecek ve PHP sonraki işlemleri yapacak.
Kullanıcı 13.50.14, 13.50.46, 13.50.55 gibi saatlerde istek atarsa exit komutu çalışır ve PHP diğer işlemleri yapmaz.
Kullanıcı 13.49.14, 13.49.46, 13.49.58 gibi saatlerde bir işlem yaparsa tüm istekleri PHP tarafından kabul edilmiş olur.
Amacımız "bir kullanıcının bir istek yaptıktan sonra 1 dakika boyunca başka işlem yapmasını engellemek" ise bu kod hatalı çalışıyordur diyebiliriz.
PHP, çift dakikalarda gelen hiçbir isteği yanıtlamıyor. Ama tek dakikalarda gelen tüm istekleri yanıtlıyor.
Kurgunu bilmediğim için belki de bunda bir hata yoktur tabi, sen zaten bunu amaçlamış olabilirsin.
Eğer bunu amaçlamışsan (her kullanıcının sadece tek dakikalarda yaptığı tüm istekler çalışsın)
if koşulundaki "tek dakika" yani "her 2 dakikada bir" ifadesi yerine "her N saniyede bir" ifadesini koymak istiyorsun.
Bu durumda N = 30 dersek, "her 30 saniyede bir gelen istekleri kabul et" demek istiyorsun.
Bu durumda "H", "i", "s" değerlerine değil de doğrudan timestamp'e bakarak işlem yapmak gerekir.
Alıntı: PHP tarih ve zaman ifadelerinde unix zaman damgasını kullanır. Unix timestamp en basit ifadeyle “1 Ocak 1970 00:00:00” tarihinden itibaren günümüze kadar geçen saniye sayısıdır.
Kaynak: https://www.phpr.org/php-ile-tarih-ve-saat
Bu durumda timestamp'i kullanarak her N saniyede bir çalışacak şekilde bir kontrol yapabiliriz. Örneğin, N = 25 saniye olarak ayarlamak istersen, şu şekilde bir çözüm uygulayabilirsin:
$currTimestamp = time();
if ($currTimestamp % 50 >= 25) exit;
Bu kod parçası, her 50 saniyede bir çalışacak ve sadece ilk 25 saniye içinde gelen istekleri kabul edecektir. Diğer 25 saniyede gelen istekler ise bloklanacaktır. Buradaki time() fonksiyonu, o anki Unix zaman damgasını verir ve bu değerin 50'ye bölümünden kalan, 25'ten büyük veya eşitse, exit komutu çalışarak PHP işlemlerini durdurur.
Eğer farklı bir süre için ayarlamak istersen, örneğin her 60 saniyede bir 20 saniye çalışsın ve 40 saniye bloklasın istersen, kodu şu şekilde değiştirebilirsin:
$currTimestamp = time();
if ($currTimestamp % 60 >= 20) exit;
Burada karşımıza 2 ifade çıkıyor: "Her X saniyede bir N saniyelik zaman diliminde çalışsın, aksi halde exit ile bloklansın."
Bunu da fonksiyonel bir hale getirmek daha uygun olacaktır. Bu işlemi yapan fonksiyon şu şekilde yazılıp kullanılabilir:
function isRequestAllowed($interval, $activePeriod) {
return (time() % $interval) < $activePeriod;
}
Artık "her 60 saniyede bir, sadece ilk 20 saniyede gelen istekleri kabul et" ifadesinin karşılığı:
if (!isRequestAllowed(60, 20)) exit;
Bu durumda örneğin,
şu saat aralıklarında yapılan tüm istekler bloklanır:
13:00:20 - 13:00:59
, 13:01:20 - 13:01:59
, 13:02:20 - 13:02:59
, 13:03:20 - 13:03:59
şu saat aralıklarında yapılan tüm istekler bloklanmadan işleme alınır:
13:00:00 - 13:00:19
, 13:01:00 - 13:01:19
, 13:02:00 - 13:02:19
, 13:03:00 - 13:03:19
Amaaaa, eğer senin asıl amacın örneğin bir kullanıcının sadece N=20 saniyede bir işlem yapabilmesi ise farklı bir kurgu gerekir.
Yani "bir kullanıcı 13:00:05'te istek yaptıysa bir daha 20 saniye boyunca (13:00:25'e kadar) yapılan isteklerine yanıt gelmesin" diyorsan orada farklı bir kurgu devreye girer.
Bu durumda isteğe gelecek yanıt sunucu zamanına değil kullanıcının istek yaptığı zamana bağlı olur ve her kullanıcının kendine özgü bir zamanı olur.
Veya amacın "bir kullanıcı 13:00:05'te istek yaptıysa diğer tüm işlemlerini 20 saniye içinde (13:00:25'e kadar) yapsın, yani 20 saniye boyunca bu kullanıcıya işlem yapma izni verilsin. 20 saniyeyi aşarsa yeni istek için 40 saniye beklesin." diyorsan burada da başka bir kurgu devreye girer.
Nitekim, senin kodundan yola çıkarak cevap yazdım ama senin kurgun farklıysa ona göre daha detaylı şekilde ayrı bir yeni soru açmalısın.
Net olarak herhangi bir yöntemi doğru kabul edemiyoruz. Tarayıcıda yaptığımız geliştirmeler tam olarak gerçek cihazı taklit edemiyor. Emulatörlerden kontrol edilen geliştirmeler daha doğru sonuç verse de kaç emülatörde test edebiliriz ki...
Mecburen tarayıcıyı doğru kabul ediyoruz ama cihazların dpi farklarını da hesap ederek, aslında zihnen çalışan bir emülatör üzerinden geliştirme yapıyoruz. Responsive geliştirme yaparken tarayıcının sunduğu örnek cihazları doğru kabul edemeyiz. Bu yüzden manuel olarak genişliği iyice daraltmak, zoom out yapıp genişliği iyice artırmak gibi denemeler yapıp her duruma uygun kod yazmak gerek.
Çok daha doğru sonuç vermesi için en düşük ekran genişliğine sahip ios ve android sistemli cihazlarda test etmek iyi olabilir. Ama pratikte böyle testler geliştirici için çok zaman alacak, projenin tamamlanma süresini uzatacaktır. Bu yüzden proje en azından ilk başta sadece tarayıcı üzerinden kontroller sağlanarak tamamlanabilir. En sonunda da emülatör testleri yapılıp ona uygun düzeltmeler yapılabilir.
Kendi adıma, projemi geliştirirken sadece tarayıcı üzerinde geliştirmemi yapıyorum. Zaman içinde tecrübe edindiğim için hangi CSS kodunun IOS'taki Safari tarayıcısında farklı davranacağını biliyorum. O CSS koduna alternatif üretemiyorsam mecburen gerçek bir cihaza ya da emülatöre bakıyorum.
HTML yapısını kurarken mümkün mertebe IOS'un Safari'sinin sistemini baz alıyorum çünkü çok katı kurallara sahip. Mesela bir elementi position:fixed
ile en üst düzeyde göstermem gerekiyorsa, o elementi DOM'da da en üst düzeyde tutmaya çalışıyorum. Çünkü Chrome tarayıcısı geliştirici dostu bir yaklaşımla benim stil yazarken ne kastettiğimi anlayıp ona uygun bir görünümü render edebiliyor ama Safari geliştiriciden net olmasını bekliyor.
Özellikle yeni CSS komutlarını kullanmaktan kaçınıyorum ama eğer kullanmam çok yerinde olacaksa mecburen tarayıcı farklılıklarını gözeterek kullanmam gerekiyor.
Verdiğin örnekte bir yükseklik problemi görünüyor. IPhone bu modelinde -utanmasa- kare ekran kullanacakmış da yine de yüksekliğe biraz daha pay vermiş sağ olsun. Bu daracık alanda güzel bir tasarım çıkarmak zor. Ama ille de buraya özgü de bir çalışma yapılması gerekecekse mecburen media query'leriyle min-height konrolüne göre stilleri overload etmek gerek. Belki header'ın height değerinden kısmak, başlığın puntosunu küçültmek, kutuların tasarımlarını daha küçük bir yapıda sunmak...
Ama işte bunun da bir sonu yok. Sadece ekranın width değeri olsa neyse de ekranın height değeri de devreye girince 4 kombinasyon çıkıyor, işler iyice birbirine geçiyor. Zaman da önemli bir faktör olduğundan en doğrusu projeyi sadece tarayıcı kontrolleri yaparak sürdürmek ve sadece mobil cihazlarda sorun olacağı çok belli stiller için mobil cihazda kontroller yapmak gerek. Sonrasında proje tamamlanınca kullanıcı dönüşlerine göre açıklar kapatılabilir.
O uygulamanın algoritmasını bilmeden buna cevap veremeyiz.
Eğer uygulama kullanmayı zorunlu tutuyorlarsa sanırım
bildirim yoluyla gönderiyorlar otp kodunu. Bu bildirimi
alabilmen için o uygulamayı kullanmak zorundasın çünkü
bildirimi gönderen sistem (belki firebase) doğrudan
o uygulamaya yönlendirilmiştir.
Eğer otp kodu sms yoluyla geliyorsa belki tarayıcıyı
mobil uygulama gibi gösterip login ekranını görüntülemek
mümkün olabilir ama yine o sitenin kurgusunu bilmek lazım.
Eğer otp kodunu web sitesinde gösteriyor ve uygulamanın
login ekranında web sayfasındaki kodu yazmanı istiyorsa
belki de web tarafında hiç login sayfası yoktur veya
o uygulamadan gönderilen bazı şifreli bilgiler olmadan
web'deki login ekranına erişim engellenmiştir. Bu durumda
yine yazacağın mobil uygulamayla o ekranı görüntülemen
mümkün olmaz.
Türlü hack denemeleri yapılabilir ama yapmamak gerek.
Belli ki her hesabın sadece 1 kullanıcısı olsun istiyorlar.
Böylece, giriş yapmak isteyen kişi kimse zaten telefonu da
yanındadır ve kendi hesabına kolayca giriş yapabilir.
Aksi halde sanırım en uygun yol 1 kullanıcının birkaç farklı
hesaba tek uygulama üzerinden girebilmesi için ilgili
firmayla iletişime geçip geliştirme yapmaları istenebilir.
Muhtemelen bu tahminlerimin hiçbiri tutmadı. Sitenin
kurgusunu tahmin ederek bir yanıt vermem mümkün değil.
Ama soruna yanıt olarak, kendi uygulamanı yazman bu sorununu
çözmeyecektir çünkü uygulama ile sunucu muhakkak
o uygulamaya özgü ve değişken bir şifreleme ile
haberleşiliyordur. Sen türlü yazılımlar kullanarak o
uygulamadan sunucuya atılan istekleri görüp aynı istekleri
kendi uygulamandan sunucuya atamazsın. Çünkü o isteklerde
muhakkak uygulama içindeki verileri de içeren bir token
bulunuyordur. Sen sunucuya header değişiklikleri ile
kendini o uygulama gibi gösterip token'ı da isteğe
eklediğinde, yine de güvenlik önlemine takılacaksın.
Çünkü token, uygulama içinde şifreleniyor ve bu şifrenin
nasıl açılacağını sadece uygulama ve sunucu biliyor. Haliyle
bu token'ı taklit etmen mümkün değil.
Tabi sistemde böyle güvenlik önlemleri almamış da olabilirler.
Belki de PostMan üzerinden header değişiklikleriyle yapacağın
basit bir login isteğine yanıt verecektir, kim bilir...
Çok ucu açık bir soru. Aslında ne yapacağın çok belli. Veritabanına eklediğin kişi sayısı 100'e ulaşmışsa yeni kişi kaydetmeyeceksin. Kullanıcılara da tablonda kaç kişinin kayıtlı olduğunu göstereceksin. Anlık bir gösterim için websocket veya socket.io gibi bir yapı kullanman gerekir ama basit xhr/ajax istekleriyle de işi kotarabilirsin.
Soruyu sorarken cevabı zaten vermişsin yani. O yüzden tam olarak ne sorduğunu anlayamadım sanırım. Doğrudan kod yazmamızı istiyor olabilir misin?
Çok özel bi'proje istenmiyorsa bu tip siteler için en güzeli Wordpress'le yapıp geçmek.
Ben de müşterilerime panel yapardım. Ama paneli sanki kendim için yazıyor gibiydim.
Çoğunlukla panele giriş şifresini bile sormuyorlar.
Aslında başta söylüyorum, paneliniz olursa şu kadar olmazsa bu kadar diye...
Olsun, diyorlar ama neye para ödediklerine girip bakmıyorlar bile.
En güzeli Wordpress için hazır bir tema seçip içini doldurup teslim etmek.
Peki ben bugüne kadar kaç Wordpress site verdim müşterilerime? Sıfır!
Neden? Çünkü bende o ticari kafa yok.
Adam sıfırdan site oluşturuyormuş gibi fiyat çekiyor müşterisine ama yarım günde Wordpress'le siteyi tamamlayıp kenarda bekletiyor. İşin sonunda müşteri "bana niye wordpress site yaptın da bu kadar para aldın" diye sormuyor. Anlamıyor çünkü. Wordpress ne ki? Onun için sıfırdan olmasıyla hazır olması arasında bir fark yok. Aradaki fark bizim için büyük gibi görünse de onun için anlamlı bir fark değil.
Wordpress öğrenirsen, bu tip işleri 4-5 saat bile sürmeden tamamlarsın. Yani günde 2-3 iş bile tamamlayabilirsin. Bu kadar saati de Wordpress site yayınlamanın uğraştırıcı olmasından değil, içerik girmekle uğraşmanın zaman almasından dolayı veriyorum. Yani içeriği de müşterinin kendisinin girmesini istersen her saat bir iş tamamlayabilirsin.
Tanesi 10 bin liradan (sunucu/domain masrafları hariç) 100 müşteri bulup işi tamamladığında 1 milyon lirayı cebine koyarsın.
Wordpress'i ve yayınlama süreçlerini iyi biliyorsan, içerik girme işini de müşteriye veya bir arkadaşına uygun bir fiyatla (mesela 4bin lira versen saatte bin lira vermiş olursun) yaptırabiliyorsan, çevrende çok da iş varsa...
Kısacası, potansiyel olarak -teoride- birkaç ay içinde milyon lira kazanman mümkün.
Ben bunu biliyorum. Peki milyon lira kazanabildim mi? Hayır! Neden?...
PHP, C#, Python, Nodejs gibi sistemleri öğrenmek sana istediğin her şeyi yapabilme gücü verir. Wordpress temalarına bağımlı kalmazsın. Wordpress temaları yapan adam olabilirsin. Kendi yapay zeka algoritmanı eğitip ses, görüntü, türlü veriler işleyebilirsin. Yapabileceklerin senin hayal gücüne kalmış. Potansiyel olarak -teoride- bu da seni milyoner yapar.
Peki mesela ben milyoner miyim? Hayır! Neden?...
İçimi dökesim varmış, bol bol yazdım.
Şu anki ruh halimde sana Wordpress'i iyi öğrenmeni ve sana iş getirecek bir çevre edinmeni öneriyorum. :)