Skocz do zawartości

Programowanie


  • Zaloguj się by odpowiedzieć
3012 odpowiedzi na ten temat

#2821 torq314 Napisany 11 maja 2016 - 23:22

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
Tam się gorąco robi teraz.

Ten rzekomy rosjanin dał się wrobić w nagłówek maila ujawniajacy jego ip i to jest ip tego drekocośtam.

Ale on się broni że jego ip jest znane i że komuś łatwo przyszłoby wrobienie go w coś takiego.

Tak obiektywnie to to są solidne poszlaki, ale ta nowa postać w grze ciekawie ją zagmatwała. Intryga godna sfilmowania normalnie :)
  • 0

#2822 Ryan Napisany 12 maja 2016 - 01:27

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
W całym FIGu się zrobił niezły kwas. Stosunek szumu do sygnału w ostatnich tygodniach tak wzrósł[1], że 4 projekty wystąpiły. :D

Tymczasem Kayla zaczęła głosowanie zgodnie z bylawsami, ale pytanie jest źle zbudowane i ludzie głosują za pozostawieniem PHPixie na gruncie formalnych niedociągnięć. =]

[1] za sprawą tego, ale i inicjatyw z cyklu "rozmawiajmy więcej o tym jak rozmawiać i jak się nazywać, a mniej jak powinny wyglądać interfejsy" ;>

Ten post był edytowany przez Ryan dnia: 12 maja 2016 - 01:28

  • 0

#2823 lukaszSA Napisany 12 maja 2016 - 06:41

lukaszSA

    Overall expert

  • Forumowicze
  • 28 919 Postów:

Zawsze mnie zastanawiało po co takie organizacje bawią się w demokratyczne struktury. Ale pomysł ze stworzeniem rosyjskiej tożsamości bardzo fajny. Koleś by się odnalazł na naszym forum.

 

A tak z newsów które nikogo. Github zmienił zasady i teraz za $7 miesięcznie można mieć nielimitowaną ilość prywatnych repozytoriów. 


  • 0

#2824 Ryan Napisany 12 maja 2016 - 06:51

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
...płatnych od użytkownika. ;) Dlatego swoje rzeczy trzymam na GitLabie, a kiedyś na BitBuckecie[1]. :)

[1] tam głównie przez to, że Hg > Git
  • 0

#2825 lukaszSA Napisany 12 maja 2016 - 06:57

lukaszSA

    Overall expert

  • Forumowicze
  • 28 919 Postów:

W sensie, że każdy kto chce dołączyć do mojego projektu musi mieć kupioną "subskrypcję"? Może tak być :hmmm: 

 

Dopóki moje projekty będą rozwijane tylko przeze mnie, to nie będę się tym przejmował :ftopa: 


  • 0

#2826 Ryan Napisany 12 maja 2016 - 06:59

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Tak, płatność jest od osoby (ale chyba pierwszych 3-5 jest w jednej cenie). Jakieś 3 lata temu jak potrzebowałem prywatnego repo do kolaboracji to jedynie BitBucket na to pozwalał za friko.

Ten post był edytowany przez Ryan dnia: 12 maja 2016 - 06:59

  • 0

#2827 lukaszSA Napisany 12 maja 2016 - 07:07

lukaszSA

    Overall expert

  • Forumowicze
  • 28 919 Postów:

Kliknąłem w link i wszystko wyjaśnili

 

 

 

  • Personal: $7/month
  • Organization: $9/user/month, $25/month for your first five users

 

 

 

If you’re using GitHub for private projects, now there’s just one paid plan—unlimited private repositories for $7/month. No matter what you were paying before, your plan now includes as many repositories as you need to work on projects in private—you can even invite collaborators.

 

Pamiętam na studiach mieliśmy 2 osobowy projekt, który był hostowany na prywatnym repo. Ja nic nie płaciłem wtedy. 


Ten post był edytowany przez lukaszSA dnia: 12 maja 2016 - 07:08

  • 0

#2828 Ryan Napisany 12 maja 2016 - 08:56

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Pytanie o wzorce, więc pewnie do torka. ;)

Jak elegancko rozwiązać następujący problem:
Jest sobie system S, na który składa się N modułów, z których każdy ma M podmodułów[1]. Podmoduł M musi być w stanie powiedzieć, że jest emtym podmodułem w entym module[2]. Optymalnie byłoby, gdyby nie musiał trzymać całej swojej ścieżki jako wewnętrznego stanu (a w każdym razie nie z palca, jak to obecnie robi absolutnie każdy pod-pod-pod-moduł; każdy inaczej).
Top level reprezentujący S jest dependency injection containerem, który przekazywany jest do konstruktora każdego modułu. Zawiera kilka rzeczy wspólnych dla całego systemu (moduł komunikacji ze światem zewnętrznym, globalny system logowania, opis konfiguracji, itd.) więc wszyscy muszą go mieć.
I.. no właśnie, jak skorzystać na tym, że każdy może np. dostać się do jakiegoś serwisu z DIC i o coś odpytać? W sensie: jak poprowadzić konstrukcję drzewa modułów, żeby mogły identyfikować swoją pozycję w systemie? Jaką piekielną maszynę muszę trzymać w DIC, żeby mogła odpowiadać na w/w pytania?

[1] prawdziwe zależności są bardziej złożone i głębsze, ale drzewiasta struktura wystarczy dla zademonstrowania problemu
[2] istnieje też system linearyzacji "współrzędnej", ale to jest pochodna podstawowego problemu

N.B. Ostatnio przekonałem się, że w pewnych klasach aplikacji niektóre wzorce pojawiają się automagicznie jako rozwiązanie oczywistych problemów. Wciąż jednak twierdzę, że wiele softu nawet złożonego na wzorcach nie korzysta. ;]

Ten post był edytowany przez Ryan dnia: 12 maja 2016 - 08:58

  • 0

#2829 torq314 Napisany 12 maja 2016 - 10:40

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
dwie rzeczy.

po pierwsze - kontener nie powinien w systemie występować jako jawna zależność w innych klasach, to jest co najmniej code smell jeśli nie anty-wzorzec.

zamiast tego są local factories, które mogą używać DI ale nie muszą:

http://www.wiktorzyc...ition-root.html

po drugie - jeśli w ramach systemu potrzebna jest pewna wiedza (moduł musi identyfikować swoją pozycję w systemie) to zgodnie z GRASP albo obiekt sam to będzie wiedział albo Information Expert - czyli tworzysz jeszcze jedną klasę, której odpowiedzialnością jest mówienie modułom jaka jest ich pozycja w systemie. taki IE pozwala więc modułowi się dołączyć/odłączyć i każdemu mówi ile jest jego kolegów. kontener DI raczej nie powinien być tym IE, bo złamiesz w ten sposób SRP (single responsibility), znaczy obiektowi spróbujesz przypisać odpowiedzialność inną niż ta jego referencyjna i SRP rekomenduje żeby tak nie robić bo to się źle kończy.
  • 1

#2830 Ryan Napisany 12 maja 2016 - 11:27

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Ze względu na to jak konstruuje się symulator w SystemC, nie jestem w stanie uniknąć sytuacji w której wszystkie moduły mają referencję przynajmniej to top-level sc_module. Obecnie wszystko konstruowane jest z explicite wiedzą o wszystkich niezbędnych rodzicach, dzieciach, braciach, więc konstruktory przyjmują od jednej do kilkunastu referencji. :| W porównaniu z tym, co jest, DIC przekazywany do wszystkich konstruktorów wydaje mi się code cherry blossom smell. ;)

Zamiast implementować fabrykę ze statyczną metodą, sądzę że mogę równie dobrze trzymać referencję do top-levelu będącego przy okazji DIC. Ta zależność to wymaganie wobec całego systemu, i to wymaganie nie może się zmienić ze względu na specyfikę projektu. Ale "DI, Factories and the Composition Root" było dobrą lekturą w szerszym aspekcie, dzięki! :) Z kolei "DI, Factories and the Composition Root Revisited" nie do końca rozumiem, umyka mi detal z UnityContainerem (ale pierwsze usprawnienie czaję). Podejdę ponownie później.

W przypadku IE uczyniłbym raczej IE jednym z serwisów, które można wydobyć z factory. W sensie - pewnie pieprzę terminologię :) - wyglądałoby to w pseudokodzie tak (nawet pozbędę się tego parametru z konstruktora dla czytelności):

interface RegisterService {
	int ReadRegister(int id);
	void WriteRegister(int id, int value);
}
class HwRegisterService: RegisterService { ... }
class MockRegisterService: RegisterService { ... }

interface LocationIE {
	int WhoAmI(); // no idea how IE works *YET*
	int MyChildCount();
}
class HwLocationIE: LocationIE { ... }
class MockLocationIE: LocationIE { ... }

class ServiceFactory { // I think of *this* as DIC
	static void AddService(ServiceType t, ServiceInstance i);
	static ServiceType* GetService(ServiceType t);
}

class ModuleN {
	void StartRender() {
		reg = ServiceFactory.GetService(RegisterService);
		location = ServiceFactory.GetService(LocationIE);

		reg.WriteRegister(RENDER_ON_NODE, location.WhoAmI());
		reg.WriteRegister(START_RENDER, 1);
		while (reg.ReadRegister(END_RENDER) != 1)
			WaitClockCycle();
	}
}

class ModuleBar {
	ModuleN children[];

	ModuleBar() {
		location = ServiceFactory.GetService(LocationIE);
		children = new ModuleN[location.MyChildCount()]();
	}

	void DoWork() {
		location = ServiceFactory.GetService(LocationIE);
		while (true) {
			pick = rand() % location.MyChildCount();
			children[pick].StartRender();
		}
	}
}

class TopLevel {
	TopLevel() {
		ServiceFactory.AddService(RegisterService, new HwRegisterService());
		ServiceFactory.AddService(LocationIE, new HwLocationIE(4, 4, 8));
		ModuleBar b = new ModuleBar();
		b.DoWork();
	}
}
Za chwilę doczytam jak się pisze IE, brb.
  • 0

#2831 Ryan Napisany 12 maja 2016 - 14:34

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Nie wiem jeszcze jak mi IE pomaga. :S Ale.

Zastanawiam się, czy visitor pattern nie użycza się sytuacji, w której chcę stworzyć wiele elementów, a później zbudować między nimi konkretną sieć powiązań i centralnie "otagować" je jako "jesteś entym foo w mtym bar, tu jest twoja jednostka teksturująca, bind"?
  • 0

#2832 torq314 Napisany 12 maja 2016 - 14:59

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
Composite

Visitor jest do tego żeby raz napisać algorytm "przechodzenia" struktury kompozytowej a przeciążenia (czyli co się ma dziać przy przechodzeniu) granulować na poziom nodów. Wcale nie wiem czy Ci o to chodzi.

Composite to z kolei wzorzec struktury hierarchicznej.

Pomyśl że Twoim composite jest na przykład AST (ma nody typu funkcja, wyrażenie, przypisanie itd.). Do takiej struktury piszesz abstrakcyjnego visitora, który odwiedza całą strukturę a pozwala przeciążać metody odwiedzania wyrażeń różnych typów. Do tego podtrzymuje stan. Może więc np odwiedzić całe sparsowane drzewo a zwrócić wynik jego kompilacji.

public class KompilującyVisitor : AbstractVisitor
{
   // jakaś strukturka zapamiętująca pośrednie wyniki kompilacji
   Dict<expression, kompilat> strukturka;

   // odwiedza wyrażenia typu l -> l*2
   public override VisitLambda( LambdaExpression exp )
   {
      base.Visit(); <- tu wchodzi w strukturę

      var l = exp.Parameter;
      var b = exp.Body;
   }

   // odwiedza wyrażenia typu x + (y*2) - 4*(z-t) 
   // (znaczy, będzie rekursywnie tyle razy wywołane jak bardzo takie wyrażenie jest rozbudowane)
   // ale za tę rekursję już odpowiada AbstractVisitor, a Ty dostajesz do ręki wywołania 
   // zgranulowane na poszczególne poziomy
   public override VisitBinary( BinaryExpression exp )
   {
      base.Visit(); // <- tu wchodzi w strukturę exp

      // tu już wiesz że odwiedził lewe i prawe
      var lewe = strukturka[exp.Left];
      var prawe = strukturka[exp.Right];
  
      strukturka[exp] = wygeneruj_kompilat( lewe, prawe, exp.Operator );
   }
}
jak chcesz zobaczyć super prosto dwie strategie generowania Visitorów to tu opisałem to studentom:

http://www.ii.uni.wr...a/ra2F2G/w6.pdf

IE to nie jest wzorzec tylko reguła projektowa, to znaczy nie wiadomo jak to zaimplementować bo nie ma żadnej wzorcowej implementacji. raczej chodzi o to żeby tę wiedzę wyciągnąć gdzieś na zewnątrz.

podejście z Composite jest okej, wtedy ta informacja mieści się w samej strukturze, a nie poza nią.
  • 1

#2833 Ryan Napisany 12 maja 2016 - 15:22

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Composite brzmi jak to, czego potrzebuję, dzięki! :*

//edyta
A co do dramy z PHP FIG, są już sępy. :D

https://github.com/php-cds/php-cds

Ten post był edytowany przez Ryan dnia: 12 maja 2016 - 15:23

  • 0

#2834 jakub Napisany 12 maja 2016 - 16:57

jakub

    Link

  • Narybek
  • 255 Postów:

...płatnych od użytkownika. ;) Dlatego swoje rzeczy trzymam na GitLabie, a kiedyś na BitBuckecie[1]. :)

[1] tam głównie przez to, że Hg > Git

Ja też polecam Gitlaba. Bezpłatne prywatne repo, nawigacja i UI bardzo wygodne. Do tego ostatnio na projekt grupowy udało mi się zestawić CI i testy są puszczane po commitach. Aż podejrzane, że jest to bezpłatne.


  • 0

#2835 Ryan Napisany 13 maja 2016 - 10:54

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Fajna pogadanka z Hejlsbergiem. :)

https://channel9.msd...er-Construction
  • 1

#2836 torq314 Napisany 13 maja 2016 - 13:37

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
osom :^^:
  • 0

#2837 Kradziej Napisany 14 maja 2016 - 16:01

Kradziej

    Wciąż dzieciak

  • Forumowicze
  • 16 004 Postów:
Moglibyście mnie oświecić na temat Variable-Length Arrays w C++? Mianowicie: czemu są "be"?

Współlokator (który jest nieskończenie wiele lepszym programistą niż ja, ale w C++ nie pisał od dawna, więc w kodzie projektu nad którym razem pracujemy na studiach widać sporo zbędnych rzeczy i naleciałości z chociażby Swifta, jego głównego języka) trochę się wczoraj pospinał, bo w komentarzu pod pull requestem dość sucho zapytałem, czy skoro VLA nie są częścią standardu i są odradzane, to może lepiej zamiast nich bufor zaalokować dynamicznie. Stwierdził, że strasznie spinam, więc postanowił do mnie pisać o tym na fejsie (współlokator, siedział w sąsiednim pokoju) w piątek o 23 zamiast grać w Uncharted 4.

Inna sprawa, że do końca nie wiem, czemu coś takiego miałoby być złe:
void Fun(int size) {
    char tab[size];
}
Bez zbędnego owijania w bawełnę: czy to jest w C++ złe i jeśli tak to dlaczego, poza tym że nie jest częścią standardu? Zarówno GCC jak i Clang (nie Visual C++) domyślnie na coś takiego pozwalają.
  • 0

#2838 torq314 Napisany 14 maja 2016 - 16:22

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
To są tablice allokowane dynamicznie (znaczy: rozmiar nie jest znany w trakcie kompilacji tylko zależy od danych) ale na stosie.
I to wystarczy, przy problematycznych danych możesz zwyczajnie nie mieć tyle miejsca na stosie.

Może ryan wie coś więcej po co w ogóle takie coś wymyślono, spekuluję że może chodzić o to że to szybciej działa niż mallokowana tablica na stercie.
  • 1

#2839 Ryan Napisany 14 maja 2016 - 17:01

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Standard nie wymaga w ogóle, żeby VLA były na stosie. Ale tak są najczęściej implementowane. "Może zabraknąć pamięci" jako argument przeciw VLA jest durny, bo na statyczną tablicę też może zabraknąć. Na alokowana na stercie też. Podobnie bzdurne są narzekania, że można nadpisać stos itp. Po to jest rozmiar, żeby nie nadpisać. No i zawsze jeszcze jest calloc(). W ogóle jak ktoś pisze (a to popularna opinia) "OMG, VLA cause segemntation faults!" to powinien sprzedawać ziemię do kwiatów, a nie programować w C.

A teraz fakty o VLA.
1. VLA jest częścią C99 i opcjonalnym ficzerem C11.
2. VLA są odrobinę kosztowniejsze od zwykłych tablic. Żeby to zrozumieć trzeba dziamać różnicę między tablicą a wskaźnikiem i konsekwencje dla sizeof(), który wciąż działa na VLA, chociaż jest ewaluowany compile time. No, powinien, w tym w sumie problem, dlatego obok tablicy musi być składowany jej rozmiar. To wpływa na szereg optymalizacji w kodzie maszynowym i może zmienić sposób indeksowania przy iterowaniu po tablicy.
3. VLA były rozważane jako część C++11 i C++14, ale w obu przypadkach je odrzucono (w C++17 definitywnie). Argumentacja jest dla mnie niejasna, ale niby VLA o więcej niż jednym wymiarze zazębiały się z istniejącymi ficzerami C++ na poziomie syntaktyki i komplikowały konstrukcję kompilatora.
4. Kompilatory domyślnie mają pierdyliard rozszerzeń włączonych, bo tak. Ten zwiększa kompatybilność kodu C/C++, więc ma jakieś tam pragmatyczne uzasadnienie.
5. VLA nie były obsługiwane w Visual Studio przed VS2015. W trybie kompilacji C++ nie są w ogóle dostępne.

Osobiście VLA w ogóle nie używam, nawet w czystym C99. Nie napotkałem póki co problemu, który faktycznie by na tym ficzerze skorzystał.

Ten post był edytowany przez Ryan dnia: 14 maja 2016 - 17:02

  • 1

#2840 Kradziej Napisany 14 maja 2016 - 18:05

Kradziej

    Wciąż dzieciak

  • Forumowicze
  • 16 004 Postów:
Dzięki :kwiatek: Wydaje mi się, że w systemach wbudowanych VLA na stosie byłyby problematyczne, bo niemożliwe by było ustalenie maksymalnej wielkości stosu, a to chyba przydatne.
Niemniej (na podstawie posta Ryana) w naszym w miarę prostym programie w którym głównie chodzi o unixowe sockety nie będę z VLA, a raczej tym ich jednym wystąpieniem, mocno walczył. Jeśli pojawią się problemy, to wtedy się zmieni.

Ten post był edytowany przez Kradziej dnia: 14 maja 2016 - 18:05

  • 0

#2841 torq314 Napisany 14 maja 2016 - 19:57

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:

Na alokowana na stercie też


wiadomo, ale kwestia jest taka jak się po czymś takim potrafisz pozbierać i czy w ogóle.

nie mam pod ręką żadnego takiego kompilatora, kradziej jak masz to sprawdź

int foo( int n )
{
   int tab[n];
   ...
}

foo( 1000000000 ); // <- tyle na pewno na stos się nie wrzuci

  • 0

#2842 Ryan Napisany 14 maja 2016 - 21:34

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:

Dzięki :kwiatek: Wydaje mi się, że w systemach wbudowanych VLA na stosie byłyby problematyczne, bo niemożliwe by było ustalenie maksymalnej wielkości stosu, a to chyba przydatne.

Nope. Szczególnie na embedded VLA ma znaczenie, bo może być dobrą alternatywą dla dynamicznej alokacji.
 

foo( 1000000000 ); // <- tyle na pewno na stos się nie wrzuci


Takiego kodu na pewno się do repo nie wrzuca.
 
$ cat ./test.c
#include <stdio.h>
#include <assert.h>

#define HEAP_USAGE_LIMIT 100

void foo(int i) {
    assert(sizeof(int) * i < HEAP_USAGE_LIMIT);
    int tab[i];
    printf("[%d]\n", tab[0]); // I know...
}

int main(void) {
    foo(10);
    foo(1000);
    return 0;
}

$ gcc ./test.c -o test
$ ./test
[4098]
assertion "sizeof(int) * i < HEAP_USAGE_LIMIT" failed: file "./test.c", line 7,
function "foo"
Abort trap (core dumped)
$ objdump -d ./test > dump.txt
$ grep callq ./dump.txt

...

ccc:   e8 df fc ff ff          callq  9b0 <__assert2@plt>
d1f:   e8 5c fc ff ff          callq  980 <printf@plt>
Czy to rozwiewa Twoje wątpliwości?

Ten post był edytowany przez Ryan dnia: 14 maja 2016 - 21:37

  • 1

#2843 torq314 Napisany 14 maja 2016 - 21:43

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
Ach gdyby tylko takie kody komitowano ...

;)
  • 0

#2844 Ryan Napisany 14 maja 2016 - 22:05

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Wydam kiedyś książkę o pisaniu higienicznego C i stanę się kenem strustrupem hajsbergiem C. ;]
  • 0

#2845 torq314 Napisany 14 maja 2016 - 22:10

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
Mam taką książkę, nazywa się Wysokie C, napisał to jakiś praktykujący programista C.

Książka jest tak uroczo niedzisiejsza, dokładnie tak jak C jest.

83-85545-44-1.gif
  • 0

#2846 Ryan Napisany 14 maja 2016 - 22:25

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Przynieś na następne piwo! :D
  • 0

#2847 torq314 Napisany 14 maja 2016 - 22:33

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
Jak nie zapomnę albo mi przypomnisz to tak, nawet Ci ją dam w prezencie :)
  • 0

#2848 Ryan Napisany 14 maja 2016 - 22:44

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Nie pozwalaj mi czytać złych rzeczy - powieszę się i będzie Ci troszkę przykro. :P Zerknąłem na spis treści i chcę przekartkować. Jest rozdział o człowieczeństwie. :D
  • 0

#2849 torq314 Napisany 16 maja 2016 - 14:54

torq314

    Buddhabrot

  • Forumowicze
  • 24 415 Postów:
nie znałem:

Heisenbug a heisenbug is a software bug that seems to disappear or alter its behavior when one attempts to study it

Bohrbug, by opposition, is a "good, solid bug". Like the deterministic Bohr atom model, they do not change their behavior and are relatively easily detected

Mandelbug is a bug whose causes are so complex it defies repair, or makes its behavior appear chaotic or even non-deterministic, also refers to a bug that exhibits fractal behavior by revealing more bugs (the deeper a developer goes into the code to fix it the more bugs they find)

Schrödinbug is a bug that manifests itself in running software after a programmer notices that the code should never have worked in the first place

Hindenbug is a bug with catastrophic behavior

za

https://en.wikipedia.../wiki/Heisenbug
  • 2

#2850 Ryan Napisany 19 maja 2016 - 13:20

Ryan

    Dominik D.

  • Administratorzy
  • 32 571 Postów:
Fajnie się czytało. :)
https://www.exceptio...they-are-tools/
  • 0