coolwolf / 07/02/2023

Aspx için kod tabanlı MessageBox fonksiyonu

public class WebMsgBox
    {
        protected static Hashtable HandlerPages = new Hashtable();
        private WebMsgBox()
        {
        }
        public static void Show(string message)
        {
            if (!(HandlerPages.Contains(HttpContext.Current.Handler)))
            {
                var currentPage = (Page)HttpContext.Current.Handler;
                if (currentPage != null)
                {
                    var messageQueue = new Queue();
                    messageQueue.Enqueue(message);
                    HandlerPages.Add(HttpContext.Current.Handler, messageQueue);
                    currentPage.Unload += new EventHandler(CurrentPageUnload);
                }
            }
            else
            {
                var queue = ((Queue)(HandlerPages[HttpContext.Current.Handler]));
                queue.Enqueue(message);
            }
        }
        private static void CurrentPageUnload(object sender, EventArgs e)
        {
            var queue = ((Queue)(HandlerPages[HttpContext.Current.Handler]));
            if (queue != null)
            {
                var builder = new StringBuilder();
                int iMsgCount = queue.Count;
                builder.Append("<script language='javascript'>");
                string sMsg;
                while ((iMsgCount > 0))
                {
                    iMsgCount -= 1;
                    sMsg = Convert.ToString(queue.Dequeue());
                    sMsg = sMsg.Replace("\"", "'");
                    builder.Append("alert( \"" + sMsg + "\" );");
                }
                builder.Append("</script>");
                HandlerPages.Remove(HttpContext.Current.Handler);
                HttpContext.Current.Response.Write(builder.ToString());
            }
        }
    }

Kullanmak için, herhangi bir C# kod sayfasında (xxx.aspx.cs) alttakine benzer bir kod yazmanız yeterli. İlk açılacak Aspx formunda mesaj görüntülenecektir.

WebMsgBox.Show("Web Forms MessageBox denemesi");

coolwolf / 18/01/2021

Linux/BSD Tabanlı NAS Distro Denemeleri

Eski sucularımı NAS cihazı olarak kullanmak istedim. Bu amaçla kısa bir araştırmadan sonra alttaki sürümleri denemeye karar verdim.

Aradığım temel özellikler şunlar:
Kolay kurulum, güvenli altyapı, kolay yönetim, birkaç adımda paylaşım oluşturma, paylaşımlara SMB/NFS/FTP gibi özellikler ekleme, vb.

  1. XigmaNas
  2. OpenMediaVault
  3. TrueNas
  4. RockStor

XigmaNAS‘tan başlayalım.

Eski adı FreeNAS. FreeBSD altyapısı üzerine kurulu.
Varsayılan admin ve root parolası xigmanas.

2GB RAM, 2GB OS Alanı istiyor. CPU kullanımı çok düşük.

Arayüzü basit, ancak kullanışlı değil. Paylaşım oluşturmak yerine “Mount Point” oluşturma şeklinde çalışıyor. Bu da, NAS mantığı yerine Webmin kullanıyormuş hissi veriyor. Hatta Webmin yönetmek daha kolay denebilir.
Bu işlerden anlarım diye havalara girmeme rağmen, bu dağıtımı 30dk içinde kullanılabilir bir NAS haline getiremedim.


OpenMediaVault :

Varsayılan root parolası “kurulum esnasında giriliyor”. Varsayılan admin parolası openmediavault.

Debian altyapısı kullanıyor. Ram ve CPU kullanımı oldukça düşük. XigmaNAS 2GB Ram’den 700MB boş bırakıyor ilk çalışmada. OpenMediaVault 2GB’ın 1.8GB’ını boş bırakıyor.

Derli toplu bir görünümü var. XigmaNAS gibi, az kaynak istiyor.

Dosya Sistemleri menüsünden depolama için kullandığım diski bağlandım.
Kullanıcı oluşturdum.
Bir paylaşım oluşturdum.
son olarak da SMB’yi açıp, ilgili paylaşımı SMB’ye dahil ettim.

Birkaç dakika içinde NAS kullanıma hazır hale geldi.

Sadece ve amaca yönelik gibi duruyor. XigmaNAS’ta diskteki imajlardan sanal makina oluşturma vardı. Bunda öyle bir özellik gözükmüyor.


TrueNAS:

Varsayılan root parolası “kurulum esnasında giriliyor”. Varsayılan admin parolası da “kurulum esnasında root için girdiğiniz parola”.

En az 8GB Ram istiyor. Altyapısı FreeBSD. Varsayılan olarak ZFS kullanıyor.
İlk açıldığında 8GB’tın 3.3GB’ını kullanıyor.

Görünüşü en güzel DashBoard bunda bence.
Diğerlerinde olan “İlk kurulum sihirbazı” eksiği burada da mevcut. Sistem ilk kurulduğunda, sistemi NAS olarak kullanmaya hazır hale getiren bir sihirbaz olsa çok iyi olurdu. Her birinin iç yapısı farklı. Adımları aynı olmuyor.

Pools altından Pool ekleyerek başlanıyor.
Ardından bir DataSet ekleniyor.
Kullanıcı ekleme ekranında oluşturulan DataSet seçilerek kullanıcı oluşturuluyor.
Ardından,  Sharing -> Windows Sharing altından SMB paylaşımı oluşturuluyor. Fakat ağda \\NasIp yazıldığında paylaşım adı yerine DataStora\PaylaşımAdı şeklinde gözüküyor. Bu istediğim bir durum değil. Her ne kadar görünümü çok iyi olsa da, OpenMediaVault’ta paylaşım oluşturmak daha kolaydı. Oluşturulan paylaşım da doğrudan share olarak gözüküyordu.

XigmaNAS’ta olduğu gibi, sanal makina desteği var.


RockSTOR

İlk kurulumda bir ip bilgisi vermemesi ilk büyük eksikti.
İkinci eksik, sadece HTTPS bağlantısı kabul etmesi. “Ne var bunda, iyi işte” diyebilirsiniz. HTTPS kullanmasına tabi ki itirazım yok. Fakat HTTP bağlantısı yapıldığında “Connection Refused” yerine HTTPS portuna yönlendirebilirdi.
Neyse, nginx ayarlarından kendimiz yönlendiririz.

VmWare altında kurulduğunda,

ERROR: not a valid btrfs filesystem: /dev/disk/by-id/

hatası veriyor. Bunu, ilgili sanal makinanın VM Options -> Advanced ->Configuration Parameters kısmına disk.EnableUUID=TRUE parametresini ekleyerek çözebilirsiniz.

Her zamanki gibi ilk adımımız ortak isimli bir kullanıcı oluşturmak.
Ardından Pool ve Share ekledik.
Oluşturduğumuz Share’ın yetki kısmında ortak kullanıcımıza bu Share üzerinde yetki de verdikten sonra işlemimiz tamamlanıyor

Daha önce yapmadıysak, File Sharing -> Samba ekranından Samba paylaşımını açalım ve oluşturduğumuz Share’i “Samba Export” lsitesine ekleyelim.

Buraya kadar, diğer NAS dağıtımlarına göre (ilk baştaki VmWare hatasını saymazsak) basit ve hızlı bir kurulum oldu.

coolwolf / 15/01/2021

OsX Seri Port İzleme

OsX altında seri port haberleşmesini izlemek istediğimizde, Windows’ta yaptığımız gibi, Putty veya benzeri terminal programı yüklemeye ihtiyacımız yoktur. Bu işlemi OsX’in dahili “screen” komutu ile yerine getirebiliriz. Alttaki adımları izleyerek, bilgisayarınıza bağlı seri cihazın veri akışını takip edebilirsiniz.

Önce kullanılabilir portaları listeleyelim:

ls /dev/cu.*

Alttaki gibi bir çıktı almalısınız:

/dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbserial-012345

Seri port dinlemeyi başlatalım:

screen /dev/cu.usbserial-012345 115200
  1. parametre Seri port adı. cu.usbserial-012345 kısmını sizin listenizdeki port ile değiştirin.
  2. 2. parametre ise band hızıdır. Dinlemek istediğiniz cihazın baud hızını yazmalısınız.

Terminal (screen) ekranından çıkmak için, önce CTR + A ardından sadece k (veya İngilizce klavyede \ (ters slash)) tuşlarını kullanabilirsiniz.

coolwolf / 04/11/2020

PrestaShop kullanım tecrübesi

Yazıya başlamadan bilgi seviyemi belirtmem gerekir. Php tabanlı bir altyapı ile çalışırken takıldığım yerlerin sebebi hakkında ipucu verecektir.

C#: iyi
PHP: iyi
PHP Framework yapısı: az
CSS: Eh işte
HTML: iyi

Uzun araştırmalar sonucunda, opencart ile prestashop arasında kaldım. Türkçe desteği, modül desteği vb. gibi kriterleri de arştırınca prestahop tercih ettim.

İlk etapta 90€’luk bir tema ile işe başladım. Temayı satın aldığım yer 2 ay sonsuz destek dediyse de, en basit talepelrime bile paralı ticket açması gerektiğini söyledi. Yani 2 ay destek vs. hak getire.

CSS konusunda iyi olmadığımdan zar zor birşeyler yapabildim.

Ardından konu geldi C# uygulamam ile prestashop arasında api ile ürün gönderme, güncelleme, sipariş indirme vb. gibi işlemleri yapmaya. İlk ve en büyük eksi puanı burada aldı prestashop. Bu kadar kötü tasarlanmış bir api yapısı görtmedim daha önce. Biraz araştırınca, apinin kolay kullanılabilmesi için ek modül satın alınabiliyormuş !!!!
Hani bu bedava bir uygulamaydı ????

Bir şekilde api konusunu tamamladım. Sıra ürün fiyatını güncellemeye geldiğinde, ÜrünID ve Fiyat bilgisini PUT ile gönderdim. Ardından ürün listeden kayboldu!! Veritabanından bakınca, sadece fiyat kısmının güncellendiğini, geri kalan bilgilerin varsayılan değerlerle değiştiğini gördüm. Varsayılan değeri olmayan alanlar da sıfırlanmış. Tabi ShopId, CategoryId vb. sıfırlandığı için ürün ekrandan kayboluyor. Bu bilgiyi öğrendikten sonra, fiyat güncelleme esnasında tüm ürün bilgilerini!! komple gönderecek şekilde düzenledim kodu. Bunun olmaması için de bir modül satın alınabildiğini öğrenmem uzun sürmedi :)!!

Bir sonraki boş vaktimde, kendi apimi yapıp, bu api ile doğrudan veritabanına yazmanın çok daha kolay olacağına karar verdim.

Bir şekilde bu aşamaları geçtik. Örnek ürünleri yükledikten sonra, sıra geldi siteyi derli toplu hale getirmeye. Statik sayfalara sitem.com/iletisim şeklinde se friendly link vermek istedim. Sürpriiiizzz !!! bunu yapamazsınız. siteniz.com/ID-FriendlyUrl şeklinde olmak zorunda. Yahu ne alaka, site benim. Vardır bir yerde bir ayarı deyip, aradım taradım ama nafile. Eğer Firendly Url’nizi ID’siz istiyorsanız modülü var. 60€ !!!!

Açıkçası bu aşamadan sonra prestashop kullanmamaya karar verdim.

Buraya da bu yazıyı yazıyorum ki, benzer araştırmayı yapacak arkadaşlar seçimlerini yaparken API kullanımı kolay mı, friendly url nasıl yapılıyor, hangi modüller paralı hangi modüller ücretsiz, ücretli modülleri Türkiyede satan var mı, satın alınan modüllerin desteği konusunda sorun yaşanıyor mu gibi bilgileri iyice araştırsınlar.

coolwolf / 16/08/2019

MicroPython machine.Pin kullanımı

Öncelikle kütüphaneyi dahil etmemiz gerekiyor:

from machine import Pin

Ardından pin nesnesi oluşturalım:

EspPin = Pin(33, Pin.IN)

Pin tetiklendiğinde çalıştırılacak fonksiyonu tanımlayalım:

def PinTrigger(p):
    print("Pin Tetiklendi:"+str(p)+"||")

Şimdi Pin.irq fonksiyonu ile pin voltajına göre nasıl tetikleme yapabileceğimize bakalım.
1. trigger=Pin.IRQ_FALLING

EspPin.irq(trigger=Pin.IRQ_FALLING , handler=PinTrigger)

Bu şekilde yaptığımızda, 33 nolu pin – (eksi) değer aldığı sürece, sürekli olarak PinTrigger fonksiyonu çalışacaktır.

2. trigger=Pin.IRQ_RISING

EspPin.irq(trigger=Pin.IRQ_RISING , handler=PinTrigger)

şeklinde kullandığımızda ise pin değeri eksiden artıya döndüğünde tetiklenir.

Mekanik butonlar durum değiştirme esnasında milisaniye aralığında dalgalanma gönderirler. Bu doğal bir sonuçtur. Bu işlemin bize yansıması, pin tetikleme foksiyonumuzun butona her basıldığıdna 3-5 defa peşpeşe tetiklenmesi şeklinde olur.
Önlem olarak, fonksiyon başında, iki tetiklenme arası 200-300 milisaniye geçmemişse fonksiyondan çık şeklinde bir sorgu koyarsak sorunumuz çözülmüş olur.

coolwolf / 10/08/2019

NodeMCU serial Communication with Nextion using LUA

  1. Never forget to set a fuse in init.lua
gpio.mode(6, gpio.INPUT)
EnableBoot=gpio.read(6)

if EnableBoot==0 then dofile("main.lua") 
else print("Device will not continue booting...")
end

Consider we have a text with id t0 on Nextion.
To test two way communication, we put a button on Nextion, which send “Hello from Nextion” over serial.
This incoming data is also printed to the debug screen.
The last component on Nextion is a gauge with id z0.

Below you can found main.lua file wihch does two way communication with Nextion. It sends the Pot value to the Nextion on input trigger. And at at every second it sends Pot value to Nextion’s gauge as integer value.

print("Normal Boot")

local MyInput=5
local Threshold=1000
local LastTrig=0
local PotValue=0

gpio.mode(MyInput,gpio.INT)

local mytimer = tmr.create()

local function SendToNextion(Object,Property,Value,IsInt)
    if IsInt then
        uart.write(0,Object.."."..Property.."="..Value..(string.char (255))..(string.char (255))..(string.char (255)))
    else 
        uart.write(0,Object.."."..Property.."=\""..Value.."\""..(string.char (255))..(string.char (255))..(string.char (255)))
    end  
end

local function InputTrigger(State, Time)
    local ms=tmr.now()/1000
    local diff=ms-LastTrig
    if diff



I hope this helps.

coolwolf / 28/07/2019

ESP201 Usable NodeMCU Pins

I just bought ESP-201. Then i flashed nodemcu firmware and boot the chip. When i started to write my first lua script, i see the pin numbers shown on ESP-201 pdf and other sources on the internet does not match with my chip. Then i made some tests to found which pin is which.

As you can see on the picture above, we have 6 pin’s usable as input/output on ESP-201 (If anyone has more knowledge, comments are welcome)

As you may already know, we can not use IO0 and IO2 on esp chips. They are used for boot mode selection.

But IO0 and IO2 shown on ESP-201 layout are on right place. I use them to flash firmware and boot normally. Also RX/TX and other pins needed to boot are okay.

gpio.mode(0,gpio.INPUT)
print(“GPIO 0:”,gpio.read(0))

The problem began when i try to use these lua commands:

I try each pin and found they differ for nodemcu. I marked them on the picture above. gpio0 is XPD/IO16 pin, gpio1 is IO5 pin etc.

I hope this helps other peoples trying to use ESP-201 with nodemcu/lua

coolwolf / 07/07/2019

Windows 10 L2TP VPN sunucusuna bağlanamıyor ama iOS ve Android bağlanıyor

Windows 10 istemciden L2TP bağlantısı yapmaya çalıştığınızda hata alıyorsanız ama iOS ve Android istemcilerden sorunsuz bağlanabiliyorsanız sırasıyla aşağıdaki işlemleri deneyebilirsiniz.

  1. Yönetici olarak komut satırı penceresi açın ve alttaki kodu çalıştırın:
  2. REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
  3. Bilgisayarınızı kapatıp açın.

Umarım sorunuz çözülmüştür.

coolwolf / 18/04/2019

NodeMCU Lua gpio.trig() kullanımı

grpio.trig fonksiyonu ile genel kullanım giriş/çıkışlarının durumlarına göre tetikleme yapabilirsiniz. Aşağıda her bir tetikleme modununun nasıl çalıştığını anlatmaya çalıştım.

up: Pin voltajı eksiden artıya değiştiğinde tetiklenir. Bir kez tetiklendiğinde, eksi görüp tekrar artı görmediği sürece tetiklenmez. Yani tekrar tetiklenmesi için pin girişinin eksi olması ve tekrar artı olması gerekir.
Örnek Kod:

local GirisPini=1 
gpio.mode(GirisPini,gpio.INT) 

local function PinUp(durum, zaman) 
 print("PinUp Durum:"..durum.." Zaman:"..zaman)    
 print("..................")  
end
 
gpio.trig(GirisPini, "up", PinUp)

down: Pin voltajı artıdan eksiye döndüğünde tetiklenir. Bir kez tetiklendiğinde tekrar tetiklenmesi için pin değerinin yeniden bir kez artı ve tekrar eksi olması gerekir.
Örnek Kod:

gpio.mode(GirisPini,gpio.INT) 

local function PinDown(durum, zaman) 
 print("PinDown Durum:"..durum.." Zaman:"..zaman)    
 print("..................")  
end
 
gpio.trig(GirisPini, "down", PinDown)

both: Pin voltajı değiştiğinde tetiklenir. Eksiden artıya veya artıdan eksiye her değiştiğinde tetiklenir.
Örnek Kod:

gpio.mode(GirisPini,gpio.INT) 

local function PinBoth(durum, zaman) 
 print("PinBoth Durum:"..durum.." Zaman:"..zaman)    
 print("..................")  
end
 
gpio.trig(GirisPini, "both", PinBoth)

low: Pin voltajı eksi olduğu sürece sürekli tetiklenir. Yukarıdakilerin tamamı bir kez tetiklenirken, low ve high sürekli olarak tekrar eder.

local GirisPini=1
gpio.mode(GirisPini,gpio.INT)

tamponsure=300
zamanfarki=0
sonokuma=0

local function PinLow(durum, zaman)
    --sürekli tekrar etmemesi için 300 milisaniyelik aralıklarla kontrol etsin
    zamanfarki=(zaman-sonokuma)/1000
    if zamanfarki




high: Pin voltajı artı olduğu sürece sürekli tetiklenir.

local GirisPini=1
gpio.mode(GirisPini,gpio.INT)

tamponsure=300
zamanfarki=0
sonokuma=0

local function PinHigh(durum, zaman)
    --sürekli tekrar etmemesi için 300 milisaniyelik aralıklarla kontrol etsin
    zamanfarki=(zaman-sonokuma)/1000
    if zamanfarki