Forum: Projeler Rhodeus Script RSS
RhS plug-in başlangıcı...
takvim.d
Sayfa:  1  2  sonraki 
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: RhS plug-in başlangıcı...
Bu sadece bir deneme ama çok pis kod yazdım...:D

Övünmek için söylemiyorum! (yoksa şöyle derdim: çok pis kod yazarım!)

Hemen aşağıdaki ilk işlev çalışsa da çok saçma sapan bir şey oldu. Mutlaka daha kolayı olmalı. Derdim sadece std.datetime olanaklarını kullanarak ISO Calendar yapmak istedim:
import std.datetime, std.stdio,
       std.range, std.format;
 
   /* takvim.d (9 Mart 2012)
    * SysTime => takvimGünleri() => ubyte[]: array [ 28, 1, .. 31 ]
    * Date => ayınBiriHangiGün() => DayOfWeek: enum { sun .. mon }
    *
    */
    auto takvimGünleri(SysTime takvim) {
      ubyte[] sonuç;
      auto fark = ayınBiriHangiGün(cast(Date)takvim) - 1;
      auto ayınSonGünü = takvim.daysInMonth;
      auto ay = enumMonth(takvim.month);
           ay--;  
      takvim.month(ay.e);
 
      auto öncekiAyınSonGünü = takvim.daysInMonth;
      auto başlangıç = cast(ubyte)(öncekiAyınSonGünü - fark);
 
      foreach(ubyte i; başlangıç..(++öncekiAyınSonGünü)) sonuç ~= i;
      foreach(ubyte i; 1..(++ayınSonGünü)) sonuç ~= i;
 
      auto pisKod = sonuç.length;
      foreach(ubyte i; 1..(8 - (pisKod%7))) sonuç ~= i;
 
      return sonuç;
    }
          
    DayOfWeek ayınBiriHangiGün(Date tarih) {
      long roll = cast(long)tarih.day;
      tarih.roll!"days"(-(--roll));
      auto günü = DateTime(tarih);
      return günü.dayOfWeek;
    }
    
    auto enumPrint(T)() {
        string[] result;
        for(T x = T.min; x <= T.max; x++) {
            auto value = appender!string();
            formattedWrite(value, "%s", x);
            result ~= value.data;
        }
        return result;
    }
    
    union enumMonth {
      Month e;
      struct {
        ubyte dizin;
        
        void opUnary(string işleç)() if(işleç == "++") {
          if(dizin < e.max) dizin++;
          else dizin = e.min;
        }
        void opUnary(string işleç)() if(işleç == "--") {
          if(dizin > e.min) dizin--;
          else dizin = e.max;
        }
      }
      
      string toString() const @property {
        return std.conv.to!string(e);
      }
    }
 
void main() {
  auto bugün = SysTime(DateTime(2013, 2, 1, 1, 1, 1));//Clock.currTime();
       bugün.writeln();
 
  writefln("%-(%s%)\n", repeat("_", 52));
  writefln("%-(%s\t%)", enumPrint!DayOfWeek);
  writefln("%-(%s%)", repeat("=", 52));
 
  foreach(i, gnlr; bugün.takvimGünleri) {
    auto ayraç = (i+1) % 7 ? "\t" : "\n";
    if(gnlr<10) " ".write();
    gnlr.write(ayraç);
  }
  writeln();
 
  enum Günler { Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar }  
  writefln("%-(%s, %)", enumPrint!Günler);
} /*Çıktısı:
2013-Feb-01 01:01:01
____________________________________________________
 
sun     mon     tue     wed     thu     fri     sat
====================================================
27      28      29      30      31       1       2
 3       4       5       6       7       8       9
10      11      12      13      14      15      16
17      18      19      20      21      22      23
24      25      26      27      28       1       2
 
Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar
*/
Gerçi modül içinde isoWeek() isminde bir işlev var ama işime yarar mı bilmiyorum...
The ISO 8601 week of the year that this SysTime is in.
Neyse önemli olan basit bir örnek teşkil etmesi. Yani bunun bir de Türkçesini hazırlayıp iki farklı DLL halinde RhS'ye veri veren bir şey yapabilir miyiz diye deneyeceğim. Bu konuyu da şurada aralamıştık: http://ddili.org/forum/thread/1130

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İlk değerlendirme benden:

Kendi kendime, kendin pişir kendin ye...:)

Hatta boşverin bu kodu değerlendirmeyin. Gerçekten saçma sapan, alelacele yazılmış bir şey. Meğer o her yerde gördüğümüz ve alışık olduğumuz biçimde (-bknz. Vikipedia ISO week date maddesi) takvimi ekrana yazmak ne zor bir şeymiş.

Gerçi basit matematiksel işlemler ile sayıları yazdırmak belki daha kolay olurdu ama açıkcası biraz saç baş yoldurdu... :nuts:

 :-D  :-D  :-D  :-D
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kusura bakmayın hocam pek giremiyorum bu aralar :) Proje raporunu düzenliyorum. Sunuma hazırlanıyorum :) Ama sanırım şu flowchart olayını biraz çözdüm :)

Kodları çok detaylıca incelemedim ama güzel görünüyor. Zaten zamanla düzenli bir hale gelir kimse bu kütüphaneleri tek seferde yazmadı :)

Kodlarda bence atladığımız bir şey var. O da tür. Bu yazılan plug-in rhs ile ilgili bir kütüphane çağırması lazım. O kütüphane de şunlar olabilir.

RhString, RhArray, RhClass gibi. Yani plug-in ile RhS nin veri türleri konusunda ortak konuşması lazım :)

Ben de zamanla ilgili RhS de ufak bir sınıf yazdım.

http://rhodeus.org/downloads/RhodeusScript_1.0.1.0b_win32.… burada datettime.rhs diye geçiyor. Bu zaman işlemlerinde çok bir bilgim yok ama ufak birşey yazdım :)

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Övünmek için söylemiyorum! (yoksa şöyle derdim: çok pis kod yazarım!)

Estağfurullah hocam olur mu öyle şey :)

Hatta boşverin bu kodu değerlendirmeyin. Gerçekten saçma sapan, alelacele yazılmış bir şey. Meğer o her yerde gördüğümüz ve alışık olduğumuz biçimde (-bknz. Vikipedia ISO week date maddesi) takvimi ekrana yazmak ne zor bir şeymiş.
Bence bu konuyu dert etmeye gerek yok. Biraz siz yaparsınız biraz ben yaparım biraz Ali hocam yardım eder :) Ortaya güzel bir şey çıkar :)

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
DLL konusunu düşünüyorum...

Slot mantığında bir şey yapmalıyız sanki. Yani derlenmiş bir çekirdeğe tanımlanması gereken null slot'lar olacak. Bunların her birine bir kütüphane yerleştiriceğiz. Onların olmaması yazılımı etkilemeyecek; diğer taraftan varlığı, çağrılmaları için tekrar çekirdeğin derlenmesi gerekmeyecek.

Hepimiz düşünelim, olur gibi ve sonra deneyelim...:)

Bu arada takvim olayını JS'de bir varyasyonuna bakayım dedim de sandığımdan daha karmaşık yapmışlar:

http://tuxgraphics.org/toolbox/cal_year.html

Render kısmı zaten kopmuş, bir sürü if()'ler ile dolu. Ama hesap kısmında Rick McCarty'nin algoritmasından faydalanmış. Belgesinde sözde kod olarak çok güzel ifade etmiş. Kolaylıkla D'ye uyarlanabilir ama std.datetime varken ne gerek var buna!

/**
 * Author of getWeekNumber function: Thomas Rabaix
 *
 * Small corrections by Guido Socher
 *
 * return the Week Number of a gregorian date using the ISO 8601 format
 * Algorithm from http://personal.ecu.edu/mccartyr/ISOwdALG.txt , Rick McCarty
 *
 * ISO 8601 specifies that Week 01 of the year is the week containing
 * the first Thursday; Monday is Weekday 1, Sunday is Weekday 7;
 */
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
mert #6
Üye Ara 2010 tarihinden beri · 193 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Konu adı: pis kod
foreach(ubyte i; 1..(8 - (pisKod%7))) sonuç ~= i;
İlahi Salih :-)
mert
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
:D

Geçen akşam bir kaç deneme yaptım, olmuyor...:(

Siz, kod koşarken DLL'nin çağrıldığı satıra gelmeseniz bile onun aynı dizin içinde varlığına ihtiyaç duyuyor. Bu olmasaydı bir şeyler yapabilirdik... :rolleyes:
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih hocam sanırım runtime işlev çağırma olayını yapmaya çok yaklaştım.

Eğer yapabilirsem paylaşırım :)

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #9
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih hocam rica etsem D dili ile bir dll hazırlayabilir misiniz? Ben hazırlamasını bilmiyorum da  :blush:

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #10
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam şöyle birşey yaptım ama

import core.runtime;
import std.stdio;
import core.memory;
import core.sys.windows.windows;
extern (Windows)
int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) MessageBoxA;
/* Runtime Dll Library */
class RDL{
    void call(){
        HMODULE h;
        FARPROC fp;
        h = cast(HMODULE) Runtime.loadLibrary("user32.DLL");
        if (h is null){
            printf("error loading user32.dll\n");
            return;
        }
        fp = GetProcAddress(h, "MessageBoxA");
        if (fp is null){
            printf("error loading symbol MessageBoxA()\n");
            return;
        }
        MessageBoxA = cast(typeof(MessageBoxA)) fp;
        MessageBoxA(null, cast(char *) "a", "Error", MB_OK | MB_ICONEXCLAMATION);
 
        if (!Runtime.unloadLibrary(h))
        {   printf("error freeing user32.dll\n");
            return;
        }
    }
}
 
 
int main(){
    auto x = new RDL();
    x.call();
    return 0;
}
Bilgi meraktan gelir...
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hiç deneyimim yok ama DLL'ler için şu sayfa var:

  http://dlang.org/dll.html

Ali
Avatar
zekeriyadurmus #12
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocam oradan yararlanıyorum zaten ama pek yeterli geldiği söylenemez :(

Bu arada kodların son hali sanki biraz daha hoş oldu ha ne dersiniz?

import core.runtime;
import std.stdio;
import core.memory;
import core.sys.windows.windows;
/* Runtime Dll Library */
class RDL{
    void call(){
        HMODULE h;
        FARPROC fp;
        h = cast(HMODULE) Runtime.loadLibrary("user32.DLL");
        if (h is null){
            printf("error loading user32.dll\n");
            return;
        }
        fp = GetProcAddress(h, "MessageBoxA");
        if (fp is null){
            printf("error loading symbol MessageBoxA()\n");
            return;
        }
        MessageBoxA = cast(typeof(MessageBoxA)) fp;
        MessageBoxA(null, cast(char *) "a", "Error", MB_OK | MB_ICONEXCLAMATION);
 
        if (!Runtime.unloadLibrary(h))
        {   printf("error freeing user32.dll\n");
            return;
        }
    }
 
    HMODULE h;
    string name;
    this(string name = "user32.DLL"){
        this.name = name;
        h = cast(HMODULE) Runtime.loadLibrary(name);
        if (h is null){
            writeln("error loading "~name~"\n");
            return;
        }
    }
 
    void load(T)(string name, ref T z){
        FARPROC fp = GetProcAddress(h, cast(char*) name);
        if (fp is null){
            writeln("error loading symbol "~name~ "()\n");
            return;
        }
        z = cast(typeof(z)) fp;
    }
 
 
    ~this(){
        if (!Runtime.unloadLibrary(h))
        {
            writeln("error freeing "~name~"\n");
            return;
        }
    }
}
 
 
struct tagRECT{
    int Left;
    int Top;
    int Right;
    int Bottom;
}
 
extern (Windows){
 
    short function (INT z) GetAsyncKeyState;
    int function(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) MessageBoxA;
    bool function(tagRECT* z) ClipCursor;
 
}
 
int main(){
    auto rdl = new RDL("user32.dll");
    rdl.load("ClipCursor", ClipCursor);
    rdl.load("MessageBoxA", MessageBoxA);
    rdl.load("GetAsyncKeyState", GetAsyncKeyState);
 
    writeln("Mesaj kutusu");
    writeln("Mesaj kutusunu kapatırken istersen sol shift tuşuna basılı tut ne dersin?");
    MessageBoxA(null, "talha", "talha", 0);
 
    writeln("Mesaj kutusu");
    if (GetAsyncKeyState(0x10)){
        writeln("Beni kırmadığın için teşekkürler :)");
        writeln("Ve şimdi sıradaki test :)");
    }
 
    writeln("Fare imleci hareketi kısıtlanıyor");
    ClipCursor(new tagRECT(500, 500, 560, 560));
 
    while(1){
    }
    return 0;
}

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #13
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ama benim yapmak istediğim tam olarak bu değil. Bu halinde yine mecburen derlemeden önce işlevleri belirtmek gerekiyor. Belirtmeden yapmak gerek ama nasıl olacak :S

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #14
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu arada Salih hocam eğer bir tane D ile hazırlanmış bir dll hazırlarsanız (ben de hata veriyor her nedense :S)

Ve eğer bu diğer dll'ler gibi çalışırsa RhS'ye plugin olayını çok kolay ekleyebiliriz.

Zekeriya
Bilgi meraktan gelir...
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Benim yaptığım deneme şu şekilde:
import a, b;
 
int main(string[] args) {
  char arg = args.length > 1 ? args[1][0] : 255;
 
  switch(arg) {
    case 'a': a_main(); break;
    case 'b': b_main(); break;
    default:
  }
  return 0;
}
Yukarıdan anlaşılacağı üzere 2 tane a ve b isminde modüllerimiz var. İçleri de çok basit ama önemli olan build.bat ve daha az ve sanırım gerekli olan def dosyaları:

@echo off
dmd -ofa.dll -L/IMPLIB a.d dll.d a.def
dmd -ofb.dll -L/IMPLIB b.d dll.d b.def
dmd test.d a.lib b.lib
def dosyaları ise şöyle:
LIBRARY "a.dll"
EXETYPE NT
SUBSYSTEM WINDOWS
CODE SHARED EXECUTE
DATA WRITE

Aynı şekilde modüllerden a olanını da vereyim:
module a;
import std.c.stdio;
 
export void a_main() { 
  printf("a.dll'deki main()'deyim...\n");
}
Dip Not: Bu arada, bir de dll.d dosyası var ki o da DMD'nin paket dosyası içinde mydll'de mevcut. Windows için standart bir şey ve sanırım çok gerekli. Zaten senin yaptığı denemede mevcut olduğunu gördüm.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2013-03-13, 13:38.
Değişiklik nedeni: Dip Not eklendi...
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-05-28, 13:35:34 (UTC -07:00)