Temat ogólny 26365 73

O temacie

Autor Leinnan

Zaczęty 28.03.2016 roku

Wyświetleń 26365

Odpowiedzi 73

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Ja pracuję z Jenkinsem. Programowałem nawet dokładnie takiego joba - sprawdzał zgodność kodu C++ z firmowymi konwencjami. Użyłem bibliotek z Eclipse CDT.
Ogólnie to nie potrzebujesz "wtyczki do Jenkinsa" tylko po prostu narzędzia weryfikującego te konwencje. Nie musi ono wiedzieć że będzie odpalane przez Jenkinsa - Jenkins ma tylko odczytywać rezultat. To jakie to narzędzie, zależy od języka który będzie analizowany.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
Ogólnie to nie potrzebujesz "wtyczki do Jenkinsa" tylko po prostu narzędzia weryfikującego te konwencje.

Masz na myśli jakieś konkretne narzędzie? Bo szczerze to nie uśmiecha mi się pisanie nowej wtyczki (która zapewne będzie daleka od ideału). Mówimy oczywiście o c++.
Planowałem jeszcze podpiąć pod to valgrinda, żeby raporty wypluwane przez jenkinsa były bardziej kompletne i szczegółowe, bo sama informacja, że build przechodzi testy nie wystarcza. A chciałem podejść do tego w miarę profesjonalnie.
 

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
nie potrzebujesz "wtyczki do Jenkinsa" tylko po prostu narzędzia weryfikującego te konwencje.
nie uśmiecha mi się pisanie nowej wtyczki
Tak jak pisałem nie potrzebujesz żadnej wtyczki do Jenkinsa. Potrzebujesz narzędzia które zostanie odpalone i którego output przeczytasz Jenkinsem.
Rzuć okiem na to: https://bitbucket.org/verateam/vera/wiki/Home

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
#63 2016-12-07, 21:13(Ostatnia zmiana: 2016-12-07, 21:36)
Cześć,
Od kilku dni uczę o DI i ogólnie o IoC.
Jakiego frameworka używać pod cpp?

Myślałem, że kontener DI znajduje się w boost, ale jest dopiero w wersji experimental:
https://github.com/boost-experimental/di

Znalazłem też propozycję od googla:
https://github.com/google/fruit
ale też wydaje się być w wersji rozwojowej.

Szukam czegoś stabilnego, co mógłbym użytkować potem w pracy.
Av, czego używaliście w Nokii? Coś opensource czy firmowe libki?
 

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Temat ogólny
#64 2016-12-07, 23:21(Ostatnia zmiana: 2016-12-07, 23:27)
Firmowa libka o wdzięcznej nazwie "DI". Nie jest dostępna poza Nokią. Twór z kilku powodów nieatrakcyjny, ale nie jestem pewien czy mogę wnikać w takie szczegóły. Sięgaliśmy po niego tylko kiedy trzeba było zoptymalizować czas alokacji pamięci - bo dzięki niemu była jedna alokacja zarówno na obiekt, jak i wszystkie jego zdefiniowane zależności. Nie wiem o ile lepsze są rynkowe alternatywy. Zasadniczym problemem jest brak refleksji w C++, przez który prawdziwy framework DI wymaga albo definiowania wielu rzeczy odręcznie ("pajęczyna" konstruktorów), albo generowania kodu.

W Javie używałem Pico Containera, cudeńko: http://picocontainer.com/introduction.html
Alternatywa dla singletonów która nie ciąży na sumieniu ;)

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
#65 2016-12-19, 19:32(Ostatnia zmiana: 2016-12-19, 20:17)
https://msdn.microsoft.com/en-us/library/jj591560.aspx
dosyć obszerny ebook od msdn na temat ES, CQRS i DDD

// Tak do poczytania do łóżka :D

#edit
Studiując tematy CI i CD, bardzo często można było usłyszeć o takich terminach jak serwery testowe, wdrażania i produkcyjne. Problem w tym, że nigdzie tego nie sprecyzowano na tyle, ażeby samemu zobaczyć jak to działa. Czy mógłby ktoś (Av) opisać jak to wygląda w praktyce? Tzn cała droga jaką musi przebyć commit z lokalnego repo developera aż wreszcie dotrze na "produkcję"? Ogólnie cały pipeline.
Niby znam te pojęcia, ale gdybym miał precyzyjnie określić zależności pomiędzy tymi układami to pewnie bym sie posypał.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Serwer testowy - serwer na którym się pracuje. Rozwijasz dany projekt. Po zrobieniu danej rzeczy, jest ona testowana i przenoszona dalej.
Serwer wdrażania - trafiają tu rzeczy, które działają na teście, łączone tu wszystkie nowe rzeczy i sprawdzane czy działa wszystko.
Serwer produkcyjny - jest to serwer, do którego ma dostęp klient. Jest to końcowa aplikacja, która jest już używana przez docelowych użytkowników.
Możliwe że w innych firmach to trochę inaczej wygląda, ale mniej więcej tak jest.

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Tak jak mapisał Adanos. W małyvh projektach serwer testowy i wdrażania może być ten sam. Na produkcję dostęp ma zazwyczaj bardzo ograniczona liczba osób. Z kolei do wdrażania może z automatu trafiać każdy działający commit z serwera/brancha deweloperskiego.

Leinnan

Leinnan

Administrator
torsonic polarity syndrome
posty2671
Propsy3600
ProfesjaProgramista
  • Administrator
  • torsonic polarity syndrome
W każdej firmie działa środowisko testowe. Niektóre firmy mają także osobne środowiska produkcyjne.

:F
 
Mit der Dummheit kämpfen die Götter selbst vergebens

steam | slavic castles |  last.fm | moddb.com | Stary, najlepszy lider Sclavinii

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
#69 2017-01-01, 22:26(Ostatnia zmiana: 2017-01-29, 13:18)
Cześć Panowie,
Przypuśćmy, że mam klasę z zdefiniowaną metodą test:
class Foo
{
public:
int test(int param1, int param2) const {
return param1 + param2;
}
};
Klasa jest oczywiście uproszczona, chodzi tylko o istotę problemu.

Klasa ta jest oddana dla klienta, czyli klient może ją użytkować jak chce. Może np wywołać ją asynchronicznie. I tu jest problem, ponieważ można to zrobić na kilka sposobów.

Nie ma problemu jeżeli, funkcję chcę wywołać np za pomocą funkcji std::async. Mogę uzyskać przyszłość reprezentującą wartość zwróconą przez funkcję. Stosujemy więc podejście oparte na zadaniach:
std::function< int(int, int) > delegateObj =
std::bind(&Foo::test, &Foo(), std::placeholders::_1, std::placeholders::_2);

auto sharedFutureObj = std::async(std::launch::async, delegateObj, 5, 5).share();
std::cout << sharedFutureObj.get() << "\n";

Problem pojawia się w momencie, kiedy chciałbym przekazać delegata bezpośrednio do obiektu klasy std::thread :
std::thread(delegateObj, 5, 5).detach();

W tym przypadku nie mogę związać uruchomienia wątku z obiektem przyszłości, więc nie mam jak odczytać wartości zwracanej. Musiałbym skorzystać z obiektu klasy std::promise<T>, ale to wiązałoby się z modyfikacją metody:
class Foo
{
public:
int test(int param1, int param2, std::promise< int >& promiseObj) const {
promiseObj.set_value(param1 + param2);
return param1 + param2;
}
};
No i dobra ok.. teraz nie ma problemu z uzyskaniem wyniku, nawet jeśli wrzucę delegata(po uprzedniej modyfikacji) prosto do konstruktora klasy std::thread :
std::function< int(int, int, std::promise< int>& ) > delegateObj =
std::bind(&Foo::test, &Foo(), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

std::promise< int > promiseObj;
std::thread threadHandler(delegateObj, 5, 5, std::ref(promiseObj));
threadHandler.detach();

std::shared_future< int > sharedFutureObj = promiseObj.get_future();
std::cout << sharedFutureObj.get() << "\n";

No ok, teraz nie ma problemu z wywoływaniem tego delegata. Ale spójrzmy na nową deklarację metody test. Pojawia się tam typ zwracany, chociaż niczego nie przechwytujemy i pojawia się instrukcja return, której nie używamy. Jest to marnotrawstwo.
I jeżeli znowu klient będzie chciał wywołać nową metodę przy użyciu std::async, to musi przekazać adres obiektu obietnicy, którego tak naprawdę nie potrzebuje, bo funkcja zwraca instancję obiektu przyszłości. Czyli znowu marnotrawstwo.

Czy można zaimplementować metodę test tak aby klient mógł jej używać w podejściu opartym o zadania jak i w podejściu opartym o wątki? Powyższe definicje są optymalne tylko dla jednego podejścia.

Osobiście myślałem nad tym, że możnaby jakoś związać delegata i obietnicę, opakować to w jedną klasę i tak utworzony obiekt przekazać do konstruktora std::thread.

// edit
niby programiści powinni preferować podejście oparte na zadaniach, a nie to oparte na bezpośrednim wywoływaniu wątków. Chodzi chyba o to, że wywołując std::thread() przejmujemy odpowiedzialność za właściwe zarządzanie wydajnością. A wywołując std::async, odpowiedzialnośc ta spada ma implementatora biblioteki standardowej.
Ale jak już mówiłem to jest kod przeznaczony dla użytkownika zewnętrznego, więc może on robić z nim co chce.

Dobra,
Wykombinowałem to w ten sposób. A konkretnej to nie kombinowałem tylko przeciążyłem metodę, tak by zwracała void i przyjmowała referencję do obiektu std::promise<T>.
Definicja obu metod wygląda następująco:

virtual int test(int param1, int param2) const {
std::cout << "test task practise\n";
return param1 + param2;
}
virtual void test(int param1, int param2, std::promise< int >& promiseObj) const {
std::cout << "test thread practise\n";
promiseObj.set_value(param1 + param2);
}

Definicja delegatów tych funkcji wygląda następująco:
std::function< void(int, int, std::promise< int >&) > delegateObj =
std::bind(static_cast<void(Foo::*)(int, int, std::promise< int >&) const>(&Foo::test), &Foo(),
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
std::function< int(int, int) > delegateObj2 =
std::bind(static_cast<int(Foo::*)(int, int) const>(&Foo::test), &Foo(),
std::placeholders::_1, std::placeholders::_2);

Natomiast wywołanie tych delegatów za pomocą funkcji std::async oraz obiektu std::thread, wygląda następująco:
std::promise< int > promiseObj;
std::thread threadHandler(delegateObj, 10, 8, std::ref(promiseObj));
std::shared_future< int > sharedFutureObj = promiseObj.get_future().share();
std::cout << sharedFutureObj.get() << "\n";
std::shared_future< int > sharedFutureObj2 = std::async(std::launch::async, delegateObj2, 6, 7).share();
std::cout << sharedFutureObj2.get() << "\n";

Kod działa zgodnie z oczekiwaniami. Klient może wywoływać metodę o tej samej nazwie zarówno przy użyciu podejścia opartego o zadania jak i opartego o wątki.
Problemem pozostaje jednak to, że potrzebne było przeciążenie metody. Nie wiem czy to nie jest nadmiarowość kodu i czy wgl wygląda to estetycznie (definicja delegatów to już wgl jakaś masakra jeśli idzie o czytelność, ale wygląda dosyć intuicyjnie)
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
Witam znowu Panowie,
W jaki sposób można nadać wartość domyślną szablonowi który jest parametrem innego szablonu.
Nadanie wartości domyślnej dla parametru, który nie jest szablonem jest proste. Ale sytuacja zmienia się gdy szablon jest parametrem.
Chodzi mi mniej więcej o taką sytuację:
template< class T >
class FooTest
{

};

template< class T = int, template< typename > class Cont = FooTest< int > >
class KeyTest
{

};

Próba konkretyzacji tego szablonu z wartościami domyślnymi, wywala komunikat, że podałem za mało parametrów.
KeyTest<> a;
To jest problem czysto składniowy. Problem w tym, że nie wiem czy jest w ogóle możliwa taka konstrukcja. Nie znalazłem użytecznych źródeł w internecie.

tak btw
Jest to chyba również problem tymczasowy, bo c++17 ma wprowadzać dedukcję parametrów szablonowych klasy na podstawie konstruktora.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
A co ty chcesz tym osiągnąć?

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
Tym konkretnym przykładem to nic szczególnego. Ot przykładowy kod dla lepszego zrozumienia problemu.
A konkretnie to chciałem mieć możliwość napisanie takiego ogólnego kodu:

template< class T = jakisTyp, template< typename > class Cont = std::shared_ptr<T> > // albo inny "kontener"
class KeyTest
{
public:
       Cont< T > _mSomething;
};
Oczywiście mogę przekazać inne "kontenery" np list, vector, map, kontener zdefiniowany przez klienta..
Chodzi o to by kod był ogólny.


Oczywiście nie będę wklejał całego kodu, bo aby zrozumieć o co chodzi potrzeba czasu na analizę, a nie chcę byście go marnowali :d. Tak to na szybkości napiszę prosty kod bez ozdobników, który przedstawi istotę problemu :)
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

Temat ogólny
#73 2017-02-05, 13:15(Ostatnia zmiana: 2017-02-05, 14:36)
Panowie jak to jest z tym wyrównywaniem pamięci?
Czy daje to jakiś zauważalny wzrost wydajności? Jest to zależne od architektury procesora (lub/i systemu operacyjnego, proszę poprawić jeśli sie mylę), bo np strukturę wyrównujemy pod konkretną długość słowa procesora danej architektury. Więc pisząc program, zawężam jego optymalne wykonanie do tej jednej konkretnej architektury? Podczas gdy ten sam program wykonywany na innym procesorze może mieć gorszą wydajność.

Czy jest to gra warta świeczki?
Czy to nie jest tak, że gdy kompiluję program pod daną architekturę to kompilator nie dokonuje własnych optymalizacji?
Jeśli tak, to jak duża jest przydatność narzędzi, które standard udostępnia, w tej kwestii? Oczywiście mówimy o nowoczesnych kompilatorach: clang, gcc, msvc, które potrafią optymalizować kod.
A więc narzędzia udostępniane przez standard mogą być użyteczne jedynie w specjalnych kompilatorach, które spełniają jedynie absolutne minimum standardu.
Czy dobrze myślę?

znalazłem kilka użytecznych linków na stackoverflow, ale nie poruszają one istotnych zagadnień:
http://stackoverflow.com/questions/381244/purpose-of-memory-alignment
http://stackoverflow.com/questions/20809721/does-alignment-really-matter-for-performance-in-c11

Jak to sie ma do pisania bibliotek?
Przecież nie wiem pod jaką architekturą będzie używany pisany kod, więc jak to wyrównywać?
Standard nie definiuje mnóstwa rzeczy, np wielkości typów wbudowanych i wskaźników są zależne od implementacji. Czy to ma jakiś większy związek z optymalizacją i wyrównywaniem pamięci?
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry