ionian

Üye
  • Mesaj sayısı

    218
  • Üyelik tarihi

  • Son ziyareti

  • Days Won

    7

Mesajlar posted by ionian


  1. o jitin çalıştığı ortamı bilip ona göre optimizasyon yaptığı yalan dolan. jitin runtimeda yaptığı (hw ile alakası olmayan) optimizasyonlar var ama çok kısıtlı denebilir.

     

    Zamanında bir masaüstü bir de dizüstü sistemim vardı. Masaüstü işlemcim athlon64 idi ve centrino işlemcili düzüstü bilgisayarımdam çok daha performanslıydı. Hatta işlemcilerin kayar-nokta performansını ölçen ufak bir c++ fonksiyonu yazmıştım ve althlon64 ciddi oranda fark atıyordu. Sonra aynı kodu c#' a taşıdım ve testi onca kez tekrar etmeme rağmen bu sefer zayıf olan centrino işlemci daha yüksek skorlara ulaşıyordu. Hatta o dönem dhw' de @@ChipArchitect' e sorduğumda intel' in jvm ve clr ekipleriyle çok yakın çalıştığını ve yapılan optimizasyonlar neticesinde bu sonuca ulaşmanın mantıklı olduğuna dair şeyler söylemişti.

     

    Elbette teoriden gerçek hayata döndüğümüzde aradan bytecode/jit/vm katmanlarını kaldırmak özellikle işlemci yoğun 3D, decode/encode gibi durumlarda managed code' a büyük fark atar. Hatta native kodla yazılmış bir windows uygulaması dahi kullanıcı için daha pürüzsüz bir deneyim sağlayabilir. Ancak iis de host edilen bir asp.net uygulaması yalnızca ilk request de jit' ı devereye sokacağından ve sonradan gelen tüm istekleri bu derlenmiş native kod üzerinde çalıştıracağından managed ortam ve onun sağladığı avantajlardan yararlanmak çok daha isabetli bir tercih olur.

     

    Native kod lehine verdiğim örneklerin aksi de öne sürelebilir elbet. Örneğin bir thread' in windows için konuşursak ram bazında maliyeti 1mb' dır. Eğer siz C++ tarafında iyi bir thread pooling kütüphanesi kullanmıyorsanız .net de internal olarak gelen bu özelliği kullanan c# dilinde yazılmış bir uygulamaya göre daha fazla kaynak tüketebilirsiniz. Veya 'new' operatörünü düşünün; Bu operatör parametre olarak verilen boyut tutarında ram bloğunu os den talep ederek kendi process' ine tahsis eder. Bu işlem doğası gereği yavaştır ancak .net tarafında bu mekanizma şöyle çalışır; clr uygumanızın appdomain' i için örneğin 16mb' lık ram den bir alan tahsis eder. Halbuki sizin uygulamanız açılışta 4.5mb ram kullanmaktadır. İşte bundan sonra new operatörüne yapılan her çağrı 16-4.5=11.5 mb' lık yerden tahsis edilir ve stack-alloc işlemi kadar hızlıdır. Dolayısıyla performans olarak c++ uygulamasına memory-alloc işlemlerinde büyük fark atar. Ancak 16 mb sınırını aşarsanız performans anlamında çok sıkıntılı bir süreç başlayacaktır; clr uygulamanızın tüm thread lerini suspend eder ve os den 32mb bir alan tahsis edip sizin uygulamanızı memcpy benzeri bir fonksiyonla buraya kopyalar. Böyle bir durum oyunlar için kabul edilemezken sunucuda çalışan bir servis için çok daha fazla avantajlı olabilmektedir. managed-native performans farkları uygulamaların yapısına göre değişmektedir kısaca.

     

     

    @@ResetButton

    Yukarda başka bir arkadaş yeni yazılımcıların Python , Perl gibi dillere yöneldiğinden bahsetmiş. Pek bu şekilde öğrenebiliyorlar mı?

     

    Yeni nesil derken çömez geliştirici demek istemedik. Bahsettiğimiz kişiler programlamanın temellerini iyi bilen ve bir çok teknolojiye aşina olup hızlı sonuca gitmek için teknoloji seçimini o doğrultuda yapan insanlar. Örneğin twitter ilk olarak ruby on rails ile geliştirilmiş. İlerleyen zamanlarda performans kaygılarından dolayı scale-java' ya geçilmiş. Eğer ilk başta RoR lehine bir tercih yapılmasydı belki de bu kadar başarılı olamazlardı.


  2. oop olacaksa cpp yazıp her platformda ayrı compile etmek çok zor iş sanki de cross-platform uğruna bunca performans kaybına boyun eğdi millet. 

     

    Olay cross-platform olma durumu değil. Günümüz de bir çok os bir çok programlama ortamını zaten destekliyor. Sana kısaca şöyle özetleyim;

    C++ dört ana unsurdan meydana gelir. Bunlar;

    1. C dili
    2. OOP
    3. Template ler
    4. STL (Standard Template Library)

    ve bu kavramları öğrenmek ciddi biçimde zaman ve emek ister. Ek olarak dilin doğası gereği nesnelerin kopyalanma ve atama gibi durumlarda sergileği davranış biçimlerini belirlemek (ki bunlara dilimleme, çoklu kalıtımda oluşacak karmaşık delta aritmetiği dahil), bellek yönetimi, tipler arası geçişlerdeki problemlerden dolayı casting den kaçıp visitor pattern gibi farklı tasarım desenlerine yönelmek, referans ve işaretçi farkları, const kullanımı, exception-safety programlama, esnek operatör yükleme seçeneklerini düzgün kullanma, templating gibi sayısız konuda uzmanlık gerektirir. (Merak edenler Scott Meyers - Effective C++ ve Stephan Dewhurst - C++ Gotchas kitaplarına bakabilirler).

     
    Java ise tüm bu problemler için harika çözümler üretmiştir. Ek olarak sahip olduğu metadata yapısıyla günümüz iletişiminin temel taşları olan nesnelerin xml/json gibi standarlarla platformlar arası taşınmasına çekirdekten(reflection) destek verir. Diğer tarafta .net' in linq/lambda expression ları, dinamik tip desteği, async/await yapısyla multi-thread programlamayı çocuk işi haline getirmesini düşünürsek neden insanların bu platfromlara yöneldiğini daha iyi anlarsın. Olayın cross-platform olma ile alakası yok olsaydı zaten Nokia' nın  qt platformu alır yürürdü.
     
    İşte yukarıdaki sebeblerden ötürü kurumsal uygulamalarda java/.net kullanılır. Daha geçen yıla kadar windows hariç hiç bir platformu resmi olarak desteklemeyen .net' in tutma nedeni de budur. Yeni nesil ise bir yığın konfigürasyon dosyasıyla boğuşmak yerine @@kronus' un da belirttiği üzere hızlı, pratik ve iş gören basit çözümlere yöneliyor. (Örneğin wcf ve node.js de rest-api oluşturmaya çalışın ne demek istediğimi anlarsınız). Javascript' in sunucu tarafında bile bu kadar popüler olduğu bir dönemde javayı performanstan dolayı eleştirmek için 90 larda yaşamak gerek.
     
    Bonus olarak managed ortamın native ortamlardan neden daha performanslı olacağına dair 'Clr via C#' kitabında güzel açıklamalar vardı;
     

     

    You’ll probably find this hard to believe, but many people (including me) think that managed

    applications could actually outperform unmanaged applications. There are many reasons to believe
    this. For example, when the JIT compiler compiles the IL code into native code at runtime, the compiler
    knows more about the execution environment than an unmanaged compiler would know. Here are
    some ways that managed code can outperform unmanaged code:
     
    • A JIT compiler can determine if the application is running on an Intel Pentium 4 CPU and
    produce native code that takes advantage of any special instructions offered by the Pentium 4.
    Usually, unmanaged applications are compiled for the lowest-common-denominator CPU and
    avoid using special instructions that would give the application a performance boost.
     
    • A JIT compiler can determine when a certain test is always false on the machine that it is
    running on. For example, consider a method that contains the following code:
    if (numberOfCPUs > 1) {
    ...
    }
    This code could cause the JIT compiler to not generate any CPU instructions if the host
    machine has only one CPU. In this case, the native code would be fine-tuned for the host
    machine; the resulting code is smaller and executes faster.
     
    • The CLR could profile the code’s execution and recompile the IL into native code while the
    application runs. The recompiled code could be reorganized to reduce incorrect branch
    predictions depending on the observed execution patterns. 

     

    Ek olarak günümüz de bırakın hayvan gibi metadata ya sahip managed dilleri, google' ın v8 javascript engine' in performansı bile göz yaşartan cinstendir. Şikayet edilen şey jvm' nin windows implementasyonu olabilir ancak.

    quad, YaRiLeTkEn and analog beğendi

  3. Oyuncular olarak hiçbir şeyden çekmedik hype' dan çektiğimiz kadar  :lol: .

     

    Ama DS serisi kendini ispatlamış ve çekirdek bir hayran kitlesi edinebilmiş bir yapım, bu oyun da kötü olmayacaktır. Sadece pc sürümünde olabilecek bazı optimizaston sıkıntılarından endişe ediyorum, o da belki...


  4. Kesinlikle sizin de belirttiğiniz üzere nereden baktığınıza göre değişir. Mesela sahada yoğun çalışan, ölçüm vb işler yapan kişiler için tablet + kalem + taşınabilir klavye en ideal çözümdür. Benim baktığım açı ise; mesela çalıştığınız hastanedeki hbys sistemlerini düşünün. Bu sistemde karmaşık hasta kayıt ekranı var ve bu ekrana veri girmesi gereken personel kesinlikle bir pc' ye ihtiyaç duyacaktır. O hbys' nin geliştirilmesi için kullanılacak sistem de yine bir pc olmak durumunda. Aynı şey birçok kamu kurumu, banka ve şirket için de geçerli. Benzer şekilde workstation' a ihtiyaç duyan mimarlar, tasarmcılar ve geliştiriciler için de pc şu an için vazgeçilmez. Yani demek istediğim pc' ye ihtiyaç duyan çekirdek bir kitle var ve bu insanlar için tablet hem donanım hem de yazılım anlamında tatmin edici olmaktan uzak, en azından şimdilik... Kısacası Apple' ın iddialarını yerine getirmesi için tabletleri yazılım ve donanım olarak daha fazla güçlendirmesi gerek.

     

    Şöyle bir baktım da yazdıklarıma özünde aynı şeyleri söylemişiz :) .

  5. Pentaman hocam size saygım sonsuz ancak kurumlar, profesyoneller ve oyuncular için pc' nin yerine geçebilecek bir cihaz halen daha mevcut değil. İlk ipad duyurulduğunda da bunlar söylenmişti ama geçen zamanda akıllı telefonlar tablet pazarının küçülmesine sebeb oldu.

     

    Bence yakın gelecekte son bulacak olan PC, Personal-Computer olan değil, Abd' de de Trump' ın seçilmesiyle birlikte Political-Correctness olacak :)

     


  6. Yeni oyunda açık dünya öğeleri var dolayısıyla side-mission lar, challenge' lar oyun süresini oldukça uzatıyor. Ayrıca sevdiğim oyunları en zor zorluk seviyesinde oynadığım için bu da süreyi uzatan bir etken. Bir de bu süreye baba-yaga dlc si de dahil. Ama ilk oyunu da 15 saat kadar oynamışım. İlk oyunu 8 saatte bitiren biri için 16 saat oynama süresi var diyelim.


  7. Nihayet w3c, google, mozilla, microsoft ve apple' ın ortak çalışıp yeni teknolojiler için standartları baraber belirliyor olmaları çok güzel bir haber.

     

    Buradaki assembly ile elbette bildiğimiz düşük seviyeli programlama dili olan asm değil managed platformlardan aşina olduğumuz portable-bytecode kastediliyor. Ek olarak ilerleyen zamanlarda kendine ait jit derleyicileri ve garbage collection eklentileriyle komple bir runtime' e evrilecek gibi duruyor.

     

    Tüm bunların ışığında .Net CLR gibi dil bağımsız bir yapıya bürünebilir mi yani tarayıcı içinde java/c#/python kullanabilecekmiyim diye soruyorsanız bu konuda Google mühendislerinden
    JF Bastien şöyle demiş;
     

     

    The goal is indeed to support any language, but supporting any language is difficult to pull off without huge delays.

     

    WebAssembly is currently focusing on languages that are traditionally compiled ahead-of-time, work well with on linear memory heap, and which don't require dynamic recompilation, runtime code loading, or garbage collections. Some of these constraints are there to get to a Minimum Viable Product as early as possible, and take into account what existing in-browser compilers can do.

     

    Note that the MVP won't support threads. Threads will be added shortly after.

     

    Python, JavaScript and Ruby can easily be supported by compiling an interpreter, written in C/C++, to WebAssembly. Later versions of WebAssembly will support JIT-compilation, but engines like V8 will have to target WebAssembly as if it were a new ISA (e.g. on par with x86-64 / ARM / ...).

     

    C# and Java require similar GC and stack manipulation primitives. That's also on the roadmap, but after MVP, threads, and dynamic linking.

     

    Note that the languages may work just fine, but supporting all their libraries is also difficult! We (browser engineers) can work towards supporting languages well, but we need communities to build up around great library support.

     

    http://stackoverflow.com/questions/31994034/webassembly-javascript-and-other-languages


  8. Arkadaşlar Merhaba;

    Google' ın başarılı mvvm javascript framework' ü Angular' ın 2. sürümünü büyük bir merakla bekliyordum ve geçtiğimiz günlerde betası yayımlandı. Ben de ilk defa bugün deneme fırsatı yakaladım. Yalnız bu sürüm önceki sürümden çok farklı ve kurulum + konfigürasyon işlemleri bildiğimiz javascript kütüphaneleri kadar kolay değil. Ben de merak eden arkadaşlar için ufak çaplı bir başlangıç rehberi hazırladım. Buradaki örnekte çok basit bir html sayfası hazırlayacağız.

    Benim burada kullanacağım ide visual studio 2015. Ek olarak mutlaka Update 1 güncellemesi yüklü olmak zorunda;
    https://www.visualstudio.com/post-download-vs?sku=community&clcid=0x409

    Angular2 ile uygulama geliştiriken kullanacağımız dil typescript olacak. Ek olarak javascript ve dart' ta kullanabilirsiniz ama Angular ekibi de typescript' i tercih ediyor. Typescript hakkında bilgi verecek olursak; Microsoft' da technical fellow olan ve daha önce C#, Delphi, Turbo Pascal gibi dillerin baş mimari Anders Hejlsberg tarafından geliştirilmiş görece yeni bir dildir. Ek özellikleri;

    •     Derleme zamanlı tip kontrolü sağlar.
    •     class, interface, encapsulation, inheritance gibi object-oriented programlamanın temel prensiplerini destekler.
    •     Derlenmiş çıktı olarak yalın javascript kodu üretir.

    Bir kere alıştıktan sonra plain-javascript yazmanın çok da sağlıklı olmadığını hemen anlamaya başlıyorsunuz. Ek olarak proje büyüdükçe typescript kullanmakla ne kadar iyi bir karar vermiş olduğunuzu anlayacaksınız. Zaten outlook.com, asana gibi yoğun javascript kullanılan uygulamalar typescript ile geliştiriliyor.
    Typescript' i indirmek için aşağıdaki linki kullanabilirsiniz;
    http://www.typescriptlang.org/


    Son olarak ta ASP.NET 5 RC indirmeniz gerekli;
    https://get.asp.net/


    Tüm yükleme işlemleri tamamlandıktan sonra yeni bir proje oluşturalım;

    Yalnız en başta belirteyim; bu proje şablonu klasik asp.net proje yapılarından çok farklı. NuGet yerine node.js den gelen npm kullanılıyor ve klasör dizilimi hatta sln dosyasının yapısı da çok değişik. Visual studio kullanmanıza rağmen daha çok java veya node.js projesi geliştiriyormuşsunuz gibi hissedeceksiniz.

    Proje oluştururken
    File > New > Project > Asp.Net Web Application > Asp.Net 5 Templates > Empty seçeneklerini seçiyoruz;

    2962910.png

    esnifd.png

    Projemizi oluşturdukdan sonra Startup.cs sınıfımızın Configure methoduna şu kodları ekleyin;
     

    app.UseDefaultFiles();
    app.UseStaticFiles();

    30j4u9u.png


    Yukarıdaki kodu eklediğiniz de visual studio tarafından hata alcaksınız. Önüne geçnek için 'project.json' konfigürasyon dosyamızın dependencies bölümüne
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final"
    referansını ekleyin ve kaydedin. Ardından ide' niz references kısmını restore edecek ve startup.cs deki hata giderilşmiş olacak.;

    2ceklrq.png

    Angular2 beta aşamasında ve dağıtımı şu an npm (node package manager) üzerinden yapılıyor. Bizim de visual studio tarafında npm i konfigüre etmemiz için projeye sağ tıklayıp; add > new item > NPM Configuration File' ı seçmemiz gerekli. Ardın oluşturulan package.json dosyasına şu kısımları kopyalayın;



    {
      "version": "0.0.0",
      "name": "Angular2QuikStart",
      "dependencies": {
        "angular2": "2.0.0-beta.8",
        "systemjs": "0.19.22",
        "es6-promise": "^3.0.2",
        "es6-shim": "^0.33.3",
        "reflect-metadata": "0.1.2",
        "rxjs": "5.0.0-beta.2",
        "zone.js": "0.5.15",
        "bootstrap": "^3.3.5",
        "jquery": "^2.1.4",
        "typescript": "1.8.7"
      },
      "devDependencies": {
        "gulp": "^3.9.1"
      }
    }

    Dosyayı kaydettikten sonra dependencies kısmının restore olduğunu ve projenin src dizinine yeni bir 'node_modules' adında bir klasör oluşturulduğunu göreceksiniz. İşte bu klasörün içinde angular2' nin ihtiyaç duyduğu tüm typescript/javascript dosyaları mevcut.

    Asp.Net Core uygulamalarında tüm sabit dosyalar, scriptler, resimler vs. wwwroot klasörünün altında bulunmalı. Dolayısıyla bizim  'node_modules' klasöründeki gerekli dosyaları 'wwwroot' altına taşımamız gerek. Bunu elle yapmak yerine Gulp' ı kullanacağız. Bunun için yine projemize sağ tıklayıp > add > new item > Gulp Configuration File seçiyoruz. Oluşan 'gulpfile.js' dosyasına aşağıdaki kodu kopyalıcaz;
     

    /// <binding AfterBuild='moveToLibs' />
    var gulp = require('gulp');
     
    gulp.task('moveToLibs', function (done) {
        gulp.src([
          'node_modules/angular2/bundles/js',
          'node_modules/angular2/bundles/angular2.*.js*',
          'node_modules/angular2/bundles/angular2-polyfills.js',
          'node_modules/angular2/bundles/http.*.js*',
          'node_modules/angular2/bundles/router.*.js*',
          'node_modules/es6-shim/es6-shim.min.js*',
          'node_modules/angular2/es6/dev/src/testing/shims_for_IE.js',
          'node_modules/systemjs/dist/*.*',
          'node_modules/jquery/dist/jquery.*js',
          'node_modules/bootstrap/dist/js/bootstrap*.js',
          'node_modules/rxjs/bundles/Rx.js'
        ]).pipe(gulp.dest('./wwwroot/libs/'));
     
        gulp.src([
          'node_modules/bootstrap/dist/css/bootstrap.css'
        ]).pipe(gulp.dest('./wwwroot/libs/css'));
    });

    yukarıda en başa eklemiz olduğumuz

    /// <binding AfterBuild='moveToLibs' />

    satırı sayesinde derleme işlemlerinde sonra ilgili dosyalar 'wwwroot/libs' klasörüne kopyalanacak.

    Şimdiki adımda ise typescript i konfigüre etmemiz gerekli;
    bunun için projeye sağ tıklayıp yeni klasör ekleyelim ve adı 'app' olsun.

    Sonra yine projeye sağ tıklayıp add > new item > TypeScipt JSON Configuration File ekleyelim ve aşağıda kodu yeni oluşan 'tsconfig.json' dosyasına kopyalayalım;

    {
      "compilerOptions": {
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "module": "commonjs",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "outDir": "../wwwroot/app/",
        "removeComments": false,
        "sourceMap": true,
        "target": "es5"
      },
      "exclude": [
        "node_modules"
      ]
    }

    Bu sayede typescript kodlarımız derlenerek plain-javascript' e çevirilecek ve "/wwwroot/app/" klasörüne kopyalacak.


    İşte nihayet biraz angular yazabiliriz. Öncelikle oluşturduğumuz app klasörüne 'app.component.ts' adında bir typescript dosyası ekleyelim ve aşağıdaki kodu kopyalayalım;

    import {Component} from 'angular2/core';
    
    @Component({
        selector: 'my-app',
        template: `<h1>{{title}}</h1>
        <div><label>Rating</label>{{hero.rating}}</div>
        <div><label>Name </label>{{hero.name}}</div>
        <div><label>Description</label>{{hero.description}}</div>
        <div><label>Motto</label>{{hero.motto}}</div>
        `
    })
    
    export class AppComponent {
        public title = "Best Game Character";
        public hero: GameHero = {
            rating: 5, name: "geralt of rivia", description: "White Wolf", motto: "If I'm to choose between one evil and another, I'd rather not choose at all."
        };
    }
    
    interface GameHero {
        rating: number,
        name: string,
        description?: string,
        motto?: string
    }

    şimdi ise ön yükleme için main adında yine bir typescript dosyası oluşturalım  ve oluşan 'main.ts' dosyasına şu kodları ekleyelim;

    ///<reference path="../node_modules/angular2/typings/browser.d.ts"/>
    import {bootstrap} from 'angular2/platform/browser'
    import {AppComponent} from './app.component'
    bootstrap(AppComponent);

     
    Son olarak bir html sayfasına ihtiyacımız var. Bunun için wwwroot klasöüne sağ tıklayarak "index.html" adında bir html dosyası ekleyelim ve bu oluşan dosyaya aşağıdaki kodları kopyalayalım;

    <!DOCTYPE html>
    
    <style>
        label {
            display: block;
            width: 100px;
        }
    </style>
    
    <html>
    <head>
        <meta charset="utf-8" />
        <title>Angular 2 with ASP.NET 5</title>
        <link href="libs/css/bootstrap.css" rel="stylesheet" />
    
        <script src="libs/es6-shim.min.js"></script>
        <script src="libs/system-polyfills.js"></script>
        <script src="libs/shims_for_IE.js"></script>
        <script src="libs/angular2-polyfills.js"></script>
        <script src="libs/system.js"></script>
        <script src="libs/rx.js"></script>
        <script src="libs/angular2.dev.js"></script>
    
        <script>
            System.config({
                packages: {
                    app: {
                        defaultExtension: 'js'
                    }
                }
            });
        </script>
        <script>
    
            System.import('app/main')
                  .then(null, console.error.bind(console));
        </script>
    
    </head>
    
    
    <body>
        <my-app>Loading...</my-app>
    </body>
    </html>

    Projeyi çalıştırdığımızda oluşturduğumuz template' in nasılda güzel html e dönüştünü görebilirsiniz. Ayrıca projenin tamamını aşağıdan indirebilirsiniz;
    https://drive.google.com/open?id=0BwknnP77KksudURZRlhOVlc2UUk
     
     
    Peki niçin angular2' yi öğrenmek gerek derseniz bence front-end geliştirmenin geleceği burada yatıyor. Hem desktop hem de mobil, hem web hem de native tarafta angular2 kendine oldukça fazla destekçi bulacaktır. Ayrıca siz de benim gibi back-end' ciyseniz ama yine de zamanınızın çok büyük bölümü front-end' de de geçiyorsa jquery' nin, razor' ın gerekli yeterliliği ve tatmini sağlamadığını göreceksiniz. Angular2 ise işte tam burada bir kahraman gibi karşınıza çıkıyor. Zevkli, yaratıcı ve keyif veren kodlamalar dilerim.

    Kaynaklar;
    https://angular.io/docs/ts/latest/quickstart.html
    http://www.mithunvp.com/angular-2-in-asp-net-5-typescript-visual-studio-2015/

    YaRiLeTkEn, OnLyTNT and Hayalet beğendi

  9. 4gb bu fiyat seviyesindeki bir kart için çok düşük bir rakam, sırf bu yüzden almazdım. Ek olarak bence de üst seviye de min 8gb+ gerekli.

    Yavaş yavaş tek kart ile vsync açık iken 1080p ultrada 60fps sıkıntı olmaya başladı, hbm2 keşke bu kadar gecikmeseydi.

    async compute benim için yeni nesilde satın alma kriterlerinin başında geliyor. Ama kesin bir kanıya varabilmek için düzgün kodlanmış uygulamalara + polaris ve pascal mimarilerinin tam olarak ortaya çıkması gerekli. Kim bilir belki r300' ün fp24' ü gibi game changer bir özelliktir.

    @@T800
    Böyle bir test çok iyi olur. Hatta ek olarak genel anlamda gerçek oyun deneyimlerinizi de aktarırsanız internette bulacağımız test skorlarının ötesinde bir değerlendirme olur. Çünkü mesela ben oyunları tv üzerinden vsync açık oynuyorum dolayısıyla min-fps max-fps den çok daha önemli benim için. İnternette bazı testler gördüm ancak bunlara bakarak tutarlı bir sonuç çıkaramadım.

     


  10. DX12' de siz de şöyle bir durum yaşıyormusunuz acaba; Hdr nin tavan yaptığı bol ışıklı sahnelerde fps de ani bir düşme yaşanıyor şöyle 30 kadar iniyor ve bu noktadan sonra 30 da sürekli kalmaya devam ediyor. Ama masaüstüne gelip tekrar oyunu açtığınızda veya map' e bakıp oyuna döndüğünüzde oyun tekrardan olması gereken fps hızlarına dönüyor. Enteresan bir durum... 


  11. DX12 yaması ve nvidia maxvell mimarisi için konuşacak olursam; İlk başta ciddi performans getirisi sağladığını bechmark' a bile gerek duymadan direk görüyorsunuz ama sonradan durduk yere ciddi frame düşmeleri, su yüzeylerindeki bulanıklık ve güneşli sahnelerdeki ışık hataları gibi olumsuzluklar oluşuyor. Kısacası bana stabil gelmedi.


  12. Steam den şimdi bakıyorum da oyun + dlc ler = 179 + 193 tl. Ama gold edition 230 tl. Bu gold edition tüm dlc leri de içermiyor mu zaten?

     

    Çevremde bu oyunu oynayan kimse yok ve o yüzden pek almak istemiyorum ama chw ahalisinden steam den alan veya almak isteyen varsa sepete attım onaylayacağım, arkadaşlarla oynaması zevkli bir oyun çünkü.


  13. Başlığı hortlatmak gibi olacak ama bahsi geçen micro-orm' nin java implementasyonunu da tamamladım. Ek olarak .Net ve Java için ufak birer rehber hazıladım, dileyen arkadaşlar deneyebilir;

     

    Kaynak Kodlar;
    .Net;
    https://github.com/ionixNet
    Java;
    https://github.com/ionixJava
     

    Kaynak kodların derlenmiş halleri;

    .Net;
    https://drive.google.com/file/d/0BwknnP77KksuZUJVOVFWZ016VmM/view?usp=sharing

    Java;
    https://drive.google.com/file/d/0BwknnP77KksuYUxKZS02allaYjQ/view?usp=sharing

     

    Veritabanı olarak ünlü Northwind kullanıldı. .Net örneğinde Sql Server, Java için Oracle Kullanılıyor

     

    Kullanırken;

    .Net;

     

     

    Model Sınıfımız;

        [Table("Products")]
        public class Products
        {
            [DbSchema(IsNullable = false, IsKey = true, DatabaseGeneratedOption = ionix.Data.StoreGeneratedPattern.Identity)]
            public int ProductID { get; set; }
    
            [DbSchema(IsNullable = false, MaxLength = 40)]
            public string ProductName { get; set; }
    
            [DbSchema(IsNullable = true)]
            public int? SupplierID { get; set; }
    
            [DbSchema(IsNullable = true)]
            public int? CategoryID { get; set; }
    
            [DbSchema(IsNullable = true, MaxLength = 20)]
            public string QuantityPerUnit { get; set; }
    
            [DbSchema(IsNullable = true)]
            public decimal? UnitPrice { get; set; }
    
    
            [DbSchema(IsNullable = true, DefaultValue = "0")]
            public short? UnitsInStock { get; set; }
    
            [DbSchema(IsNullable = true, DefaultValue = "0")]
            public short? UnitsOnOrder { get; set; }
    
            [DbSchema(IsNullable = true, DefaultValue = "0")]
            public short? ReorderLevel { get; set; }
    
            [DbSchema(IsNullable = false, DefaultValue = "0")]
            public bool Discontinued { get; set; }
        }
    

    Factory Nesnemiz;

        public static class ionixFactory
        {
            private static readonly string ConnetionString = "Data Source=192.168.204.128;Initial Catalog=NORTHWND;User Id=sa;Password=1;";
    
            public static DbConnection CreateEmptyConnection()
            {
                return new SqlConnection();
            }
    
            public static DbConnection CreateDbConnection()
            {
                DbConnection conn = CreateEmptyConnection();
                conn.ConnectionString = ConnetionString;
                conn.Open();
    
                return conn;
            }
    
            public static IDbAccess CreatDataAccess(DbConnection connection)
            {
                DbAccess dataAccess = new DbAccess(connection);
                dataAccess.ExecuteSqlComplete += (e) =>
                {
                   try
                    {
                        //Sql Sorgularını loglamak veya görüntülemek için aşağıdaki kodları aktif hale getirin.
                        //string path = e.Succeeded ? "x:\\sql.txt" : "x:\\sqlHata.txt";
                        //using (Stream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
                        //{
                        //    using (StreamWriter sw = new StreamWriter(fs))
                        //    {
                        //        if (e.Query != null)
                        //        {
                        //            sw.WriteLine(e.Query.ToParameterlessQuery());
                        //            sw.WriteLine();
                        //        }
                        //    }
                        //}
                    }
                    catch { }
                };
    
                return dataAccess;
            }
    
            public static IDbAccess CreatDataAccess()
            {
                return CreatDataAccess(CreateDbConnection());
            }
    
            public static ITransactionalDbAccess CreateTransactionalDataAccess()
            {
                TransactionalDbAccess dataAccess = new TransactionalDbAccess(CreateDbConnection());
    
    #if DEBUG
                dataAccess.ExecuteSqlComplete += (e) =>
                {
                    try
                    {
                        //string path = e.Succeeded ? "x:\\sql.txt" : "x:\\sqlHata.txt";
                        //using (Stream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
                        //{
                        //    using (StreamWriter sw = new StreamWriter(fs))
                        //    {
                        //        if (e.Query != null)
                        //        {
                        //            sw.WriteLine(e.Query.ToParameterlessQuery());
                        //            sw.WriteLine();
                        //        }
                        //    }
                        //}
                    }
                    catch { }
                };
    #endif
                return dataAccess;
            }
    
            public static ICommandFactory CreateFactory(IDbAccess dataAccess)
            {
                return new CommandFactory(dataAccess);
            }
    
            public static ICommandAdapter CreateCommand(IDbAccess dataAccess)
            {
                return new CommandAdapter(CreateFactory(dataAccess), CreateEntityMetaDataProvider);
            }
    
            public static IRepository<TEntity> CreateRepository<TEntity>(IDbAccess dataAccess)
                where TEntity : class ,new()
            {
                return new Repository<TEntity>(CreateCommand(dataAccess));
            }
    
            public static IEntityMetaDataProvider CreateEntityMetaDataProvider()
            {
                return new DbSchemaMetaDataProvider();
            }
        }
    

    Uygulamadaki örneği;

                using (IDbAccess dataAccess = ionixFactory.CreatDataAccess())
                {
                    IRepository<Products> rep = ionixFactory.CreateRepository<Products>(dataAccess);
                    Products entity = rep.SelectById(1);
                    entity.ProductName = "Chai Değişti";
                    rep.Upsert(entity);
    
                    IList<Products> entityList = rep.Query("select top 3 * from products ".ToQuery());
                    rep.BatchInsert(entityList);
    
                }
    

     

     

     

     

    Java;

     


    Model Sınıfımız;

    import ionix.Annotation.DbSchema;
    import ionix.Annotation.Table;
    import ionix.Data.StoreGeneratedPattern;
    import java.math.BigDecimal;
    
    
    @Table(name="PRODUCTS")
    public class Products {
        @DbSchema(columnName = "PRODUCTID", isKey = true,databaseGeneratedOption = StoreGeneratedPattern.AutoGenerateSequence)
        private int productId;
        public int getProductId(){ return this.productId;}
        public Products setgetProductId(int value){
            this.productId = value;
            return this;
        }
    
    
        @DbSchema(columnName = "PRODUCTNAME")
        private String productName;
        public String getProductName(){ return this.productName;}
        public Products setProductName(String value){
            this.productName = value;
            return this;
        }
    
        @DbSchema(columnName = "SUPPLIERID")
        private int supplierId;
        public int getSupplierId(){ return this.supplierId;}
        public Products setSupplierId(int value){
            this.supplierId = value;
            return this;
        }
    
        @DbSchema(columnName = "CATEGORYID")
        private int categoryId;
        public int  getCategoryId(){
            return this.categoryId;
        }
        public Products setCategoryId(int  value){
            this.categoryId = value;
            return this;
        }
    
        @DbSchema(columnName = "QUANTITYPERUNIT")
        private String quantityPerUnit;
        public String getQuantityPerUnit(){ return this.quantityPerUnit;}
        public Products setQuantityPerUnit(String value){
            this.quantityPerUnit = value;
            return this;
        }
    
        @DbSchema(columnName = "UNITPRICE")
        private BigDecimal unitPrice;
        public BigDecimal getUnitPrice(){
            return this.unitPrice;
        }
        public Products setUnitPrice(BigDecimal  value){
            this.unitPrice = value;
            return this;
        
    
    
        @DbSchema(columnName = "UNITSINSTOCK")
        private int unitsInStock;
        public int getUnitsInStock(){ return this.unitsInStock;}
        public Products setUnitsInStock(int value){
            this.unitsInStock = value;
            return this;
        }
    
        @DbSchema(columnName = "UNITSONORDER")
        private int unitsInOrder;
        public int getUnitsInOrder(){ return this.unitsInOrder;}
        public Products setUnitsInOrder(int value){
            this.unitsInOrder = value;
            return this;
        }
    
        @DbSchema(columnName = "REORDERLEVEL")
        private int reorderLevel;
        public int getReorderLevel(){ return this.reorderLevel;}
        public Products setReorderLevel(int value){
            this.reorderLevel = value;
            return this;
        }
    
        @DbSchema(columnName = "DISCONTINUED")
        private int discontinued;
        public int getDiscontinued(){ return this.discontinued;}
        public Products setDiscontinued(int value){
            this.discontinued = value;
            return this;
        }
    }
    

    Factory Nesnemiz;

    import ionix.Data.*;
    import ionix.Data.DbAccess;
    import ionix.Data.Oracle.CommandFactory;
    import ionix.Data.SqlQueryHelper;
    import ionix.Data.TransactionalDbAccess;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public final class ionixFactory {
        public static Connection createConnection() {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@DB:1521:ORCL", "NORTHWND", "1");
                return conn;
            } catch (ClassNotFoundException ex) {
                throw new RuntimeException(ex);
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
        }
    
        public static DbAccess creatDataAccess(Connection connection) {
            DbAccess dataAccess = new DbAccess(connection);
            dataAccess.onExecuteSqlComplete((e) ->
                    System.out.println(SqlQueryHelper.toParameterlessQuery(e.getQuery()))
            );
    
            return dataAccess;
        }
    
        public static DbAccess creatDataAccess() {
            return creatDataAccess(createConnection());
        }
    
        public static TransactionalDbAccess createTransactionalDbAccess() {
            TransactionalDbAccess dataAccess = new TransactionalDbAccess(createConnection());
            dataAccess.onExecuteSqlComplete((e) ->
                    System.out.println(SqlQueryHelper.toParameterlessQuery(e.getQuery()))
            );
            return dataAccess;
        }
    
        public static CommandFactory CreateFactory(DbAccess dataAccess) {
            return new CommandFactory(dataAccess);
        }
    
        public static CommandAdapter createCommand(DbAccess dataAccess) {
            return new CommandAdapter(CreateFactory(dataAccess), createEntityMetaDataProvider());
        }
    
        public static <TEntity> Repository<TEntity> createRepository(Class<TEntity> cls, DbAccess dataAccess){
            return new Repository<TEntity>(cls, createCommand(dataAccess));
        }
    
        public static EntityMetaDataProvider createEntityMetaDataProvider() {
            return new DbSchemaMetaDataProvider();
        }
    }
    

    Uygulamadaki örneği;

            try(TransactionalDbAccess dataAccess = ionixFactory.createTransactionalDbAccess())
            {
                Repository<Products> rep = ionixFactory.createRepository(Products.class, dataAccess);
                Products entity = rep.selectById(1);
                entity.setProductName("Chai değişti");
                rep.update(entity);
    
                List<Products> entityList = rep.query("select * from products where rownum <= 3");
                rep.batchInsert(entityList);
                dataAccess.commit();
            }
    
    OnLyTNT beğendi

  14. Xamarin ile hedeflenen mevcut c# geliştiricilerinin ios ve android tarafında uygulama geliştirirken diğer dillere ve araçlara yönelmesinin önüne geçmek. Ama beyhude çabalardan biri daha bence. Sonuçta bu işte ciddi olan arkadaşlar native tarafta. Multiplatform için de cordova gayet iyi iş görüyor.