Anladığım kadarıyla siz kodunuzu mesela GitLab'a göndermek istiyorsunuz.
Sonra da otomatik bir sistemin bu kodu sunuculara dağıtmasını istiyorsunuz.
Yani siz git push
dedikten sonra bu sistemin kurulu olduğu sunucularda kodunuz otomatik yenilensin istiyorsunuz.
Daha doğrusu siz kodunuzu GitLab'a gönderdikten sonra, kendi panelinizdeki bir Güncelle butonuna basarak GitLab'daki projenizin güncel halinin tüm sunuculara otomatik gönderilmesini istiyorsunuz.
2 türlüsü de mümkün. Ancak sunucuların kontrolünün sizde olması lazım.
Diyelim ki aynı projeyi hem A hem B sunucusuna kurdunuz. Bir de kendinize ait bir Merkez sunucunuz var.
Bu iki sunucuda da projenize git ekleyip GitLab hesabınıza bağlamalısınız.
Manuel olarak bu işi yapmak için:
Hem A hem B sunucularında bir web servisiniz veya projenize dahil bir endpoint'iniz olmalı. Merkez sunucunuzdaki panelinizden butona bastığınızda A ve B sunucularındaki web servisinize bir istek atmalısınız.
A ve B sunucularındaki web servis de istek geldiği zaman shell bağlantısı açıp projeye girmeli ve git pull
komutu vermeli.
Ben olsam çok daha kolay bir yöntem olan GitLab runner'larından faydalanmak yerine böyle kendi oluşturduğum yöntemi kullanmayı tercih ederim.
GitLab'ın dahili yöntemleriyle bu işi yapmak için:
Bu işler daha da otomatik olsun, ben GitLab'a gönderdiğim gibi hemen sunuculara dağılsın, benim de bir Merkez paneline bunun için buton koymama gerek kalmasın derseniz de CI/CD şeklinde bir araştırma yapabilirsiniz. GitLab'ın runner'ları sizin oluşturduğunuz .gitlab-ci.yml dosyanıza bakarak A ve B sunucularının terminaline bağlanıp projenizi pull edebilir.
Bu işlemi çözmek için kendi kodlarınızı yazmayacaksanız kalın yazdığım ifadeleri araştırabilirsiniz.
Tek tablo çok daha rahat olur tabi. Ama orada da premium_1, premium_2 ve premium_3 sütunlarında bitiş tarihi tutmanız daha uygun olur.
premium_bittimi diye ayrı bir sütuna gerek olduğunu sanmıyorum.
emlakci tablosu:
id, kayit_tarihi, premium_1, premium_2, premium_3 sütunlarına sahip olursa ve bu premium sütunları bitiş tarihini tutarsa rahatça sorgulama yapabilirsiniz.
Eğer tarihleri PHP ile hesaplatırsanız çok fazla ihtimale göre kod yazmanız gerekecek.
Okul dersleriniz iyiyse, ailenizin de imkânı varsa mutlaka üniversite okumalısınız. (Hatta mümkünse ailenizle yaşadığınız şehirden farklı bir şehirde)
Mümkünse yazılım mühendisliği sizin için uygun olacaktır.
Üniversiteler için "hiçbi'şey göstermiyorlar" efsanesi vardır ve çoğunlukla doğrudur.
Ama üniversiteler, lisedeki gibi hazır bilginin önlerine sunulmasını beklemek yerine kendini belli bir konuda geliştirmek için çaba sarf edecek öğrenciler için harika bir ortamdır. Sizi alanınızla ilgili olabilecek birçok alanda bi'şeyler öğrenmeye mecbur tutar. Kendi başınıza öğrenmeyi gereksiz göreceğiniz konularda projeler yazmanız beklenir mesela. Oysaki üniversitenin size verdiği derslerin çoğunu bir "yazılımcı" olarak bilmelisinizdir aslında.
Üniversite ortamında katılıp güzel deneyimler kazanabileceğiniz kulüpler vardır.
Üniversiteler araştırma yapıp kendinizi geliştirebileceğiniz birçok ortam sunar. Gidip ilgi duyduğunuz bir konuda yazılmış yüksek lisans veya doktora tezlerini inceleyebilirsiniz mesela. Hemen oracıkta, kütüphanedeler...
Ortaklaşa iş yapabileceğiniz kafa dengi insanlar bulmanız kolaydır. Oraya sizin gibi yazılıma meraklı birçok öğrenci geliyor.
Kendi kendine öğrenme işini üniversite okurken de yapabilirsiniz.
İleri düzey konularda danışıp bilgi alabileceğiniz bir çevrede olacaksınız. Probleminizi sınıf arkadaşlarınız çözebilirler. Üst sınıflardan birileri de çözebilirler. Yüksek lisans öğrencileri de çözebilirler. Daha da ileri gidin. Doktora için ileri seviye yazılım geliştirmekle uğraşan insanlar var orada.
Kendi bölümünüzle sınırlı da değilsiniz. Üniversiteye gittiğinizde tüm bölümler size açıktır. Matematikçi bir profesör ile istatiksik üzerine kurulu bir yazılımın nasıl bir algoritması olabileceğini tartışma imkânı bulabilirsiniz mesela.
İyi bir şirkete girip kendinizi daha hızlı geliştirmek mi istiyorsunuz? Staj yapın. Hatta gidin ücretsiz çalışın. Yorulursunuz ama öğrenirsiniz.
Üniversitenin gereksiz olduğu, zaman kaybı oluduğu düşüncesi çoğunlukla öğrencilerle alakalıdır.
Üniversiteyi lise gibi okumaya çalışırırsanız lisede elde ettiğiniz kadarını bile elde edemezsiniz.
Ama oraya gerçek bi'şeyler yapmaya gidiyorsanız daha iyi bir ortamı kolay kolay bulamazsınız.
Sevgili bazı prototurk.com soru-cevap bölümü kullanıcıları,
Bir soruya doğru yanıtınızı aldığınızda yanıtı "Doğru Cevap" olarak işaretleme nezaketi gösterirseniz aynı sorulara tekrar tekrar girip bakmamış oluruz.
Sorunuza çözüm bulamadıysanız da neden çözüm bulamadığınıza dair bi'şeyler yazıp konuyu ilerletin veya kendi başınıza çözdüyseniz kendi çözümünüzü yazıp doğru cevap olarak işaretleyin en azından.
Bi'başlık açıyorsanız cevap verenlere saygı gösterip başlığınızın takibini de yapmanız pek güzel olur.
for/foreach döngüsü işinizi görmüyor mu?
$hedefler = [
'https://www.ornekLink1.com/a-1',
'https://www.ornekLink1.com/a-2',
'https://www.ornekLink2.com/b-1',
'https://www.ornekLink3.com/b-1',
'https://www.ornekLink4.com/b-2'
];
$sonuclar = [];
foreach($hedefler as $hedef) {
$ct = curl_init();
curl_setopt($ct, CURLOPT_URL, $hedef);
curl_setopt($ct, CURLOPT_HEADER, 0);
$sonular[] = curl_exec($ct);
curl_close($ct);
echo "<div>$hedef için curl isteği tamamlandı.</div>";
}
Denemek lazım... Sırayla tüm isteklerin sonuçları $sonuclar
array'ına işlenecek.
O zaman sanırım veritabanında tuttuğunuz verilerle ilgili bir sorun olabilir.
emlakci tablonuzda premium_1, premium_2 ve premium_3 adında sütunlarınız var.
Ayrıca premium_uyelik tablonuzda da bu alanlar var.
Hem emlakci hem de premium_uyelik tablolarından kayıt çekerken tek bir id değeri kullanıyorsunuz. Sanırım bir üye kaydı yaptığınızda üyenin 2 tabloda da kaydını oluşturuyorsunuz ve id'lerin böylece aynı olmasını sağlıyorsunuz. Burada bir sorun var gibi geldi bana.
Eğer premium üyelikleri ayrı bir tabloda tutacaksanız, emlakci tablonuzda 3 adet premium durumu tutmak yerine premium_uyelik tablosuyla ilişki kurabileceğiniz 1 adet premium_uyelik_id adlı sütununuz olmalı. Yani:
emlakci tablosu sütunları: id, kayit_tarihi, premium_uyelik_id şeklinde olmalı.
Buradaki premium_uyelik_id sütunu, kullanıcının premium üyeliği varsa premium_uyelik tablosuna kaydedildiği id değerini tutmalı. Kullanıcı premium üyelik almamışsa bu değer 0 olmalı.
Siz ilk kez sisteme kaydolan kullanıcıya direkt 1 haftalık premium paketlerini hediye ettiğiniz için kullanıcı kayıt olduğu anda iki tabloda da kullanıcıya kayıt açmalısınız ve premium_uyelik tablosunda kullanıcının id değerini alıp emlakci tablosundaki premium_uyelik_id sütununa yazmalısınız.
Böylece artık emlakci tablosunda sadece üyenin herhangi bir premium paketi olup olmadığını tutmuş olacaksınız. Premium detaylarını da premium_uyelik tablosunda tutuyorsunuz zaten.
Daha sonra bir premium paketinin bitiş tarihini nasıl hesaplayacağınızı kurgulamak lazım. Burada hesaplamayı "+1 week" şeklinde yapmamalısınız.
premium_uyelik tablosunda kayıt oluştururken zaten ne süreyle premium üyelik verdiğinizi biliyorsunuz. Bu yüzden bu tabloda paketin bitiş tarihini tutmalısınız. Mesela premium_1 sütununda, bu üyenin 1. premium paketinin hangi tarihte sona ereceği bilgisi direkt tutulabilir. Eğer kullanıcı bu paketi hiç almamışsa buranın değeri NULL olur.
Böylece örneğin şöyle bir veritabanı yapısına kavuştuk:
emlakci
id: 123
kayit_tarihi: '2022-06-23 15:55:24'
premium_uyelik_id: 23
premium_uyelik
id: 23
premium_1: '2022-06-30 15:55:24'
premium_2: '2022-06-30 15:55:24'
premium_3: '2022-06-30 15:55:24'
Bu üye sisteme 23 Haziran'da kaydolmuş. Biz de kayıt tarihinden itibaren 1 hafta sonra sonlanmak üzere 3 premium paketi de vermişiz.
Sonra mesela bu üye paketleri incelemiş ve premium_2 paketini beğenip 1 aylığına almak istemiş olsun.
O zaman bu üyenin premium_uyelik_id sütununa bakarak 23 değerini elde ederiz.
premium_uyelik tablosundaki id=23 olan sütunun premium_2 sütunundaki tarihi alırız.
Bu tarih geçmiş bir tarih mi?
EVET: O zaman premium_2 alanına bugünün şu anından itibaren 1 ay sonrasının tarihini yazarız.
HAYIR: O zaman premium_2 alanındaki tarihi alır, bu tarihe 1 ay ekler, yeni tarihi buraya yazarız.
Böylece premium_uyelik tablosunun id=23 satırının son hali şöyle olur:
id: 23
premium_1: '2022-06-30 15:55:24'
premium_2: '2022-07-30 15:55:24' (1 hafta + 1 ay)
premium_3: '2022-06-30 15:55:24'
Kontrollerimizi yaparken artık işimiz çok kolay. Üyenin herhangi bir premium üyeliği var mı diye emlakci tablosundaki premium_uyelik_id değerine bakarız. Bu değer NULL veya 0 değilse belli ki premium üyeliği var veya daha önce en az bir kere premium üyelik almış. (Tabi siz kaydolan her müşteriye premium verdiğiniz için bu mecburen olacak)
Sonra bu değer ile premium_uyelik tablosuna gider, her bir premium paket için kayıtlı tarihi kontrol ederek günü geçmiş mi diye bakarız.
Günü geçmemiş olanlar aktiftir. Günü geçmiş olanları umursamamıza gerek yok.
Uzun bir cevap oldu. Umarım anlaşılır olmuştur. Kurgu yazması kolay. Kodlamasında kolay gelsin... :)
PHP ile bir yönetim paneli yapıp güncelleyemediğiniz yer neresi?
1) Kurgunuz şu şekilde mi?
Sizin 1 adet premium üyelik özelliğiniz var. Paketler, bu premium özelliklerine ne kadar süreyle sahip olunacağını belirtiyor.
1.paketi seçerlerse 1 haftalık premium üyelik kazanmış oluyorlar.
2.paketi seçerlerse 1 aylık premium üyelik kazanmış oluyorlar.
3.paketi seçerlerse 1 yıllık premium üyelik kazanmış oluyorlar.
2) Yoksa kurgunuz şu şekilde mi?
Sizin 3 adet premium üyelik özelliğiniz var. Paketler, hangi premium özelliklerine sahip olunacağını belirtiyor.
1.paketi seçerlerse 1.premium üyelik özelliklerini almak için 1 hafta, 1 ay, 1 yıl seçenekleri mevcut.
2.paketi seçerlerse 2.premium üyelik özelliklerini almak için 1 hafta, 1 ay, 1 yıl seçenekleri mevcut.
3.paketi seçerlerse 3.premium üyelik özelliklerini almak için 1 hafta, 1 ay, 1 yıl seçenekleri mevcut.
Anladığım kadarıyla 2. kurgu sizin için geçerli çünkü kayıt tarihinden itibaren 1 hafta boyunca 3 paketi de hediye ediyorsunuz.
Yani 3 farklı premium üyelik özelliklerini kayıt tarihinden itibaren 1 hafta boyunca kullanıcıya hediye etmek istiyorsunuz.
2 kurgu da üzerine ayrı ayrı düşünelecek kurgular. Sizinki hangisiyse ona göre ilerleyelim.
NOT: "dahi" anlamındaki tüm -de'leri bitişik, hal eki olan tüm -de'leri ayrı, ayrı yazılması gereken tüm soru eklerini bitişik yazıyorsunuz. Bu TDK'ye bir tepki mi diye düşündüm bi'an.
@kartal, local storage ile ilgili sorularınıza yanıt vereyim.
- local storage için domain başına 5mb alan ayrılır. Bu alanı açmak için sizin yapmanız gereken bi'şey yok. Bu alan hep açıktır.
- Başka sitelerin local storage'yi doldurması mümkmün değildir. Tarayıcı, local storage'yi her domain için ayrı ayrı tutar.
- Başka bir sitenin sizin local storage'ınıza ulaşma şansı yoktur. Dizin domain'inize ayrılmış local storage'a sadece sizin domain'inizle erişilebilir.
- Eğer bir tarayıcının sizin siteniz için ayrılan local storage'ı dolmuşsa yeni veri ekleyemezsiniz. Eklemek istediğinizde konsolda QUOTA_EXCEEDED_ERR hatası fırlatıldığını görürsünüz. Daha doğrusu o kullanıcı bu hatayı görür. Bu hata çıktıysa tarayıcı local storage'a veriyi yazmaya çalışmaz. (yani verinin yarısı yazıldı, geri kalanı yazılamadan kota doldu gibi bir durum olmaz. yeni veri yazıldıktan sonra kota dolacaksa tarayıcı local storage'ı değiştirmeyecektir.)
- Bazı tarayıcılar local storage'ın alanının artırılmasına izin verebiliyor (Opera, Firefox) sanırım ama tabi bunun bir anlamı yok çünkü kullanıcılardan tarayıcı ayarlarına girip bizim için düzenleme yapmalarını bekleyemeyiz.
Bu durumda herhangi bir input'un input olayı tetiklendiğinde tüm input'ları kontrol etmelisiniz.
Kodunuzda şu değişikliği yapabilirsiniz:
$inputRequired.on("input", function() {
let buttonWillBeActive = true; // kontrolümüzden sonra bu değer halen true kalırsa butonu aktif edeceğiz.
for(i=0; i<$inputRequired.length; i++) { // tüm input'ları tek tek dolaşıp değerlerini kontrol edelim.
const val = $inputRequired.eq(i).val().trim(); // şu an baktığımız input'un değerini alalım.
if(!val) { buttonWillBeActive = false; break; } // değer boşsa buttonWillBeActive değerini false edip döngüden çıkalım.
}
if(buttonWillBeActive) buttonActived(); // buttonWillBeActive değeri kontrolden sonra halen true kalabilmişse buton aktif olacak.
else buttonDisabled(); // buttonWillBeActive değeri kontrol sırasında false edilmişse buton pasif olacak.
});