Jump to page: 1 2
Thread overview
Onaltılık Dönüştürme (sadece 9, 7 ve sıfır ile)
Feb 17
Erdem
Feb 18
Erdem
Feb 19
Erdem
Feb 19
Erdem
Feb 19
Erdem
Mar 21
Erdem
Mar 21
Erdem
Mar 25
Erdem
February 15

Merhaba,

İşlerin yoğunluğundan ne zamandır kendimle bir meydan okuma fırsatı bulamıyordum. Eee meydan okuyacak kimse bulamadığımdan AI'ya sordum:

"Bana herhangi bir metni hexadecimal olarak kodlar mısın? Not: İçinde Türkçe karakter ve UTF özel karakterler de olabilir!"

O da bana hangi metni çevirmek istediğimi sordu ben de onu D'ye yönlendirmek için aşağıdaki kodun başlangıcını verdim:

module hexconverting;

void main()
{
  string str = "Merhaba\n\tDünya!";
  auto hex = str.toHexString;
  
  enum expectedResult =  "4D6572686162610A0944C3BC6E796121";
  assert(hex == expectedResult);

  import std.conv, std.stdio;
  hexString!expectedResult.writeln;
}

auto toHexDigit(ubyte value)
{
  if(value > 9) value += 7;
  return '0' + value;
}

auto toHexString(const char[] str)
{
  string result;

  ubyte a, b;
  foreach(ubyte c; str)
  {
    a = c / 16; b = c % 16;
    result ~= a.toHexDigit;
    result ~= b.toHexDigit;
  }
  return result;
}

Önce str.toUTF8.to!string.toHex.writeln; hatalı cevabını söylediklerimden yola çıkarak verdi. Böyle aptal bir algoritmayı suçlayamazsınız ve hatalı olduğunu yazınca cevaba kısmen yaklaştı:

string toHexString(string input)
{
    string hex;
    foreach (char c; input)
    {
        hex ~= to!string(c).format("%02x");
    }
    return hex;
}

Elbette yine saçmaladı! Yani bir döngü içinde karakteri neden string'e çevirirsin ve madem string üzerinden (kütüphaneden faydalanarak) çevireceksin bu daha basit değil mi?

string toHexString(string str)
{
  import std.format;
  return str.format!"%-(%02X%)";
}

Tabi aradığım bu değildi, yukarda ilk paylaştığım kod gibi kütüphaneden bağımsız (önce toHexDigit, sonra toHexString) gibi bir şey yapmaktı. Yine kendime meydan okudum ve çok kısa şekilde icra ettiğimi düşünüyorum.

Dip Not: Elbette neden 7 ile topladığımı merak edenler olabilir. Çünkü 2 nibble arasında ASCII kod tablosundaki fark o kadar. Belki a ve b değişkenleri gereksizdi veya hız açısından faydası da olabilirdi.

Kolay gelsin...

February 17

Kütüphane olanaklarından faydalanmak düşünülebilir.

import std.stdio;
import std.utf;
import std.digest;

void bilgiVer (string metin)
{
    ubyte[] baytlar = cast(ubyte[])metin;
    writeln("Baytlar: ", baytlar);

    string onaltılık = baytlar.toHexString();
    writeln("Onaltılık: ", onaltılık);

    string dizge = cast(string)baytlar;
    writeln("Dizgemiz: ", dizge);
}

void main()
{
    string merhaba = "Merhaba\n\tDünya!";
    string nasılsın = "كيف حلك؟";
    bilgiVer(merhaba);
    bilgiVer(nasılsın);
}
February 17

On Saturday, 17 February 2024 at 07:19:27 UTC, Erdem wrote:

>

Kütüphane olanaklarından faydalanmak düşünülebilir.

Gömülü projelerde kütüphaneden bağımsız çözümler avantaj sağlıyor. Üstelik enum kullanarak kendi türünüzle kişiselleştirmeler mümkün. Şimdilik işlev içine gömülmüş ve to!T ile dönüştürme gerekmeyen örnekleri paylaşmayacağım ama aşağıdaki kod parçacağından ne demek istediğim anlaşılacaktır:

import std.conv, std.stdio;

enum SmallLetterHex {
  o = '0', p, q, r, s, t, u, v, w, x,
  a = 'a', b, c, d, e, f
}
enum CapitalLetterHex {
  O = '0', P, Q, R, S, T, U, V, W, X,
  A = 'A', B, C, D, E, F
}

enum CustomHex {
  a = '0', b, c, ç, d, e, f, g, ğ, ı,
  i = 'A', j, k, l, m, n
}

alias T = CustomHex;

void main()
{
  auto str = "Made in Türkiye";
  auto hex = str.toHexString;
  fromHexString(hex).writeln;

  // Kişiselleştirme örneği 1:
  T[] results;
  foreach(bayt; hex)
  {
    results ~= cast(T)bayt;
  }
  results.writefln!"%(%c%)";

  // Kişiselleştirme örneği 2:
  import std.algorithm : each, map;
  str.toHexString
     .map!(bin => bin.to!T)
     .each!(chr => chr.write);
} /* ÇIKTISI:
Made in Türkiye
4D61646520696E2054C3BC726B697965
dlfbfdfecafıfmcaedkçjkgcfjfıgıfe
*/

Dip Not: Paylaşmadığım fromHexString() işlevi de kendiniz yapabileceğiniz benzer mantıkla yapılan basit bir şey. Çalışmayan kod olursa ilgili satırı yoruma çevirebilirsiniz.

Başarılar...

February 18

Bu işlev std.digest'in içinde package.d kütüğünde tanımlanmış.

Birim testleri oldukça anlaşılır.

    assert(toHexString(cast(ubyte[4])[42, 43, 44, 45]) == "2A2B2C2D");
    assert(toHexString(cast(ubyte[])[42, 43, 44, 45]) == "2A2B2C2D");
    assert(toHexString!(Order.decreasing, LetterCase.lower)
           (cast(ubyte[4])[42, 43, 44, 45]) == "2d2c2b2a");

İşlev bildirimi ise pek sayılmaz.

char[num*2] toHexString(Order order = Order.increasing,
                        size_t num,
                        LetterCase letterCase = LetterCase.upper)
(const ubyte[num] digest)
{
    /* ... */
}

private void toHexStringImpl(Order order,
                             LetterCase letterCase,
                             BB,
                             HB)
(scope const ref BB byteBuffer, ref HB hexBuffer)
{
    /* ... */
}

D'den herhalde biraz uzak kalmışız. İşlev bildirimde ikinci bir parantez var.

February 19

Erdem Hocam selamlar,

Gayet az ve öz cümleler ile derin konulara girmişsiniz. O yüzden size hayranım ama ben uzun uzadıya anlatmadan yapamıyorum o yüzden kusura bakmayınız...:)

Gerçi Ali hocam daha yetkin, son cümlenizi (soru olmadığı için cevaplamıyorum!) yani şablon parametrelerini daha iyi anlatacaktır. Ama forumdan uzak şu sıralar; görür mü bilmiyorum, hali hazırda kitabının şu bölümünde açıklamış:

https://ddili.org/ders/d/sablonlar.html#ix_sablonlar.varsay%C4%B1lan%20%C5%9Fablon%20parametresi

On Sunday, 18 February 2024 at 18:26:48 UTC, Erdem wrote:

>

Bu işlev std.digest'in içinde package.d kütüğünde tanımlanmış.

Birim testleri oldukça anlaşılır.

    assert(toHexString(cast(ubyte[4])[42, 43, 44, 45]) == "2A2B2C2D");
    assert(toHexString(cast(ubyte[])[42, 43, 44, 45]) == "2A2B2C2D");
    assert(toHexString!(Order.decreasing, LetterCase.lower)
           (cast(ubyte[4])[42, 43, 44, 45]) == "2d2c2b2a");

İşlev bildirimi ise pek sayılmaz.

Ben de hep bu birim testlerine bakıyorum. Gerçi kendi kütüphanemde ihmal ettiğim çok test var ama yapmaya vakit yok. İşte o yüzden kısıtlı vakitte o satırları görmek ve kullanmak arasında sanırım 1 dakka geçiyor. Harikalar!

Artislik yapmak gibi olacak ama bilgi amaçlı veriyorum. Kütüphanemde her şeyi küçük parçalara böldüm. Böylece ulaşma kolaylığı sağladım. Örneğin konumuza dönersek bütün enum'larım sdb.map içinde, bu benim düzenim ve kimseye uymak zorunda olmadığım gibi kimse de beni kabul etmesi gerekmez...:)

Örneklere tekrar girersek. Ben de şablon parametresi kullanıyorum ve çoğu zaman auto toHexString(bool big = false)(const char[] str) gibi kolayıma geliyor. Zaten bu benim kolaylık işlevim ve neyi kullanmak istiyorsam kütüphanemdeki kolaylık işlevlerini çağırıyor ve ihtiyaç duyulmayacak hiç bir kodu derlemeye eklemiyorum. Örneğin:

module bitoku;

import sdb.map;
import std.stdio;
import std.string;

enum merhaba = "merhaba";
auto Merhaba() => merhaba.capitalize;

void main()
{
  auto str = Merhaba.format!"%s\n\tDünya!";

  import std.conv, sdb.converts.hex : toHexString;
  str.toHexString!true.writeln();/*
  auto test = HexString(str);
  alias T = ABCDEF;
  auto hex = test.to!T;
  typeof(hex).stringof.writeln(": ", hex);
  test.from!T(hex).writeln;//*/

/* istersek ihtiyacım olanı yukardaki gibi değil böyle de daraltabilirdim:
   import sdb.converts : toHexString;  TAMAMEN AYNI) */
  import std.algorithm : each, map;
  str.toHexString // <-- burada !true eklersem kod çalışmaz çünkü küçük harfleri map'liyor
     .map!(e => e.to!hexTR)
     .each!(chr => chr.write);
} /* ÇIKTISI:
4D6572686162610A0944C3BC6E796121
dlfegcfğfbfcfbaiaıddkçjkfmgıfbcb
*/

Size hızlıca yazdığım şeylerden biri. Her biri başka deneme ve sanırım buradan 3-5 şeyi denemiştim. Standart kütüphanede dönüştürme işlemleri std.conv.d dosyasında. Ben ise bunu sdb\converts dizini içine alarak packages.d marifetiyle tüm dönüştürme dosyalarını birbirine bağladım. Ama istersem yukardaki gibi hex.d'yi de çağırabiliyorum.

D modülleri ve şablon parametreleri öyle başarılı ki diğer dillerin tamamına yetişti ve geçiyor bile. Bu bir gizli hazine ama çok az kişi değerini biliyor.

Sevgiler, saygılar...

February 19

Salihcim öncelikle güzel sözler için teşekkürler!

Bir zamanlar Vibe.d dersleri hazırlamıştık. Şu an yayında değil.

Diyelim ki kullanıcı bir şifre girecek.

Bunu veritabanında düz metin olarak saklamak yerine tek taraflı bir anahtarlama mekanizması kullanılıyor.

İşte bu anahtarlamayı yaparken bu onaltılı arkadaşı kullanmıştık.

Linux ISO kalıplarının yanında da 256SUM gibi anahtarlar geliyor.

February 19

On Monday, 19 February 2024 at 06:44:01 UTC, Erdem wrote:

>

Bunu veritabanında düz metin olarak saklamak yerine tek taraflı bir anahtarlama mekanizması kullanılıyor.

Süpermiş, ben de PGP gibi çift anahtarlı (public/private) şeylerle ilgileniyorum ve std.digest adeta biçimliş kaftan. HMAC'ı denedin mi, o da iyidir?

Mutlaka farketmişsinizdir; bilgisayarlar var olalıberi, enteresan yaygınlıkta standart ASCII onaltılık dönüşümler kullanılır. Bir benzeri eski WindowsKey'lerde bile var. Ama insan için yanıltıcı olabilir. Çünkü büyük harflerde birbirine benzer karakterler olabilir:

B harfi 8'e benzer
D harfi 0'a benzer
G harfi 6'ya benzer

İşin içine bir de Base32/64 girdiğinde (sanırım bunlar std.digest modülünde lezzetli bir biçimde implement edildi) karıştırılan karakterler artar. Bu kodlama standartdından ilk söz öden Crockford 1 rakamı küçük l harfine benzediği gibi bazılarını elemiştir.

Ben de benzer geleneği sürdürüyorum; toHumString() kolaylık işlevi ile karışma ihtimali olan karakterleri ARCTEV ile değiştirerek kullanıyorum. Base16'da olduğu gibi doldurma karakterleri olmadığı için sanki bu daha basit. Basit şeyleri seviyor, kullandırtıyorum. Ve's-selam...

SDB@79

February 19

On Monday, 19 February 2024 at 10:58:15 UTC, Salih Dincer wrote:

>

Süpermiş, ben de PGP gibi çift anahtarlı (public/private) şeylerle ilgileniyorum ve std.digest adeta biçimliş kaftan. HMAC'ı denedin mi, o da iyidir?

Hayır.

Diğer başlıkta konuştuğumuz Rize isimli basit uygulamanın D sürümünü yazabilir miyiz diye bakıyordum.

Öncelikle bir pencere tasarımının yüklenmesi düşünülebilir.

Burada konuşmuşuz.

Anlaşıldığına göre bir hesap makinesi yapmaya çalışmışız.

February 19

On Monday, 19 February 2024 at 19:05:57 UTC, Erdem wrote:

>

Diğer başlıkta konuştuğumuz Rize isimli basit uygulamanın D sürümünü yazabilir miyiz diye bakıyordum.

İsim de hazır.

Rizede ;)

Rizede

Denemek isteyenler için kütükleri de paylaşıyorum.

rize.glade

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow" id="pencere">
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">Çay</property>
    <property name="window-position">center</property>
    <property name="default-width">320</property>
    <child>
      <object class="GtkBox" id="kutu">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="saat">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="margin-top">69</property>
            <property name="margin-bottom">69</property>
            <property name="label" translatable="yes">00:00</property>
            <property name="justify">center</property>
            <attributes>
              <attribute name="scale" value="5"/>
            </attributes>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Bu sadece bir pencere tasarım kütüğüdür. Glade isimli bir yazılımla oluşturuluyor.

rize.d

import gtk.Builder;
import gtk.Main;
import gtk.Widget;
import gtk.Window;
import gtk.Label;
import std.stdio;

int main (string[] çorbalar)
{
   Main.init(çorbalar);
   Builder yapıcı = new Builder();
   yapıcı.addFromFile("rize.glade");
   Window pencere = cast(Window) yapıcı.getObject("pencere");
   Label saat = cast(Label) yapıcı.getObject("saat");
   saat.setLabel = "07:10";
   pencere.addOnHide( delegate void(Widget çıkış){ Main.quit(); } );
   pencere.showAll();
   Main.run();
   return 0;
}

Uygulamayı derlemek için gdc kullandık :

gdc rize.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -o rize
March 17

On Monday, 19 February 2024 at 19:37:09 UTC, Erdem wrote:

>

On Monday, 19 February 2024 at 19:05:57 UTC, Erdem wrote:

>

Diğer başlıkta konuştuğumuz Rize isimli basit uygulamanın D sürümünü yazabilir miyiz diye bakıyordum.

İsim de hazır.

Rizede ;)

Bir Karadenizli olarak ismini çok güzel buluyorum. Zaten çay deyince akla, bırak Çin'i, dünyayı Rize gelir :)

>

Uygulamayı derlemek için gdc kullandık :

gdc rize.d -I/usr/include/d/gtkd-3 -L /usr/lib -lgtkd-3 -o rize

gtkD'nin bu kadar kolay derlenebildiğini bilniyordum.

Teşekkürler...

« First   ‹ Prev
1 2