Tag Archives: VB.NET

[new ideas] using signalR to support long time consuming operations on server

In many situations i faced with problem when i have to make an operation which will be done on server side but this operation is very time consuming. For example reading structure for 100 parts from our ERP system. If i want to do it in one call from my web application then user starts process and for long time (e.g. 10 minutes) is not notified about what is really happening on server. In such situation user can start to think that something wrong happen and tries to make a call again for example.

Expected situation for me in that case would be to give user feedback that something is still going on server. Then user would know. Ok, it is time consuming process but still going well so i need to be patient.

Until today it was only a dream for me and i had no idea how to develop something like this.

But as you can find from this post i start to play a little with signalR. And today i made an experiment to see if signalR can help to solve this problem?

So i did an experiment and i know now that answer for this question is yes.

Here is how i did an experiment. You can implement your own solution as you want.

Setup on server side:

Web application with included signalR

Setup on client side:

Javascript application with jquery and knockout model in it.

Implementation:

On server i have hub named tester with following code:

Imports Microsoft.AspNet.SignalR 

Public Class tester
Inherits Hub

Public Sub hallo(id As String)
Clients.All.start("New client has loggin with guid: " + id)
End Sub

Public Sub test()
Clients.Caller.start("Starting at: " + Now.ToString)

For i = 0 To 30
Clients.Caller.step("Step: " + (i + 1).ToString + " " + Now.ToString)
System.Threading.Thread.Sleep(20000)
Next

Clients.Caller.koniec("Finish at: " + Now.ToString)
End Sub

End Class

My hub has two methods:

1. hallo – which get’s one attribute id – it is connection id and this methods send’s information for all connected clients that new user has been connected. it is only infomration method in our example.

2. test – this is right test method. At starts – sends information for client that process has been started, next makes fake long operation which is loop for 31 iteration. In loop it send’s information to client with step number of loop and freezes thread for 20 seconds. At the end sends information that process is finished. That means all process takes over 10 minutes. Which is enough long to make usual timeout.

Method test calls 3 different method on client side – start, step and finish

In client we have following application deffinition in Javascript.

function model() {
var m = this;
m.info = ko.observableArray();

m.startProcess = function () {
m.info.push(new info("Sending start call"));
myHub.server.test();
m.info.push(new info("Start call done"));
};
};

function info(i) {
var m = this;
m.Text = ko.observable(i);
}

var myHub;

$(function () {

myHub = $.connection.tester;
myHub.client.start = function (o) {
myModel.info.push(new info(o));
};
myHub.client.step = function (o) {
myModel.info.push(new info(o));
};
myHub.client.koniec = function (o) {
myModel.info.push(new info(o));
};

var myModel = new model();
ko.applyBindings(myModel);
$.connection.hub.start().done(function () { myHub.server.hallo($.connection.hub.id);});

});

First we have knockout model with observable array named info and one method which send call of tester on server.

Next we have knockout object of info which just presents data from server.

Finnaly we have start definition:

First step is definition of hub object tester from server. Next is definition of handling events send from server for start, finish and step methods. Next is definition of knockoout model and applying bindings to web page. Finally start of connection and after connection is succeeded  then calling method hallo on server.

on page we have button which calls method startProcess and unsorted list which presents contains of info array. When user clicks button starting process then process on server is starting and server notifies each 20 seconds loop that something i still going on server and finally sends finish information.

Here is how it looks in browser when process will finish:

signalr1

[new ideas] How to immediately transfer text note/url between two computers

In my work i have two computers which are connected to different networks. That means sometimes i’m faced with situation when i want to simply transfer some text or url data between this two computers. I don’t use any instant messenger so until today only one reasonable idea for me was to send e-mail message. This is ok, but a little bit uncomfortable because each time i have to create new message and i have lot of small emails with simple data.

So today i start to think about changing my life a little bit and make it little more comfortable. My decision was that it is great time to make an experiment with signalR project which is Microsofts idea to use realtime messaging on web.

I was thinking about it long time ago but i thought that it is little bit complicated and hard to implement so always i had no time to read and make a test. But today i decided that it is something very small so i can make a test. And result was very surprising for me because after 15 minutes i had ready application.

So application is very easy – it has only one input when i can put what i want to send and button “Wyślij” which means – Send.

When i push button then information which is in input box is send to every clients which has open this page. So i can have open many instances of this app and all of it will see my information.

Pages displays only what is posted right now and doesn’t remember any history.

Zrzut_ekranu_24.06.2013_20_17

 

Try it yourself – i hope you will have lot of fun

[SAP JSON proxy] First public information – BAPI calls and SE37 HTML equivalent

Today i finally prepared test environment for SAP JSON proxy and i’d like to present all of you some of ideas.

First – why this project?

Right now i’m working on few applications which works with SAP but all of them are .net apps and fat client.  Because i’m last time fascinated web and mobile programming again i was wondering how to easy build simple applications interacting with SAP. Usually it was quite easy – i was building web service which was exchanging data with my application. This was good idea and everything was working really nice and smooth, but problem was that first i have to do something on server and then in my app (web or mobile). Then i asked myself what if i will simply put universal application on web which will somehow understand some queries from my app and then will execute my calls on SAP and return data back.

I was wondering about exchanging data in xml but json seams to be better so i decided to use json.

How it works?

application is sending json object with definition of process which want to call on SAP, then proxy analyze this object and prepare RFC call for SAP. After call is executed and return is converted to json and send back to application.

What are benefit so this approach?

First of all – you don’t need to care about any special sap connectors for web and mobile devices. Second you don’t need to care about server side any more, you have to focus only on side of your application. Third it is secure because applications doesn’t have any direct access to SAP server so you can extend proxy by adding some security filters or limitations on calls

So now an example

Example works on bank accounts settings. On SAP we have BAPI_BANK_GETLIST bapi which looks this way:

sap1

it expect import parameter BANK_CTRY – which in our example will be PL and returns BANK_LIST table which in our example looks this way:

sap2

As you can see there is one row with one example bank.

my JSON query looks this way:

{ "bapiName" : "BAPI_BANK_GETLIST",
 "errorMessage" : "",
 "exportFields" : [ { "name" : "BANK_CTRY",
 "value" : "PL"
 },
 { "name" : "MAX_ROWS",
 "value" : "0"
 }
 ],
 "exportStructures" : [ ],
 "importFields" : [ ],
 "importStructures" : [ { "fields" : [ { "name" : "TYPE",
 "value" : " "
 },
 { "name" : "ID",
 "value" : " "
 },
 { "name" : "NUMBER",
 "value" : "000"
 },
 { "name" : "MESSAGE",
 "value" : " "
 },
 { "name" : "LOG_NO",
 "value" : " "
 },
 { "name" : "LOG_MSG_NO",
 "value" : "000000"
 },
 { "name" : "MESSAGE_V1",
 "value" : " "
 },
 { "name" : "MESSAGE_V2",
 "value" : " "
 },
 { "name" : "MESSAGE_V3",
 "value" : " "
 },
 { "name" : "MESSAGE_V4",
 "value" : " "
 },
 { "name" : "PARAMETER",
 "value" : " "
 },
 { "name" : "ROW",
 "value" : "0"
 },
 { "name" : "FIELD",
 "value" : " "
 },
 { "name" : "SYSTEM",
 "value" : " "
 }
 ],
 "name" : "RETURN"
 } ],
 "result" : "OK",
 "tables" : [ { "columns" : [ "BANK_CTRY",
 "BANK_KEY",
 "BANK_NAME",
 "CITY"
 ],
 "name" : "BANK_LIST",
 "rows" : [ ]
 } ]
}

and proxy response is this:

{ "bapiName" : "BAPI_BANK_GETLIST",
 "errorMessage" : "",
 "exportFields" : [ { "name" : "BANK_CTRY",
 "value" : "PL"
 },
 { "name" : "MAX_ROWS",
 "value" : "0"
 }
 ],
 "exportStructures" : [ ],
 "importFields" : [ ],
 "importStructures" : [ { "fields" : [ { "name" : "TYPE",
 "value" : ""
 },
 { "name" : "ID",
 "value" : ""
 },
 { "name" : "NUMBER",
 "value" : "000"
 },
 { "name" : "MESSAGE",
 "value" : ""
 },
 { "name" : "LOG_NO",
 "value" : ""
 },
 { "name" : "LOG_MSG_NO",
 "value" : "000000"
 },
 { "name" : "MESSAGE_V1",
 "value" : ""
 },
 { "name" : "MESSAGE_V2",
 "value" : ""
 },
 { "name" : "MESSAGE_V3",
 "value" : ""
 },
 { "name" : "MESSAGE_V4",
 "value" : ""
 },
 { "name" : "PARAMETER",
 "value" : ""
 },
 { "name" : "ROW",
 "value" : "0"
 },
 { "name" : "FIELD",
 "value" : ""
 },
 { "name" : "SYSTEM",
 "value" : ""
 }
 ],
 "name" : "RETURN"
 } ],
 "result" : "OK",
 "tables" : [ { "columns" : [ "BANK_CTRY",
 "BANK_KEY",
 "BANK_NAME",
 "CITY"
 ],
 "name" : "BANK_LIST",
 "rows" : [ { "values" : [ { "name" : "BANK_CTRY",
 "value" : "PL"
 },
 { "name" : "BANK_KEY",
 "value" : "TESTPL1"
 },
 { "name" : "BANK_NAME",
 "value" : "Test bank pl"
 },
 { "name" : "CITY",
 "value" : "test"
 }
 ] } ]
 } ]
}

And this is how it looks in my HTML tester page which works similar to SE37 transaction

sap4

 

And here is another example:

Details of this bank account:

sap3And my data

sap5

This is current stage, if you have any questions for this project, then please let me know in comments or send an email.

 

[Web apps] Voli.Faktury

If you have a small company in Poland and you need to create an invoice sometimes maybe you are looking for an simple and easy tool when you can do this from web.

I also have this problem, but because i’m a software developer, i don’t like to use existing software and i like to do something my own. Specially if there is good occasion to build something interesting and test some exiting technologies 😀

So i did invoicing software which is available here and here is a screen.

faktura

In this tool you can create your invoice, save it and use it later. You don’t need to create database of clients or products, because if you want to create an invoice for someone who you already did just copy this invoice and paste it in new one. Idea is to have as less functionality as possible and make it to use as easy as it is.

Because it is still in beta stage, if you will register and want to use it, then let me know this because i need to know if i should care about your data.

Ok, some technical information. Here is done some of my favorite (for now;)) software technic and i did something what i personally call “onion programming”. We have following liers:

1. Data – data are stored in NoSQL Document database called Ndatabase. It is easy and great solution for embeded concept – just one library try it!!!

2. data access lier is ASP.NET MVC 4 application

3. data exchange lier it is JSON communication

4. data presentation lier is HTML with Bootstrap and jQuery

5. data binding is MVVM model supported by Knockout-js – great option if you have an experience with WPF or silverlight. Using Knockout and jQuery programming web applications is so easy as building fat client applications in WPF or WindowsForms.

If you have any technical questions or suggestions to this project, please let me know and i will try to answer you.

 

Voli.PicasaDownloader

Mój kolega Krzysiu prosił mnie już jakiś czas temu, żeby rozwiązać jego drobny problem z Picasą. Chodzi o to, że ma tam wiele albumów ze zdjęciami i nie ma pomysłu w jaki sposób ściągnać je wszystkie na dysk aby utworzyć sobie kopię.

Dzisiaj postanowiłem “zaprzyjaźnić” się z Google API i okazało się, że sprawa nie jest specjalnie skomplikowana. Udało mi się napisać prostą aplikację, której jedynym zadaniem jest zapisanie zdjęć z picasy na lokalny dysk do lokalnego folderu. Aplikacja tworzy subfoldery o nazwach katalogów i tam zapisuj wszystkie zdjęcia.

Pomyślałem sobie, że komuś jeszcze może się to przydać dlatego wrzucam dla wszystkich – miłego używania. Link do aplikacji (acha – ważna rzecz – aplikacja działa pod windows i jest publikowana przez click once – jak nie będzie się chciała zainstalować to spróbujcie IE wtedy zawsze działa).

Oczywiście czekam na opinie – jak zawsze 🙂

Przewijanie do konkretnego miejsca strony w kontrolce WebBrowser WPF

Jakiś czas temu szukałem sposobu na przewinięcie strony w kontrolce WebBrowser w WPF. Trochę się z tym męczyłem, trochę też szukałem na sieci i wszędzie nie było jakichś sprytnych prostych rozwiązań. Było kilka patentów z wstrzykiwaniem java scriptu do strony, ale nie wydawało mi sie to eleganckie.

Udało mi się jednak znaleźć inny sposób, który jest dość prosty więc się nim dzielę.

Po pierwsze element do którego chcemy przewinąć musi mieć określone ID – kiedyś nie było to zbyt popularne, ale teraz już bardzo wiele stron ma ponadawane ID kolejnym tagom, więc nie powinno być z tym wielkiego problemu. Jeżeli sami generujemy stronę to tym bardziej jest to proste.

Jak znamy ID naszego tagu to kod wygląda tak – kod jest VB.NET

Dim doc = WebBrowserDokument.Document
Dim d = doc.getElementById(sp.id.ToString)
d.scrollIntoView()
 Jeżeli jednak nie znamy ID – wtedy mamy wersję trudniejszą, ale też możemy skorzystać z kolekcji getElementsByTagName i wtedy po prostu przenieść się do któregoś z elemntów tej kolekcji.
Mam nadzieję, że ten przykład był pomocny.

 

 

Nauka czytania

W ubiegłym tygodniu postanowiłem pomóc trochę moim chłopakom w nauce czytania. Okazuje się, że to dość skomplikowany proces, ale wymyśliłem aplikację, która może pomóc troszkę.

Idea jest taka, aby można było wczytać dowolny tekst. Później podzielić go na zdania i w każdym zdaniu wyświetlić kolejne słowa. Jednak pomysł jest także taki, że przecież dzieci nie zawsze pamiętają jaka literka jest która dlatego też po najechaniu myszą na literkę wyświetla się obrazek, który podpowiada z jaką literką mamy do czynienia. Dodatkowo chłopcy chcieli aby samogłoski były innego koloru, w ten sposób łatwiej im łączyć słowa w sylaby. Okazało się, że chłopcy mają także problem z głoskami zapisywanymi jako dwie litery w języku polskim, dlatego też program rozpoznaje takie głoski i łączy je razem.

Oto efekt:

Aplikacja jest napisana w silverlight więc można się nią pobawić bezpośrednio w przeglądarce pod adresem:

http://goluda.pl/naukaczytania

Testowałem na Windows i Mac OSX – na linuxie też powinno działać.

Miłej zabawy i czekam na sugestie.

Transmisje żużla na Androidzie

Dla wszystkich zaglądających na tą stronę informacja, że nowa wersja aplikacji jest do pobrania i obejrzenia w tym poście

Wczoraj rano Filip wpadł na pomysł, że potrzebna mu jest aplikacja, dzięki której mógłby na telefonie przeglądać transmisje z meczy żużlowych, tak jak to jest dostępne na stronach www. Właściwie to chodziło właśnie o parser strony z relacjami.

Tak się złożyło, że Filip ma telefon z Androidem, więc była dobra okazja wypróbować jak to wszystko działa pod Mac OSX – działa 😉 instalacja nie była specjalnie skomplikowana, jedyny problem pojawił się z jakimś tajemniczym okienkiem googli w eclipse, które nie chciało się zamknąć, ale to wszystko.

Ustaliliśmy, że będziemy parsować relacje meczy umieszczone na stronie http://zuzelend.com/

Utworzyłem następującą architekturę.

1. aplikacja w ASP.NET, która przygotuje dane dla aplikacji dla telefonu – przede wszystkim VB.net jest dla mnie łatwiejszym językiem, a dodatkowo w ten sposób zmniejszymy zapotrzebowanie na dane telefonu.

2. aplikacja w javie dla androida – jako finalny front end

Teraz trochę screenów dla ciekawych jak to wygląda

okno wyboru listy relacji (nie zapanowałem nad polskimi znakami tutaj jeszcze, ale daje się odczytać).

Widać tutaj:
– godzinę relacji
– drużyny
– wynik (nie wiem dlaczego dla archiwalnych relacji podają na stronie 0:0)

Okno szczegółów meczu (wyświetla się po wybraniu meczu).

Widać tutaj:
– Nazwy drużyn
– przycisk odświeżenia (lista odświeża się ręcznie)
– opisy biegów
(numer biegu, zawodnicy, zdobyte punkty przez zawodników, wynik biegu, wynik meczu do tego biegu, komentarz do biegu)
– Opisy drużyn (zawodnicy wraz z ilością zdobytych punktów)

Aplikacja wyświetla dokładnie te same dane, które dostępne są na stronie zuzelend.com.

Aktualną wersję można pobrać stąd

Prezentacja aplikacji do nauki rachunkowości

Pracuję nad aplikacją do nauki rachunkowości. Przygotowałem właśnie krótką prezentację jak jej używać. Prezentacja jest w dwóch językach polskim i angielskim – starałem się przełączać między nimi, ale nie zawsze mi to dobrze wychodziło, więc wybaczcie.

Proszę o zostawianie komentarzy co sądzicie o tej aplikacji. Wkrótce opiszę coś więcej, przede wszystkim chciałbym się skupić na stronie technicznej.

Na razie zapraszam do oglądania