Yazar: admin

  • Devlog 2026 Eylül

    Öncelikle selamlar. Bu ayki geliştirmeleri sizlere aktarmak isterim.

    XDraw

    Mobil versiyonu Google Play store’da

    Uzun süre sonra ilk kez bir uygulama yükledim. Tabi eski google play hesabım kapandığı için mecburen bi 25 dolar verdim. Normalde web teknolojilerinin istenirse verimli olabileceği tarafındayım ancak web’te yayılmak kolay değil. Bu nedenle insanlara ulaşabilmemin kolay bir yolu olacağını düşündüm ama 12 kişilik beta’dan dolayı güzel patladım. Bu nedenle katılmak ve beni desteklemek isterseniz Google Forms üzerinden başvurabilirsiniz.

    Resim export

    Artık çizimler ekran boyutuna ya da en uç sınırlara göre export yapabilirsiniz. Bazı konfigürasyonlar ve ölçekleme de ayrıca yapılabiliyor…
    Export penceresi
    "Günün Teto Kelimesi", XDraw içinde çizildi ve export alındı

    Webworker

    Bu zamana kadar hep tek thread tek thread dedim. Ancak tabi ki webte de alternatif bir teknoloji var. Webworkerlar ile ana threadden worker’a postmessage ile veri gönderip gelen veriyi onmessage ile alabiliyoruz. Peki şu ana neden kullanmadığımı soracak olursanız:

    • XDraw’ı olabildiğince optimize ederek webworker bağımlılığı olmadan kullanılabilirliği sağlamak istiyorum
    • Çizim esnasında çok büyük bir obje oluşuyor. Bu büyük objeler Worker’a ya da Worker’dan geçişi sırasında yavaşlatabiliyor.

    Bu nedenle kısmen webworker’a geçildi. Bu ikinci nedenden dolayı veri deltaları üzerinde çalışıyorum. Delta’lar postmessage ile gönderilecek ve onmessage ile buffer alınacak. Şu an zaten aktif ancak eğer hata olursa bildirebilirsiniz ve web workersız versiyonunu mouse ya da kalem butonuna iki kez tıklayıp diyalogta “Gezinme ayarları” kısmından kapatabilirsiniz.

    Diğer geliştirmeler

    • Neolit tarafında değişiklikler requestBrowserAnimation‘a bağlanarak akıcılık sağlandı. Kullanıcının görmeyeceği değişikleri anında uygulamak yerine gerektiğinde yapılması sağlandı. Bu nedenle de pan (gezinme ve yakınlaştırma) sırasında gridler ayrı kanvas çizimleri ayrı oynamıyor.
    • HSL Renk seçimi artık yapılabiliyor.
    • Eski renk seçildiği anda renk silinmek yerine artık geçmiş renkler diyaloğunda ilk sıraya atanıyor.

    Lotus

    Her şeyi otomatize etmeye çalışmak bir hataydı…

    Lotus uygulamasında 1 sene boyunca aynı soru kitaplarının kalmasının bir sebebi de buydu. Önce planım şuydu, basılı olan tedavülden kalkmış kitaplardan sorular okumaktı, hem de ileride Yayınevlerinin ya da hocaların basmış olduğu soruları da sisteme aktarabilmesi için de önemli. Bunu layoutparser ile planlıyordum ancak hem Python’un saçma sapan sürüm sorunları, hem de soru bankalarının düzenini okuyamamasından dolayı devam edemedim. Çünkü soruların iskeletininin bir çok parçasını kendim eğitmem gerekiyordu. Ve tek bir soru için de değil. Zaten yapay zeka’nın özünde zaten yazılmış çizilmiş trilyonlarca verinin eğitilmesi ve onların matematiksel bir formüle dönüşmesi var.Ancak tek başıma bunu kaldıramadım, eğitimin de uzun sürmesi bu işi bırakmama neden oldu. Ve daha kötüsü “otomatize” etme amacım benim 1 sene boyunca kitap eklemememe sebep oldu. En önemli şeyleri unutup insanları çekmek için çok başka şeylerle oyalandım, postral bir tık gerekliydi ama bilmiyorum…

    Ama şunu biliyorum ki bir işe her gün bir dakika ayırmak, yılda 6 saat o işe zaman ayırmak demek. 1 yıl ile 6 saat dışarıdan öksüren bebek vs oksijen bombası gibi görünüyor, madalyonun bir diğer yüzünde yılda o işe 6 kat daha fazla zaman ayırmak demek. İşin özü zaten çok zaman ayırmakta değil, her gün zaman ayırabilmekte gizli.

    Bu yüzden bir işi haldır küldür bitirmeye çalışıp ertesi gün hiçbir şey yapmamaksa, her gün ona az da olsa zaman verip devamlı yapmak çok daha fazla katkı sağlayacaktır.Ve ayrıca Hustle kültürü bu “çok çalışma” illüzyonuna inanmamızı sağladı ancak inanmayın. Hustle kültürü, başarı vaadiyle insanı kendi kendisine yabancılaştıran en büyük modern çağ yalanlarından birisidir; üretkenlik maskesi altında insani sınırlarımıza, sağlığımıza ve yaratıcılığımıza yapılmış en büyük suikasttır.

    Bu yüzden Melih Abuaf’ın her gün video atma meydan okuması gibi ben de her gün en az 1 soru yazma hedefi koydum… Elimde hiç bir şey yokken bile en azından azar azar da olmuş olsa kitap sayısını çoğaltacağımı umuyorum

    Düzenleme: 4 işlem sorularında bu şekilde baya ilerleme sağladım, 15 sorudan neredeyse 39 soruya kadar getirdim. Yalan yok çoğu basit matematik işlemleri. 1 sene sonra sonunda bir kitap yayınlayabileceğim aşdasdkşdkasş. Son günlerde bunu XDraw ve diğer durumlardan ötürü yapamadım ama tekrardan bir düzene oturtacağıma inanıyorum.

    Düzenleme 2: Evet sonunda yayınladım. 2 sene sonra bir ilk gerçekleşti 😀 Aşırı basit sorular olduğundan dolayı zaten kolaydı ancak bir dahaki sefer Fizik elektrik konusunu yayınlamayı deneyeceğim… Bu arada 4 işlem soruları kitabına da buradan ulaşabilirsiniz

    Soru önizlemeleri

    Artık soru listesinde soruların önizlemesi gözüküyor. Her save’de sunucu tarafından Markdown => Html dönüşümü yapılıyor

    Diğer geliştirmeler

    • Artık düzenleme ekranında soru sıralama bölümünde konular da sıralanabiliyor
    • Sorulara ve diğer markdown editör alanlarına spoiler ekleyebilirsiniz. EKlemek için editöre !! spoiler olacak metin !! yazarak (yani iki ünlem ile başlayıp iki ünlem ile bitirdiğimizde) bir buton şekline gelecek.

    Postral

    Postral’e özel taraflarda çok büyük bir şey yapmadım açıkçası. Bazı refund ve payment ile ilgili buglar çözüldü. Bunlar refund yapıldığı anda hiç tamamlanmamasına neden oluyordu. Öte yandan artık iade’de ve faturada not yazılabiliyor. İade kısmında hem müşteri, hem de yetkili notu ayrıca ekleniyor.

    Karma (Lotus, Postral ve UBS Mona Platform)

    Minky-Reform geliştirmeleri

    Hem lotus hem de postral için geliştirdiğim bir framework var. Angular Forms ve FormControl yerine buna geçtim. Hem istek atılacak endpointe birebir aynı veriyi gönderme ve Typescript sınıfı içerisinde dekorasyonlar ile tek bir yerden kontrol sağlıyoruz. Ancak dinamik veri değişikliklerinde çok yavan kalıyordu. Yoğun bir kodbase olduğundan dolayı biraz bunu açıklamam gerekiyor. Reform’un hikayesi eski projelerden kalan bir şey. Sonra başka bir yazıda anlatabilirim ama uzatmak istemiyorum…

    Birincisinde Eyalet olan şehirde ilçe seçilebiliyor. Eyaletli yani subentity’li ülkeler Ülke => Eyalet/Subentity => Şehir => İlçe olmakta. Bu nedenle İlçe yazılması gerekiyor

    İkincisinde Eyalet olmayan ülkelerde (örn: Türkiye)de durum Ülke => Şehir => İlçe olakta. Bu nedenle subentity yok ve ilçeleri select listesinden seçtirebiliriz. En alttaki ilçe yazısı zaten disabled kalıyor.

    Bu kısmı geliştirmeye devam edeceğim çünkü ilk açılışta disable olması gereken alanlar disabled olmuyor. Reform apisinde onChange’i önden bir tetiklemek gerekiyor…

    Nestjs, Angular ve NX Güncellemeleri

    En son sanırım 1 sene önce güncellemiştim ancak paketleri resolve etmek ve eski dependencylerden dolayı yükseltme kolay olmuyor. Ancak github açık bildirimlerinden dolayı zorunda hissettiğim için versiyonlar yükseltildi. Angular tarafında zoneless yapısı artık stabil hale geldi, ben ilk çıktığından sanırım 5 ay sonra zoneless’a ve signal yapılarına entegre etmeye başlamıştım. Şu anki signal yapısını daha tutarlı buluyorum.Hem zonejs’in dökümanı baştan aşağı tarama gibi bir ağır iş olmadığından dolayı hem de = operatörü ile atama yapmanın verdiği tekinsizlik signal.set() ve signal.update(data => {data.foo = 'bar'; return data}) ile ortadan kalmış olduğundan dolayı. Tekinsizlik hissi şundan dolayı aslında çok önceki sürümlerde string ya da farklı bir obje ataması yapıldığında ekran güncelleniyor, ancak ekranda basılan bir obje alanları varsa, ve bu objedeki alanlar değiştiriliyorsa, ram’deki referans değerleri aynı olduğundan herhangi bir değişiklik olmuyordu. Tabi sonradan çözülmüştür ya da ben spread operatörü (...) ile değiştirdiğimden sanırım hissetmiyordum. Ancak bu işin oluru maalesef bu. Ben neolit’i geliştirirken de bu mantığı kullandım. Neolit de uzun hikaye ancak XDraw’ın monoreposu olan Lotus-neo’dan inceleyebilirsiniz. Özet geçmek gerekirse, react çakması bir şey. React’in kendisini sevmiyorum ancak react’in yaşadığı sorunları sanırım böyle çözebiliyorum. Neolit ve dolayısıyla XDraw için bu repoyu inceleyebilirsiniz

    Son sözler

    Bu eylül ayında projelerimde gelişmeler bu şekilde. Eğer bu yolda beni desteklemek isterseniz XDraw uygulamasının kapalı betasına katılabilirsiniz. Ve ya bunlar olmazsa bile eğer çalışmalarımı beğenirseniz İstanbul Avrupa yakası çevrelerinde çalışmaya açığım.

    Buraya kadar okuduğunuz için çok teşekkürler. Geribildirimleriniz ve yorumlarınız ve hatta en azından like atarsanız mutlu olurum. Kendinize dikkat edin, seviliyorsunuz 🌹

  • Devlog 2026 Ağustos

    Herkese selamlar. Umarım iyisinizdir. Öncelikle 30 Ağustos Zafer Bayramımız kutlu olsun. Bu ayın sonunda Uygulamalarda yaptığım değişiklikleri, düzeltmeleri ve özellikleri sizlere anlatmak isterim.

    XDraw

    Daha önce yaptığım optimizasyonlara ek olarak daha farklı optimizasyonlar yaptım.

    Garbage Collector baskısı

    Yüksek seviyeli dillerde hep olan ve varlığını hissetmediğimiz bir durumdur. Çöp toplayıcısı olarak çevrilebilir. Bu atıl durumdaki değerleri, referansları RAM’den silmeye yarar.

    C gibi dillerde RAM’den bir alan almak için malloc, calloc ve yeniden boyutlandırmak için realloc kullanmamız gerekiyor. Ve daha da önemlisi bu referanslarla işimiz bittiği sırada free kullanarak değerleri temizlememiz gerekiyor. Yoksa uygulama sürekli RAM’i şişirecekti ve en sonunda en iyi ihtimalle OutOfMemory ile crashlenecekti, ya da işletim sistemini bir deadlock’a sokarak tepkisiz hale getirecektir.

    Daha doğrusu gerekiyordu… Artık bunu bizim yerimize yüksek seviyeli dillerin çalıştırıcısı (Örn: Java VM, Javascript içinse V8 ve benzeri motorlar) yapıyor. Örneğin: void metot çağırılıp bitiyorsa, orada örnek bir obje olarak

    const userInfo = {
      name: "Hüseyin Can",
      surname: "Gündüz",
      isNewUser: true,
      foo: "bar",
    };

    buradaki userInfo objesi void metot bittikten sonra garbage collectorler tarafından temizlenir. Eğer saniyede maks 10-15 kere oluşturuluyorsa, bunun varlığını hissetmezsiniz. Ancak bu çok fazla oluyorsa zaten tek thread’de çalışan kod çok daha fazla kasmaya neden olacaktır. Örneğin, kanvas’ta crop edilirken noktalar için, arrayleri filter ile filtreliyordum. Ekranda görünmeyen noktaları filtreliyordum.

    ...
    determinedPoints = drawElement.points.slice(startIndex, endIndex + 1);
    ...

    Bu Array.slice metodu indeksler arasındaki kısmı alıp yeni array olarak veriyor. Tabi ki bu array, canvas’a rasterize edilirken her bir fırça vuruşuna dönüşüyor, ve ardından atıl durumda beklemeye başlıyor. Tabi deminden dediğim gibi bu saniyede olan bir şey değil, milisaniyede muhtemelen bin kez olan bir şey. Bu yüzden de zaten hali hazırdaki tüm noktaları yeni array olarak oluşturmak yerine direkt element içindekini aynen veriyorum. Rasterizer bunu zaten değiştirmiyor ya da düzenlemediği için ise ekstra atıl durumda bir obje de oluşmuyor.

    onFound({
      ...initialFoundElement,
      element: drawElement,
      elementId: drawElement.id,
      elementType: drawElement.type,
      points: drawElement.points,
      pointStartIndex: startIndex,
      pointEndIndex: endIndex,
      color: drawElement.color,
      partial: partial,
    } as any as XDrawElementCropData);

    Ve ayrıca tek bir döngüde ilk ve son noktaları kontrol edebiliyoruz. Ekranda görünen uç noktaları startIndex ve endIndex olarak ayarlayabiliyoruz.

    const scanCount = Math.ceil(pointCount / 2);
    for (let i = 0; i < scanCount; i++) {
      const lastIndex = pointCount - 1 - i;
      if (startIndex === -1 && cropCondition(drawElement.points[i])) {
        startIndex = i;
      }
      if (endIndex === -1 && cropCondition(drawElement.points[lastIndex])) {
        endIndex = lastIndex;
      }
      if (startIndex !== -1 && endIndex !== -1) {
        break;
      }
    }

    Bu sayede en az bir indeks ekranda görünüyorsa (startIndex > -1 || endIndex > 1 ) bunu ekrana çizdiriyoruz. Yoksa görünmeyecek…

    Ve ayrıca, bir obje ile işimiz bittiği sırada ve final, readonly ya da const ile değişkeni bir sabit olarak tanımlamamız gerekmiyorsa, normal değişken olarak tanımlayıp sonradan da degisken = null atanarak GC’ye daha az iş düşmesini sağlayarak verimlilik elde edebilirsiniz. Tüm dillerde farklı olabilir ama aklıma javascript geldi.

    OffscreenCanvas, part 2

    Aslında planım Offscreencanvas kullanmak yoktu ancak çok daha fazla tepkisel hale getirmek istiyordum. Bu yüzden ilk önce tüm elementlerin cachelerinde kendilerine özel bir OffscreenCanvas ekledim. Sonuç hüsrandı çünkü çok ama çok fazla elemente tek tek canvas eklemek yine astarı yüzünü geçiyordu. Tabi yine Claude ve diğer Github Copilot modelleri ile bol token ikramlı gırgır şamatadan sonra tüm alanı rasterize ederek cachelemeye karar verdik. Burada tam ekranın biraz marginli (ekrandan %50 civarı daha büyük çözünürlüğünü croplamak) rasterize ediyoruz. Ve bu durumlarda tekrardan rasterize ediliyor.

    • Silgi ile silinirse
    • Çok fazla yakınlaştırıp uzaklaştırılırsa
    • Kaydırmaya başladığından itibaren kaydırılma x ve y’si margin’den daha fazla kaydırılırsa
    • Kalem ile çizim tamamlanıp ekrandan kalem çekilirse, ya da mouse up olursa

    O zaman cache geçersiz sayılıyor ve tekrardan çizdiriliyor.

    Ve ayrıca akıcılık bozulmaması için aktif çizilen element cache’den bağımsız şekilde çizilmeye devam ediyor.

    Izgaralar artık CSS’de

    Tablette denemeler yaparken şunu farkettim. Eğer gridler açık ise tepkiselliği azalıyor, kapalı ise artıyor. Çünkü yine her rasterize işleminde OffscreenCanvas cacheden bağımsız gridler her bir fırça darbesi ile tekrar tekrar çiziliyordu. Elbette cache’ye dahil edilebilirdi, ancak yeniden oluşturması da biraz daha ağırlaşacaktı. Tek thread sürekli dediğim şey ancak klişe bile olsa web app geliştirdiğim için bu biraz önemli. Ve biraz daha düşününce aslında tarayıcıların bu kadar ağır durumu daha iyi kompanse ediyorlar. Bu yüzden canvas’ın arka planını tamamen saydam bırakıp tamamen css sınıfına yöneldim

    gridSize = computed([this.zoomFactor], ([zoom]) => {
      const gridSizeRaw = 20 * zoom;
      return gridSizeRaw + "px " + gridSizeRaw + "px";
    });
    
    /// Kaydırılırken sanki tam kayıyor hissi vermesi için (x * zoom bölü size) işleminden kalan sonuç, (yani mod) kadar bi kaydırıyoruz...
    gridOffset = computed(
      [this.worldX, this.worldY, this.zoomFactor],
      ([x, y, zoom]) => {
        const gridSizeRaw = 20 * zoom;
        return `${-(x * zoom) % gridSizeRaw}px ${-(y * zoom) % gridSizeRaw}px`;
      },
    );
    
    gridLineWidth = computed([this.zoomFactor], ([zoom]) => {
      return zoom + "px";
    });
    
    canvas = (
      <canvas
        id="myCanvas"
        width={this.canvasWidth}
        height={this.canvasHeight}
        style={{
          cursor: "crosshair",
          touchAction: "none",
          "--gridSize": this.gridSize,
          "--gridOffset": this.gridOffset,
          "--lineWidth": this.gridLineWidth,
        }}
        className="xdraw-grid xdraw-grid-lines" 
      ></canvas>
    );

    Normalde rootta verdiğimiz değişkenleri style içine --değişken olarak verebiliyoruz. Tabi bu değişkenler piksel biriminde ifade etmek için sonu px ile bitirerek string olarak veriyoruz. Ve en önemlisi ise css sınıflarımız…

    .xdraw-grid {
      background-repeat: repeat;
      background-clip: content-box;
      background-origin: 0px 0px;
    }
    
    .xdraw-grid-lines {
      background-image:
        repeating-linear-gradient(
          0deg,
          rgba(139, 139, 139, 0.3) 0px,
          rgba(139, 139, 139, 0.3) var(--lineWidth),
          transparent var(--lineWidth),
          transparent var(--gridSize)
        ),
        repeating-linear-gradient(
          90deg,
          rgba(139, 139, 139, 0.3) 0px,
          rgba(139, 139, 139, 0.3) var(--lineWidth),
          transparent var(--lineWidth),
          transparent var(--gridSize)
        );
      background-position: var(--gridOffset);
      background-size: var(--gridSize);
    }

    Ve bu sayede çizimlerde çok daha fazla akıcı gezinme sağlanabiliyor.

    Tabi ki burada gösterebilmek adına basitleştirdim. Çok daha fazlası kaynak kodlarından inceleyebilirsiniz…

    Postral, Lotus UI ve UBS Mona Platform

    Country-State-City-District servisi

    Farklı bir dünyadan başka farklı bir dünyaya geçebiliriz. Öncelikle adres olayları karışık frontend’de saklamak için ise fazla büyükler. Bu yüzden ubs-platform/ubs-mona-mr içinde cscd adında yeni bir uygulama açtım. Bu uygulama countries(ülkeleri), subdivision (2. seviye sınırlar) ve locality(3. seviye sınırlar) saklanabiliyor. Eğer Subentity olarak geçiyorsa ülke ve subdivision’larda hasSubdivisions: true oluyor. Gerçi isimlendirmelerde fena batırmışım ama neyse 😅🤫. Bu sayede Postral’de adres alanları UBL’e şekilde doğru verilebiliyor.

    Eğer ülkede hasSubdivisions ise, countrySubentity alanları dolduruluyor, aksi halde cityName ve İlçe alanları dolduruluyor. Tabi otomatize edilebilir form alanları, dümdüz input tanımlamak yerine proje içinde Minky Reform adını verdiğim bir framework çalışıyor. Tabi burada ince ayar yapmaya vaktim olmadığı için alan adlarını daha otomatize edemedim ama o da planlarım arasında

    Bu arada çok fazla item olduğu zaman da artık yazarak filtrelenebiliyor. Yeni özellik gibi tanıtmak çok saçma ama maalesef bunu yeni ekleyebildim

    Postral Adres düzenleme - Bahçelievler/İstanbul/Türkiye

    Çoklu dil desteği

    Proje içinde bir dil seçim ekranı var, ancak neredeyse tüm string alanları “aman sonra hallederim” diye hardcoded şekilde yazdım. Ancak belli bir süre sonra çok baş ağrıtan bir şeye dönüştü. Çok fazla string hardcoded ve oluşturduğum kütüphane de yetersiz gelmeye başladı. Tabi @ubs-platform/translator-core ve @ubs-platform/translator-ngx üzerinde çalışmaya başlayacağım. Muhtemelen proje içinde çalışan bir sistem hale gelebilir npm’den kaldırıp. Kimse indirip kullandığını da düşünmüyorum, ve ayrıca gerçekten o kadar zahmete değmiyor… UBSMona’daki XR aracı gibi de scriptlemekle de uğraşmak istemiyorum ama o bir yana kalsın, yapay zeka desteği ile artık daha fazla sayfayı çevirmeyi başardım. Şu an sadece Türkçe ve İngilizce olmasına karşın daha fazla dil desteği eklemek istiyorum. RTL diller yakın zamanda gelemeyebilir, ya da arayüz değişimini yakın zamanda ekleyemeyebilirim.

    Postral tarafında diğer geliştirmeler ve bugfixler

    • Açık faturalar artık zaman aşımından etkilenmiyor. Komisyon ödemesi için açılan faturalar bir süre sonra kabul edilemez hale geliyor. O yüzden timeouttan etkilenmiyor.
    • Faturalar kısmında bir çok alan refactor edildiği için müşteri tarafında finalized olan faturalar gelmiyordu, bu düzeltildi.
    • Banka hesapları birden fazla eklenebiliyor. Ayrıca banka hesaplarının kabul ettiği para birimini de alıyor.
    • Artık payment snapshotları fatura oluştuğunda değil, ödeme anında oluşturuluyor. Önemli bilgiler anında kaydedilmiş oluyor…

    Son sözler

    Evet, bu ay baya araştırma ile ve bugfixlerle geçti. İleriki dönemlerde bir işe girebilirsem yavaşlayabilirim (mesai sonrası ve ya haftasonu gibi devam ederim) ancak son dönemin işten çıkarma olaylarından sonra vazgeçme gibi bir lüksümün olmadığını hatırladım. Bu ay içinde XDraw’ın web versiyonunu tetakent[nokta]com adresine yükleyeceğim ve daha da oturttuktan sonra Google Play’e yükleyeceğim bir aksilik olmazsa. Apple cihazlar için şu an ekstra bir şey söyleyemem. Çünkü müzik yapım gibi hobiler dışında çok Apple cihaz kullanan birisi değilim. Ancak UBS Mona ve Postral buildleri ARM64 için devam edecek. ARM32 için hem Raspberry Pi cihazım olmadığı için hem de CI/CD makinem yavaş olduğu için ara verdim.

    Buraya kadar okuduğunuz için çok teşekkürler. Geribildirimleriniz ve yorumlarınız ve hatta en azından like atarsanız mutlu olurum. Kendinize dikkat edin, seviliyorsunuz 🌹

  • Linux ve Docker yardımıyla bir başka bilgisayarı disk olarak bağlamak

    Eğer evde kullanılmayan bir kaç bilgisayarınız varsa bunlar bir dolapta öylece duracak ve tozlanacak. Windows sayesinde(!) de bir çok bilgisayar maalesef hurdaya döndü ancak Linux dağıtımları sayesinde hayata döndürmek ve hatta NAS benzeri bir dosya sunucusuna dönüştürmek mümkün.

    “Buna neden ihtiyacınım olabilir?” diye sorabilirsiniz. Belli dosyalarınızı arşivlemek, yer kaplayan ama önemli olabilecek dosyaları flaş ile uğraşmadan saklayabilmenin farklı bir yolu. İsterseniz birden fazla bilgisayarda çalışabileceğiniz dosyaları atıp iki bilgisayarda da çalışın, isterseniz de film cehennemlerinden indirdiğiniz filmleri saklayın. Orası sizin hayal gücünüze kalmış

    Gereksinimler

    • Docker’ın kurulu olması (eğer bilgisayarınız eski ya da hafızası düşük ise linux kurmanızı daha çok tavsiye ederim, windows bilgisayarda muhtemelen sanal makine üzerinden çalıştıracağından fazla verim alamayabilirsiniz)
    • Yerel ağ (Daha detaylı güvenlik önlemleri alınarak dışarı açılabilir ancak şu an için ihtiyacım yerel ağ idi. dışarı açmam gerekirse emin olun paylaşacağım)

    Yapılış

    Önce NAS yapacağımız bilgisayarın yerel ağdaki IPsini öğrenmemiz gerekir. Bunun için ise bu komutu kullanabiliriz


    hostname -I

    Bu bize yerel ağdaki ip adresimizi verecek. Örn: 192.168.1.21 gibi…

    Burada sunucu yazmanız gerekecek

    Ardından boş bir klasörde docker-compose.yml dosyasına bunları ekleyin


    name: ev-dosyasis
    services:
       nfs-server-alpine:
         restart: always
         ports:
             - 2049:2049
         container_name: nfs
         privileged: true
         volumes:
             - ./fileshare:/nfsshare
         environment:
             - SHARED_DIRECTORY=/nfsshare
         image: itsthenetwork/nfs-server-alpine:latest


    Bu imajın kaynak kodlarına https://github.com/sjiveson/nfs-server-alpine adresinden erişebilirsiniz

    docker-compose.yml dosyasını eklediğiniz klasörün içinde fileshare klasörü oluşturalım.

    docker-compose.yml dosyasını eklediğiniz klasörde son olarak bunu yazarak çalıştıralım:


    docker compose up -d

    Ve başka bir Linux bilgisayarda istediğiniz bir klasörde (Örn: “home/kullaniciadiniz” olan ev klasöründe) bunu terminal üzerinde çalıştırın


    mkdir ev-sunucu
    sudo mount -v [[SUNUCU ADRESİNİZ]]:/ ev-sunucu

    Artık ev-sunucu klasörünü oluşturduğunuz klasöre istediğiniz dosyaları atabilirsiniz.

    Ve diğer bilgisayarda işiniz bitince bağlantıyı kesmek için bunu kullanabilirsiniz

    Eğer sorularınız olursa yazabilirsiniz, bakabileceğimden emin değilim ama görürsem cevaplayacağım. Okuduğunuz için teşekkürler…

  • Türkçe hile kağıtları

    Selamlar. Hayatımın son 5-6 senesi daha çok linux’la geçti ve kendi işlerimi daha çok linux ve docker üzerine kurdum. Tek projeler yaparken bir sorun olmuyor ancak ekip çalışmalarında doğal olarak anlatmak zorunda kalıyordum. Tabi ki benim olmadığım durumlarda biraz sıkıntı olacak ki bunu github’ta linux ve docker üzerinde bilgileri bir git reposunda yazdım ve herkese açık olabilecek bilgileri de Github reposunda paylaştım.

    Github reposuna bu linkten ulaşabilirsiniz. Ve ayrıca bildiğiniz önemli bilgileri ya da yapmak istediğiniz contribution olursa PR’larınızı almaktan memnuniyet duyarım. Sevgiler…

  • İlk blog yazısı, sanırım

    Selamlar, ben Hüseyin Can Gündüz
    Yazılım geliştiricisiyim ve aktif olarak Java Spring boot uygulamaları geliştiriyorum. Yakında burayı daha fazla kodlama ile yazılarla dolduracağım. Bana ulaşmak isterseniz:

    Linkedin: https://www.linkedin.com/in/huseyincgunduz

    Github: https://github.com/huseyincangunduz