title: Czym różnią się cechy rdzy od interfejsów Go?

text: Jestem stosunkowo dobrze zaznajomiony z Go, ponieważ napisałem w nim kilka małych programów. Rust, oczywiście, jest mi mniej zaznajomiony, ale mam na oku. Po niedawnym przeczytaniu http://yager.io/programming/go.html pomyślałem, że osobiście zbadam dwa sposoby obsługi Generics, ponieważ artykuł wydawał się niesprawiedliwie krytykować Go, podczas gdy w praktyce nie było zbyt wiele interfejsów nie mógł osiągnąć elegancko. Ciągle słyszałem szum o tym, jak potężne są Cechy Rusta i tylko krytykę ze strony ludzi na temat Go. Mając pewne doświadczenie w Go, zastanawiałem się, na ile to było prawdziwe i jakie ostatecznie były różnice. Odkryłem, że cechy i interfejsy są dość podobne! Ostatecznie nie jestem pewien, czy czegoś mi brakuje, więc oto krótki edukacyjny przegląd ich podobieństw, dzięki czemu możesz mi powiedzieć, co przegapiłem! Teraz spójrzmy na interfejsy Go z ich dokumentacji: > Interfejsy w Go umożliwiają określenie zachowania obiektu: jeśli > coś może to zrobić, to może być tutaj użyte. Zdecydowanie najpopularniejszym interfejsem jest `Stringer`, który zwraca łańcuch reprezentujący obiekt. type Stringer interface { String() string } Tak więc każdy obiekt, który ma zdefiniowaną `String()` jest obiektem `Stringer`. Może to być użyte w sygnaturach typów, tak że `func (s Stringer) print()` bierze prawie wszystkie obiekty i drukuje je. Mamy też `interfejs{}`, który przyjmuje dowolny obiekt. Następnie musimy określić typ w czasie wykonywania poprzez odbicie. * * * Teraz przyjrzyjmy się cechom Rust z ich dokumentacji: > Najprościej rzecz ujmując, cecha to zestaw zero lub więcej sygnatur metod. Na przykład, moglibyśmy zadeklarować cechę Printable dla rzeczy, które > można wydrukować w konsoli, za pomocą jednej sygnatury metody: cecha Printable { fn print(&self); } To od razu wygląda bardzo podobnie do naszych interfejsów Go. Jedyną różnicą, jaką widzę, jest to, że definiujemy „Wdrożenia” Cech, a nie tylko określamy metody. Więc robimy impl Printable for int { fn print(&self) { println!("{}", *self) } } zamiast fn print(a: int) { ... } **Pytanie bonusowe:** Co dzieje się w Ruście, jeśli zdefiniujesz funkcję, która implementuje cechę, ale nie używasz `impl`? To po prostu nie działa? W przeciwieństwie do interfejsów Go, system typów Rusta ma parametry typu, które pozwalają na tworzenie właściwych typów ogólnych i rzeczy takich jak `interface{}`, podczas gdy kompilator i środowisko wykonawcze faktycznie znają typ. Na przykład cecha Seq<T> { fn length(&self) -> uint; } działa na dowolnym typie, a kompilator _wie_, że typ elementów Sequence w czasie kompilacji, a nie przy użyciu odbicia. * * * Teraz właściwe pytanie: czy brakuje mi tutaj jakichkolwiek różnic? Czy naprawdę są do tego podobne? Czy nie ma tu jakiejś bardziej fundamentalnej różnicy, której mi tutaj brakuje? (W użyciu. Szczegóły implementacji są interesujące, ale ostatecznie nie są ważne, jeśli działają tak samo.) Oprócz różnic składniowych, rzeczywiste różnice, które widzę, to: 1. Go ma automatyczne wysyłanie metod vs. Rust wymaga(?) `impl`s to zaimplementuj cechę * Elegancki vs. Jawny 2. Rust posiada parametry typu, które pozwalają na poprawne generowanie bez refleksji. * Go naprawdę nie ma tutaj odpowiedzi. Jest to jedyna rzecz, która jest znacznie potężniejsza i ostatecznie jest tylko zamiennikiem metod kopiowania i wklejania z różnymi sygnaturami typów. Czy to jedyne nietrywialne różnice? Jeśli tak, wydaje się, że system interfejsu/typu Go w praktyce nie jest tak słaby, jak się wydaje.


title: Czy funkcje serializacji należą do modelu czy kontrolera?

text: Zajmuję się tworzeniem aplikacji, w której: * Modele przechowują dane w postaci wielowymiarowej tablicy, które są zapisywane bez zmian w bazie danych MongoDB. Model służy do dostarczania metod do manipulowania danymi, a poza tymi metodami właściwości danych są tylko do odczytu. * Fabryka modeli tworzy instancję każdego obiektu w standardowy sposób i umożliwia skrócone "zapytania" w celu wyszukania wpisu w bazie danych i natychmiastowego utworzenia instancji obiektu. * „Widok” to Javascript i wszystko, co robi, pyta kontrolera o pewne rzeczy, a kontroler odpowiada przez HTTP za pomocą JSON. * Kontroler używa fabryki modeli do tworzenia instancji obiektów modelu i robi wszystko, czego żąda widok, jeśli to możliwe. Zawsze zwraca JSON. Generowanie tego JSON jest obecnie w klasie "pomocnika", którą próbuję wyeliminować. Serializacja danych MongoDB obejmuje konwertowanie MongoDates, MongoIDs i innych obiektów Mongo na ciągi. W kontrolerze potrzebne jest wyprowadzenie ich do przeglądarki w postaci ciągów — w większości przypadków kontroler wie, jak wyprowadzić dane do widoku. Jednak w niektórych przypadkach w modelu konieczne jest zestawienie wielowymiarowych danych tablicowych na liście, zanim kontroler przekaże je przeglądarce. Kontroler nie ma wystarczającej wiedzy o modelu, aby wykonać tę tabelę. Czy klasa pomocnicza jest tutaj nieunikniona? A może 100% serializacji powinno odbywać się wewnątrz modelu? Czy powinienem pozostawić funkcję serializacji w modelu abstrakcyjnym i używać jej z kontrolera z wywołaniem statycznym?


title: Projekt usług internetowych o wysokiej dostępności?

text: Zastanawiałem się, czy jacyś guru projektowi mogliby mi pomóc zrozumieć, jak duże firmy internetowe projektują swoje usługi tak, aby były wysoce dostępne. Scenariusz, o którym myślę, to: 1. Klient A łączy się z Usługą A 2. Klient A wysyła N żądań 3. Na żądanie N+1 Usługa A wybucha 4. Klient A ponownie łączy się z Usługą B 5. Usługi Usługi B żądania N+1 i dalej Jedyny projekt, o jakim mogłem pomyśleć, to korzystanie z usługi "metadata"/"discovery", o której Klient mógł być świadom statycznie. Usługa ta podałaby informacje o najlepszej dostępnej Usłudze, z którą Klient następnie łączyłby się i rozpoczynał swoje żądania, a także ponownie wysyłał zapytanie do usługi „metadanych”, gdy zorientowałby się, że Usługa A nie działa. Usługa aplikacji jest teraz wysoce dostępna, ale... ...rażący problem polega na tym, że usługa "metadata"/"discovery" jest statyczna, będzie poddawana dużym obciążeniom i nie jest wysoce dostępna, co w pewnym sensie niweczy całość zamiar. Przypuszczam, że mógłbym wrzucić dużo sprzętu do tej usługi, ale to nie jest zbyt dobre rozwiązanie. Jak mam zaprojektować naprawdę wysoce dostępną usługę internetową?


title: Czy dodanie tagu @beta doc-comment byłoby przydatne?

text: Kiedy funkcja dobiega końca, dodajemy do jej komentarza doc tag `@deprecated`, aby powiadomić innych programistów, że powinni przestać używać tej funkcji, a kilka lat później jest ona usuwana. Właśnie myślałem o tagu `@beta`, który oznaczałby, że ta metoda jest zupełnie nowa i nie została jeszcze przetestowana w różnych przypadkach użycia. Być może myślisz „możesz napisać przypadki użycia, aby zapewnić ich poprawność!” Oczywiście, że możesz, ale to API mnie niepokoi i jak zachowuje się w skrajnych przypadkach. Czasami decyzje te nie są oczywiste, dopóki nie wypróbujesz funkcji w różnych sytuacjach. Czasami trzeba dodać nowe parametry, aby objąć więcej przypadków użycia. Czasami zmiana ich kolejności ma sens, jeśli okaże się, że argument jest w rzeczywistości opcjonalny i musi zostać przeniesiony na koniec (lub odwrotnie). Dodając tag `@beta`, ostrzegasz innych programistów, że API tej metody może się jeszcze zmienić i powinni używać go ze szczególną ostrożnością. Daje to bardziej szczegółową kontrolę nad interfejsem API, zamiast tworzyć cały projekt w wersji „beta”. Jednak, aby jak najlepiej wykorzystać to, środowiska IDE i generatory dokumentacji musiałyby skorzystać z tego tagu. Co myślicie? Czy postrzegasz to jako przydatne, czy to strata czasu, czy masz inne sposoby radzenia sobie z tym? W przeszłości robiłem takie metody „prywatnymi” tam, gdzie było to możliwe, lub poprzedziłem je podkreśleniem.


title: Powtarzanie kodu a metoda wieloodpowiedzialna

text: Staram się przestrzegać zasady pojedynczej odpowiedzialności (SRP), a także unikać powtórzeń kodu. Jednak często są miejsca, w których występują powtórzenia kodu, które są niczym innym jak blokami kodu wywołań, które są odporne na wyodrębnienie ich do co najmniej znaczącej nazwy metody: DoAction1(); WykonajAkcję2(); if (wartość) DoAction3(); DoAction4(); Jak najlepiej wyodrębnić taki kod do metody i jak go nazwać?


title: Wskazówki dotyczące aplikacji typu Android, aby połączyć się z serwerem sql

text: Wybacz moją ignorancję, ale mamy aplikację, którą chcielibyśmy wypróbować w aplikacji mobilnej. Aplikacja jest aplikacją C#/asp.net połączoną z naszą bazą danych serwera sql. Jeśli zamierzamy napisać aplikację na Androida dla tej aplikacji, jak dokładnie połączyć się z instancją serwera sql? Próbowałem znaleźć wiele artykułów, niektórzy twierdzą, że za pośrednictwem usługi sieciowej, inni twierdzą, że sterowniki jdbc itp. Nie wiem zbyt wiele na ten temat, ponieważ nigdy nie robiliśmy programowania mobilnego. Gdybyśmy mieli napisać usługę sieciową, czy usługa sieciowa jest po prostu odpowiedzialna za łączenie się z warstwą bazy danych i pobieranie rekordów? Wszelkie przykłady byłyby bardzo mile widziane.


title: Jak sprawić, by testy jednostkowe przebiegały szybko?

text: W naszym projekcie osiągnęliśmy punkt, w którym mamy prawie tysiąc testów i ludzie przestali zawracać sobie głowę przeprowadzaniem ich przed odprawą, ponieważ trwa to tak długo. W najlepszym przypadku przeprowadzają testy, które są istotne dla fragmentu kodu, który zmienili, aw najgorszym po prostu sprawdzają go bez testowania. Uważam, że ten problem wynika z faktu, że rozwiązanie rozrosło się do 120 projektów (zwykle robimy znacznie mniejsze projekty i to dopiero drugi raz, kiedy robimy poprawnie TDD) a czas budowania + testowania urósł do około 2-3 minut na mniejszych maszynach. Jak skrócić czas wykonywania testów? Czy istnieją techniki? Udawanie więcej? Udawanie mniej? Może większe testy integracyjne nie powinny uruchamiać się automatycznie podczas uruchamiania wszystkich testów? **Edytuj:** w odpowiedzi na kilka odpowiedzi używamy już CI i serwera kompilacji, stąd wiem, że testy kończą się niepowodzeniem. Problem (właściwie objaw) polega na tym, że ciągle otrzymujemy komunikaty o nieudanych kompilacjach. Przeprowadzanie testów częściowych to coś, co robi większość ludzi, ale nie wszyscy. a jeśli chodzi o testy, to właściwie są całkiem nieźle wykonane, do wszystkiego używają podróbek i w ogóle nie ma IO.


title: Dlaczego nie mogę zaimplementować interfejsu, który ma ograniczony typ ogólny w tym kodzie w javie?

text: Mam następujące interfejsy: public interface Successorable<E> extends Comparable<E> E suc(); } i interfejs IInterval <E extends Następny<E>> { E min(); E maks(); } Próbuję zaimplementować IInterval wykonując: public class Interval<E> implements IInterval<E> { ....Jednak zaćmienie narzeka, że typ E nie jest prawidłowym substytutem parametru ograniczonego `<E extends Successorable<E >>` typu `IInterval<E>`. Co ja robię źle? Dziękuję!


title: Opcje rejestru aplikacji

text: Pracuję dla małej firmy programistycznej (około 200 osób budujących 8-10 aplikacji) i miałem nadzieję uzyskać porady na temat produktów, które mogą być dostępne do zarządzania informacjami o tym, którzy klienci używają jakich wersji naszych produktów? Najbardziej fundamentalna zależność polegałaby na tym, że „produkt” ma „wersje”, a dana „wersja” jest używana przez „klienta”. Zastosowania to: * Określ, którzy klienci używają jakich produktów * Określ, którzy klienci korzystają z jakich wersji produktu * Określ, którzy klienci są narażeni na jakie luki ze względu na używaną wersję * Określ, którzy klienci nie mogą przejść do nowej wersji z powodu luka w nowej wersji, na którą mogą trafić * Określ, do których klientów należy się zwrócić w celu uaktualnienia. Wszelkie przemyślenia lub recenzje produktów byłyby bardzo mile widziane! Z góry dziękuję.


title: Cel adresu podstawowego?

text: Jaki jest cel adresu bazowego w pliku wykonywalnym? Na przykład w konsolidatorze Microsoft Visual C++ można ustawić adres bazowy lub użyć domyślnego `0x1000000`. Ale z pamięcią wirtualną, dlaczego potrzebny byłby adres bazowy? Dlaczego nie miałbyś po prostu połączyć go z `0x0` i umieścić tam procedury inicjującej (`mainCRTStartup` w systemie Windows), co spowodowałoby, że pisanie do wartości NULL (`0x0`) po prostu nadpisałoby procedurę startową (metoda, która nigdy nie będzie zadzwonił ponownie). Dodatkowo, możesz po prostu ustawić strony kodu tak, aby wykonywały się tylko na procesorze x86, więc pisanie spowoduje wyjątek.


title: Struktura klas do wdrożenia systemu recenzji podobnego do Stack Exchange

text: Przeglądałem kilka wątków na Stack Overflow i zacząłem zadawać sobie pytanie, jak zaprojektować moje klasy i relacje, aby stworzyć taki system. ### Mój cel – **Chcę zbudować system recenzji, taki jak system recenzji Stack Exchange.** * * * Przyjrzyjmy się, jak działa system recenzji na Stack Exchange. Aby to uprościć, odniosę się tylko do funkcji sugerowanych zmian. 1. Niedoświadczony użytkownik (mniej niż 2000 przedstawicieli) edytuje czyjś post 2. Dodaj wpis do systemu „przeglądu” oznaczony jako „sugerowana edycja” 3. Doświadczony użytkownik (ponad 2000 przedstawicieli) może przejrzeć „sugerowane zmiany” jeden przez jeden Jako doświadczony użytkownik mogę: * Zobaczyć różnicę między treścią oryginalną a edytowaną * Zatwierdzić edycję * Odrzucić edycję * Poprawić edycję * Przeskoczyć do następnej recenzji Końcowa uwaga na temat innych typów recenzji. Możemy sobie wyobrazić „otagowanie” recenzji odpowiadającymi im typami, ponieważ działania są takie same. ### Projekt Zacząłbym od modelu `Review`. Moglibyśmy mieć jedną podklasę dla każdego typu recenzji, umożliwiając w przyszłości niestandardowe atrybuty i metody dla każdego typu. Klasa `ruby` Klasa Review Review::SuggestedEdit < Klasa Review Review::FirstPost < Klasa Review Review::LateAnswer < Klasa Review Review::LowQuality < Review Obiekt `Review` miałby 2 odniesienia: * Zawartość oryginalna * Zatwierdzanie zawartości edytowanej 1. Zastąp oryginalną treść edytowaną treścią. 2. Oznacz recenzję jako zatwierdzoną. 3. Przejdź do następnej recenzji. Odrzuć 1. Zapisz przyczynę odrzucenia. 2. Oznacz recenzję jako odrzuconą. 3. Przejdź do następnej recenzji. Ulepsz 1. Bezpośrednio edytuj edytowane treści. 2. Zatwierdź. 3. (Możemy wykonać obrazowanie, tworząc nowy przegląd dla tego ulepszenia.) 4. Przejdź do następnego przeglądu. Pomiń 1. Przejdź do następnej recenzji. * * * **Jak mam ustrukturyzować swoje zajęcia, aby zbudować taki system recenzji?**


title: Modelowanie punktów końcowych REST z danymi, do których nie wszyscy użytkownicy mają dostęp

text: Próbuję znaleźć najlepszy sposób na obejście małego problemu, jaki mam z projektem interfejsu API Hypermedia, który obecnie buduję. Mam pojęcie o witrynie, bardzo proste, niewiele się dzieje i jest dostępne przez: * /sites * /sites/{id} Witryny mają wiele właściwości i żadna nie jest zbyt wrażliwa. Jednak witryna ma pojęcie budżetu, nie jest to nic zbyt egzotycznego, w rzeczywistości dla przesunięcia będzie to prosty obiekt, który zawiera pole dziesiętne i wskaźnik do waluty, ale nie powinno to być widoczne dla każdej osoby żądającej zasobów, ponieważ uważa się je za poufne informacje, które powinni posiadać kierownicy projektów. Niektóre opcje: 1. Po prostu wyślij - problem polega na tym, że nie wiem, co zrobią z tym klienci korzystający z API, a to jest po prostu okropna opcja przez cały czas 2. Wyślij pusty obiekt, tj. `Budżet:{}` 3. Uczyń `Budżet` subzasobem `Witryny` i daj do niej dostęp tylko użytkownikom z odpowiednim poziomem dostępu Ponieważ jest to hipermedialne API, skłaniam się ku opcji 3, ponieważ mogłem (lub nie) w zależności od przypadku podać link, a także osobno chronić ten punkt końcowy, ale jednocześnie wydaje się to trochę nie tak, nie wiem, dlaczego. Pozycja 3 może wyglądać tak: * /sites/{id}/budget Czy ktoś ma jakąś pomocną radę na ten temat?


title: Dlaczego nie standardowy silnik renderujący do rozwiązywania problemów z różnymi przeglądarkami?

text: Dlaczego przeglądarki używają różnych silników renderujących, to powoduje problem, którego najbardziej nienawidzę „uczynić swój HTML/CSS kompatybilnym ze wszystkimi głównymi przeglądarkami internetowymi”. Dlaczego nie używają jednego silnika renderującego jako standardu, a to zaoszczędzi wiele czasu i wysiłku wszystkim programistom. Właściwie tego nienawidzę w branży IT „Zbieżność kosztem użytkownika”. To samo możemy powiedzieć o systemach operacyjnych. Dlaczego nie tylko jeden?


title: Czy testy jednostkowe z pojedynczym atestem nie łamią zasady DRY?

text: Za każdym razem, gdy piszę testy jednostkowe, zawsze starałem się mieć **pojedyncze potwierdzenie na test**, aby ułatwić debugowanie w przypadku niepowodzenia testów. Jednak gdy stosuję się do tej zasady, czuję, że ciągle kopiuję ten sam kod w każdym teście, a mając więcej testów, trudniej jest wrócić do czytania i utrzymania. _Więc czy testowanie z pojedynczą asercją narusza DRY?_ I _Czy istnieje dobra zasada, której należy przestrzegać_, aby znaleźć dobrą równowagę, np. po prostu **jeden test na metodę**?* *Zdaję sobie sprawę, że prawdopodobnie nie ma jednego dopasowania wszystkie rozwiązania tego problemu, ale czy istnieje zalecany sposób podejścia do tego?


title: Konsorcjum branżowe na rzecz szerszego przyjęcia C#?

text: **Czy istnieje jakieś konsorcjum oprogramowania promujące C# jako język?** Znam Mono i postrzegam to jako szczerą, odważną próbę. Jednak jest mało prawdopodobne, że będą w stanie prześcignąć Microsoft w modelu „doganiania”. Szersze konsorcjum oznacza, że mapy drogowe są wspólne, a nie „nadrabiające”. Porównuję C# do C++. C++ jest niesamowity, ponieważ może działać na prawie wszystkim, od ARM RTOS, Linux, BSD, Windows itp. Oczywiście ekspansywna natura platformy wykonawczej (.NET) sprawia, że jest to ogromne wyzwanie. Nie wspominając o tym, że język (C#) i środowisko wykonawcze stały się prawie synonimami. Ale dygresja, wracając do głównego pytania powyżej ...


title: Jak aplikacja na iPhone'a powinna łączyć się z usługą .NET?

text: Muszę zaakceptować dane tekstowe i fotograficzne z aplikacji na iPhone'a. Normalnie napisałbym usługę sieci Web lub usługę Windows z WCF dla połączeń z serwerem klienta. Nie jestem zaznajomiony z aplikacjami na iPhone'a, jaki jest dobry sposób na obsługę warstwy komunikacyjnej używanej do obsługi iPhone'a na Windows?


title: Jakie są korzyści finansowe z przejścia na zwinność?

text: Dlaczego warto pracować zwinnie? To pierwsze pytanie, które przychodzi mi do głowy, gdy myślę o zwinności. Jakie są możliwe korzyści finansowe, które można osiągnąć, przechodząc na agile? Większość z nas z pewnością lubi myśleć o klientach i klientach jako o kimś, kto nie wie, czego chce. Więc po co im w ogóle pomagać? Dlaczego nie wyssać ich pieniędzy będąc pasożytniczą firmą i sprawić, że będą głupsi z dnia na dzień. Tradycyjne tworzenie oprogramowania nie jest złe i prawdopodobnie jest (w większości z tego, co widziałem) dużo łatwiejszym środowiskiem do pracy niż projektami zwinnymi. Więc po co w ogóle być zwinny? Co może dać zwinny (mam na myśli finansowo) coś, czego tradycyjne tworzenie oprogramowania nie może?


title: Czy ograniczenia czasowe dotyczące testów technicznych to dobra rzecz?

text: Toczymy więc wewnętrzną debatę na temat tego, czy ograniczenie czasowe, które mamy dla naszego testu technicznego, jest dobre. Pomyślałem, że otworzę to dla społeczności. Więc jakie są twoje przemyślenia na temat tego ograniczenia, czy ludzie akceptują to jako standardową praktykę, czy jest to sztuczne ograniczenie? Trochę tła, dla wszystkich naszych stanowisk, oczekujemy od kandydatów wykonania ćwiczenia z kodowania i ustalamy limit czasu, który naszym zdaniem jest rozsądny, aby przynajmniej rozplanować projekt (nie oczekujemy w pełni działającego rozwiązania) i to jest to termin, który jest przedmiotem debaty. Obecny limit czasu to 2 godziny (co, szczerze mówiąc, jest hojne).


title: Wzorce projektowe: czy powinienem się ich nauczyć?

text: Dziwnie jest więc zadawać dwa pytania jeden po drugim, ale nie są one bardzo powiązane i nie chciałem ich łączyć, ale nie wysyłam spamu, obiecuję! W każdym razie jestem świeżo upieczonym absolwentem college'u, a moja edukacja dotykała tylko wzorców projektowych… wdrożyliśmy kilka prostych, poruszyliśmy fakt, że są bardziej skomplikowane i poinstruowano nas, aby zwrócić się do książki GoF, jeśli chciałem dowiedzieć się więcej. Moje pytanie brzmi, czy warto uczyć się schematów z książki GoF? Zawsze wydawało mi się, że próba dopasowania problemu do klasycznego wzoru jest sprzeczna z intuicją, ale oczywiście książka i wzory są znane nie bez powodu. Czy pojawiają się na tyle, że powinienem się ich uczyć? Dzięki jeszcze raz!


title: Czy możesz zamykać gałęzie w Git?

text: W Mercurial możesz zamknąć gałąź w ten sposób: `hg commit --close-branch`, oznacza to, że gałąź nie będzie już wyświetlana, ale nadal będzie istnieć i nadal może być wymieniona, jeśli użyjesz `hg branch --closed` Nauczyłem się, że w Git generalnie gałęzie nie są zachowywane, znikają, szczególnie podczas łączenia w przód. Więc moje pytanie brzmi: czy możesz zachować branche w git, ale w taki sposób, że już ich nie wymieniasz? **Edit** : Dodatkowy kontekst: W gałęziach Mercurial są metadane, więc każdy commit zawsze zna swoją gałąź. W Mercurial, jeśli chcesz usunąć gałąź, usuwasz podstawową wersję gałęzi. Możesz także zmienić bazę i uzyskać taki sam wynik, jak w przypadku Git. Zakładki Mercurial są wskaźnikami, więc zachowują się dokładnie tak samo jak gałąź Git.


title: Czy WTFPL zwalnia autora od odpowiedzialności?

text: Grupa z nas zastanawiała się, czy wybrać CC0 lub WTFPL, ponieważ CC0 wyraźnie stwierdza brak odpowiedzialności. Czy WTFPL, jeśli jest właściwie używana, zwalnia również autora(ów) z odpowiedzialności za użytkowanie?


title: Dlaczego wzorzec projektowy metody fabryki jest bardziej przydatny niż posiadanie klas i wywoływanie ich indywidualnie?

text: Z wzorców projektowych „Gang Czterech” mamy metodę Factory: class Factory(product) case product kiedy nowy A kiedy b nowy B kiedy c nowy C koniec nowy Fabryka(a) Dlaczego jest to bardziej przydatne niż posiadanie trzech klas, `a`, `b` i `c` i wywoływanie ich indywidualnie?


title: Gdzie nas zawodzi Waterfall i czy Scrum może nam pomóc w osiągnięciu sukcesu w naszych projektach?

text: Pozwólcie, że wyjaśnię naszą sytuację. Jesteśmy małą firmą zatrudniającą ponad 20 osób i przez cały czas praktykujemy standardowy model wodospadu z niewielkim powodzeniem (ze względu na częste zmiany wymagań i brak kierunku). Tak więc pewnego dnia przyszedł nasz CTO i poinformował nas o SCRUM i wszyscy byliśmy przekonani, że ten model świetnie sprawdzi się w tak małym zespole jak my. Niestety każdy z nas nie ma żadnego doświadczenia w praktykowaniu SCRUM i polegamy głównie na zasobach internetowych i książkach. Następnie dochodzimy do nowego projektu, który właśnie zaczynamy i robimy coś takiego: 1. Zbieramy wymagania od użytkownika domeny biznesowej 2. Przygotowujemy specyfikację wymagań z interfejsem użytkownika i funkcjami (zajęło nam to już tygodnie) 3. Spotkanie ponownie użytkownik domeny biznesowej, aby sprawdzić, czy są wymagane jakieś zmiany 4. Gdy użytkownik biznesowy zaakceptuje specyfikacje, wprowadzimy te funkcje do katalogu produktów 5. Podziel te funkcje na zadania i przypisz do sprintu. zwinne podejście? na przykład 1. Zbierz wymagania od interesariuszy 2. Zacznij tworzyć epickie historyjki użytkowników i przeanalizuj je z zainteresowanymi stronami 3. Podziel te epickie historie na mniejsze historie (wspierane przez niektóre interfejsy użytkownika) i przydziel je do krótkiego sprintu (2 tygodnie) 4. Pokazujemy co zrobiliśmy przez 2 tygodnie, zdobądź ich informację zwrotną i zaplanuj kolejny sprint Biorąc pod uwagę charakter naszych projektów, w których ciągle mamy do czynienia z wyzwaniami niestabilnych wymagań i braku kierunku, gdzie powyższe punkty Scrum/Agile korzyści nam i dlaczego powyższe metody wodospadu nas zawodzą?


title: Narzędzie dokumentacji dla OpenEdge ABL

text: Mam duży system w OpenEdge ABL, który przydałby się trochę miłości do dokumentacji. Obecnie członek zespołu pracuje nad narzędziem, które może znaleźć metody i funkcje oraz zrobić z niego kilka stron html w stylu Javadoc. Na brzegach jest dość szorstko. Ok, to jak brzeszczoty na krawędziach. Próbuję znaleźć coś takiego jak Javadoc lub Doxygen, które jest w stanie analizować OpenEdge ABL w celu wygenerowania pewnego rodzaju dokumentacji API. Wiem, że rynek OpenEdge nie jest najlepszy, ale jest wiele rzeczy, które są przekazywane z ust do ust. Wyszukiwanie jest trudne, ponieważ kiedyś nazywało się „Postęp”, co powoduje, że zapytania wyszukiwania są nieistotne. Jestem również otwarty na system, który pozwala zdefiniować wyrażenia regularne, których należy szukać, aby zdefiniować własną składnię. Następnie analizuje i daje wynik na tej podstawie.


title: Aplikacje bankowe - Oszczędzanie salda konta

text: Z tego, co wiem, większość aplikacji bankowych okresowo przechowuje saldo konta w określonym momencie, ponieważ nie byłoby prawdopodobne obliczanie go w całej historii transakcji za każdym razem, gdy jest to potrzebne. Aby znaleźć saldo konta, aplikacja najpierw załaduje ostatnie zapisane saldo i doda transakcje, które nastąpiły po tym punkcie. Jak nazywa się ten proces oszczędzania sald kont? Jakie są typowe techniki stosowane w tym procesie? (np. uruchamiaj go w każdy weekendowy wieczór)


title: W jaki sposób testowane jest oprogramowanie używane w krytycznych systemach życia lub śmierci?

text: Samolot, w przeciwieństwie np. do strony internetowej, to system, w którym jakakolwiek awaria niektórych systemów jest całkowicie nie do zaakceptowania, ponieważ błędy m.in. monitorowanie lotu może spowodować nieprawidłowe działanie autopilota i wykonanie nurkowania. Oczywiście tak się nie dzieje, ponieważ błyskotliwi inżynierowie Boeinga i Airbusa sprawdzają autopilot, aby upewnić się, że nagle nie zdecyduje, że nurkowanie jest całkowicie akceptowalnym i bezpiecznym manewrem. A może komputer się zawiesza i piloci w nowszych samolotach typu fly-by-wire nie mogą już nim latać. Oczywiście w te systemy wbudowano różne procedury bezpieczeństwa i redundancje, aby zapobiec awariom (zarówno oprogramowania, jak i samolotu). Jednak z drugiej strony jest całkiem oczywiste, że oprogramowanie nie jest doskonałe — zarówno oprogramowanie open source, jak i oprogramowanie zamkniętego źródła regularnie ulegają awarii i tylko najprostszy program „Hello World” nie zawodzi. W jaki sposób inżynierowie, którzy projektują systemy oprogramowania w przemyśle lotniczym, medycznym i innych branżach zajmujących się życiem lub śmiercią, mogą testować swoje oprogramowanie tak, aby nie zawiodło (a jeśli zawiedzie, przynajmniej z wdziękiem)? Mam rozpaczliwą nadzieję, że nie wszyscy pójdziecie: „Och, pracuję dla Boeinga / Airbusa / (innej firmy) i tak nie jest! Baw się dobrze podczas następnego lotu / wizyty w szpitalu”.


title: Czy istnieje skuteczny sposób na tworzenie złożonych form?

text: Tworząc formularz „wyszukiwarki” spotkałem się z przytłaczającą złożonością i zastanawiałem się, czy istnieje dobrze znany sposób na wykonanie takiego zadania. Pola formularza, o którym mowa, można zobaczyć tutaj: http://developer.echonest.com/docs/v4/artist.html#search Oto kilka problemów, z którymi się spotkałem i które próbowałem rozwiązać za pomocą prostych rozwiązań doprowadziło w końcu do wielu kopiowania i wklejania: * Gdy użytkownik może wybrać wiele opcji dla pola lub nie, systematycznie musiałem tworzyć ich kolekcję, dodając wartość „null” dla możliwości zignorowania tego pola. Ponadto, ponieważ są to wartości wyliczenia, nie są one _przyjazne_ dla użytkownika_ do odczytania i dlatego potrzebne jest dodatkowe pole opisu, które będzie wyświetlane zamiast tego w interfejsie użytkownika. I na koniec wszystkie te _przyjazne dla użytkownika_ wartości muszą zostać skonwertowane z powrotem do oryginalnego obiektu. * Wybór dokonywany przez użytkownika, te wybory muszą zostać pobrane i do tego niestety w moim przypadku powiązanie danych WPF pokazało swoje granice. Przykład : gdy użytkownik wybiera elementy z kolekcji, nie ma możliwości zaktualizowania obiektu docelowego tymi wyborami. (Oczywiście jest to nierealne, ponieważ obiekt służy jako źródło danych) W końcu wznawia się wiele ręcznego pobierania z pól kombi, pól list itp. Obiekt _middle-man_, aby otrzymać to wszystko i do tego musisz dodaj również walidację. W związku z tym strategia staje się koniecznością, ponieważ będę musiał zrealizować kilka tych złożonych form. Szukałem w sieci rozwiązań, ale poza niezwykle prostymi przykładami nie znalazłem nic istotnego. Pytanie brzmi, czy istnieje skuteczny sposób, który pomaga przy tworzeniu złożonych formularzy użytkownika?


title: Jak projektować struktury danych do shardingu?

text: Jakie są najlepsze praktyki podczas projektowania struktur danych dla aplikacji, aby upewnić się, że można ją podzielić na fragmenty? W szczególności, które z poniższych jest lepsze: 1. Tworzenie relacji w bazach danych 2. Tworzenie relacji w zapytaniach SQL w razie potrzeby?


title: Jakich wskaźników ilościowych używasz do mierzenia jakości zespołu testującego offshore?

text: Czy programiści są w USA, nasi testerzy są w Indiach. Jak mierzymy ich zdolności, jakość, sukces? Niektóre możliwości: \- Pokrycie na poziomie interfejsu użytkownika \- Całkowity czas potrzebny do przeprowadzenia testów regresji


title: Problemy z pamięcią podczas planowania ucieczki z DLL Hell w Delphi

text: Pracuję nad programem z około 50 bibliotekami DLL, które są ładowane z jednego pliku wykonywalnego, jest to stary, organicznie rozwinięty program, w którym jedynym uzasadnieniem tworzenia nowej biblioteki DLL jest to, że wcześniej nie istniała, aby zaspokoić daną potrzebę. (a przestrzenie nazw nie istniały w Delphi, więc nigdy nie przyszło nam do głowy, aby dll1.main.pas, dll2.main.pas lub coś jeszcze bardziej unikalnego) To, co chcemy zrobić, to skonsolidować wszystkie te biblioteki DLL w jeden plik wykonywalny, ponieważ żaden z nich są używane poza programem, nie powinno być większego problemu. Obawy mojego szefa polegają na tym, że gdybyśmy to zrobili, obciążenie pamięci dla klientów serwera terminali poszłoby przez dach. Tak więc przejrzałem wystarczająco dużo kodu inicjującego, aby wiedzieć, że wiele rzeczy jest wykonywanych za każdym razem, gdy biblioteka DLL jest ładowana do pamięci, ale powiedzmy, że mam projekt z około 4000 plików i 50 bibliotekami dll, z których 10 jest prawdopodobnie wykorzystywane przez jednego użytkownika w jednej sesji programu. 50 bibliotek dll to około 2/3 formy plików, jeśli nie więcej, ale poza tym nie ma ładowanych wielu innych zasobów (tylko kilka osadzonych obrazów, ikon, kursorów itp.). Jeśli załadowałem wszystkie te pliki do pamięci, ile pamięci jest używane na jednostkę? ile jest używane na zajęcia? Jak obniżyć koszty ogólne? a jaki jest największy projekt, którego można się spodziewać z Delphi? Ta ciekawostka nie pomoże w odpowiedzi, ale myślę, że może wyjaśnić, o co martwi się mój szef, obecnie zaczynamy nasz program przy około 18 megs, normalne warunki pracy to zwykle mniej niż 40 megs, uważa, że może wzrosnąć nawet do 120 megs .


title: Korzystanie z biblioteki LGPL ze statycznym lub dynamicznym łączeniem Java

text: Przeszukałem i przeczytałem wiele postów na temat LGPL i C, a kiedy udało mi się znaleźć taki, który był związany z Javą, mój umysł wciąż nie odpoczywał, więc postaram się być bardziej konkretny i mam nadzieję, że uzyskam realne wytycznych i oczywiście w końcu skonsultowałbym się z prawnikiem! Konfiguracja: * Jest biblioteka LGPL, nazwijmy ją **Lib-B** * Mam Moją Bibliotekę opartą na **Lib-B** nazwijmy ją **My-Lib** Moim zdaniem ** Architektura Lib-B** nie jest dobrze sformułowana i chcę zastosować w **My-Lib** moją własną architekturę i użyć **niektórych** funkcji **Lib-B**. Problem polega na tym, że **Lib-B** opakowuje funkcje, do których chcę uzyskać dostęp w sposób, który nie pasuje do architektury **My-Lib**, więc zmieniłem **Lib-B** i zahermetyzowałem (zduplikowane) wiersze kodu, które chciałem/potrzebowałem w kilku obiektach nadal wewnątrz **Lib-B** i wywołaj te funkcje z **My-Lib**. To jest moja aktualna konfiguracja statyczna... ===================== Drugą rzeczą, którą mogę zrobić, to uczynić moją konfigurację dynamiczną, więc: * Mogę utworzyć Biblioteka definiująca interfejs z funkcjami, których potrzebuje **My-Lib**, nazwijmy ją **Lib-A**. Później skompiluję i połączę **My-Lib** z **Lib-A** i pozwolę **Lib-B** zaimplementować interfejs z **Lib-A** i załadować **Lib- B** dynamicznie w **My-Lib**. Rozumiem, że w obu przypadkach muszę opublikować moje zmiany w **Lib-B** również jako LGPL i zezwolić użytkownikom końcowym na dostęp do kodu itp. A co z **My-Lib**? Dzięki, Adamie.


title: Rozlanie informacji przez granice obiektów

text: Często w moich obiektach biznesowych występują sytuacje, w których informacje muszą zbyt często przekraczać granice obiektu. Wykonując OO, chcemy, aby informacje znajdowały się w jednym obiekcie i w miarę możliwości cały kod zajmujący się tą informacją powinien znajdować się w tym obiekcie. Jednak reguły biznesowe nie przestrzegają tej zasady, co sprawia mi kłopot. Jako przykład załóżmy, że mamy zamówienie, które ma pewną liczbę pozycji OrderItem, które odnoszą się do elementu InventoryItem, który ma cenę. Wywołuję Order.GetTotal(), który sumuje wynik OrderItem.GetPrice(), który mnoży ilość przez InventoryItem.GetPrice(). Na razie w porządku. Ale potem dowiadujemy się, że niektóre przedmioty są sprzedawane w cenie dwa za jedną. Możemy sobie z tym poradzić, pozwalając OrderItem.GetPrice() zrobić coś takiego jak InventoryItem.GetPrice( ilość ) i pozwolić InventoryItem zająć się tym. Jednak wtedy dowiadujemy się, że umowa dwa za jednego trwa tylko przez określony czas. Ten okres musi być oparty na dacie zamówienia. Teraz zmieniamy OrderItem.GetPrice() na InventoryItem.GetPrice( quatity, order.GetDate() ) Ale potem musimy obsługiwać różne ceny w zależności od tego, jak długo klient był w systemie: InventoryItem.GetPrice( ilość, zamówienie. GetDate(), order.GetCustomer() ) Okazuje się jednak, że transakcje dwa za jednego dotyczą nie tylko zakupu wielu takich samych pozycji magazynowych, ale wielu dla dowolnego przedmiotu z kategorii InventoryCategory. W tym momencie rzucamy ręce i po prostu dajemy InventoryItem element zamówienia i pozwalamy mu przemieszczać się po wykresie referencji obiektu za pośrednictwem akcesorów, aby uzyskać informacje, których potrzebuje: InventoryItem.GetPrice( this ) TL;DR Chcę mieć niskie sprzężenie w obiektach, ale reguły biznesowe często zmuszają mnie do dostępu do informacji z dowolnego miejsca w celu podjęcia określonych decyzji. Czy istnieją dobre techniki radzenia sobie z tym? Czy inni znajdują ten sam problem?


title: O co proszę poprzedniego programistę przy przejęciu utrzymania sieci?

text: Przejmuję prowadzenie prostej komercyjnej strony internetowej, wyświetlane są zdjęcia i informacje. Mam doświadczenie z html, php, wordpress, javascript, java i tym podobne. O co powinienem poprosić poprzedniego dewelopera, jeśli chodzi o przejęcie utrzymania, hostingu, plików, testowania, wdrażania itp.? Ile powinienem pobierać za utrzymanie i rozbudowę strony?


title: Protokół metaobiektu: dlaczego jest znany jako ważna koncepcja?

text: Protokół metaobiektu jest protokołem dla metaobiektów w językach programowania. Chociaż rozumiem to w prosty sposób, chcę poznać przyczynę i podsumowanie rzeczywistych wzorców użytkowania tego protokołu. Dlaczego dokładnie metaobiekt i co ważniejsze protokół metaobiektu jest tak dobrym pomysłem. Chcę poznać problem, który doprowadził do jego ewolucji, a także wysokie zużycie energii. Mile widziane są również opinie oraz ogólny przegląd/opis/alternatywne wyjaśnienia.


title: Jaka jest twoja metoda, aby nie zapomnieć o nawiasach końcowych, nawiasach

text: _disclaimer: dla uproszczenia nawiasy będą odnosić się do nawiasów, nawiasów klamrowych, cudzysłowów i nawiasów w związku z tym pytaniem. Kontynuuj._ Pisząc kod, zwykle najpierw wpisuję początek i koniec elementu, a następnie wracam i wpisuję wewnętrzne rzeczy. To musi być dużo cofania, zwłaszcza gdy robisz coś z wieloma zagnieżdżonymi elementami, takimi jak: jQuery(function($){$('#element[input="file"]').hover(function(){$(this ).zanikanie();})); Czy istnieje skuteczniejszy sposób zapamiętywania, ile masz otwartych nawiasów? Lub drugi przykład z cudzysłowami: <?php echo '<wartość wejściowa="'.$_POST['nazwa'].'" />"; ?>


title: Jak rozpocząć mój pomysł na open source?

text: Mam pomysł na projekt open source. Chodzi o budowanie narzędzi programistycznych dla programistów. Jeszcze nigdy nie dołączyłem do zespołu programistów i teraz niewiele wiem o tych zespołach poza tym, że istnieją ;) Moje pytania to: 1. Czy istnieje zespół projektów c# open source? Gdzie? 2. Jak mogę zaproponować swój pomysł/kod 3. Jeśli grupy istnieją... czy powinienem być kierownikiem projektu w sensie oferowania zakresu, wersji itp. czy też pozwolić to zrobić innym? Wiem, że java i inne języki są lepszym punktem wyjścia dla open-source, ale... Czuję się bardziej komfortowo z C# i środowiskiem programistycznym vs.


title: Czy czas uruchamiania aplikacji internetowej jest naprawdę tak ważny?

text: Rozmawiał z kimś o dodaniu kodu inicjującego podczas uruchamiania aplikacji i narzekał, że powoduje to wydłużenie czasu uruchamiania. Tak naprawdę nie potrafił podać powodu (przeczucie czy coś, nie wiem). Nie jest to aplikacja intensywnie użytkowana i zaczyna się za około minutę, wdrażamy kilka razy w roku. Pamiętam, że jakiś czas temu czytałem takie porady na pytania na SO, ludzie radzą inicjować przy starcie zamiast przy dostępie do strony z pieczątką „jeśli możesz sobie pozwolić na karę”. Pracowałem z aplikacjami internetowymi, które zaczynały się od 30 sekund do 4-5 minut, ale kiedy były online, działały. Więc czego mi brakuje? O ile nie jest to istotna aplikacja jak... nie wiem... dla rynku finansowego, zastosowań medycznych, eksploracji kosmosu itp., czy czas startu jest aż tak ważny? PS Ściśle odnoszę się do aplikacji internetowych, aplikacje desktopowe z pewnością zaczną działać błyskawicznie.


title: Wytyczne iOS dotyczące aplikacji bezpłatnych i płatnych

text: Kilka miesięcy temu czytałem rekreacyjnie w iOS Dev Center i natknąłem się na małą listę wytycznych dotyczących darmowych i płatnych aplikacji. Zawierał wskazówki w następujący sposób: * Jak nie promować płatnej wersji w ramach darmowej wersji * Nie wyświetlając "zastępczych" przycisków w darmowej wersji, które "działają" w płatnej wersji Nie pamiętam wiele więcej, a ja nie można go już znaleźć w Centrum deweloperów iOS. Możliwe, że całkowicie to sobie wyobraziłem, ale wątpię – czy ktoś ma link do tych informacji, albo ma zestaw wytycznych dotyczących darmowych vs płatnych aplikacji w App Store?


title: BDD i zachowanie oparte na stanie złożonym

text: Zastanawiam się, jak napisać przypadki testowe BDD dla prawdziwego systemu. Wszystkie przykłady jakie znajdę są banalne i nie odpowiadają na pytanie. Przykładowy przypadek użycia/historia wygląda następująco: 1. Użytkownik znajduje się na głównej stronie aplikacji 2. Klika pobierz, aby pobrać zlecenie do pracy 3. Wypełnia 4 pola tekstowe i klika „Prześlij”. 4. Coś się dzieje 5. Kolejna kolejność jest prezentowana użytkownikowi Tak więc punkt 4 jest trochę niejasny, ale jest w to dużo logiki, pod spodem jest przepływ pracy itp. Można to zasadniczo zdefiniować w ten sposób: Podana kolejność typy A+B+C+E+F (20 możliwych wartości z dowolną kombinacją) i podtyp a1 i kolejność ma atrybut X = 1, atrybut Y=asdasd, (i wiele więcej) Gdy użytkownik wprowadzi tutaj określoną wartość , a inne tu i klika prześlij Potem zamówienie robi to, to, to, to, to, to i tam Nie wygląda to dobrze... Czyli w drugą stronę napisz: Biorąc pod uwagę zamówienie z typem A (i resztą jest "domyślny") Kiedy użytkownik to robi... Wtedy kolejność robi rzeczy-zależne-tylko-na-A Wydaje się ładniejsze, ale - czy naprawdę jest to właściwe podejście do zdefiniowania tego "stanu domyślnego" systemu? Nie może to być arbitralne, ponieważ „rzeczy zależne tylko od A” nie są tak naprawdę niezależne – mogą nawet nie mieć szansy na włączenie, jeśli jest włączona flaga „nie bierz-pod uwagę” lub jakakolwiek inna inny dziwny specjalny przypadek. (tak, mój obecny projekt to: jakaś niezbyt skomplikowana logika + osobo-laty szczególnych przypadków) Uwaga - opisując wymagania czasami określamy parametry wymagane, aby historia miała sens, czasami nie - to działa dla nas, bo my poznać inne historie. Ale w BDD wydaje się, że przypadek testowy powinien być konkretny i jednoznaczny.


title: Kryteria uznania języka programowania za „dojrzały”

text: Niedawno czytałem odpowiedź na to pytanie i uderzyło mnie stwierdzenie „Język jest dojrzały”. Zastanawiałem się więc, co właściwie mamy na myśli, kiedy mówimy, że „Język programowania jest dojrzały”? Zwykle język programowania jest początkowo rozwijany z potrzeby, np. * Wypróbuj / zaimplementuj nowy paradygmat programowania lub nową kombinację funkcji, których nie można znaleźć w istniejących językach. * Spróbuj rozwiązać problem lub przezwyciężyć ograniczenia istniejącego języka. * Stwórz język do nauczania programowania. * Utwórz język, który rozwiązuje określoną klasę problemów (np. współbieżność). * Stwórz język i API dla specjalnego pola aplikacji, np. sieć (w tym przypadku język może ponownie wykorzystać dobrze znany paradygmat, ale całe API musi być nowe). * Stwórz język, aby wypchnąć konkurenta z rynku (w tym przypadku twórca może chcieć, aby nowy język był bardzo podobny do istniejącego, aby przyciągnąć programistów do nowego języka programowania i platformy). Niezależnie od pierwotnej motywacji i scenariusza, w którym język został stworzony, w końcu niektóre języki są uważane za **dojrzałe**. W mojej intuicji oznacza to, że język osiągnął (przynajmniej jeden z) swoich celów, m.in. „Możemy teraz używać języka X jako niezawodnego narzędzia do pisania aplikacji internetowych”. Jest to jednak trochę niejasne, więc chciałem zapytać, jakie uważasz za najważniejsze kryteria (jeśli w ogóle), które są stosowane, gdy mówisz, że język jest dojrzały. **WAŻNA UWAGA** To pytanie jest (celowo) niezależne od języka, ponieważ interesują mnie tylko ogólne kryteria. Proszę pisać tylko odpowiedzi i komentarze niezależne od języka! Nie pytam, czy jakiś konkretny „język X jest dojrzały” lub „które języki programowania można uznać za dojrzałe” lub czy „język X jest bardziej dojrzały niż język Y”: proszę unikać publikowania jakichkolwiek opinii lub odniesień na temat konkretnych języków, ponieważ te są poza zakresem tego pytania. **EDYTUJ** Aby sprecyzować pytanie, przez **kryteria** rozumiem takie rzeczy jak „wsparcie narzędzi”, „przyjęcie przez branżę”, „stabilność”, „rich API”, „duża społeczność użytkowników”, „Rekord udanej aplikacji”, „standaryzacja”, „czysta i jednolita semantyka” i tak dalej.


title: Na jakich rozdzielczościach ekranu powinniśmy testować podczas tworzenia aplikacji na urządzenia mobilne?

text: Jeśli chcę stworzyć mobilną wersję strony internetowej, jakie są najpopularniejsze rozdzielczości ekranu, na których powinienem testować?


title: Strategia przechowywania/średnich logów pingów

text: Zajmuję się tworzeniem witryny do monitorowania usług internetowych. Najbardziej podstawowym rodzajem sprawdzenia jest wysłanie pinga, przechowującego czas odpowiedzi w obiekcie `CheckLog`. Domyślnie obiekty `PingCheck` są wyzwalane co minutę, więc w ciągu godziny otrzymujesz 60 `CheckLogs`, aw ciągu jednego dnia otrzymujesz 1440 `CheckLogs`. Jest ich dużo, nie muszę przechowywać takiego poziomu szczegółowości, dlatego ustawiłem _mechanizm zwijania_, który cyklicznie pobiera nierozwinięte `CheckLogs` starsze niż 24h i _zwija_ (średnie) w odstępach 30 minut. Tak więc, jeśli masz 360 „CheckLogs”, które zostały zapisane od 0:00 do 6:00, po zwinięciu zachowujesz tylko 12 z nich. Problem… cóż, jest taki: ![tutaj podaj opis obrazu](http://i.stack.imgur.com/vnX8p.png) Po uśrednieniu czasów odpowiedzi wykres zmienia się drastycznie. Co mogę zrobić, aby to poprawić? Chyba jedną z opcji może być zawężenie czasu trwania interwału do 15 minut. Widziałem wykresy na stronie statusu GitHub i nie wydają się cierpieć z powodu tego problemu. Byłbym wdzięczny za wszelkie informacje, które możesz mi udzielić na ten temat.


title: nazwa pochodzenie "WebService"

text: WebServices to jedna z możliwych implementacji SOA, stąd nazwa „Services”. Ale dlaczego nazywają się * _WEB_ * Usługa? Czy to dlatego, że do implementacji używają technologii i protokołów internetowych (HTTP, XML, ...)?


title: Implementacja kodu GUI dla określonej klasy Window/Form

text: **Terminologia** Element/formularz Element -> Pola takie jak lista tekstowa, pola kombi, przyciski itp. **Problem** Mam program, który jest w zasadzie grubym klientem, który łączy się z systemem, który śledzi sygnalizację świetlną . W tym programie istnieje formularz. Formularz zawiera kilka podformularzy. Tak jak w tej chwili, niektóre podformularze mają swoje własne klasy, a niektóre podformularze są po prostu całkowicie kontrolowane z klasy głównego formularza. Główna klasa formularza ma metodę walidacji, która jest wywoływana, gdy formularz jest przesyłany i wywołuje metody walidacji w podformularzach, a także wykonuje walidację niektórych elementów formularza, które nie mają własnych klas. Nie jestem sprzedawany na tej architekturze, ponieważ uważam, że powinna być spójna (każdy podformularz powinien mieć własną klasę lub żaden podformularz nie powinien mieć własnej klasy. Mój problem polega na implementacji obsługi ostrzeżeń. W tej chwili, gdy element jest walidowany względem, walidacja skutkuje błędem lub ostrzeżeniem. Jeśli jest to błąd, użytkownik musi poprawić pole, aby spełnić wymagania dotyczące walidacji formularza. Jeżeli jest to ostrzeżenie, użytkownik musi zostać powiadomiony o tym ostrzeżeniu, oraz następnie wyślij formularz po raz drugi.Jeśli pojawi się ostrzeżenie, stworzyłem flagę, która zostanie ustawiona.Zanim informacje zawarte w elementach formularza będą mogły zostać zaakceptowane, formularz najpierw sprawdza, czy nie zostały zgłoszone błędy.W przypadku ich braku błędy, sprawdza ostrzeżenia.Jeśli ustawiona jest flaga ostrzeżenia, wyświetla ostrzeżenie.Przy następnym wywołaniu tej metody flaga ostrzeżenia jest przełączana w ramach metody walidacji.Nie podoba mi się ta implementacja, ponieważ w zasadzie oznacza to masz tę nieuczciwą flagę, która powinna być czysta ed w oparciu o wymagania. Myślałem o zaimplementowaniu go jako automatu stanów, jednak napotykasz ten sam problem, w którym stan formularza byłby ustawiany w różnych miejscach w klasie na podstawie wymagań (jedno z pól zostało zmienione, zresetuj do stanu początkowego itp.). Innym problemem, na który natknąłem się, jest to, że flaga ostrzegawcza należy do głównej klasy formularzy. Z podformularza mogę utworzyć wskaźnik do formularza nadrzędnego, a następnie ustawić tam flagę. To wszystko wydaje się bardzo niezgrabne i wydaje mi się, że może to spowodować wiele zamieszania. Dla mnie musi być lepszy sposób na zaprojektowanie tego. **EDYTUJ: Dodanie kodu dla kontekstu** bool MainForm::callback_pushbutton_submit_clicked( const FormEvent&) { if ( validate_all_forms() ) { //wyświetl błąd } else if ( get_warning_displayed_flag() ) { //wyświetl ostrzeżenie } else { // prześlij formularz } } bool MainForm::validate_all_forms() { bool error = false; bool display_warning = false; błąd |= subform1.validate(); błąd |= subform2.validate(); //... //przeprowadź walidację podformularzy kontrolowanych w głównym formularzu if ( !(my_date_field.validate() ) { display_warning = true; } //.... if( error ) { //błąd formatu komunikat //usuń flagę ostrzeżenia } else if ( display_warning ) if ( !get_display_warning_flag() ) { //pobierz komunikat ostrzeżenia } invert_warning_display_flag() } return error;


title: Jak osiągnąć flow w programowaniu webowym?

text: Bardzo lubię programować proste rzeczy, takie jak rozwiązania dla Project Euler, gdzie można się skoncentrować, napisać algorytm, błyskawicznie wykonać, przetestować, zweryfikować i zmienić program, aż zadziała. Czuję, że nawet w przypadku większych projektów mogę utrzymać płynność i być bardzo produktywny, o ile mogę pozostać w jednym IDE (np. Eclipse) i wszystko się kompiluje i uruchamia szybko, na przykład, jeśli jest to GUI Swing. Wraz z rosnącym zainteresowaniem aplikacjami webowymi i smartfonami, jestem jednak zmuszony skonfigurować serwer WWW, żonglować dużą ilością języków programowania i znaczników (np. Javascript, Java, HTML, CSS), różnego rodzaju edytorów i czekać, aż coś jest wdrożony (serwer WWW), skompilowany (GWT, Vaadin) lub zwirtualizowany (Android). Czy istnieją rozwiązania, które pozwalają obejść te problemy? Wiem, że te pytania mogą brzmieć subiektywnie, ale jest to dla mnie ważna kwestia i myślę, że może z niej skorzystać również wielu innych. P.S.: Poszukuję rozwiązania do tworzenia stron internetowych, które pozwala pozostać w jednym IDE i które pozwala na testowanie i uruchamianie bez długiego oczekiwania na długie kompilacje, wdrożenia itp.


title: Dlaczego plik wykonywalny C miałby być mniejszy w porównaniu z plikiem wykonywalnym C++?

text: Próbuję zrozumieć, dlaczego rozmiary plików wyjściowych są znacząco różne podczas korzystania z kompilatora C i C++. Pisałem mały program hello world w C i C++, zauważyłem, że w wersji C rozmiar pliku wykonywalnego wynosił 93,7KB aw C++ rozmiar tego samego programu hello world wynosił 1,33MB. Nie jestem pewien, dlaczego tak jest. Myślę, że może to być spowodowane tym, że C++ ma więcej bibliotek i przestrzeni nazw do użycia, więc usunąłem linię `using namespace std` i po prostu użyłem `std::cout`, a wynik był taki sam. **C** #include <stdio.h> int main() { printf("Witaj świecie"); zwróć 0; } // rozmiar 93,7KB **C++** #include <iostream> int main() { std::cout<<"Witaj świecie"; zwróć 0; } // rozmiar 1,33MB Wydaje się, że w powyższym kodzie nie ma dużej różnicy. Czy istnieje jakaś różnica w kompilatorach, która tworzy różne rozmiary plików?


title: Zdezorientowany implementacją wzorca modułu javascript

text: Mam klasę napisaną w projekcie, nad którym pracuję, o której powiedziano mi, że używa wzorca modułu, ale robi to trochę inaczej niż przykłady, które widziałem. Zasadniczo przyjmuje następującą postać: (function ($, document, window, undefined) { var module = { foo : bar, aMethod : function (arg) { className.bMethod(arg); }, bMethod : function (arg) { console .log('łyżki'); } }; window.ajaxTable = ajaxTable; })(jQuery, dokument, okno); Rozumiem, co się tutaj dzieje. Ale nie jestem pewien, jak to się ma do większości definicji wzorca modułu (lub ujawniającego?), które widziałem. jak ten z briancray var module = (function () { // prywatne zmienne i funkcje var foo = 'bar'; //structor var module = function () { }; // prototyp module.prototype = { constructor: module, coś: function() { } };//zwróć moduł zwróć moduł;})(); var mój_moduł = nowy moduł(); Czy pierwszy przykład jest podobny do drugiego, z wyjątkiem tego, że wszystko jest w konstruktorze? Po prostu owijam głowę wokół wzorów, a małe rzeczy na początku i na końcu zawsze sprawiają, że nie jestem pewien, co powinienem robić.


title: Czy „Agile” można zastosować w zespołach IT w służbie zdrowia?

text: Czy Agile można zastosować w dziedzinie takiej jak IT dla opieki zdrowotnej, gdzie tak duża część opieki nad pacjentem zależy od jakości i terminowej dostawy systemów?


title: Dlaczego błyskawica jest używana do reprezentowania wydarzeń w środowiskach IDE?

text: Byłem tylko ciekaw, czy ktoś wiedział, dlaczego błyskawica została wybrana do reprezentowania wydarzeń w różnych IDE? lub kiedy został użyty po raz pierwszy? Od czubka głowy piorun jest używany w visual studio, prototypowaniu delphi i axure.


title: Narzędzie do śledzenia błędów, które integruje się z kontrolą źródła

text: Myślałem, że to będzie łatwe, ale to była katastrofa. Chcę skonfigurować narzędzie do śledzenia błędów, które integruje się z kontrolą źródła. Co najmniej, kiedy zatwierdzasz do kontroli źródła, powinno to powiadomić tracker problemów, a jeśli komentarz jest poprawnie skonfigurowany, wypchnąć odwołanie do zatwierdzenia do trackera problemów, abyś mógł cofnąć się i zobaczyć, co się stało. Działa to bardzo dobrze z githubem używającym zintegrowanego narzędzia do śledzenia problemów, ale wymaga to github jako miejsca, do którego trafia źródło, a narzędzie do śledzenia problemów jest BARDZO proste (co jest dobre i złe). Współpracujemy z wieloma klientami, a około 50% korzysta z SVN. _moglibyśmy_ robić wycieczki w obie strony na github, ale to bałagan. Wielokrotnie próbowałem Jira, korzystając z ich usługi na żądanie. To była ogromna strata czasu. Integrują działalność wywrotową, a wszystko inne wydaje się być nagrane po fakcie. Dokumentacja i wszystko inne jest komicznie złe. Po wielu próbach nadal nie mam githuba do pracy z Jira, a konfiguracja wydaje się być w porządku, ale nic się nie pojawia. Próbowałem FogBugz, ale wydaje się, że zawiera własną kontrolę źródła. Nie można połączyć się z zewnętrznymi repozytoriami. Wypróbowałem plan.io dla redmine. Możesz mieć subversion lub git, co było bardzo ekscytujące, dopóki nie dowiedziałem się, że możesz je mieć, ale ONI je hostują, co całkowicie nie działa. Idealnie chciałbym, aby Jira lub coś podobnego mogło wskazywać na zewnętrzne repozytoria. Spojrzałem również na youtrack i chociaż wydaje się wspominać o integracji z githubem, z wersji demonstracyjnej wygląda na to, że nie łączy się z powrotem do repozytorium przy zatwierdzeniach. Mają też link do hostowanego Youtracka, ale kiedy tam dotrzesz, nie będzie już na żywo. Pobrałby/zainstalował się lokalnie, gdybym myślał, że to rozwiąże problem, ale wolę nie przechodzić przez to ćwiczenie, nie wiedząc, czy ma on funkcje, których potrzebuję. Chciałbym również kilka funkcji przeglądu kodu, ale zaczniemy od problemów związanych z kontrolą źródła. Z góry dziękuję.


title: Lepsze zrozumienie pętli zdarzeń i timerów

text: Mam podstawową wiedzę na temat akceptowania klientów bez tworzenia wątku dla każdego połączenia za pomocą narzędzi takich jak `select` i nowoczesnych odpowiedników (kqueue, epoll). Ale dokąd mam się stąd udać? np. asynchroniczne we/wy i (okresowe) zegary. Mógłbym otworzyć źródło dla libev i przyjaciół, ale jest to dla mnie co najmniej przytłaczające. Rozejrzałem się po podręcznikach na ten temat, ale nie znalazłem niczego przydatnego. Podstawowym celem jest napisanie małej _zabawkowej_ implementacji biblioteki zdarzeń z zegarami i asynchronicznymi wejściami/wyjściami. Tylko dla lepszego zrozumienia tematów. _Nie chcę wymyślać koła na nowo. Służy to wyłącznie do celów edukacyjnych/edukacyjnych. (też nie praca domowa)_


title: Jak uczyć programistów podstawowych zasad

text: Aby zdobyć doświadczenie jako lider zespołu, niedawno otrzymałem zadanie nadzorowania programisty. Odkryłem, że ma problem z napisaniem prostego warunku „jeśli”. Ma problemy ze „strunami”. I nie wie, jak przekazać zmienną w funkcji `addClass` jQuery z warunkiem `if`. I nie wie, kiedy użyć pętli `for`. Lub nawet do czego służy pętla `for`. **Jak sprawić, by szybko zrozumiał te podstawowe pojęcia?** Poinformowałem go Google, jak używać warunku `if` dla zmiennej `addClass`. Ale on tego nie znalazł, potem powiedziałem mu, żeby zrobił to szybko wczesnym rankiem, kiedy dyskutował, podał powody, że tak jest, potem powiedziałem mu, że pokażę ci, jak to zrobić, a potem powiedział mi, powinieneś był to zrobić wcześniej. **Co mam mu odpowiedzieć?** Mówi mi, że masz mi wszystko powiedzieć, czy **Mam to robić i pokazywać mu za każdym razem?** Może to zająć dużo czasu i za każdym razem muszę to zrobić zadanie. Chcę, żeby był niezależny.


title: Jak daleko jest szlak od Javy do C/C++?

text: Chcę się dowiedzieć, jak łatwe lub trudne jest przejście na C/C++ dla średnio doświadczonego programisty Java. Czytałem już pytania dotyczące "C++ dla programistów Java" i "Czy programiści Java muszą nauczyć się trochę programowania w C/System?". Wszystko brzmi bardzo interesująco, ale chcę konkretnie dodać aspekt, który mam doświadczenie w programowaniu w Pythonie. Zdaję sobie sprawę, że możesz uruchomić Pythona na JVM z jythonem, ale myślę, że zapewni to lepsze wrażenia, aby poznać nowe koncepcje i poznać początki Pythona. Moim środowiskiem docelowym jest głównie Linux. Czy mógłbyś oszacować (może nawet powiedzieć z własnego doświadczenia), jak trudne byłoby to, a zwłaszcza dać wskazówkę, czy lepiej byłoby przejść z C lub C++ w celu interakcji z Pythonem?


title: Eksportowanie ogromnych danych do XLS w aplikacji internetowej

text: Zajmuję się tworzeniem aplikacji webowej w Java/J2EE, w której posiadam funkcjonalność eksportu. Użyłem Jaspera do tego samego. Problem polega na tym, że próba wyeksportowania ogromnego zestawu danych zajmuje dużo czasu. Czy istnieje jakieś podejście do projektowania funkcji eksportu, aby poprawić wydajność? Wcześniej wypróbowałem JExcel API, a potem przeszedłem na DynamicJasper API.


title: Dlaczego niektóre witryny nie zezwalają na cofanie/do przodu/odświeżanie?

text: Było to dla mnie powodem frustracji w wielu witrynach, takich jak IRCTC, witryny bankowości internetowej, które nie pozwalają na Wstecz, do przodu lub odświeżanie. Jeśli to zrobisz, zostaniesz wylogowany i będziesz musiał zalogować się ponownie. To, czego nie rozumiem, to jakie obawy mieli w ich umyśle, aby mieć tak okropną „cechę”.


title: Dopasowanie istniejącej witryny do frameworka CI

text: Zarządzam dość dużą, pełną funkcji koszmarem witryny, która nie ma końca ustawień/opcji pełzania funkcji/itd. Do tej pory był kodowany w sposób proceduralny/funkcjonalny i chciałby przejść do konfiguracji OO, MVC. Jestem w tym całkiem nowy, ale przeprowadziłem wiele badań i uważam, że CodeIgniter to wybór kodu do frameworka, który pomoże przyspieszyć transfer. Zanim przyjrzałem się frameworkowi, zacząłem konstruować listę obiektów do tworzenia klas z: * zdjęć * użytkowników * tematów na forach * forów * blogów * postów na blogach * komentarzy Teraz mam problem z tym, że rozumiem, gdzie te ogólne/uniwersalne obiekty wchodzą w konfigurację CI MVC. Jaki jest najlepszy sposób na zorganizowanie tego rodzaju rzeczy? Klasy te mogą być ogólnie używane w wielu modelach/widokach/kontrolerach.


title: Czy zmiana nazwy przestrzeni nazw liczy się jako GŁÓWNA zmiana w wersji semantycznej?

text: Piszę bibliotekę C++ i zgodnie z tą stroną tutaj: http://semver.org/ powinienem zwiększyć wersję MAJOR, gdy dokonuję niezgodnych zmian w API. Czy zmiana nazwy przestrzeni nazw jest uważana za niezgodną zmianę w interfejsie API? Nie jestem pewien. Nie wiem, czy powinienem zwiększyć numer wersji MAJOR czy MINOR.


title: Jakie są dobre sposoby organizowania plików wejściowych (Makefiles, SConstruct, CMakeLists.txt itp.) w celu tworzenia oprogramowania do automatyzacji?

text: Jedną z rzeczy, które lubię robić z moim kodem, jest upewnienie się, że jest on refaktoryzowany na łatwe do zarządzania fragmenty. Jednak jeśli chodzi o budowanie oprogramowania, stwierdzam, że jakiekolwiek oprogramowanie do automatyzacji kompilacji, którego używam (ostatnio GNU Make lub SCons), kończy się kompletnym bałaganem. Pliki wejściowe wyglądają jak długie skrypty, które wydają się przeciwstawiać łatwej refaktoryzacji. Chciałbym mieć możliwość ich refaktoryzacji w jakiś sposób, ale koncepcja „funkcji” nie zachowuje się tak samo w niektórych programach do automatyzacji kompilacji, jak w języku programowania, więc trudno mi jest pisać w sposób łatwy do opanowania Pliki Makefile lub pliki SConscript dla dowolnych projektów, które są umiarkowanie skomplikowane. Czy ktoś ma jakieś rady dotyczące pisania zarządzalnych plików wejściowych do oprogramowania do automatyzacji kompilacji? Najlepsze byłyby porady niezależne od oprogramowania, ale nawet porady dotyczące konkretnego narzędzia do automatyzacji kompilacji byłyby pomocne, szczególnie Make lub SCons, ponieważ tego właśnie używam w projektach. **Edytuj:** Jak zauważył Thorbjørn, powinienem dodać trochękontekst i przykłady użycia. Kończę doktorat z inżynierii chemicznej i prowadzę badania z zakresu informatyki. (Jestem profesjonalnym moderatorem w SciComp.SE, dla tych z was, którzy odwiedzają.) Moje projekty zazwyczaj obejmują mieszankę skompilowanych języków (C, C++, Fortran), które wykonują niektóre z ciężkich języków skryptowych (Python , Perl) do prototypowania, a czasami języków specyficznych dla domeny do prototypowania lub do celów technicznych. Poniżej dodałem dwa przykłady, mniej więcej w zakresie 250 linii. Problemem jest dla mnie generalnie brak modułowości. Niektóre z tych projektów mogą być zorganizowane w modułowe jednostki i byłoby miło wyabstrahować części kompilacji w ten sposób, aby ułatwić mi i przyszłym opiekunom śledzenie. Rozbicie każdego skryptu na wiele plików było jednym z rozwiązań, nad którym bawiłem się w mojej głowie. Drugi przykład jest szczególnie ważny, ponieważ wkrótce będę miał do niego dużą liczbę plików. Oto co 265-wierszowy `Makefile` miWygląda jak dla mnie, zaczerpnięty z rzeczywistego projektu i zorganizowany najlepiej jak potrafię: #!/usr/bin/make #Katalog zawierający folder biblioteki DAEPACK daepack_root = . library = $(daepack_root)/lib wrappers = $(daepack_root)/Wrappers/DSL48S c_headers = parser.h problemSizes.h f77_headers=problemSizes.f commonParam.f f90_headers=problemSizes.f commonParam.f90 zawiera = -I. -Iinclude -I/usr/include/glib-2.0 \ -I/usr/lib/glib-2.0/include -I/usr/include/libxml2 \ -I/usr/include/libgdome -I/usr/include/gtest / #Zmienne środowiskowe Fortran 77 f77=gfortran fflags=-ggdb -cpp -fno-second-underscore --coverage -falign-commons \ -mcmodel=large -fbacktrace -pg flibs= #Zmienne środowiskowe Fortran 90 f90=gfortran f90flags=- ggdb -cpp -fno-second-underscore --coverage -falign-commons \ -mcmodel=large -fbacktrace -pg f90libs= #Flagi środowiska C cc=gcc cflags=-ggdb --coverage $(includes) -mcmodel=large clibs= #Biblioteki do łączenia libs=-L$(library) -ldaepack_sparse -lblas -llapack -ldl -lg2c \ -lgdome -lxml2 -lgtest -lcunit -lcholmod -lamd -lcolamd -lccolamd \ -lmetis -lspqr -lm -lblas -llapack -lstdc++ -lpcre #Pliki obiektów objs=main.o $(dsl48sObjs) $(gdxObjs) gdxObjs = gdxf9def.o gdxf9glu.o gamsglobals_mod.li.o commonsObjs parser.o $(gdxObjs) originalModelObjs=originalModel.o dsl48sChemkinModule.o $(commonObjs) cspSlowModelObjs=cspSlowModel.o dsl48sChemkinModuleSlow.o cspModule.o \ $(commonObjs) Ortho. spqrUtility.o $(commonObjs) #Definicje zmiennych środowiskowych powłoki dla FUnit FCFLAGS := $(f90flags) LDFLAGS := libdsl48s_model.sl cklib.o gdxf9glu.o parser.o spqrUtility.o \ $(libs) misc=*table .f wyjście=*.out #Ftncheck flags do statycznej analizy kodu Fortran 77 ftnchekflags= -declare -include=. -library -style=block-if,distinct-do,do-enddo,end-name,goto,labeled-stmt,structured-end all:ckinterp.exe parserTest.exe originalModel.exe cspSlowModel.exe \ orthoProjModel.exe spqrUtilityTest. exe #Sprawdź styl kodu za pomocą analizatora leksykalnego @echo Sprawdzanie stylu programu... ftnchek $(ftnchekflags) rhs.f ftnchek $(ftnchekflags) resorig.f ftnchek $(ftnchekflags) res.f # ftnchek $(ftnchekflags) cklib.f # ftnchek $(ftnchekflags) ckinterp.f #Skonfiguruj plik danych pokrycia linii bazowej @echo Ustaw plik danych pokrycia linii bazowej lcov -c -i -d . -o conpDSL48Sbase.info #Uruchom test jednostkowy na cspModule.f90 @echo Uruchamianie testów jednostkowych na cspModule.f90... funit cspModule #Generuj dane pokrycia testowego dla cspModule.f90 @echo Generuj dane pokrycia testowego z testów cspModule.f90... lcov -c -d . -o conpDSL48ScspTest.info #Uruchom test jednostkowy na orthoProjModule.f90 @echo Uruchamianie testów jednostkowych na orthoProjModule.f90... funit orthoProjModule #Generuj dane pokrycia testowego dla orthoProjModule.f90 @echo Generowanie danych pokrycia testowego z testów orthoProjModule.f90... lcov - płyta CD . -o conpDSL48SgenProjTest.info #Uruchom testy jednostkowe na parserze biblioteki C @echo Uruchamianie testów jednostkowych na parserze w C... -G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind -v --tool=memcheck \ --leak- check=full --show-reachable=yes --leak-resolution=high \ --num-callers=20 --log-file=parserTest.vgdump \ ./parserTest.exe > parserTest.log #Generuj dane pokrycia testowego dla biblioteka parser wrapper C @echo Generowanie danych pokrycia testowego dla parsera w C... lcov -c -d . -o conpDSL48SparserTest.info #Uruchom testy jednostkowe biblioteki SparseQR C @echo Uruchamianie testów jednostkowych biblioteki SparseQR w C... ./spqrUtilityTest.exe #Generuj dane pokrycia testowego dla biblioteki SparseQR C @echo Generowanie danych pokrycia testowego dla biblioteki SparseQR C... lcov -c -d . -o conpDSL48SsparseTest.info #Uruchom test jednostkowy on basisModule.f90 @echo Uruchamianie testów jednostkowych na podstawieModule.f90... funit basisModule #Generuj dane pokrycia testowego dla basisModule.f90 @echo Generuj dane pokrycia testowego z testów basisModule.f90... lcov -c -d . -o conpDSL48SbasisMod.info #Połącz dane pokrycia testowego @echo Połącz dane bazowe i pokrycia testowego... lcov -a conpDSL48Sbase.info \ -a conpDSL48ScspTest.info \ -a conpDSL48SgenProjTest.info \ -a conpDSL48SbasisMod.info \ -a conpDSL48SparserTest info \ -a conpDSL48SsparseTest.info \ -o conpDSL48Stotal.info #Proces końcowy usuwający statystyki pokrycia z automatycznie #generowanego kodu źródłowego. @echo Usuwanie statystyk zasięgu dla generowanych automatycznieźródło... lcov -r conpDSL48Stotal.info baseModule_fun.f90 \ ckinterp.f cklib.f cspModule_fun.f90 davisSkodjeAd.f90 \ davisSkodjeJac.f90 davisSkodjeRes.f90 davisSkodjeRhs.f90 \ davisSkodje. jac.f jacorig.f resad.f resadp.f resorigad.f resorigadp.f ressp.f \ resorigsp.f senrhs.f senrhsorig.f TestRunner.f90 \ -o conpDSL48Stotal.info #Generuj raport HTML danych pokrycia @echo Generuj Raport HTML danych o zasięgu... genhtml conpDSL48Stotal.info @echo Otwórz "index.html" w przeglądarce, aby zobaczyć wyniki zasięgu! originalModel.exe: $(originalModelObjs) $(f90_headers) $(f77_headers) \ $(c_headers) $(f90) $(f90flags) -o originalModel.exe $(originalModelObjs) $(libs) originalModel.o: dsl48sChemkinModule.o $ (commonObjs) $(f77_headers) \ $(f90_headers) $(c_headers) $(f90) $(f90flags) -c -o originalModel.o originalModel.f90 cspSlowModel.exe: $(cspSlowModelObjs) $(f90_headers) $(f77_headers) \ $(c_headers) $(f90) $(f90flags) -o cspSlowModel.exe $(cspSlowModelObjs) $(libs) cspkinSlowModel48SCh.o: o cspModule.o $(commonObjs) \ $(c_headers) $(f77_headers) $(f90) $(f90flags) -c -o cspSlowModel.o cspSlowModel.f90 orthoProjModel.exe: $(orthoProjModelObjs) $(f90_headers) $(f77_headers) ) \ $(c_headers) resOrthoFast.o $(f90) $(f90flags) -o orthoProjModel.exe $(orthoProjModelObjs) \ resOrthoFast.o $(libs) orthoProjModel.o: dsl48sChemkinModuleOrthoProj.o ortho(Projmonmon.o) (c_headers) $(f90_headers) $(f77_headers) resOrthoFast.o basisModule.o $(f90) $(f90flags) -c -o orthoProjModel.o orthoProjModel.f90 dsl48sChemkinModule.o: dsl48sChemkinModule.f90 cklib.h problem parS .o $(c_headers) $(f90_headers) $(f90) $(f90flagi) -c -o dsl48sChemkinModule.o dsl48sChemkinModule.f90 dsl48sChemkinModuleSlow.o: dsl48sChemkinModuleSlow.f90 cspModule.o cklib.o \problemSizes.h parser.o $(c_headers) $(f90_headers) $(f90) $(f90 \ModuleSlow -c. dsl48sChemkinModuleSlow.f90 dsl48sChemkinModuleOrthoProj.o: dsl48sChemkinModuleOrthoProj.f90 \ orthoProjModule.o basisModule.o cklib.o problemSizes.h \ parser.o $(c_headers) $(f90_gsl ds.48 -c90f90) \ dsl48sChemkinModuleOrthoProj.f90 basisModule.o: basisModule.f90 cklib.o spqrUtility.o commonParam.f90 $(f90) $(f90flags) -c -o basisModule.o basisModule.f90 spqrUtility.o: spqrUtility.c spqr cc) $(cflags) -c -o spqrUtility.o spqrUtility.c spqrUtilityTest.exe: spqrUtilityTest.o spqrUtility.o $(cc) $(cflags) -o spqrUtilityTest.exe spqrUtilityTest.o \ spqrUtility) spqrUtilityTest.o: spqrUtilityTest.c spqrUtility.o $(cc) $(cflags) -c -o spqrUtilityTest.o spqrUtilityTest.c cklib.o: cklib.f ckstrt.f $(f77) $(fflags) -c -o cklib .o cklib.f ckinterp.exe: ckinterp.o $(f77) $(fflags) -o ckinterp.exe ckinterp.o ckinterp.o: ckinterp.f $(f77) $(fflags) -c -o ckinterp.o ckinterp.f #Rekursywny plik makefile odziedziczony po poprzednich absolwentach libdsl48s_model.sl: $(f77_headers) cklibDAEPACK.f cp $(wrappers)/makefile model.mk make -f model.mk resOrthoFast.o: libdsl48s_model.sl $(f90) (f90flagi) -c -o resOrthoFast.o resOrthoFast.f90 problemyRozmiary.f: problemRozmiary.fpp problemRozmiary.h cpp problemRozmiary.fpp problemRozmiary.f perl -p -i.bak -we 's/# /! /;' problemSizes.f commonParam.f90: commonParam.f perl -p -i.bak -we 's/^#/!/;' commonParam.f echo "commonParam t f t fpp" | pref77tof90 echo "commonParam /" | f77tof90perl -p -i.bak -we's/integer a/!integer a/;' commonParam.f perl -p -i.bak -we 's/END //;' commonParam.f90 commonParam.f: commonParam.fpp problemSizes.h cpp commonParam.fpp commonParam.f perl -p -i.bak -we 's/^#/!/;' commonParam.f cspModule.o: cspModule.f90 $(f90) $(f90flags) -c -o cspModule.o cspModule.f90 orthoProjModule.o: gamsglobals_mod.o gdxf9def.o gdxf9glu.o orthoProjModule.f90 $(Labels.f90 f90) $(f90flags) -c -o orthoProjModule.o orthoProjModule.f90 gdxf9def.o: gdxf9def.f90 $(f90) $(f90flags) -c -o gdxf9def.o gdxf9def.f90 gdxf9glu.o: gdxf9def.c o 64-bitowa wersja wrapperów (z podkreśleniami) $(cc) $(cflags) -DCIA_LEX -DAPIWRAP_LCASE_DECOR -c -o \ gdxf9glu.o gdxf9glu.c 64-bitowa wersja wrapperów (bez podkreśleń, dla interoperacyjności C) # $(cc) $(cflags) -DCIA_LEX -DAPIWRAP_LCASE_NODECOR -c gdxf9glu.c #32-bitowa wersjawrappery # $(cc) $(cflags) -DAPIWRAP_LCASE_DECOR -c gdxf9glu.c -Iinclude gamsglobals_mod.o: gamsglobals_mod.f90 gdxf9def.o gdxf9glu.o $(f90) $(f90global ser_mod.gams) .c $(c_headers) $(cc) $(cflags) -c -o parser.o parser.c parserTest.exe: parserTest.o parser.o $(cc) $(cflags) -o parserTest.exe parser.o \ parserTest.o $(libs) parserTest.o: parserTest.cpp parser.o $(cc) $(cflags) -c -o parserTest.o parserTest.cpp clean: -rm *.bak -rm *.f77 -rm *.log -rm commonParam.f90 -rm problemSizes.f -rm commonParam.f -make clean -f model.mk -rm model.mk -rm *.o -rm *.mod -rm $(misc) -rm * .exe -funit --clean -rm *.gcno -rm *.gcda -rm *.info -rm *.png -rm *.html -rm *.css -rm -rf html -rm *.pyc -rm * .lst tutajto 245-wierszowy plik `SConstruct`, który obecnie próbuję zorganizować dla projektu, który jest mniej więcej tak złożony: ## \file SConstruct # \brief Kompiluje bibliotekę i kompiluje testy. # import SCons ## \brief Zbuduj nazwy katalogów każdej biblioteki COIN z nazw pakietów # i wersji. # ## Ogólne środowisko SCons # env = Środowisko(); flags = [] ## Skompilować przy użyciu wersji debugowania? # debug = True debugString = '-debug' debugFlags = ['-ggdb'] dynamicLinkFlag = '-Wl,-rpath,' if debug: flags += debugFlags ## Kompiluj Google Test od podstaw. # GTestVersion = '1.6.0' GTestStem = 'gtest-' + GTestVersion GTestBuildIncDir = [GTestStem, GTestStem + '/include', ] GTestAllLib = env.Library('lib/libgtest.a', 'gtest-1.6.0/ src/gtest-all.cc', CPPPATH = GTestBuildIncDir, CXXFLAGS = flagi) GTestMainLib = env.Library('lib/libgtest_main.a', 'gtest-1.6.0/src/gtest_main.cc', CPPPATH = GTestBuildIncDir, CXXFLAGS = flagi) GTestIncDir = GTestStem/ '/ gtest' GTestLibDir = 'lib' GTestLibFlags = ['gtest', 'gtest_main', 'pthread'] ## Biblioteka macierzy Armadillo # ArmadilloLibFlags = ['armadillo']; ## Szybkie przypomnienie o flagach SCons: # CPPPATH = ścieżka nagłówków (w tym katalogi) # LIBPATH = ścieżka bibliotek # LIBS = flagi bibliotek # CXXFLAGS = flagi kompilacji C++ # ## Lokalizacje bibliotek zainstalowanych w systemie w standardowych lokalizacjach # StdIncDir = '/usr/include' StdLibDir = '/usr/lib' ## Informacje konfiguracyjne dla bibliotek COIN # CoinUtilsVersion = '2.6.4' ClpVersion = '1.12.0' OsiVersion = '0.103.0' CbcVersion = '2.5.0' ## Niektóre standardowe lokalizacje katalogów bibliotek COIN, z dodanymi ukośnikami dla # dla wygody. # CoinLibLocation = '/usr/local/COIN/' StdCoinIncDir = '/include/coin' StdCoinLibDir = '/lib' CoinUtilsStem = 'CoinUtils-' + CoinUtilsVersion ClpStem = 'Clp-' + OSIV CbcStem = 'Cbc-' + CbcVersion if debug: CoinUtilsStem += debugString CbcStem += debugString ClpStem += debugString OsiStem += debugString ## Tworzenie zawiera nazwy katalogów dla projektów COIN z części składowych. # CoinUtilsIncDir = CoinLibLocation + CoinUtilsStem + StdCoinIncDir ClpIncDir = CoinLibLocation + ClpStem + StdCoinIncDir OsiIncDir = CoinLibLocation + OsiStem + StdCoinIncDir CbcIncLicDir + Nazwy biblioteki StdCoinBuilds z projektu CoinLibr = CoinLibLocation + CoinUtilsStem + StdCoinLibDir     ClpLibDir = CoinLibLocation + ClpStem + StdCoinLibDir     OsiLibDir = CoinLibLocation + OsiStem + StdCoinLibDir     CbcLibDir = CoinLibLocation + CbcStem + StdCoinLibDir          ## CPLEX     #     CpxStem = '/opt/ibm/ILOG/CPLEX_Studio_Academic123/cplex/'     CpxIncDir = CpxStem + 'include/ilcplex' CpxLibDir = CpxStem + 'lib/x86-64_sles10_4.1/static_pic' ## Gurobi # GrbStem = '/opt/gurobi460/linux64/' GrbIncDir = GrbStem + 'include' GrbLibDir + ' GrbStem' OsiLibFlags = ['Osi', 'CoinUtils'] ClpLibFlags = ['Clp', 'OsiClp'] CbcLibFlags = ['Cbc', 'Cgl'] OsiCpxLibFlags = ['OsiCpx'] OsiGsrbLibFlags = ['FsbLibFlags = ['Cbc', 'Cgl'] 'cplex', 'ilocplex', 'pthread', 'm'] GrbLibFlags = ['gurobi_c++', 'gurobi46', 'pthread', 'm'] milpIncDirs = [CoinUtilsIncDir, ClpIncDir, CbIncIncDir, CbcDir,                    GrbIncDir,                 GTestIncDir,                    ]     milpLibDirs = [CoinUtilsLibDir,                    ClpLibDir,                    OsiLibDir,                    CbcLibDir,                    CpxLibDir,                    GrbLibDir,                    GTestLibDir,                 ]     milpLibFlags = [OsiCpxLibFlags,                     OsiGrbLibFlags,                     CbcLibFlags,                     ClpLibFlags,                     OsiLibFlags,                     CpxLibFlags,                     GrbLibFlags,                     GTestLibFlags,                     ]     ##milpSolver = env .Object('milpSolver.cpp', ## CPPPATH = milpIncDirs, ## LIBPATH = milpLibDirs, ## CXXFLAGS = flagi) milpSolverTest = env.Program('milpSolverUnitTest', ['milpSolverTest'.cpp'], CPPPATH = milpIncDirs, LIBPATH = milpLibDirs, LIBS = milpLibFlags, CXXFLAGS = flagi, LINKFLAGS = ['-Wl,-rpath,' + OsiLibDir]) env.Depends(milpSolverTest##inLib, [GT) katalogi i pliki źródłowe # ChemkinSourceDir = '/mnt/hgfs/DataFromOldLaptop/Data/ModelReductionResearch/Papers/AdaptiveChemistryPaper/AdaptiveChemistry/NonOpenSource/ChemkinII/'; ChemkinSourceList = ['cklib.f', 'pcmach.f','tranlib.f'] ChemkinSourceList = [ChemkinSourceDir + nazwa pliku dla nazwy pliku w ChemkinSourceList] env.Depends('cklib.f','ckstrt.f') ## Cantera include directory # CanteraStem = '/usr/local/cantera' jeśli debug: CanteraStem += debugString CanteraIncDir = CanteraStem + '/include/cantera'CanteraLibDir = CanteraStem + '/lib' CanteraTestingFlags = ['kinetyka', 'termo', 'tpx', 'ctbase', 'm',] CanteraLibFlags = ['użytkownik', 'oneD', 'zeroD', 'equil' , „kinetyka”, „transport”, „termo”, „ctnumerics”, „ctmath”, „tpx”, „ctspectra”, „konwertery”, „ctbase”, „cvode”, „ctlapack”, „ctblas”, „ ctf2c', 'ctcxx', 'ctf2c', 'm', 'm', 'stdc++'] CxxFortranFlags = ['g2c', 'gfortran']; chemSolverIncDir = [CanteraIncDir, StdIncDir, '/usr/local/include', GTestIncDir, ] chemSolverLibDir = [StdLibLibDir, CanteraLibDir, GTestLibDir, ] chemSolverLibFlags,ClagFlags,FlagsTArmSolverLibDir = [StdLibDir, CanteraLibDir, GTestLibDir, ]chemSolverTest = env.Program('chemSolverUnitTest', ['chemSolverTest.cpp', 'chemSolver.cpp', 'ckwrapper.f90'] + ChemkinSourceList, CPPPATH = chemSolverIncDir, LIBPATH = chemSolverLIBSLBX chemFlags = flags, F90FLAGS = flagi) env.Depends(chemSolverTest, [GTestAllLib, GTestMainLib]) #env.AddPostAction(milpSolverTest, milpSolverTest[0].abspath) testAlias = env.Alias('test', [BuildestTest]) testAlias) ckInterp = env.Program('ckinterp', ChemkinSourceDir + 'ckinterp.f') canteraGTestLibFlags = CanteraTestingFlags + GTestLibFlags #canteraGTestLibFlags = ['kinetyka', 'termo', 'tctb',ase', 'm', 'gtest', 'gtest_main', 'pthread'] canteraGTest = env.Program('canteraGTest', 'canteraGTest.cpp', CPPPATH = chemSolverIncDir, LIBPATH = chemSolverLibDir, CESTX = canteraGTest.cpp' ) env.Depends(canteraGTest, [GTestAllLib, GTestMainLib]) canteraMemTestLibFlags = CanteraTestingFlags canteraMemTest = env.Program('canteraMemTest', 'canteraMemTest.cpp', CPPPATH = chembX, LIIRPAH flagsLA


title: Czy specyfikacja funkcjonalna jest częścią specyfikacji wymagań systemowych?

text: Zastanawiam się, źródła takie jak wikipedia lub szablony, które znalazłem, pokazują, że specyfikacja funkcjonalna **jest** częścią dokumentów wymagań systemowych. Zawsze myślałem, że SRD to tylko ogólny opis systemu, ze wszystkimi wymaganiami funkcjonalnymi i niefunkcjonalnymi. Pomyślałem jednak, że specyfikacja funkcjonalna jest bardziej szczegółowa i jest osobnym dokumentem, podczas gdy SRD to opis na wysokim poziomie stworzony przez klienta (jak się wtedy nazywa?) Czy ktoś mógłby mi to wyjaśnić?


title: Rozwiązania licencyjne dla oprogramowania o zamkniętym kodzie źródłowym działającego w systemie Linux?

text: Szukam prostego oprogramowania licencyjnego, które działa w systemie Linux - biblioteki, która może generować i wykorzystywać klucze licencyjne. Z tego, co udało mi się znaleźć, było kilka behemotowych serwerów licencyjnych, coś, co znacznie przekracza moje wymagania. Czy są konkretne biblioteki, które możesz polecić?


title: Jakie są skutki włączenia narzędzi do kompilacji do repozytorium kodu, gdy te narzędzia mają inne licencje niż Twój kod?

text: Jaki wpływ ma włączenie innego narzędzia o otwartym kodzie źródłowym do repozytorium źródłowego, jeśli używa ono różnych licencji? * Zwykle używam bardziej liberalnych licencji, takich jak Apache i MIT. * Aby umożliwić innym korzystanie z projektu z jak najmniejszą konfiguracją, chcę dołączyć do repozytorium narzędzia używane przez skrypty budujące (generator dokumentacji, minifier JavaScript itp.). * Rozumiem, że rzeczy generowane przez te narzędzia (dokumentacja, zminifikowane pliki JS) są **nie** pracami pochodnymi. * Co nie jest dla mnie tak jasne, czy włączenie niektórych narzędzi, które mają bardziej restrykcyjne licencje, spowoduje konflikty z moim kodem? * Czy „wirusowa” natura GPL grozi „zainfekowaniem” mojego kodu przez włączenie narzędzi GPL do mojego repozytorium i odwoływanie się do nich w moich skryptach kompilacji? Żaden kod nie zostanie przemieszany, przy każdym produkcie pozostaną odpowiednie licencje. Powinienem głównie używać plików binarnych ze źródeł zewnętrznych (.jar itp.). Chcę się tylko upewnić, że „rozpowszechnianie” ich w moim repozytorium, gdy przesyłam je do GitHub, nie skazi wszystkiego innego.


title: Dodawanie nowych obiektów do tablicy po stronie klienta – najlepsze praktyki?

text: Powiedzmy, że masz listę "pojazdów" - masz observableArray tych ko.observable(). Pozwalasz użytkownikowi dodać nowy pojazd w następujący sposób: var emptyVehicle = { "make": "chevrolet", "model": "corvette" }; app.on('CLICKED_ADD_VEHICLE', function () { var vehicle = new vehicleViewModel(emptyVehicle); vehicle.hasWheels(true); innerModel.sets.push(set); }); Jeśli uratują pojazd, otrzymasz prawdziwy pojazd z serwisu danych, a następnie zastąp puste miejsce następującym: app.on('CLICKED_SAVE', function (oldVehicle) { var newVehicle = new vehicleViewModel(dataservice.createVehicle(oldVehicle)) ; innerModel.vehicles.remove(staryPojazd); innerModel.vehicles.push(nowyPojazd); }); Wiem, że zostawiam tutaj trochę kodu, ale jest to bardziej pytanie dotyczące praktyki/podejścia niż pytanie o kod. Czy jest to akceptowalne podejście do dodawania nowych pozycji do listy? Utworzyć nowy szablon tymczasowy i wyrzucić go zamiast rzeczywistego elementu, jeśli użytkownik zapisze?


title: Czy powinienem łączyć podobne funkcje, mimo że są nieco inne?

text: W aplikacji, nad którą pracowałem, mam funkcję połączenia z maszyną wirtualną, którą można wykonać na dwa sposoby. Użytkownik może wybrać maszynę z listy i kliknąć przycisk „Połącz”. Lub może dwukrotnie kliknąć maszynę na liście. Obecnie są to dwa oddzielne programy obsługi zdarzeń, ponieważ działają nieco inaczej. Jeśli użytkownik jest już połączony, kliknięcie przycisku spowoduje jego rozłączenie, a dwukrotne kliknięcie przywróci okno z powrotem. ///edytuj Logika to zasadniczo przycisk if(połączone) Disconnect() else ConnectAndShowWindow() List ConnectAndShowWindow() Moje pytanie brzmi: czy powinienem zachować oddzielne metody, czy połączyć te dwie metody, mimo że są nieco inne, a następnie w celu rozłączenia /ponownie przełączyć je na podstawie nadawcy?


title: Czy głębokie zagnieżdżanie przepływu sterowania w kodzie jest badanym problemem?

text: Przedstawiłem współpracownikom argument, że głębokie poziomy przepływu sterowania są szkodliwe dla czytelności kodu. Przykład zaczerpnięty z odpowiedniego pytania o przepełnienie stosu Jeśli potrzebujesz więcej niż 3 poziomów wcięć, jesteś wkurzony?: for(int i=0; i<10; ++i){ Object val = repeat(i, someVar) ; if(val.value > 3){ switch(val.item){ case DOG: if(mProcess){ outputToUser(val); doMoreThings(val, mMoreThingDoer); if(mRepurpose){ addExample(val); } // i tak dalej, i tak dalej... Jak w przypadku większości rzeczy, bardzo łatwo jest znaleźć opinie na ten temat. Zastanawiam się jednak, czy ktoś może wnieść do tego więcej. Czy na przykład przeprowadzono rzeczywiste badanie dotyczące problemu? A może można wysunąć inne argumenty, które wykraczają poza „lubię X bardziej”?


title: Generowanie kodu testu jednostkowego

text: Mamy projekt, który był pisany przez 2 lata, ale ma kiepsko zaprojektowaną architekturę i nie ma testów jednostkowych. Oprogramowanie działa dobrze, ale jesteśmy w punkcie, w którym chcemy dokonać refaktoryzacji niektórych podstawowych modułów. Budżet jest również ograniczony, więc nie możemy zatrudnić wystarczającej liczby programistów do pisania testów jednostkowych. Czy automatyczne generowanie kodu testów jednostkowych w celu pokrycia (jako przykładu) scenariuszy integracji za pomocą niektórych również byłoby realną strategią? Założenie jest takie, że biorąc pod uwagę, że system działa teraz dobrze, a jego dane wyjściowe można przekonwertować na dane XML do testów jednostkowych? Takie podejście daje nam możliwość szybkiego rozpoczęcia refaktoryzacji istniejącego kodu i otrzymania natychmiastowej informacji zwrotnej, jeśli jakaś podstawowa funkcjonalność zostanie zepsuta z powodu tych zmian.


title: Lazy Loading, abstrakcja DAL i BLL

text: Zadaję sobie pytanie, jak poprawnie zakodować nowy, świeży projekt. Mam zaprojektowaną bazę danych i zmapowałem tabele do równoważnych klas POCO przy użyciu Entity Framework 6 Code First. Potem pomyślałem: „poczekaj, jeśli pewnego dnia chcę przełączyć się z EF na inny Framework z jakichkolwiek powodów, a nawet powiedzieć, że przejdźmy do bezpośredniego kodowania ze względu na wydajność, NIE MOGĘ używać EF bezpośrednio w LOGO. Tak więc EF jest NIE DAL.Zacząłem implementować DAL, który hermetyzuje wywołania EF.Następnie zaimplementowałem BLL consoming DAL.W przypadku niektórych tabel jest to jak bezpośrednie mapowanie, ponieważ są to „tabele parametrów” (kraje, waluty itd.).Ale dla innych jest dobra część logiki biznesowej, co jest w porządku.ALE Potem chodzi o Lazy Loading, dołączanie encji itp. Porozmawiajmy tylko o Lazy Loading.1) Użyj Lazy Loading: kiedy jestem tak daleko w BLL, Nie wiem już więcej o podstawowych elementach wewnętrznych DAL.Po prostu konsumuję moje obiekty i myślę „hej, każda właściwość pojawi się tylko wtedy, gdy jej potrzebuję”.Ale OMG!Jestem poza DAL, Datacontext nie jest już tam, więc nic nie może się już załadować.Czy powinienem utrzymywać otwarty kontekst danych EF przez cały okres użytkowania aplikacji? przeczytaj, że to nie jest dobra praktyka, tym bardziej, jeśli chodzi o witrynę e-biznesową, która zawsze żyje... 2) Nie używaj Lazy Loading, tylko gorliwego ładowania. Tak, ładuję wszystkie właściwości mojego obiektu, więc wszystkie dane są dostępne dla mojej konsumującej LOGIKI biznesowej. Ehm, czy naprawdę muszę, podczas ładowania klienta, załadować wszystkie jego zamówienia, komentarze, adresy, kraje i właściwości krajów, waluty itp. itd. itd. To wydaje się naprawdę przesadne i nie może żyć w sieci aplikacja... Ale DAL NIE powinien wiedzieć, czego potrzebuje LOGIKA BIUROWA. DAL jest tutaj, aby zapewnić dostęp do danych, a następnie LONG zrobi to, czego potrzebuje, aby załadować dokładnie to, czego potrzebuje. Czy powinienem więc zapewnić metody DAL, aby uwzględnić/nie zawierać żadnej możliwej kombinacji kluczy obcych? Wydaje się niemożliwe... Czy powinienem czekać, aż programista BLL powie mi, jakich metod potrzebuje dla każdego z jego wymagań? Wydaje się, że jest to zbyt dużo sprzężone... Czy BLL powinien być w stanie powiedzieć DAL dokładnie to, czego potrzebuje? Jak to zrobić, nie będąc zbytnio powiązanym? Wygląda na to, że Lazy Loading nie ma zastosowania w aplikacji wielowarstwowej...


title: Jak podejść do zadań scrumowych, by spaliły się, gdy w zadaniach zaangażowanych jest wiele osób?

text: W mojej firmie jedno zadanie nigdy nie może być wykonane przez jedną osobę. Do każdego zadania będzie należeć osobna osoba do kontroli jakości i przeglądu kodu. Oznacza to, że każda osoba poda swoje szacunki, dla każdego zadania, ile czasu zajmie wykonanie. Problem polega na tym, jak mam podejść do spalenia? Jeśli agreguję godziny razem, przyjmij następujące oszacowanie: 10 godz. — Czas tworzenia 4 godz. — Kontrola jakości 4 godz. — Przegląd kodu. Oszacowanie zadania = 18 godzin Na koniec każdego dnia proszę o zaktualizowanie zadania o „ile czasu pozostało do jego wykonania”. Jednak każda osoba na ogół myśli tylko o swojej części. Czy powinni oznaczyć pozostały nakład pracy, a następnie DODAĆ do tego szacunki nakładu? Jak to robicie? **AKTUALIZACJA** Aby wyjaśnić kilka rzeczy, w mojej organizacji każde zadanie w historii wymaga 3 osób. 1. Ktoś, kto opracuje zadanie. (przeprowadzać testy jednostkowe, ect...) 2. Specjalista QA do przeglądu zadania (przeprowadzają głównie testy integracyjne i regresyjne) 3. Kierownik techniczny do przeglądu kodu. Nie sądzę, że istnieje zła droga lub właściwa droga, ale to jest nasza droga… i to się nie zmieni. Pracujemy jako zespół, aby w miarę możliwości ukończyć nawet najmniejszy poziom historii. Nie możesz faktycznie przetestować, czy coś działa, dopóki nie zostanie ukończone, ani nie możesz sprawdzić jakości kodu ... więc najlepsze, co możesz zrobić, to podzielić rzeczy na małe logiczne wycinki, aby można było przetestować minimalną funkcjonalność i weryfikowane na jak najwcześniejszym etapie procesu. Moje pytanie do tych, którzy działają w ten sposób, brzmiałoby, jak spalić „zadanie”, gdy są skonfigurowani w ten sposób. O ile zadanie nie ma własnych pod-zadań (na które JIRA nie zezwala) ... Nie jestem pewien, czy jest to najlepszy sposób na codzienne śledzenie tego, co pozostało.


title: Czy dobrą praktyką jest niefiltrowanie wartości według wartości null?

text: Czasami kiedy tworzę API, które powinno umożliwiać pobranie pojedynczej wartości lub wszystkich wartości, używam następującego wzorca (przekazanie `NULL` do API oznacza pobranie wszystkich wierszy): @Usernames - lista użytkowników oddzielona przecinkami CREATE PROC GetUsers (@Usernames VARCHAR(100) = NULL) AS BEGIN SELECT * FROM Users Gdzie @Usernames IS NULL LUB dbo.in_list(@Usernames,Username) = 1 END Czy jest to dobra praktyka, aby użyć warunku OR, aby uzyskać obie funkcje, czy powinienem napisać coś takiego: CREATE PROC GetUsers (@Usernames VARCHAR(100) = NULL) AS BEGIN IF(@Username IS NULL) BEGIN SELECT * FROM Users END ELSE BEGIN SELECT * FROM Users Gdzie dbo.in_list(@Usernames,Username) = 1 END END * **Uwaga:** To jest tylko na przykład SQL, **to nie jest pytanie dotyczące konkretnego języka kodowania**. Dziękuję.


title: Walidacja i trwałość danych w modelu domeny

text: Moje (pierwsze i obecne) miejsce pracy (sklep .NET) cierpi z powodu nadmiaru anemicznych modeli domen, do tego stopnia, że tak naprawdę nie wiem, jak walidacja i trwałość danych powinny być obsługiwane w odpowiednim modelu domeny. ### Trwałość danych Jedną z opcji byłoby nadanie modelowi domeny sposobu na zachowanie trwałości. Możesz, na przykład, wstrzyknąć `IFooRepository` przez wstrzyknięcie konstruktora i zlecić jego rozwiązanie przez kontener IoC, aby upewnić się, że nie tworzysz od niego zależności (architektura cebulowa). Ale nie jestem pewien, czy kod korzystający z modelu domeny powinien być odpowiedzialny za wywoływanie metod do zapisywania danych itp., czy też powinien to być zrobione niejawnie za kulisami w wątku w tle. Być może to łamie tę czystość modelu domeny i jest bardziej zgodne z wzorcem aktywnego rekordu. Inną opcją, którą widzę, jest w ogóle nie wiązanie modelu domeny z trwałością danych, a zamiast tego posiadanie koordynującej warstwy usług odpowiedzialnej za ten aspekt. Jakie są najlepsze rozwiązania dotyczące trwałości danych we wzorcu modelu domeny? ### Walidacja Innym problemem, którego nie wiem, jak rozwiązać za pomocą odpowiedniego modelu domeny, jest to, jak wskazać interfejsowi użytkownika _dlaczego_ bieżący stan modelu jest nieprawidłowy bez sprzężenia z interfejsem użytkownika (lub przynajmniej dostosowania do niego). Załóżmy na przykład, że mam formularz, który użytkownik wypełnia z różnymi polami. Chcemy sprawdzić poprawność tych danych wejściowych, a jeśli coś jest nie tak, wskazać błąd w tym konkretnym polu za pomocą komunikatu. Jak poradzimy sobie z walidacją na tym poziomie szczegółowości bez dodawania znaczącej złożoności do modelu domeny lub robienia hackowych rzeczy wpisanych łańcuchowo (takich jak zgłaszanie wyjątku walidacji z nazwą właściwości i komunikatem)?


title: Jak dostosować aplikację internetową (strony i interfejs użytkownika) do różnych klientów?

text: Mamy aplikację internetową ASP.NET, która stała się trudna w utrzymaniu i szukam pomysłów, jak ją przeprojektować. Jest to system zarządzania pracownikami, który można w dużym stopniu dostosować do każdego z naszych klientów. Pozwólcie, że wyjaśnię, jak to teraz działa: Na domyślnej stronie mamy menu, w którym użytkownik może wybrać zadanie, takie jak Utwórz pracownika lub Wyświetl grafik. Jako przykładu użyję Utwórz pracownika. Gdy użytkownik wybierze opcję Utwórz pracownika z menu, ładowana jest strona ASPX, która zawiera dynamicznie ładowaną kontrolę użytkownika dla wybranego elementu menu, np. dla Utwórz pracownika będzie to AddEmployee.ascx Jeśli użytkownik kliknie przycisk Zapisz w kontrolce, przejdzie do strony domyślnej. Niektóre pozycje menu obejmują wiele kroków, więc jeśli użytkownik kliknie Dalej w przepływie wieloetapowym, przejdzie do następnej strony w przepływie i tak dalej, aż dotrze do ostatniego kroku, w którym kliknięcie Zapisz powoduje przejście do strony domyślnej. Niektórzy klienci mogą wymagać dodatkowego kroku w procesie tworzenia pracownika (np. SecurityClearance.ascx), ale inni nie. Różni klienci mogą korzystać z tej samej kontroli użytkownika ASCX, więc w AddEmployee.OnInit możemy dostosować pola dla tego klienta, tj. uczynić niektóre pola ukrytymi, tylko do odczytu lub obowiązkowymi. Następujące elementy można dostosować dla każdego klienta: * Pozycje menu * Kroki w każdym przepływie (nazwy kontrolne ascx) * Ukryte pola w każdym ascx * Pola obowiązkowe w każdym ascx * Reguły odnoszące się do każdego ascx, które pozwalają na użycie określonej logiki w kodzie dla tego klienta Dostosowania są przechowywane w ogromnym pliku XML na klienta, który może mieć długość 7500 wierszy. Czy jest jakiś framework lub mechanizm reguł, którego moglibyśmy użyć do dostosowania naszej aplikacji w ten sposób? Jak inne aplikacje zarządzają dostosowaniami na klienta?


title: Czy jest możliwe ponowne zduplikowanie sygnału sprzętowego w systemie Linux?

text: Od tego czasu wszystko jest plikiem w systemie UNIX. Jeśli mam sprzęt, na przykład mysz, przesuń się z lewego rogu do prawego rogu, to powinno wytworzyć jakiś plik do komunikacji z systemem. Tak więc, jeśli moje założenie jest poprawne, czy jest to możliwe do wykonania następujących rzeczy: 1. Przechwytywanie surowych danych, czyli przesuwanie kursora myszy z lewego do prawego rogu? 2. Powiel surowe dane, używając programu, o tej samej prędkości produkcji i danych, aby "przerobić" przesuwanie kursora myszy z lewego do prawego rogu


title: Obsługa zignorowanych warunków awarii w metodzie

text: Pracuję nad zgrubnym API do wykonywania funkcji biznesowych wyższego poziomu. W wielu warunkach funkcje te mogą zawieść w sposób oczekiwany (nie wyjątkowy), tj. funkcja może nie być w stanie zakończyć się z powodu niespełnienia pewnego rodzaju warunku sprawdzania poprawności. W wielu przypadkach to, co chcę zrobić w tych scenariuszach „awarii”, to zaalarmować użytkownika i dać mu opcję „obejścia” awarii. np. „Ostrzeżenie: przeniesienie mocy warp na tarcze uszkodzi układ emiterów, czy na pewno chcesz kontynuować?” Wiele z tych funkcji może mieć listę kilku reguł walidacji i mogę chcieć zastąpić je wszystkie. To, co teraz wyobrażam sobie, to utworzenie niestandardowej klasy MyResult, która jest zwracana przez funkcje, która zawiera informację, czy funkcja się powiodła, a jeśli się nie powiodła, być może listę reguł walidacji, które nie powiodły się dla funkcji. Następnie dodaj parametr do funkcji dla „zastąpień”, który umożliwia pominięcie tych reguł sprawdzania poprawności w kolejnym wywołaniu. Potrzebuję opinii na temat tego podejścia. Czy jest na to wzór? Funkcje w interfejsie API mogą być wywoływane z wielu platform, a sam interfejs API jest w języku C#.


title: Jak sprawdzić, czy Twój prototyp/aplikacja spełnia wymagania?

text: Niedawno napisałem mały prototyp, który wykorzystuje stosunkowo nową technologię. Teraz chciałem sprawdzić, czy ten prototyp jest użyteczny i może być użyty w prawdziwym świecie. Ale teraz mam problem, jak mogę to zrobić? * Normalnie dobrze byłoby porównać prototyp z już istniejącymi podobnymi aplikacjami i porównać, czy działasz lepiej, zapewniasz lepszą użyteczność itp. Ponieważ nie jestem świadomy czegoś podobnego, jest to dość trudne * Normalnie bym sprawdź, czy wymagania klientów są spełnione. Ale nie ma żadnych rzeczywistych wymagań ani prawdziwych klientów. To tylko pomysł. Problem polega więc na tym, jak mogę uzyskać informację zwrotną na temat mojego prototypu, aby zobaczyć, jak jest on akceptowany przez potencjalnych użytkowników i co należy poprawić w prawdziwym wdrożeniu?


title: Obliczanie odległości i normalizacja danych

text: Projektuję system, który musi zgłaszać podstawową odległość między kodami pocztowymi. Będzie używał **Google Distance Matrix API**, ale chcę buforować wyniki w bazie danych, aby wiele żądań dla tych samych punktów danych nie powodowało zduplikowanych wywołań API. Podstawowa klasa `Distance` może wyglądać tak: ![YUML Distance rzecz](http://i.stack.imgur.com/aPG4x.png) Podstawowa struktura danych dla pamięci podręcznej może wyglądać tak: ![YUML DB table](http://i.stack.imgur.com/HHQ6y.png) Ponieważ nie używam szczegółowych szczegółów dotyczących zmian spowodowanych ulicami jednokierunkowymi lub podzielonymi autostradami, węzłami itp., nie nie ma dla mnie znaczenia, czy pozyskuję dane z punktu A do punktu B, czy z punktu B do punktu A. Ale nie jestem pewien, jak to wyrazić przy pełnej normalizacji w bazie danych. Z tym kluczem podstawowym całkowicie legalne byłoby istnienie tej samej odległości w dwóch oddzielnych wierszach, tj. var row1 = new Distance("00001", "00002"); var row2 = new Distance("00002", "00001"); Prawdopodobnie dobrym pomysłem byłoby wymaganie parametru `SortedList` w konstruktorze, ale czy jest sposób na zaprojektowanie go od strony bazy danych, aby wymusić pełną normalizację?


title: Stopniowe wydawanie oprogramowania na licencji GPL

text: Mamy kod JavaScript, który chcemy udostępniać w sposób przyrostowy. Oznacza to, że chcemy najpierw udostępnić pełny kod do niektórych naszych podstawowych modułów, zachowując resztę kodu „aplikacji” w formacie zminimalizowanym. W końcu udostępnimy również cały kod aplikacji (choć może to potrwać kilka miesięcy). Ustaliliśmy, że GPL (v3) jest najlepszą licencją dla naszego projektu oprogramowania. Obawiamy się jednak, że nie można jej użyć w opisany przeze mnie sposób. W szczególności, ponieważ nasz kod aplikacji zależy od wyżej wymienionych podstawowych modułów, aby funkcjonować, zostałby związany z GPL w momencie, gdy te moduły zostaną wydane na GPL. Jeśli dobrze rozumiem, oznacza to, że od pierwszego dnia musielibyśmy wydać niezminifikowaną wersję kodu aplikacji. Czy moje rozumienie jest prawidłowe? A jeśli tak, to czy istnieje licencja „next best”, której moglibyśmy używać dla naszych modułów podstawowych, która zapewniłaby nam podobną ochronę przed niewolnymi pochodnymi, bez wymogu, aby od samego początku publikować cały kod aplikacji?