Ingilizce-Türkçe ya da Almanca-Türkçe Çeviri Eklentileri ve Uygulamaları

Merhaba dostlar. Dil öğrenimi uzun zaman alan bir süreçtir ve öğrenim sırasında ufak tefek seylere takılmak motivasyon kaybına yol açabilmektedir. Motivasyonu en cok bozan seyin basinda ise tek tek sözlükten kelime anlamina bakmak, sonra az ileride ayni kelimenin anlamina tekrar bakmak, ve unutursan daha ileride tekrar bir kez daha bakmak oldukça can sıkıcı. Iste bu yüzden bu ceviri sürecini asgari düzeye indirmek dil öğrenimi sirasinda oldukça motivasyonunuzun artmasini saglayacaktir.

Bu yazida Transover, Google Translate, Sesli Sözlük, Kindle Cloud Reader Translate eklentileri yani sira farkli ortamlarda (Calibre Epub viewer, Amazon Cloud Reader, Cloud ortamlar…) pratik ceviri yapabilmenizi saglayacak bilgiler sunulacaktir.

Şimdi sizlere alternatif olarak kullandığım eklenti ve uygulamalari tanitmak istiyorum. Belki benzer arayışlarda olan birilerine katkım olur.

Devamını Oku …

Java Spring Boot: Lazy Loading nesneler ve Dto Kullanimi

Merhabalar.

Bu yazida DTO (Data transfer Object) seklinde bilinen veri transfer nesnelerinin Spring Boot uygulamalarinda ne kadar elzem olduguna deginmeye calisacagim.

Somut bir örnek üzerinden meseleyi anlatmak gerekirse projemdeki Post, Category ve Comment tablolari icin Entity iliskilerine bakalim.

Post Entity sinifimiz:

package blog.model;

import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.*;


@Getter
@Setter
@NoArgsConstructor
@ToString(exclude = {"user", "comments", "categories"})
@EqualsAndHashCode(exclude = {"user", "comments", "categories"})
@Entity
@Table(name = "post")
public class Post implements Serializable {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @Column(columnDefinition = "CHAR(32)")
    private String id;

    @NotBlank(message = "title is mandatory")
    @Size(max = 100)
    @Column(name = "title", unique = true, nullable = false)
    private String title;

    @NotBlank(message = "content is mandatory")
    @Lob
    @Column(name = "content", nullable = false)
    private String content;

    @Column(name = "is_published")
    private Boolean isPublished = false;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_at")
    private Date createdAt;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "updated_at")
    private Date updatedAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @OneToMany(
            mappedBy = "post",
            fetch = FetchType.LAZY,
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private List<Comment> comments = new ArrayList<>();

    public void addComment(Comment comment) {
        comments.add(comment);
        comment.setPost(this);
    }

    public void removeComment(Comment comment) {
        comments.remove(comment);
        comment.setPost(null);
    }

    public void removeAllComments() {
        for (Comment comment : new ArrayList<>(comments)) {
            removeComment(comment);
        }
    }

    @ManyToMany(
            fetch = FetchType.LAZY,
            cascade = {CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(name = "post_category",
            joinColumns = @JoinColumn(name = "post_id"),
            inverseJoinColumns = @JoinColumn(name = "category_id"))
    private Set<Category> categories = new HashSet<>();

    public void addCategory(Category category) {
        categories.add(category);
        category.getPosts().add(this);
    }

    public void removeCategory(Category category) {
        categories.remove(category);
        category.getPosts().remove(this);
    }

    public void removeAllCategories() {
        for (Category category : new ArrayList<>(categories)) {
            removeCategory(category);
        }
    }

    public Post(String title, String content, User user) {
        this.title = title;
        this.content = content;
        this.user = user;
    }
}
Devamını Oku …

Angular 9 – Lazy Loading ve Multiple Layout Kullanimi

Bir site yapiyoruz. Sitede anasayfa bilesenleri,yönetim paneli ve ek olarak 404 sayfasi var. Normalde app-routing.mudule.ts de component bazli bir routing yapisi kurgulayabiliriz. Fakat sadelik ve kullanim kolayligi acisindan lazy-loading seklinde yüklenen modüler bir yapi kurgulayacagiz. Anasayfa bilesenlerini SiteModule altinda toplayacagiz. Site yönetim ile ilgili bilesenleri ise DashboardModule de toplayacagiz. PageNotFound mesaji icin ise bir component kullanacagiz.

Örnek site yapimiz bu sekildedir.
Örnek site yapimiz bu sekildedir.

app-routing.mudule.ts dosya icerigimiz su sekildedir:

import { NgModule } from '@angular/core';
import {Routes, RouterModule, PreloadAllModules} from '@angular/router';
import {PageNotFoundComponent} from "./page-not-found/page-not-found.component";
import {AuthGaurdService} from "./services/auth-guard.service";
import {LandingPageLayoutComponent} from "./shared/layout/guest/landing-page-layout/landing-page-layout.component";

const routes: Routes = [
  {
    path: '',
    loadChildren: () => import('./modules/site/site.module').then(m => m.SiteModule),
    data: { preload: true }
  },
  {
    path: 'dashboard',
    loadChildren: () => import(`./modules/dashboard/dashboard.module`).then(m => m.DashboardModule),
    canActivate:[AuthGaurdService],
    data: { preload: true }
  },
  {
    path: '',
    component: LandingPageLayoutComponent,
    children: [
      { path: '**', component: PageNotFoundComponent }
      ]
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: false, onSameUrlNavigation: 'reload', preloadingStrategy: PreloadAllModules})],
  exports: [ RouterModule ]
})
export class AppRoutingModule { }

Görüldügü üzere app-routing.mudule.ts dosyamiz SiteModule ve DashboardModule featured module kullanimi ile oldukca sade bir görünüme kavustu.

Devamını Oku …

Zebkit ile Canvas Uzerine HTML5 Çizimler Yapma

Merhaba arkadaşlar. Bu yazımda zebkit javascript kütüphanesini tanıtacağım.

Zebkit, canvas üzerine HTML5 öğeleri çizmenizi sağlayan MVC tabanlı bir javascript kütüphanesidir. Adı çok duyulmamış olmasına karşın HTML5 elemanlarının çizimi ve sunumunda oldukça güçlü ve maharetlidir. HTML5 elemanlarını çizimini yapmanın yanı sıra designer moduyla bu elemanların canvas üzerinde sürükle bırak ile yeniden konumlandırabiliyorsunuz. Tek sayfa uygulamalara ve mobil uygulamalara da destek veren Zebkit hiyerarşik kullanımı ile nesneye yönelik yazılımın tadını almanızı sağlıyor.

 zebkit.require("ui", "layout", function(ui, layout) {
        ...
        // create panel with border layout manager
        var panel = new ui.Panel(new layout.BorderLayout());
        // add button component at the top part of the container
        panel.add("top", new ui.Button("Button"));
        // add text area component to occupy central part of the 
        // container
        panel.add("center", new ui.TextArea("Text area"));
        ...
    });

zebkit-component

Zebkit bir Fabric.js kadar bilinir değildir. Fakat konu HTML5 şekilleri çizimi noktasına geldiğinde birçok anlamda ihtiyacınızı Fabric.js’den daha fazla karşılayacaktır. Oldukça gelişmiş dokümantasyona sahip olan Zebkit dokümantasyonu da oldukça gelişmiştir. Siyah ve beyaz teması ve özelleştirmeye açık yapısı Zebkit’in tercih edilebilirliğini artırmaktadır.

zebkit dokümantasyon

Eğer canvas kullanrak bir proje geliştirecekseniz ve HTML5 elemanlarının oldukça sık kullanıldığı, icabında designer ekranında bu HTML5 öğelerini konumlandırabileceğiniz bir yapı geliştirmek istiyorsanız Zebkit sizin için çok uygun bir seçim olabilir.

Zebkit büyük bir proje olmasına karşın geliştirici/destek veren kitle biraz sınırlı kalmış gibi gözükmekte (şuan Andrei Vishneuski öncülüğünde proje ilerliyor) fakat kütüphaneyi kullanırken karşılaştığınız sorunlarınızı açtığınız hata raporları ile bildirmeniz durumunda kısa sürede cevap almaktasınız.

Umarım yararlı olmuştur.

Drupalden Jekyll'ye Geçiş

Merhaba arkadaşlar. Uzun süre drupal ile haşır neşir olmuş biri olarak artık ben de Jekyll ile yazı yazanlardan biriyim.

Github Pages - Jekyll - Drupal

Drupal benim ilk olmasa da sevdiğim göz ağrılarımdan biriydi:) Ne varki drupal ile site geliştirmek ve daha da iyisini geliştirme çabaları esas amacın yani yazı yazmanın önüne geçti. En son edindiğim tecrübeler ile artık Github Pages üzerinde Jekyll statik site üretici kullanarak web sitemi geliştirme konusunda karar kıldım ve iyi de yaptığımı düşünüyorum:)

Devamını Oku …

Python ile Tanışmam

Merhaba arkadaşlar. Bugün TUTEV‘in Ankara’daki python seminerine katıldım. Tabi amacım derinlemesine bir giriş değil sadece bir keşif, farkındalığımı artırmaya yönelik bir serüvendi.

Seminer başladı ben de merak içinde acaba python’un hangi özelliklerine değinilecek, onu öne çıkaracak neler tarzı sorular kafam bunlarla meşgul. Derken beklediğim gibi olmadı, daha çok katılımcıların düşüncelerini paylaştığı bir tarzda gerçekleşti -giriş için yine de idare eder-.

Devamını Oku …

Composite C1: Açık Kaynak Microsoft Tabanlı İçerik Yönetim Sistemi ve Tercih Sebepleri

Merhaba arkadaşlar. Bu yazıda sizlere Windows tabanlı bir içerik yönetimi olan Composite C1‘den bahsedeceğim. Bildiğiniz üzere şuan piyasada irili ufaklı onlarca içerik yönetim sistemi var gerek ücretli gerekse ücretsiz. Peki o kadar içerik yönetim sistemi arasından Composite C1’in dikkatimi çekmesindeki sebepler ne? İşte bu yazıda Composite C1’i tercih sebebi yapabilecek özelliklere değineceğim

Devamını Oku …