Meeting-uri ADCES

Nu stiu cum am facut de am reusit sa avem meeting-uri in avans

Braintree Payments si ASP.NET Core on OSX and Linux, 13 dec 2016, https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/234409961/

Hosting Web App in the Azure App Service + Audit/History in EF / Sql Server , 9 ian 2017, https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/235066724/

SAP Hana Cloud Platform & Build an Intelligent Bot to Interact with your Users , 7 februarie 2017, https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/235100350/

ASP.NET MVC 6 What’s new & Dockerizing an ASP.NET Core application, 14 martie 2017, https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/235101183/

WPF Window closing and async / await

 

Partea cea mai buna la async/await este ca acest cod se scrie usor .Usurinta aceasta vine de la un State Machine ( vezi text  sau video  ) si care aduce penalitati de performanta daca nu e folosit cum trebuie (https://ayende.com/blog/174689/the-cost-of-the-async-state-machine )

Vreau sa discut despre un async/ await specific, pe Windows_Closing din WPF. Trebuia sa chem o functie async . Am zis, nimic mai usor:

private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{

await MyFunc();

}

 

Acolo, desi pui async pe eveniment si await pe un functie ce ruleaza async, totusi aplicatia se inchide. De ce? As vrea  sa stiu – probabil se inchide pe un thread separat.

Am zis, ok , pun e.Cancel=true la inceput si apoi pe false.


private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{

e.Cancel=true;

await MyFunc();

e.Cancel=false;

}

 

Iar nu merge . Nu se mai inchidea.

Am zis, ok, il pacalesc cu scot async de pe eveniment si pun .Result()

private async void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{


var  t= MyFunc().Result;


}

Acum se bloca ( configureAwait, Cleary , https://msdn.microsoft.com/en-us/magazine/dn605875.aspx )

In disperare de cauza , am revenit la old good threads:

bool Cancel;
private void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{

        this.Title = "aaaa";


        var _thread = new Thread(new ThreadStart(() => { Cancel = WaitMe(); }));
        _thread.Start();
        _thread.Join();
        e.Cancel = Cancel;




    }
    bool WaitMe()
    {
        var x = WaitOneMinute().Result;
        return !x;
    }

    async Task<bool> WaitOneMinute()
    {
        await Task.Delay(5 * 1000);        
        var res=MessageBox.Show("Close ?","Close application?",MessageBoxButton.OKCancel);
        return res == MessageBoxResult.OK;
    }

 

Si asa a mers…

 

Build any cpu = 32 != 64

Sunt tot felul de diferente intre 32 si 64 de biti. Iar “Any CPU” , teoretic, ar trebui sa te ajute – insa  citeodata te incurca

Exemplu:

Sa zicem ca avem un programel care listeaza toate procesele

            var p1 = Process.GetProcesses();
            foreach (var process1 in p1)
            {
                Console.WriteLine(process1.MainModule.FileName);
            }
   

 

 

 

Compilat pe AnyCPU si pornit cu drepturi de admin, eroarea este

Unhandled Exception: System.ComponentModel.Win32Exception: A 32 bit processes cannot access modules of a 64 bit process.
   at System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
at System.Diagnostics.NtProcessManager.GetFirstModuleInfo(Int32 processId)
at System.Diagnostics.Process.get_MainModule()
at TestCPU.Program.Main(String[] args) in C:\eu\TestCPU\TestCPU\Program.cs:line 18

 

Compilat pe 64 si pornit cu drepturi de admin , da, nu poate accesa citeva procese –insa pe celelalte da

Acum, cum faceti daca aveti dll de x32 compilate in C ( declspec dllinvoke ) si vreti sa le accesati din x64?
Microsoft zice ca nu se poate incarca x32 in x64 cu LoadLibrary ( https://support.microsoft.com/en-us/kb/282423) )

Alternativa 1:
Faceti consola x32 care sa comunice cu X64 prin command line si cu dll prin nativ API
Alternativa 2:
Utilizati https://github.com/CodefoundryDE/LegacyWrapper
Alternativa 3:
De mina dupa https://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/

Intilnire programatori ADCES

Prima prezentare
Titlu : Productivity tips for Sql Server Management Studio
Prezentator : Bogdan Curca ,

Descriere: 

Have you ever wondered how you can improve your productivity while using Sql Server Management Studio? I would like to share with you some tips & tricks I discovered along my ride with Sql Server and also present you a few free 3rd party tools from Sql Server ecosystem that will help you increase your speed and improve your development experience.

A doua prezentare:
Titlu : ASP.NET Core Configuration, Routing si Dependency Injection
Prezentator: Radu Daniel Matei, https://radu-matei.github.io/blog/
Descriere:
Va fi prezentat ASP.NET Core si citeva tips and tricks:

– engine-ul pentru routing si cum sa introduci dinamic rute in aplicatie (fara reload) printr-un JSON
– cum sa introduci dependinte la runtime printr-un JSON

 

Inscrieri la http://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/234235266/

XUnit si parametrii la functii – clase sau statice?

Mi-am analizat codul pe care l-am scris intr-un proiect de test.

Vroiam sa citesc niste date de test pe un fisier CSV si sa le trimit ca parametrii la test.

Aveam clasa de baza

public class CSVReaderClassData : IEnumerable<object[]>
{
private readonly List<object[]> _data = new List<object[]>();
public CSVReaderClassData(string fileName)
{
var contents = File.ReadLines(fileName);
//skip 1 - the header
contents.Skip(1).ToList().ForEach(it => _data.Add(it.Split(',')));

    }

    public IEnumerator<object[]> GetEnumerator()
    { return _data.GetEnumerator(); }

    IEnumerator IEnumerable.GetEnumerator()
    { return GetEnumerator(); }
}

si apoi alte vreo patru clase derivate( arat doar doua)

class RoboCopyCSV: CSVReaderClassData
{
public RoboCopyCSV(): base("RoboCopyCSV.txt")
{

    
}
}
class XCopyCSV: CSVReaderClassData
{
public XCopyCSV(): base("XCopyCSV.txt")
{

    
}
}

 

Nu intelegeam de ce am facut asa – pina cind am descoperit

[Theory]
[ClassData(typeof(RoboCopyCSV))]
public void TestTimeRoboCopy(string dest, string source, string threadsNumber){
}

[Theory]
[ClassData(typeof(XCopyCSV))]
public void TestTimeXCopy(string dest, string source){

}

Fie faceam asa , fie faceam cu

[PropertyData(nameof(RoboCopyTestData))]

unde RoboCopyTestData era o functie statica care intorcea IEnumerable

Nu stiu de ce, dar intre functii statice si clase …. parca prefer clase ( asta poate insemna ca am depasit programarea modulara. Sa vad cind trec la cea functionala)

Despre programare si NIH

Am citit de curind despre http://www.codeproject.com/Articles/1142178/ACoreLib-Tracer-Tracing-done-right

Acolo e prezentata o librarie care face logging .

  • E configurabila din cod( nicidecum dintr-un fisier de configurare, ca sa fie mai usor la deploy)
  • Scrie intr-un fisier/RAM mai bine decit Visual Studio Trace class . Insa ca target are doar fisier / RAM ( daca vreti o comparatie, vedeti https://github.com/nlog/nlog/wiki/Targets )
  • Si cam atit.

Ce vreau sa spun cu asta: Nu re-inventati roata daca nu ati cautat-o inainte. Puteti sa va faceti timp inainte de a face o librarie si sa vedeti ce au facut altii care s-au confruntat cu aceeasi problema. Dupa ce vedeti ca intr-adevar nu va satisface nevoile, puteti apoi sa va faceti libraria voastra.

Da , stiu ca in facultate ati invatat Sorting(QuickSort,BubbleSort, etc ) si ca ati scris cod. Insa daca nu lucrezi la Google /Microsoft / Amazon / Apple , orice cod de Sort( ) pe care l-ai invatat NU o sa il aplici in practica( cel mult o sa faci o analiza ) . Pentru LOB software  NIH  e moarte curata

Application Starters

I have started an application about CDC and TemporalTables . It is made in Windows Forms( to be much easy ) –and it is a refactoring of http://cdchelper.codeplex.com/ . You will see in Windows Store soon , I hope.

It is amazing for me the amount of packages/references used for a simple windows forms project :

1.  DataConnectionDialog  –  to have a popup with sql server connection . This is authentication – and , for other applications, could be replaced with AD or Forms authentication ( generic)

2. ExporterWordExcelPDF  – to export data in HTML /Excel /PDF ( adds Razor to the stack) – exporter capabilities for the user.( generic)

3. UserAccountControl –  to run as administrator ( in order to start sql server agent if not started already)

4. nlog – error logging( generic)

5.DataGridViewAutoFilter project – to have autofilter in DataGrid. This is for all projects – needs something like paging/filtering/sorting ( generic)

( If it were WPF, it will be added PRISM or Caliburn or other ….)

( I have removed dependecies on Sql MAnagement Objects, since I do not know if they work with the past versions)

What is good is that I have already those on the form of packages/components. Otherwise, I will have more time allocated to re-invent the wheel ….

Get si set pe proprietati in Javascript

Lucram cu un framework de MVVM pe javascript , asemanator cu knockout ( ok, da – am trecut la angular 2 ) . Si nu intelegeam cine imi seta o proprietate pe null. Adica aveam asa ceva :

var person = {
Name : “Ignat”
}

 

iar cineva din cod( adica eu…), dupa citeva clickuri pe interfata( 3 combo-uri in cascada ) , cindva, imi seta Name la null – si nu intelegeam cind .

Solutia ? Get/set in javascript – modificat din Name in name si define property:

var person = {name : “Ignat”};

Object.defineProperty( person , 'Name',
 {get : function(){ return name; },
set : function( value ){ this.name = value; }
} ); 

Asa ca am pus un breakpoint in debugger in browser (F12) pe set – si voila! doar un copy paste gresit – faceam bind la niste valori si setam ce nu trebuia…

Apoi am sters codul si am revenit la initial( asta pentru ca nu aveam chef de linii in plus)

var person = {
Name : “Ignat”
}

 

Morala 1: Se poate si in javascript sa ai get/set – doar ca nu merita …

Morala 2: se poate face un tt cu asta – care , in functie de un parametru, sa iti scrie fie varianta simpla, fie cea cu defineProperty – in functie daca vrei sa faci debug sau nu…

ChromeCast

E un device mic( poza la https://www.google.com/intl/en-us/chromecast/?utm_source=chromecast.com ) . Se conecteaza la TV prin HDMI si la telefon prin Wifi. Stie sa faca duplicate la video / audio de pe telefon prin aplicatia GoogleCast si prin alte aplicatii dedicate ( TED, NetFlix, altele) .
E o modalitate mai usoara de conectat la TV a telefonului decit Mirror Direct – si pare sa mearga bine.
Pentru Chrome de desktopnm exista o extensie ca sa trimiti rowser-ul actual – iar pe telefon sunt o groaza de aplicatii inutile ( cea default face streaming bun de muzica + foto)
Nu e de programare ( ca cele de la http://www.adces.ro/hardware-share/ ) insa are o utilitate ok-ish in casa

O saptamina IT buna

Simbata trecuta a fost SQL Saturday ( http://www.sqlsaturday.com/565/Sessions/Schedule.aspx ) organizat de Cristi Lefter.

Duminica a fost Code 4 Romania , https://web.facebook.com/events/1786879391589859/ – chiar daca unele initiative sunt generice( cele pentru refugiati, de exemplu)

Miercuri a fost Bucharest JS Meetup (https://www.meetup.com/BucharestJS/events/233967770/ ) la care am participat si eu cu WebAPI + Knockout (https://github.com/ignatandrei/Presentations/tree/master/DepEmpWebApiKnockout )

Iar pe 11 octombrie va fi MEF+ DSL + F# la ADCES : https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/234258087/ 

Si , daca tot suntem aici, vedeti hardware share (raspberry + netduino) : www.adces.ro/hardware-share/

http://creativecommons.org/licenses/by/4.0/