EMP 800.14 bozuk para tanıma cihazı

20 Kas 2009 In: hoş, ilginç

Merhabalar, WH Münzprüfer berlin firmasına ait EMP800.14 model bozuk para ve jeton tanıma cihazına, custom (özel) jeton tanıtımı ile ilgili bir çok mail gelmekte, adım adım nasıl yapılacagını aşagıda inceleye bilirsiniz. Uygulamadaki degerli bilgilerini bizimle paylaşan Önder BİLİM e teşekkürler.

İlk olarak cihaz USB üzerinden PC ye baglı olmalı, hiç bir yazılıma ihtiyaç yok. Yanlızca elektriksel baglantı için ihtiyacımız var. Buyrun efendim :

  1. 8 nolu swtich "ON" yapılarak "Teach Mode" aktif hale getirilir.
  2. 7 nolu swithc "ON" yapılarak tolerans oranını arttıralım.
  3. Cihazdaki 15 ve 16 nolu portlar ögretilebiliyor. Hangisini kullanmak istiyorsanız onu "ON" yapınız.
  4. Ögrenmesini istediginiz bozuk para veya jetondan en az 10 tane ardısıra atıoyoruz. Ve ögrettigimiz portu "OFF" yapıyoruz.
    İşlem başarılı olmuş ise selenoid kendisini bir defa çekip bırakıyor.
  5. Cihazı teach moddan çıkarıyoruz. Yani switch 8 "OFF".

Artık kullanıma hazır. Yeni para tanıtma işlemi bu kadar. Hepinize kolay gelsin.



EMP 800



bozuk para münzprüfer berlin

Çok güzel bir haber çünkü .Net MF in Microsoft'ta Developer Division a taşındıktan sonraki ilk versiyonu. Çok değişiklik var. Hem vizyonu degişmiş hemde içerigi geliştirilmiş. Lafı uzatmadan yeniliklerden bahsedeyim, işte gelenler:

 

  •         HTTP ve HTTPs: HTTP client ve server uygulamalarına tam destek. (System.Net.HttpWebRequest, System.Net.HttpWebResponse, System.Net.HttpListener)
  •         Çoklu Dokunma ( Multi-touch ) : Giriş seviye çoklu dokunma destegi, mesela ekran üzerinde 2 parmağın hareketini algılama (emulatorde destegi). Gesture desteği yeniden daha hızlı ve yetenekli hale getirilmiş.
  •         Versiyonlama: Built ile Versioning ayrımı yapabilme, aynı kütüphanenin farklı versiyonları bind edebilme.
  •         SSL ve HTTPS için emulatör desteği: Artık emulator de SSL ve HTTPs emulasyonu.
  •         Native XML Parser: Daha iyi performan için XML parser, native code kısmına taşınmış.
  •         Native collections: Collection sınıfları yine performans için native koda taşımış. Queue ve Stack tipleri zenginleştirilmiş.
  •         Time sync: Cihazlardaki zaman olayı için Time Sync API ile ister manuel veya otomatik olarak istenilen serverdan sync yapılabilecek.
  •         Ayarlanabilir ekran boyutu: 760KB dan buyuk resimler için memory destegi.
  •         Büyük bufferlar: Microsoft.SPOT.Hardware.LargeBuffer adında yeni bir tip ile 760KBden buyuk buffer imkanı. Ve artık Microsoft.SPOT.Hardware sınıfının içinde.
  •         Watchdog ve Güç Seviye kontrolü: Güç seviyesi ve watchdog'u managed kod ile kontrol edebilme Microsoft.SPOT.Hardware. PowerState  ve Microsoft.SPOT.Hardware.Watchdog sınıfları.
  •         Geniş kalemler (pens) ve gradient dolgular: Geliştirilmiş grafik modelleme (widgets ve WPF kontroller için).
  •         TinyCore performans geliştirmesi: Olay güncelleme ve layout performansı TinyCore için geliştirilmiş.

Vizyondaki degişik ise lisanslamada, artıkın .NET her şeyi ile FREE. Yarın detaylandıracagım şimdi çıkmam lazım. Geç oldu  :)

Merhabalar, alpha kardeş yeni bir mail atıp sorunu giderdigini anlatmış, sizde adım adım uygularsanız blogengine altyapısı kullanan blogunuza yorum ekleme kısmında captcha ( resim dogrulama) ile spam yorumlardan kurtula bilirsiniz.

Ben ciddi anlamda comment (yorum) kirliligi yaşıyorum.
Aşagıdaki adımları eksiksiz yaparsanız, bendeki gibi çalışan bir yapınız olur :

 1. Web.config den ajaz destegini açıyoruz

<pages enableSessionState="true" enableViewStateMac="true" enableEventValidation="true">

 2. Kök dizinde Image.aspx diye bir dosya oluşturuyoruz, içisi bu şekil :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Image.aspx.cs" Inherits="Image" %>
     Kök dizinde yine Image.aspx.cs diye bir dosya yaratıyoruz, içisi :
using System;using System.Data;using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Drawing;using System.Drawing.Drawing2D;

public partial class Image : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

CreateCheckCodeImage(GenCode(4));

}

private string GenCode(int num)

{

string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E",

"F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

string code = "";

Random rd = new Random();

int i;for (i = 0; i < num; i++)

{

code += source[rd.Next(0, source.Length)];

}

return code;

}

private void CreateCheckCodeImage(string checkCode)

{

if (checkCode.Trim() == "" || checkCode == null)return;

Session["AlphaCaptchaCode"] = checkCode;System.Drawing.Bitmap image =

new System.Drawing.Bitmap((int)(checkCode.Length * 19), 22);Graphics g = Graphics.FromImage(image);

try{Random random = new Random();

g.Clear(Color.White);

int i;

for (i = 0; i < 25; i++)

{

int x1 = random.Next(image.Width);

int x2 = random.Next(image.Width);

int y1 = random.Next(image.Height);

int y2 = random.Next(image.Height);

g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);

}

Font font = new System.Drawing.Font("Arial", 14, (System.Drawing.FontStyle.Bold));

System.Drawing.Drawing2D.LinearGradientBrush brush =

new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);

g.DrawString(checkCode, font, brush, 4, 1);

g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

System.IO.MemoryStream ms = new System.IO.MemoryStream();

image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

Response.ClearContent();Response.ContentType = "image/jpg";

Response.BinaryWrite(ms.ToArray());

}

catch

{

g.Dispose();

image.Dispose();

}

}

}

   3.1. Kök dizindeki /Users Control/ klasöründe bulunan CommenView.ascx i açıp, '<span class="bbcode" title="BBCode tags"><%=BBCodes() %></span>' yazan satırın üstüne aşagıdaki kodu ekleyip kaydedip geri yolluyoruz :

 <label for="<%=txtCaptcha.ClientID %>">Güvenlik *</label>

<img src="/Image.aspx" alt="Degistirmek için tıklayın" style="width: 82px; height: 23px" onclick="this.src=RefreshCaptcha(this.src)" />
<asp:TextBox runat="Server" ID="txtCaptcha" TabIndex="4" MaxLength="4" Width="60px" onblur="DoCheckCaptcha()"/><span id="CaptchaMsg"></span><asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtCaptcha" ErrorMessage="<%$Resources:labels, required %>" Display="dynamic" ValidationGroup="AddComment" /><br />

 

3.2. Birde sayfada ki 'Save' butonunu aşagıdaki kodla degiştiriyoruz :

<input type="button" id="btnSaveAjax" value="<%=Resources.labels.saveComment %>" onclick="if(Page_ClientValidate('AddComment')&&checkCaptchaResult){AddComment()}" tabindex="7" />

 

3.3. Ve  'lbCommentsDisabled' labelini buluyorsunuz sayfada, onun hemen üst satırına aşagıdaki kodu ekliyorsunuz :

 <script type="text/javascript">    

        function DoCheckCaptcha() {

            var code = document.getElementById("<%=txtCaptcha.ClientID %>").value;

            checkCaptcha(code);

        }

        var checkCaptchaResult=false;

        function ReceiveServerData(CheckResult) {

            document.getElementById("CaptchaMsg").innerHTML = "";

            if (CheckResult == 1) {

                checkCaptchaResult = true;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=green>Captcha OK</font>";

            }

            else if (CheckResult == -1) {

                checkCaptchaResult = false;

                //document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

            else {

                checkCaptchaResult = false;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

        }

        function RefreshCaptcha(url) {

            if (url.toString().indexOf("?",0) > 0) {

                url = url.toString().substring(0, url.toString().indexOf("?", 0)) + "?" + new Date().toUTCString();

            }

            else{

                url = url.toString() + "?" + new Date().toUTCString();

            }

            return url;            

        }

    </script>

4.1.  Neredeyse bitti, son olarak CommentView.ascx.cs de RaiseCallbackEvent, foksiyonunu buluyorsunuz o fonksiyonun en üstüne aşagıdaki kodu ekliyorsunuz :

 if (eventArgument.Length < 1)

  {

      _Callback = "-1";

      return;

  }

  if (eventArgument.LastIndexOf("-|-") < 0)

  {

      string img = Session["AlphaCaptchaCode"].ToString().ToLower(); ;

      if (eventArgument.ToLower().Equals(img))

      {

          _Callback = "1";

      }

      else

      {

          _Callback = "0";

      }            

      return;

  }

4.2. Sayfadaki Page_Load, methodunu buluyorsunuz '//InititializeCaptcha();' satırını hemen altına :

string cbReference = Page.ClientScript.GetCallbackEventReference(this, "CheckResult", "ReceiveServerData", "");
string callbackScript = "function checkCaptcha(CheckResult){" + cbReference + ";}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "checkCaptcha", callbackScript, true);
 

 

İşte bu kadar arkadaşlar, hepinize kolay gelsin, alpha ya teşekkürler.

 

Visual Studio 2008 için bir ipucusu

10 Kas 2009 In: .net, ipucu

Code sectionda, kod yazarken methodlarımızı, regionlarımınız veya scopelarımızı Visual Studio sağ olsun daha kolay okuna bilsin diye bize yardımcı olur ve onları agaç yapısı şeklinde kümeler, tıpkı aşagıdaki gibi :

 

böyle düzenli iken çok güzelde çalışmaya başlayınca, gitgite kodlar arasında kaybolunmaya başlanılıyor. Bir düzene sokmak için tek tek kapatmanız (collapse) yapmanız gerekebilir. Bendede sebebini bilinmez bir hepsini tek tek kapatma istegi var. Bu 5000 satırlı bir cs dosyasında epey vakit alabileceginden bunun ipucunu sizinle paylaşmak istedim.

Efendim tek yapmanız gereken, kapatmak istediginiz region veya scope a geliyorsunuz ve CTRL+M CTRL+M (iki kere)
ve ilgili scope kapandı tekrar CTRL+M CTRL+M deyincede yeniden açıldı.

Ha eğer tümünü açmak isterseniz CTRL+M CTRL+L diyoruz tümüsü açılır (Open All olayı).

Tümünü hızlıca kapatmak içinse CTRL+M CTRL+O (Yani Collapse All olayı).

Çeşitli web kontrollerinde (örn. Datagrid ve DataListl), bazı resimlerin bind edilen veriye göre resim kaynaklarını kullanmasını isteriz. Resimlerin url'lerini dinamik belirlerken dogal olarak tooltipleride güncellemek istersiniz. Aşagıdaki örnekdeki gibi IMAGE kontrollerinin URL ve ALT html taglarını databound anında belirlenmiştir :

 




Template fieldaki imagelerin dinamik baglanması konusu şu şekil sizinde bildigi üzere :

            //prod. with camp.
            string k = ortak.LOGO.UrununKampanyasi(((DataRowView)e.Row.DataItem).Row["LOGICALREF"].ToString());
            if (k != "")
            {
                ((Image)e.Row.FindControl("img_kampanyali")).Visible = true;
                ((Image)e.Row.FindControl("img_kampanyali")).AlternateText ="Kampanya Koşulu : " + k;
                
            } 

Burada ben sürekli resimlerde tooltip olarak ALT html tagını kullanırdım <img src="var.gif" Alt="Stokda"/> gibi


Lakin Firefox ve Chrome bunları görüntülememekte, biraz araştırınca sorunu fark ettim efendim, sizinlede paylaşayım dedim. 

Resimler deki ALT (AlternativeText) tagı, yanlızca resimin browser tarafından gösterilemedigi durumlarda görüntülenmek üzere oldugu için, FF ve chrome tooltip olarak göstermez. Halbuki IE bunu tooltip gibi sürekli göstermekte, IE 6 dan IE 8 kadar bu böyle.

Lakin FF ve Chrome buna bozulur, kardeşim W3C bu iş için aslan gibi TITLE tagını yapmış nüçun onu kullanmazsın der ve ALT ları tooltip olarak göstermez. Ama Visual Studio 2005 ve 2008 de code sectionda 

((Image)e.Row.FindControl("img_kampanyali")).Title="Kampanyalı ürün";

derseniz VS size kızar ve derlemez. O ne olaki der ! Smile

Hal böyle olunca iş yine JS e düşer ve şu method hayatınızı kurtarır:

<script language="javascript" type="text/javascript">
window.onload=function() 
{
   for (var i = 0; i < document.images.length; i++) 
   {
      if (document.images[i].title == "") 
         document.images[i].title = document.images[i].alt; 
   }
};
</script>


Siz yine bildiginiz yöntemle yaparsınız (ALT tagı ile), bu JS sayfaki bütün imageleri tek tek dolaşır TITLE ı olmayan resimlere ALT tagında yazanı atar. Sizinde sorun çözülür.

O zman ne diyoruz hep birlikte "yaşasın JS !..."


Ben Kimim ?

Celiker BahceciMerhabalar, ben Çeliker BAHÇECİ. 2004 den beri özel sektörde bilgisayar mühendisligi ve egitmenlik yapıyorum. Yine aynı yılın Ekim ayından beri sitemde .Net ile programlama ve hayat görüşüm ile ilgili makalelerimi yayınlıyorum. Blogum dışında Yazgelistir.com, mobilnedir.com gibi ineta kapsamındaki bir çok siteye Microsoft teknolojileri ile ilgili yazılar yazmaktayım.
Bu site ile sizinde hayatınızı anlamlandırmanızda bir parça katkımın olması dilegiyle...