Oldalak

2013. március 13., szerda

File méretének lekérdezés WinAPI használatával

Az alábbi függvénnyel egy állomány méretét lehet lekérdezni. A lekérdezéshez a GetFileAttributesEx WinAPI függvényt használom fel.
A függvény a 2GiB -nál nagyobb méretű állományok méretét is helyesen adja vissza (nincs túlcsordulás), mert a visszatérési érték Int64-ben van.

function GetFileSize(AFileName : String) : Int64;
var
  rData : WIN32_FILE_ATTRIBUTE_DATA;
  iSize : Int64;
begin
  Result := 0;
  if GetFileAttributesEx(PChar(AFileName), GetFileExInfoStandard, @rData) then
    begin
      iSize := rData.nFileSizeHigh;
      iSize := iSize shl 32;
      iSize := iSize + rData.nFileSizeLow;
      Result := iSize;
    end;
end;

2013. március 4., hétfő

sfPopup használata

A minap abba a problémába ütköztem, hogy Samsung SMART TV alkalmazásban egy popup stílusú dialógus ablakot kellett készíteni. Nos a megoldás kézenfekvő, ezt meg lehet oldani jQuery segítségével és nem kell a ECMAScript stílusban megírni a kódot. A gondot viszont az jelenti, hogy a Samsung SMART TV fejlesztői API elírásai igencsak vérszegény leírások. A google keresője sem sokat segít ebben a feladatban. Ami viszont segítség, hogy a SMART TV emulátorában lehet debuggolni a Javascript kódot és a nyomkövetés közben meg lehet nézni a gyári függvényeket, illetve bele lehet "kukkantani" az sfPopup működtető kódjába. Ennek segítségével hoztam létre az alábbi működő popup ablakot.

index.html tartama:

 
  
  IME_Test

  
  
  
  
   
  
        
        
  
  
  
  
  
  
  

  
  

  

 

 
   
  
  
Ez egy tartalom

Main.js tartalma:
var widgetAPI = new Common.API.Widget();
var tvKey = new Common.API.TVKeyValue();
var pluginAPI = new Common.API.Plugin();
var fileSystemObj = new FileSystem();

var Main = {
 selIndex : 0,
 selListIndex : 0,
 SCROLL_UP : 1,
 SCROLL_DOWN : 2,
 use_scrollbar : false,
 scrollb_height : 0
};

Main.list = new Array();
Main.list_ex = new Array();

Main.onLoad = function() {
 // Enable key event processing
 this.enableKeys();
 widgetAPI.sendReadyEvent();
 this.list.push("A", "B", "C", "D", "É", "J", "K", "L", "M", "Q", "G", "S");
 this.init();
};

Main.onUnload = function() {

};

Main.init = function () {
 
 $("#popup").sfPopup({
  text: "",
  buttons: [], // "OK",
  title: "Gyors kereső",
  timeout: 0,
  defaultFocus: 0,
  keyhelp: {'UPDOWN':'Navigáció', 'ENTER':'Kiválaszt', 'RETURN':'Vissza'},
  //keyhelp: {'UPDOWN':'navigate', 'ENTER':'Select', 'RETURN':'Back'},
  callback: function (index) {
   
   dialogCallBack(Main.selIndex);
   
   Main.enableKeys();
  },
  onkeydown: function(keyCode) {
   
   alert("popup onkeydown event KEYDOWN : " + keyCode);
   
   if (event.defaultPrevented) {
    switch (keyCode) {

    case tvKey.KEY_ENTER:
     this.hide();
     break;
    case tvKey.KEY_UP:
     
     if (Main.selIndex == 0) {
      Main.selIndex = Main.list.length - 1;
     } else {
      Main.selIndex--;
     }
     Main.updateListSelection(Main.SCROLL_UP);
     break;
    case tvKey.KEY_DOWN:
     
     if (Main.selIndex == Main.list.length - 1) {
      Main.selIndex = 0;
     } else {
      Main.selIndex++;
     }
     Main.updateListSelection(Main.SCROLL_DOWN);
     break;
    }
   }
   sf.key.preventDefault();
   
   return true;
  }
  /*,
  actionpopup: true
  */
 });
};

function dialogCallBack(param) {
 alert("selected index: " + param);
 //$("#popup").sfPopup("hide");
 var item = Main.list[param];
 $("#text").html(param + ' érték: ' + item);
}

Main.enableKeys = function() {
 document.getElementById("anchor").focus();
};

Main.getListHtml = function () {
 var res = "";
 
 for (var i = 0; i < 5; i++) {
  if (i < this.list.length) {
   res += '
  • ' + this.list[i] + '
  • '; } else { res += '
  • '; } } /* for (var i = 0; i < this.list.length; i++) { res += '
  • ' + this.list[i] + '
  • '; } */ res = '
      ' + res + '
    '; return res; }; Main.initScroll = function() { if (this.list.length > 5) { $("#scrollbgalls").addClass('scrollbgalls'); $("#scrollmarkalls").addClass('scrollmarkalls'); $("#scrollbgalls").show(); $("#scrollmarkalls").show(); $("#scrollbgalls").height($(".internal_list").height()); this.use_scrollbar = true; this.scrollb_height = $("#scrollbgalls").height() - $("#scrollmarkalls").height(); } else { $("#scrollbgalls").removeClass('scrollbgalls'); $("#scrollmarkalls").removeClass('scrollmarkalls'); $("#scrollbgalls").hide(); $("#scrollmarkalls").hide(); this.use_scrollbar = false; } }; Main.updateListSelection = function(move_direction) { var len = this.list.length; if (len > 5) { len = 5; } if (move_direction == Main.SCROLL_DOWN) { if (this.selListIndex < 4) { this.selListIndex++; } else { if (this.selIndex == 0) { this.selListIndex = this.selIndex; // frissiteni kell a tartalmat for (var i = this.selIndex; i < len; i++) { var item = '#item_' + i; var li = $(item); if (li != undefined) { li.html(this.list[i]); } } } else { // frissiteni kell a tartalmat var j = 0; for (var i = this.selIndex - 4; i <= this.selIndex; i++) { var item = '#item_' + j; var li = $(item); if (li != undefined) { li.html(this.list[i]); } j++; } } } } else if (move_direction == Main.SCROLL_UP) { if (this.selListIndex == 0) { if (this.selIndex == this.list.length - 1) { var j = 0; for ( var i = this.selIndex - 4; i <= this.selIndex; i++) { var item = '#item_' + j; var li = $(item); if (li != undefined) { li.html(this.list[i]); } j++; } this.selListIndex = 4; } else { var j = 0; for ( var i = this.selIndex; i < this.selIndex + 5; i++) { var item = '#item_' + j; var li = $(item); if (li != undefined) { li.html(this.list[i]); } j++; } } } else { this.selListIndex--; } } for (var i = 0; i < len; i++) { var item = '#item_' + i; if (i == this.selListIndex) { $(item).addClass('selected_item'); $(item).blur(); } else { $(item).removeClass('selected_item'); } } if (this.use_scrollbar) { var top = (this.scrollb_height / (this.list.length - 1)) * this.selIndex; $("#scrollmarkalls").css("top", top + "px"); } }; Main.keyDown = function() { var keyCode = event.keyCode; alert("Key pressed: " + keyCode); switch(keyCode) { case tvKey.KEY_RETURN: case tvKey.KEY_PANEL_RETURN: alert("RETURN"); widgetAPI.sendReturnEvent(); break; case tvKey.KEY_LEFT: alert("LEFT"); break; case tvKey.KEY_RIGHT: alert("RIGHT"); break; case tvKey.KEY_UP: alert("UP"); //this.ShowPopup(); break; case tvKey.KEY_DOWN: alert("DOWN"); break; case tvKey.KEY_ENTER: case tvKey.KEY_PANEL_ENTER: alert("ENTER"); break; case tvKey.KEY_RED: this.selIndex = 0; this.selListIndex = 0; $("#popup").sfPopup("option", "text", this.getListHtml()); $("#popup").sfPopup("show"); this.initScroll(); this.updateListSelection(); break; case tvKey.KEY_GREEN: break; default: alert("Unhandled key"); break; } };

    Ezt a fenti kódot futtatva az alábbi kinézetű ablak fog megjelenni:

    2013. február 21., csütörtök

    Eredmény halmaz rendezése magyar ábécé szerint MySQL-ben

    A minap futottam abba a problémába, hogy egy SQL lekérdezésben az eredmény halmazt a magyar ábécé szerint kellett rendezni. Ez önmagában nem lenne probléma, ha a tábla illetve az a mező, amiből szelektálni akarunk a karakter készlete utf8_hungarian_ci (COLLATION) lenne. Jelen esetben a táblában lévő adatok migrációja UTF-8 kódolásra nem megoldható ezért a SELECT-ben kell megoldani ezt a konverziót.


    SELECT id, 
           CONVERT(CAST(nev_latin1_ben as BINARY) USING utf8) as name
    FROM tabla
    ORDER BY CONVERT(CAST(nev_latin1_ben as BINARY) USING utf8) COLLATE utf8_hungarian_ci;
    

    A fenti lekérdezés átkonvertálja a mezőben nev_latin1_ben mező tartalmát UTF-8 karakter kódolásra és az eredményhalmazt magyar ábécé szerint rendezi.

    2013. február 18., hétfő

    Tömb rendezése magyar ábécé szerint

    Ez egy példa, hogy hogyan lehet megvalósítani egyedi rendezést JavaScrip használatával.

    A függvény, ami az egyéni rendezést megvaólsítja:
         function mSort(a, b) {
            
            if (a == b){
                return 0;
            }
            var huAbcLower = "aábcdeéfghiíjklmnoóöőpqrstuúüűvwxyz";
            var huAbcUpper = "AÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ";
            
            len_abc = huAbcLower.length;
            len_a = a.length;
            len_b = b.length;
            var loc_a;
            var loc_b;
            
            for (var n = 0; n < len_a && n < len_b; ++n) {
                for (var k = 0; k < len_abc; ++k) {
                    if (a.charAt(n) == huAbcLower.charAt(k) || a.charAt(n) == huAbcUpper.charAt(k)){
                        loc_a = k;
                    }
                    if (b.charAt(n) == huAbcLower.charAt(k) || b.charAt(n) == huAbcUpper.charAt(k)){
                        loc_b = k;
                    }
                }
                if (loc_a > loc_b){
                    return 1;
                }
                if (loc_a < loc_b){
                    return -1;
                }
            }
            if (len_a > len_b){
                return 1;
            }
            if (len_a < len_b){
                return -1;
            }
            return 0;
        }
    

    A használata pedig a következő képen néz ki:
       var arr = ["Körte", "barack", "alma"];
       
       arr.sort(mSort);
    

    A sort függvény callback paraméterének az általunk létrehozott függvényt kell megadni paraméternek.

    2013. február 4., hétfő

    Refactoring használata

    1. lépés: a kódblokk kijelölése, amit újra hasznosítani szerentnénk, majd a kijelölésen jobb kattintás. A megjelenő menüből a Refactor->Extract Method... menüpontot kell választani.
    2. Lépés: a megjelenő párbeszéd ablakban meg kell adni a metódus nevét.

    Az alábbi kódból:

    for (int i = 0; i iLen; i++)
    {
      int iKey;
      char cLetter;
      do
      {
        iKey = r.Next(65, 65 + (2 * iLen));
        cLetter = (char)iKey;
      } while (sSecret.Contains(cLetter.ToString()));
      sSecret += cLetter;
    }
    
    
    ez a metódus lett:

    private static string GenerateWord(int iLen)
    {
     string sSecret = "";
      for (int i = 0; i < iLen; i++)
      {
      int iKey;
      char cLetter;
    
      do
      {
      iKey = r.Next(65, 65 + (2 * iLen));
      cLetter = (char)iKey;
      } while (sSecret.Contains(cLetter.ToString()));
    
      sSecret += cLetter;
      }
      return sSecret;
    }
    
    A metódus hívási módja pedig ez:
    sSecret = GenerateWord(iLen);
    

    C# dll készítése

    1. Lépés: létre kell hozni egy új ClassLibrary-t. Ehhez a Solution Explorer-ben egy jobb egér gombot kell nyomni, majd a megjelenő menüben az Add->New Project menüpontot kell kiválasztani. Az alábbi ábra ezt szemlélteti.
    A menüpont kiválaszátása után a következő párbeszéd ablak jelenik meg:
    A megjelenő ablakban a Templates listából a Class Library elemet kell kiválasztanunk. A Name mezőbe azt a nevet kell írni. Ez a név lesz az a névtér, amin keresztül el tudjuk majd érni a DLL függvényeit.


    2. Lépés: a Dll metódusainak megírása.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleAppLibrary
    { 
            public class Game
            {
                    static Random r = new Random();
                    public string GenerateWord(int iLen)
                    {
                            string sSecret = "";
                            for (int i = 0; i < iLen; i++)
                            {
                                    int iKey;
                                    char cLetter;
    
     do {
    
       iKey = r.Next(65, 65 + (2 * iLen));
    
       cLetter = (char)iKey;
    
     } while (sSecret.Contains(cLetter.ToString()));
    
     sSecret += cLetter;
    
     }
    
     return sSecret;
    
     }
    
     public void Evaluate(string ASecret, string AAnswer, out int ABlack, out int AWhite)
    
     {
    
     // kimeneti valtozok inicializalasa
    
     ABlack = 0;
    
     AWhite = 0;
    
     for (int iCnt = 0; iCnt < AAnswer.Length; iCnt++)
    
     {
    
     // hanyadik pozicioban szerepel a valasz iCnt-dik
    
     // eleme a titokban
    
     int iPos = ASecret.IndexOf(AAnswer[iCnt]);
    
     
    
     if (iCnt == iPos)
    
     {
    
     ABlack++;
    
     }
    
     else if (iCnt > -1)
    
     {
    
     AWhite++;
    
     }
    
     }
    
     }
    
     }
    
    }
    
    
    

    3. Lépés: a DLL referenciájának hozzáadása az alkalmazáshoz. Ehhez a Solution Eplorer-ben az alkalmazásunkat kijelölve egy jobb egér gombot kell nyomni. A megjelenő menüből az Add Reference... menüpontot kell kiválasztani.
    Ezután a megjelenő párbeszéd ablakban a Project fülre kattintva ki kell választani a DLL-t, majd OK gombot kell nyomni.
    Ezután a Solution Eplorer-ben a References ág kiegészül az újonan hozzáadott DLL referenciájával.

    4. Lépés: a Dll metódusainak használata.

    ...
    using ConsoleAppLibrary;
    namespace ConsoleApplication2
    {
     class Program
     {
     static Game game = new Game();
      static void Main(string[] args)
     {
      ...
     sSecret = game.GenerateWord(iLen);
    ...
    

    C# adattípusok táblázata

    C# adattípus .NET Mérete Legkisebb érték Legnagyobb érték
    sbyte System.Sbyte 1 -128 127
    byte System.Byte 1 0 255
    short System.Int16 2 -32 768 32 767
    ushort System.UInt16 2 0 65 535
    int System.Int32 4 -2 147 483 648 2 147 483 647
    uint System.UInt32 4 0 4 294 967 295
    long System.Int64 8 -9 223 372 036 854 775 808 9 223 372 036 854 775 807
    ulong System.UInt64 8 0 18 446 744 073 709 551 615
    char System.Char 2 0 65 535
    float System.Single 4 1,5*10-45 3,4*1038
    double System.Double 8 5,0*10-324 1,7*10308
    bool System.Boolean 1 false (0) true (1)
    decimal System.Decimal 16 1,0*10-28 kb. 7,9*1028

    C# összetett aritmetikai értékadó műveletek

    Műveleti jel Használati alak Kifejezése Művelet
    += x += 4 x = x + 4

    összeadás

    -=

    x -= 4 x = x - 4

    kivonás

    *= x *= 4 x = x * 4

    szorzás

    /= x /= 4 x = x / 4

    osztás

    %= x %= 4 x = x % 4 maradék képzés (modulo)

    Thread-safe TCounter osztály

    interface
    
    type
      TCounter = class
      public
         constructor Create;
         function GetCounter : Integer;
      end;
    
    var
      Counter : Integer;
      CriticalSection : TRtlCriticalSection;
    
    implementation
    
    constructor TCounter.Create;
    begin
    
      inherited;
      EnterCriticalSection(CriticalSection);
      try
        Counter := Counter + 1;
      finally
        LeaveCriticalSection(CriticalSection);
      end;
    end;
    
    function TCounter.GetCounter : Integer;
    begin
      // nem kell kritikus tartomány, mert az Integer
      // elemi változó
      Result := Counter;
    end;
    
    initialization
      InitializeCriticalSection(CriticalSection);
    finalization
      DeleteCriticalSection(CriticalSection);
    end.
    

    Provider pattern

    public static class Note 
    {
      private static NoteProvider provider; 
      static Note() 
      {
        string providerName = ConfigurationManager.AppSettings["noteProvider"]; 
        Type providerType = Type.GetType(providerName); 
        provider = (NoteProvider)Activator.CreateInstance(providerType); 
      }
      public static string GetNote() 
      {
        return provider.GetNote(); 
      }
    }
     
    public abstract class NoteProvider 
    {
      public abstract string GetNote(); 
    }
     
    public class FirstNoteProvider : NoteProvider 
    {
      public override string GetNote() 
      {
        return "első note"; 
      }
    }
     
      
    public class SecondNoteProvider : NoteProvider
    {
      public override string GetNote() 
      {
        return "második note"; 
      }
    }
    

    Thread safe Singleton minta

    class Program 
    {
      static void Main(string[] args)
      {
      Singleton s, s2;
      s = Singleton.GetInstance();
      s2 = Singleton.GetInstance();
     
      // a két objektum referenciája egyenlő lesz
      Console.WriteLine(ReferenceEquals(s,s2));
      }
    }
     
    class Singleton
    {
      private static Singleton instance; 
     
      /// statikus konstruktor
      /// a legelső osztáylra történő hivatkozákor lefut
      static Singleton()
      {
      instance = new Singleton();
      }
     
      public static Singleton GetInstance()
      {
      return instance;
      }
    }
    

    Műveletek precedenciája

    Szint Művelettípus Műveletek
    1 Elsődleges () . [] x++ x-- new typeof sizeof checked unchecked
    2 Egyváltozós + - ! ~ ++x --x
    3 Multiplikatív * / %
    4 Additív + -
    5 Eltolási << >>
    6 Viszonító < > <= >= is
    7 Egyenlőségi == !=
    8 Logikai AND &
    9 Logikai XOR ^
    10 Logikai OR |
    11 Feltételes AND &&
    12 Feltételes OR ||
    13 Feltételes művelet ?:
    14 Értékadás = *= /= %= += -= <<= >>= &= ^= |=

    Domain MX rekordjának lekérdezése

    nslookup -q=mx domain.name

    A domain.name helyére azt a nevet kell megadni, amiről az MX információt le szeretnénk kérdezni.

    Kötet árnyékmásolatainak méret beállítása

    Kötetek árnyékmásolatait tároló lemezterület méretének korlátozása

    Az árnyékmásolat méretének listázására parancssorba írjuk be a következő parancsot

    vssadmin list shadowstorage

    Az árnyékmásolatokat tároló lemezterület körlátozása illetve testreszabása

    vssadmin resize shadowstorage /for=c: /on=c: /maxsize=2GB

    A fenti parancs 2GB méretűre állítja be az árnyékmásolatok tárolására használható lemezterületet a C: meghajtón. A parancs végrehajtásához rendszergazdai jogosultság szükséges.

    Tálcán megjelenő ikonok újra töltése

    A tálcán megjelenő ikonok újra töltése vista alatt, ha valamelyik ikon eltünne a tálcáról, például eltűnik a hálózati ikon vagy a hangerőszabályozó ikon.

    A parancssorba gépeljük be a következő parancsokat:

    taskkill /F /IM "explorer.exe"

    majd ha végrehajtottuk a fenti parancsot utánna pedig a következő parancsot

    start explorer.exe

    A fenti műveletet automatizálhatjuk, hogyha a fenti parancsokat egy BAT file-ba tesszük és azt futtatjuk szükség szerint.

    Hibernációs állomány létrehozása

    Hibernációs file létrehozása

    A parancssorba gépeljük be a következőt:

    powercfg -h on

    Hibernációs file törlése

    A parancssorba gépeljük be a következőt:

    powercfg -h off

    2013. január 16., szerda

    XML feldolgozás kliens oldalon JavaScript-el

    Az alábbi kódrészlet a kliens oldali XML feldolgozásra példa, hogy például egy AJAX kérésben kapott XML választ hogyan kell feldolgozni (bejárni az XML node-okat).

    XML, amit fel kell dolgozni:

    
      
        
        
        
        
        
        
      
      
        
        
        
        
        
        
      
    
    

    A feldolgozó script:
    function parseXML(xml){
            $('datas', $(xml)).each(function(){
                
                $('data1', this).each(function(){
                    $('data', this).each(function(){
                        data1_array.push([$(this).attr("date"), parseInt($(this).attr("value"))]);
                    });
                });
                $('data2', this).each(function(){
                    $('data', this).each(function(){
                        data2_array.push([$(this).attr("date"), parseInt($(this).attr("value"))]);
                    });
                });
            });
        }
    
    A fenti függvény a paraméterben kapott XML-ben lévő adatokat a data1_array és a data2_array tömbbe teszi.

    2013. január 7., hétfő

    JavaScript tiltásának kezelése kliens oldalon

    A minap futottam bele abba a problémába, hogy egy meglévő PHP-val előállított oldalon meg kellett valósítani azt, hogy az oldal működésében ellenőrizni kellett, hogy kliens oldalon engedélyezve van-e a JavaScript futtatása a böngészőben, és annak függvényében jelenítse meg az oldal tartalmát, vagy jelenjen meg hibaüzenet, hogy kapcsolja be a JavaScript futtatását a felhasználó.

    A PHP által előállított HTML oldalt az alábbi módon kell felépíteni:
    ...
      
        ...
        
        
        
        ...
      
    ...
    
    Az oldal tartalma lerenderelődik a böngészőben csak pageContent div láthatósága display:none -ra van állítva. Ha a JavaScript engedélyezve van, akkor a script fogja megjeleníteni az oldal további tartalmát. Ha nincs, akkor a noscript tag-ek között megadott szöveg fog megjelenni a böngészőben.