czwartek, 26 stycznia 2017

jQuery podstawy


  • Selektory:


$(document).ready(function(){   
   $("*").css("border","2px dotted red") //-dodanie ramki do wszytkich elementów na stronie   
   $("p").css("border","2px dotted red") //-dodanie ramki do wszytkich paragrafów na stronie   
   $(".tekst").css("border","2px dotted red") //-dodanie ramki do wszytkich klas tekst   
   $("#papu").css("border","2px dotted red") //-dodanie ramki do wszytkich elementów o id papu   
   $("#papu,p,.tekst").css("border","2px dotted red") //-dodanie ramki do wszytkich elementów podanych jako selektory   
  }   


  • Selektory hierarchiczne:

$(document).ready(function(){
$(#test p).css("background","#fffff"); //- wszytkie paragrafy w kontenerze o id test niezależnie jak głęboko się znajdują
$(#test > p).css("background","#fffff"); //- bezpośrednie dzieci, paragrafy poniżej kontenera o id test
$(h1 > p).css("background","#fffff"); //- kolejny element za h1 na tym samym poziomie
$(h1 ~ p).css("background","#fffff"); //- każdy następny paragraf znajdujący się ZA h1
$(h1 ~ p).css("background","#fffff"); //- każdy następny paragraf znajdujący się ZA h1
$(#test > h1 ~ p).css("background","#fffff"); //- każdy następny paragraf znajdujący się ZA h1 będący  dzieckiem kontenera o id test
}


  • This w jQuery(kliknięty obiekt zostanie ukryty):
 $(document).ready(function(){  
   $(this).hide(slow);  
 }  
  • Filtry
 $(document).ready(function(){    
   $("p:first").css("border","2px dotted red") //-dodanie ramki do pierwszego paragrafu  
   $("p:last").css("border","2px dotted red") //-dodanie ramki do ostattniego paragrafu  
   $("p:not(.test)").css("border","2px dotted red") //-dodanie ramki do wszystkich paragrafów za wyjątkiem tego z klasą test    
   $(":header").css("border","2px dotted red") //-dodanie ramki tylko do nagłówków  
   $("p:eq(2)").css("border","2px dotted red") //-dodanie ramki do drugiego elementu na stronie  
   $("p:gt(2)").css("border","2px dotted red") //-dodanie ramki do paragrafów o indeksie większym niż 2  
   $("p:lt(2)").css("border","2px dotted red") //-dodanie ramki do paragrafów o indeksie mniejszym niż 2  
   $("p:even(2)").css("border","2px dotted red") //-dodanie ramki do paragrafów o indeksie parzystym  
   $("p:odd(2)").css("border","2px dotted red") //-dodanie ramki do paragrafów o indeksie nieparzystym  
 }    


  • Łączenie filtrów:
    • paragrafy większe od indeksu 2 , pierwszy i ostatni element
 $(document).ready(function(){    
   $("p:gt(2):first:last").css("border","2px dotted red")  
  }   

  • Filtry potomków

  $(document).ready(function(){    
   $("#test :first-child").css("border","2px dotted red") //-pierwsze dziecko kontenera o id test lub głębiej  
   $("#test > :first-child").css("border","2px dotted red") //-pierwsze dziecko kontenera o id test  
   $("#test :last-child").css("border","2px dotted red") //-ostatnie dziecko kontenera o id test lub głębiej  
   $("#test :only-child").css("border","2px dotted red") //-ostatnie dziecko kontenera o id test lub głębiej  
   $("#test th:nth-child(3n)").css("border","2px dotted red") //- co trzecie dziecko kontenera o id test lub głębiej  
   $("#test th:nth-child(3n+2)").css("border","2px dotted red") //- co trzecie dziecko kontenera o id test lub głębiej zaczynając od elementu drugiego  
  }    


niedziela, 24 kwietnia 2016

Autofac Trick&Tips

Autofac Trick&Tips


  • Skanowanie dla typów

Skanowanie w bibliotece "Services", gdzie nazwa interfejsu kończy się nazwą "Service"

protected void Application_Start()  
     {  
       var builder = new ContainerBuilder();
       builder.RegisterControllers(typeof(MvcApplication).Assembly);  
       builder.RegisterAssemblyTypes(Assembly.Load("Services"))  
          .Where(t => t.Name.EndsWith("Service"))  
          .AsImplementedInterfaces();  
       var container = builder.Build();  
       DependencyResolver.SetResolver(new AutofacDependencyResolver(container));  

       AreaRegistration.RegisterAllAreas();  
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
       RouteConfig.RegisterRoutes(RouteTable.Routes);  
       BundleConfig.RegisterBundles(BundleTable.Bundles);  
     }  

Link: http://docs.autofac.org/en/latest/register/scanning.html



Skanowanie w bibliotece "Services", gdzie interfejs dziedziczy po IDependency


protected void Application_Start()  
     { 
       var builder = new ContainerBuilder();      
       builder.RegisterControllers(typeof(MvcApplication).Assembly);  
         
       builder.RegisterAssemblyTypes(Assembly.Load("Services"))  
       .Where(t => t.GetInterfaces().Contains(typeof(IDependency)))  
       .AsImplementedInterfaces();  
       var container = builder.Build();  
       DependencyResolver.SetResolver(new AutofacDependencyResolver(container));  
       AreaRegistration.RegisterAllAreas();  
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
       RouteConfig.RegisterRoutes(RouteTable.Routes);  
       BundleConfig.RegisterBundles(BundleTable.Bundles);  
     }  



wtorek, 12 kwietnia 2016

Angular Tricks&Tips

1) Wstrzykiwanie serwisów


WorkApp.ts:

 /// <reference path="../../../typings/tsd.d.ts" />  
 (function() {  
   angular.module("workApp", [])  
 })();

ValuesService.ts:

/// <reference path="../../../typings/tsd.d.ts" />  
 namespace Services {  
   export class ValuesService {  
     static IID: string = "valueService";  
     constructor() { }  
     reachValue(val: string): string {  
       return "dqwdqwdwdqwdq" + val;  
     }  
   }  
 }

WorkController.ts

class WorkController {
    firstName: string;
    value: number;
    lastName: string;

    static inject = ["$scope", Services.ValuesService.IID];
    constructor($scope: ng.IScope, private valuesService: Services.ValuesService) {
        let vm = this;
        vm.firstName = "Paweł";
        vm.lastName = "Hałat";
    }

    getFullName(): string {
        return this.valuesService.reachValue(this.firstName) + " " + this.lastName;
    }
}


2) Wstrzyknięcie i wykorzystanie $timeout

WorkController.ts:

  class WorkController
 {  
   firstName: string;  
   value: number;  
   lastName: string;  
   static inject = ["$scope", "$http"];  
   constructor($scope: ng.IScope, private $timeout: ng.ITimeoutService) {  
     let vm = this;  
     vm.firstName = "Paweł";  
     vm.lastName = "Hałat";  
     this.myMethod();  
   }  
   public myMethod() {  
     this.$timeout(() => { this.firstName = "fewfwfewffwe" }, 5000);  
   }  
 }  


workApp.ts:


 (() => {  
   angular.module("workApp", [])  
     .controller("workController", WorkController)  
 })();  



3) Wstrzyknięcie $http, wywołanie obiektów json z strony

WorkController.ts:

  class WorkController {  
   myData: any;  
   private httpService: any;  
   static inject = ["$scope", "$http"];  
   constructor($scope: ng.IScope, private $http: ng.IHttpService) {  
     let vm = this;  
     this.httpService = $http;  
     this.getData();  
   }  
   getData(): any {  
     return this.httpService.get("http://www.w3schools.com/angular/customers.php")  
       .then((response) => { this.myData = response.data.records });  
   }  
}

workApp.ts:


  (() => {   
   angular.module("workApp", [])   
    .controller("workController", WorkController)   
  })();   



4) Dodawanie inputów dynamicznie wysłanie przez json

Index.html:

 <html>  
 <head>  
   @Scripts.Render("~/bundles/angular")  
   @Scripts.Render("~/content/typescript/controllers")  
   @Scripts.Render("~/scripts/work")  
 </head>  
 <body data-ng-app="workApp">  
   <div data-ng-controller="workController as ctrl">  
     <fieldset data-ng-repeat="choice in ctrl.arr">  
       <input type="text" ng-model="choice.name" placeholder="name">  
       <input type="text" ng-model="choice.surname" placeholder="surname">  
     </fieldset>  
     <button ng-click="ctrl.addField()">Add new field</button>  
     <div class="well">  
       {{ctrl.arr}}  
     </div>  
   </div>  
 </body>  
 </html>  


WorkController.ts:


 class WorkController {  
   myData: any;  
   public arr = [{ id: 1 }];  
   public vm: any;  
   static inject = ["$scope"];  
   constructor($scope: ng.IScope) {  
   }  
   addField() {  
     let itemNo = this.arr.length + 1;  
     if (itemNo < 20) {  
       this.arr.push({ "id": itemNo });  
       console.log(this.arr);  
     }  
   }  
 }  
 (() => {  
   angular.module("workApp", [])  
     .controller("workController", WorkController)  
 })(); 



4) Disabled/Enabled Button, Hide ActionLink

<html>
<head>
</head>
<body data-ng-app="workApp">
    <div data-ng-controller="workController as ctrl">
        <input type="checkbox" data-ng-model="checkBoxActive" />
        @Html.ActionLink("Powrót", "Index", null , new { @class = "btn btn-info", ng_hide = "checkBoxActive" })
        <button ng-disabled="checkBoxActive">Click Me</button>
        {{checkBoxActive}}
    </div>
</body>
</html>
@Scripts.Render("~/bundles/angular")
@Scripts.Render("~/content/typescript/controllers")
@Scripts.Render("~/scripts/work")






sobota, 26 grudnia 2015

Wielowątkowość - Task

Dziś porozmawiamy o wątkach w C#

Klasa Task wymaga zastosowania następującej przestrzeni nazw:

using System.Threading.Tasks;

Jest kilka sposobów tworzenia wątków.. Stwórzmy do tego prostą metodę w Console Aplication:

public static int DoWork( int val )
{
    var tmpVal = 0;
    for ( int i = 0; i < val; i++ ) {
         tmpVal += i;
    }
    return tmpVal;
}

static void Main( string[] args )
{
    //..
}

Przypominam że delegat Action umożliwia przypisanie metody zwracającej void.


1) Pierwszy ze sposobów to Lambda expression :

static void Main( string[] args )
{
     const int taskLoop = 100;
     var task = new Task<int>( () => DoWork( taskLoop ) );
     task.Start();
     Console.WriteLine( task.Result );
}

2) Lub..

static void Main( string[] args )
{
     const int taskLoop = 100;
     var task = new Task<int>( n => DoWork( (int)n ), taskLoop );
     task.Start();
     Console.WriteLine(task.Result);
}

3) Można również zastosować metodę "w locie" umieszczając ją w nawiasach:

static void Main( string[] args )
{
     const int taskLoop = 100;
     var task = new Task<int>( () => {
     var tmpVal = 0;
     for ( int i = 0; i < taskLoop; i++ ) {
         tmpVal += i;
     }
     return tmpVal;
     });
     task.Start();
     Console.WriteLine( task.Result );
}



Ważnym aspektem wątków jest możliwość ich przerwania w czasie wykonywania z poziomu wątku głównego można to powiązać z wyrzuceniem wyjątku:

public static int DoWork(CancellationToken ct,  int val )
{
    var tmpVal = 0;
    for ( int i = 0; i < val; i++ ) {
        tmpVal += i;
        ct.ThrowIfCancellationRequested();
    }
    return tmpVal;
}

static void Main( string[] args )
{
      const int taskLoop = 100;
      CancellationTokenSource cs = new CancellationTokenSource();
      var task = new Task<int>(() => DoWork(cs.Token,1000));
      task.Start();
      cs.Cancel();

      try {
           Console.WriteLine("Wynik to: {0}",task.Result);
      }
      catch ( AggregateException ex ) {
      ex.Handle( e => e is OperationCanceledException );
      Console.WriteLine("Operacja anulowana");
}

Powyższy kod spowoduje zatrzymanie wykonywania wątku już przy pierwszej pętli a to wszytko poprzez argument CancellationTokenSource cs = new CancellationTokenSource(); który po wywołaniu metody Close() powoduje wyrzucenie wyjątku.

 

piątek, 11 grudnia 2015

Użyteczne Rozszerzenia dla VB

Poniżej przedstawiam Rozszerzenia dla VB:

Rozszerzenia:
Tools > Extension Manager





Viasfora - Roszerzenie do VB mające na celu zwiększenie przejrzystości kodu poprzez podstawienie kolorowych nawiasów.  http://viasfora.com/#/texted






Użyteczne NuGety .NET

Poniżej przedstawiam zestaw użytecznych NuGetów Visual Basic:

NuGety:
Prawy przycisk na projekcie > Manage NuGet Packages



NuGet z Konsoli:

1. Prawy przycisk myszy na projekt > Package Manager Console
2. Tools > NuGet Package Manager > Package Manager Console






Faker  - baza losowych danych osobowych - przydatna podczas tworzenia testowej bazy danych.  https://www.nuget.org/packages/Faker.Net/

PM> Install-Package Faker.Net



TopShelf  - zestaw bibliotek do tworzenia Windows Service http://topshelf-project.com/



HTML Agility Pack - library do parsowania stron www. https://htmlagilitypack.codeplex.com/


MahApps.Metro 1.1.2 

- library do skórek WPF  

https://www.nuget.org/packages/MahApps.Metro/
PM> Install-Package MahApps.Metro



Quartz.NET - biblioteki do obsługi czynności wg. ustalonego przez użytkownika czasu
http://www.quartz-scheduler.net/


Route Debugger - narzędzie to sprawdzania wywołanych ścieżek routingu. https://www.nuget.org/packages/routedebugger/



MongoDb - biblioteka zarządzania nierelacyjna baza danych. https://www.mongodb.org/


Fody - bdzieki tej bibliotece działania są wykonywane dopiero, gdy zostanie zainstalowany jakikolwiek z pluginów:

[ImplementPropertyChanged]
public class Person 
{        
    public string value1 { get; set; }
    public string value2 { get; set; }
 
    public string GetVal1
    {
        get
        {
            //..get
        }
    }
}


sobota, 31 października 2015

XmlSerializer - Cz2. Serializacja, deserializacja - uzupełnienie

Do części 1 chciałbym dodać jeszcze kilka modyfikacji i opisów. Mianowicie chciałbym zamiast listy dołożyć dodatkową klasę do Serializacji i deserializacji:

[Serializable()]
[XmlRoot("root")]
public class SerializeClass
{
   public string Comment { get; set; }
        
   public List<Person> PeopleList { get; set; }

   public SerializeClass()
   {
       Comment = "This is Test List of People";
   }
}

I teraz modyfikujemy klasę PersonRepository - dodajemy pole SerializeClass, która będzie wykorzystywana do zapisu oraz odczytu z pliku. Należy zwrócić uwagę na zmiany metod SaveToXml() i  LoadFromXml() Oto kod zmodyfikowanej klasy:

public class PeopleRepository : IRepository
{
    private string _assemblyDirectory;

    private static int _peopleersonId;

    public List<Person> PeopleList { get; set; }

    private SerializeClass serializeClass;

    private int SetNewId()
    {
        return ++_peopleersonId;
    }

    public void AddPerson(Person person)
    {
        if (PeopleList == null)
        {
            PeopleList = new List<Person>();
        }
        person.PersonId = SetNewId();
        PeopleList.Add(person);
    }
    public PeopleRepository(string assemblyDirectory = @"d:/peoplelist.xml")
    {
        _assemblyDirectory = assemblyDirectory;
    }

    public void SaveToXml()
    {
        serializeClass = new SerializeClass();
        serializeClass.PeopleList = this.PeopleList;

        var xSerializer = new XmlSerializer(typeof(SerializeClass));

        using (var writer = new StreamWriter(_assemblyDirectory))
        {
            xSerializer.Serialize(writer, serializeClass);
        }
    }

    public void LoadFromXml()
    {
        var tmpXmlSerializer = new XmlSerializer(typeof(SerializeClass));

        using (FileStream readFileStream = new FileStream(_assemblyDirectory, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            object obj = tmpXmlSerializer.Deserialize(readFileStream);

            serializeClass = (SerializeClass)obj;
            PeopleList = serializeClass.PeopleList;
        }
    }
}

W klasie Widoczne są atrybuty:

[Serializable()]
[XmlRoot("root")]

Pierwszy z nich określa, że obiekty tej klasy mogą być serializowane czyli zapisywane do XML'a. Drugi określa nazwę głównej gałęzi. W klasie Person określiłem atrybut:

[XmlAttribute("id")]

Który zamienia z kolei atrybut w XML'u  z elementu

<PersonId>1</PersonId> na  <Person id="1">


Kolejny Atrybut zmienia nazwę elementu:


public class SerializePerson
{ 
    [XmlElement("Number")]
    public int HouseNo { get; set; }
    [XmlElement("Street")] 
    public  string StreetName { get; set; } 
    [XmlElement("CityName")]
}

Efekt jest następujący:

<AddressDetails> 
  <Number>4</Number>
  <Street>Rohini</Street>
  <CityName>Delhi</CityName>
</AddressDetails>

Kolejny [XmlIgnore] powoduje wyrzucenie pola w klasie z procesu serializacji.

public class AddressDetails
{
    [XmlElement("Number")]
    public int HouseNo;
    [XmlElement("Street")]
    public string StreetName;
    [XmlIgnore]
    public string City;
}

Oto wynik kompilacji - pominięto w serializacji pole City:

<AddressDetails>
    <Number>4</Number>
    <Street>ABC</Street>
</AddressDetails>

Materiał został częściowo pobrany z CodeProject.