title: Pojedyncza odpowiedzialność i niestandardowe typy danych

text: W ciągu ostatnich miesięcy prosiłem ludzi na SE i innych stronach o konstruktywną krytykę mojego kodu. Jest jedna rzecz, która pojawiała się prawie za każdym razem i nadal nie zgadzam się z tym zaleceniem; :P Chciałbym o tym tutaj porozmawiać i może wszystko stanie się dla mnie jaśniejsze. Dotyczy to zasady pojedynczej odpowiedzialności (SRP). Zasadniczo mam klasę danych, `Font`, która nie tylko przechowuje funkcje do manipulowania danymi, ale także do ich ładowania. Powiedziano mi, że te dwa elementy powinny być oddzielone, że funkcje ładujące powinny być umieszczone wewnątrz klasy fabrycznej; Myślę, że jest to błędna interpretacja SRP... ## Fragment z klasy My Font Class Font { public: bool isLoaded() const; void loadFromFile(const std::string& file); void loadFromMemory(const void*bufor, std::size_t size); nieważny wolny(); nieważne niektóre(); unieważnić inny(); }; ## Sugerowana klasa projektu Czcionka { public: void some(); unieważnić inny(); }; class FontFactory { public: virtual std::unique_ptr<Font> createFromFile(...) = 0; wirtualne std::unique_ptr<Czcionka> createFromMemory(...) = 0; }; Sugerowany projekt podobno jest zgodny z SRP, ale nie zgadzam się - myślę, że idzie za daleko. Klasa `Font` nie jest już samowystarczalna (bez fabryki jest bezużyteczna), a `FontFactory` musi znać szczegóły implementacji zasobu, co prawdopodobnie odbywa się za pomocą znajomych lub publicznych getterów, które dodatkowo eksponują implementację „Czcionka”. Myślę, że jest to raczej przypadek _rozdrobnionej odpowiedzialności_. Oto dlaczego uważam, że moje podejście jest lepsze: * `Czcionka` jest samowystarczalna -- Będąc samowystarczalnym, łatwiej ją zrozumieć i utrzymać. Możesz także korzystać z klasy bez konieczności dołączania czegokolwiek innego. Jeśli jednak okaże się, że potrzebujesz bardziej złożonego zarządzania zasobami (fabryką), możesz to również łatwo zrobić (później opowiem o mojej własnej fabryce, `ResourceManager<Font>`). * Podąża za standardową biblioteką - uważam, że typy zdefiniowane przez użytkownika powinny próbować jak najwięcej skopiować zachowanie typów standardowych w danym języku. `std::fstream` jest samowystarczalny i udostępnia funkcje takie jak `open` i `close`. Przestrzeganie standardowej biblioteki oznacza, że nie trzeba poświęcać wysiłku na naukę jeszcze jednego sposobu robienia rzeczy. Poza tym, ogólnie rzecz biorąc, komitet standardu C++ prawdopodobnie wie więcej o projektowaniu niż ktokolwiek tutaj, więc jeśli kiedykolwiek masz wątpliwości, skopiuj to, co robią. * Testowalność — coś idzie nie tak, gdzie może być problem? -- Czy jest to sposób, w jaki `Font` obsługuje swoje dane, czy sposób, w jaki `FontFactory` ładuje dane? Naprawdę nie wiesz. Samowystarczalność klas zmniejsza ten problem: możesz testować `Czcionka` w izolacji. Jeśli musisz następnie przetestować fabrykę i wiesz, że `Czcionka` działa dobrze, będziesz również wiedział, że za każdym razem, gdy pojawi się problem, musi on znajdować się wewnątrz fabryki. * Jest niezależny od kontekstu -- (przecina się to trochę z moim pierwszym punktem.) `Czcionka` robi swoje i nie przyjmuje żadnych założeń co do tego, jak będziesz jej używać: możesz jej używać w dowolny sposób. Zmuszenie użytkownika do korzystania z fabryki zwiększa sprzężenie między klasami. ## Ja też mam fabrykę **(Ponieważ projekt `Czcionki` mi na to pozwala.)** A raczej menedżer, a nie tylko fabrykę... `Czcionka` jest samowystarczalna, więc menedżer nie' trzeba wiedzieć _jak_ je zbudować; zamiast tego menedżer upewnia się, że ten sam plik lub bufor nie jest ładowany do pamięci więcej niż raz. Można powiedzieć, że fabryka może zrobić to samo, ale czy nie złamałoby to SRP? Fabryka musiałaby wówczas nie tylko budować obiekty, ale także nimi zarządzać. template<klasa T> class ResourceManager { public: ResourcePtr<T> seek(const std::string& file); ResourcePtr<T> pozyskiwanie(const void*bufor, std::size_t size); }; Oto demonstracja, jak można wykorzystać menedżera. Zwróć uwagę, że jest używany w zasadzie dokładnie tak, jak robi to fabryka. void test(ResourceManager<Font>* rm) { // Ten sam plik nie jest dwukrotnie ładowany do pamięci. // Jednak nadal mogę mieć tyle czcionek używających tego pliku, ile chcę. ResourcePtr<Font> font1 = rm->acquire("fonts/arial.ttf"); ResourcePtr<Font> font2 = rm->acquire("fonts/arial.ttf"); // Wydrukuj coś dwoma czcionkami... } ## Bottom Line... (Chciałbym tu wstawić tl;dr, ale nie przychodzi mi do głowy. :\ ) Dobrze, masz to , zrobiłem swoją sprawę najlepiej, jak potrafiłem. Proszę zamieścić wszelkie kontrargumenty, które masz, a także wszelkie zalety, które Twoim zdaniem sugerowany projekt ma nad moim własnym projektem. Zasadniczo spróbuj mi pokazać, że się mylę. :)


title: Co muszą być w stanie zrobić testerzy, aby być „wysoko wykwalifikowanymi”?

text: **Czy współcześni testerzy to „głupi” użytkownicy, którzy próbują znaleźć błąd, klikając i wypełniając pola, czy też mają solidną wiedzę na temat rdzeni produktów?** Co muszą umieć robić współcześni testerzy? * Czy muszą być programistami tworzącymi testy niezależne/osadzane? * Czy muszą rozumieć kod źródłowy produktów, a nawet potrafią naprawić łatwe błędy? * Inne rzeczy? Interesuje mnie prawdziwa praktyka.


title: Konwencje nazewnictwa JavaScript

text: Pochodzę z Javy i jestem nowy w JavaScript. Zauważyłem wiele metod JavaScript używających jednoznakowych nazw parametrów, tak jak w poniższym przykładzie. doSomething(a,b,c) Nie podoba mi się to, ale inny programista JavaScript przekonał mnie, że robi się to w celu zmniejszenia rozmiaru pliku, zauważając, że pliki JavaScript muszą być przesyłane do przeglądarki. Potem znalazłem się w rozmowie z innym deweloperem. Pokazał mi, w jaki sposób Firefox obcina nazwy zmiennych, aby szybciej ładować stronę. Czy jest to standardowa praktyka przeglądarek internetowych? Jakie są najlepsze praktyki konwersji nazw, których należy przestrzegać podczas programowania w JavaScript? Czy długość identyfikatora ma znaczenie, a jeśli tak, to w jakim stopniu?


title: Budowanie serwisu internetowego z mvc

text: Planuję tutaj swoją stronę internetową w oparciu o MVC. I myślę o serwisie internetowym (kto wie, może kiedyś stworzę aplikację na Androida czy coś). Witryna i usługa internetowa będą zachowywać się inaczej. Więc co powinienem zrobić? Napisz różne kontrolery dla każdego z nich... lub zapakuj IF w różne miejsca? Na przykład: na stronie kontroler będzie działał tak: Hasło poprawne? \---->przekieruj użytkownika do ekranu powitalnego Niepoprawne hasło? \---->wyrenderuj ponownie stronę logowania Ale usługa internetowa po prostu pokaże json, taki jak: {komunikat: 'wrong password/sucess'} Która według Ciebie jest najlepsza?


title: Narzędzia i wsparcie dla specyfikacji formatu wiadomości

text: Jak większość firm definiuje specyfikacje formatu wiadomości i zarządza nimi? Czy firmy często tworzą niestandardowe narzędzia do tworzenia i pracy z tymi dokumentami? W pracy mamy wiele systemów komunikujących się za pomocą wiadomości UDP. Każdy system ma swój własny dokument kontroli interfejsu (w programie Word lub HTML), który opisuje jego schemat komunikatów. Dokumenty zawierają opisy każdej wiadomości wraz z jej polami i uwagami dotyczącymi użytkowania. Zamierzamy ujednolicić format tych ICD i napisać kilka narzędzi, które pomogą w ich tworzeniu. Myślałem, że powinniśmy stworzyć schemat ICD i zdefiniować ICD w jakimś formacie wymiany danych (XML, JSON, protobuf). Następnie moglibyśmy stworzyć parsery, które generują czytelną dla człowieka dokumentację (HTML, PDF), a nawet kod parsujący wiadomości (tam, gdzie jest to przydatne i stosowne). Nie chcę wymyślać koła na nowo i nie chcę dać się ponieść emocjom. Czy powyższa propozycja brzmi rozsądnie?


title: Czy powinienem stworzyć własną klasę Assert w oparciu o te powody?

text: Głównym powodem, dla którego nie podoba mi się Debug.Assert, jest fakt, że te potwierdzenia są wyłączone w wydaniu. Wiem, że jest ku temu powód wydajności, ale przynajmniej w mojej sytuacji uważam, że zyski przeważyłyby nad kosztami. (Swoją drogą, domyślam się, że tak jest w większości przypadków). I tak, wiem, że możesz zamiast tego użyć Trace.Assert. Ale nawet jeśli to zadziała, uważam, że nazwa Ślad mnie rozprasza, ponieważ nie uważam tego za śledzenie. Innym powodem tworzenia własnej klasy jest chyba lenistwo, ponieważ mógłbym napisać metody dla najczęstszych przypadków, takich jak Assert.IsNotNull, Assert.Equals i tak dalej. Druga część mojego pytania dotyczy używania Environment.FailFast w tej klasie. Czy to byłby dobry pomysł? Podobają mi się pomysły przedstawione w tym dokumencie. Stąd właśnie wziąłem się za pomysł. Ostatni punkt. Czy tworzenie projektu takiego jak ten oznacza posiadanie nietestowalnej ścieżki kodu, jak opisano w tej odpowiedzi Erica Lipperta na inne (ale powiązane) pytanie?


title: Czy kod JSF 2.0.0 można przekonwertować na JavaScript/HTML5?

text: Zajmuję się tworzeniem aplikacji wykorzystującej WebSocket do wymiany wiadomości; jest oparty na JSF 2.0.0, ale idea jest podobna, a HTML5 obsługuje WebSocket. Czy jedyną różnicą między tymi językami jest używany tag i składnia? Czy logika stojąca za tym jest taka sama? Ciekawe czy jest do tego jakiś konwerter.


title: Czy zwalnianie zasobów przed zakończeniem procesu jest stratą czasu?

text: Rozważmy fikcyjny program, który buduje połączoną listę na stercie, a na końcu programu znajduje się pętla, która zwalnia wszystkie węzły, a następnie kończy działanie. W tym przypadku załóżmy, że połączona lista ma tylko 500 KB pamięci i nie jest wymagane żadne specjalne zarządzanie przestrzenią. * Czy to strata czasu, ponieważ system operacyjny i tak to zrobi? * Czy później będzie inne zachowanie? * Czy to różni się w zależności od wersji systemu operacyjnego? Interesują mnie głównie systemy oparte na UNIX, ale każda informacja będzie mile widziana. Miałem dzisiaj pierwszą lekcję kursu OS i teraz się nad tym zastanawiam. **Edytuj:** Ponieważ wiele osób jest zaniepokojonych skutkami ubocznymi i ogólną „dobrą praktyką programistyczną” i tak dalej. Masz rację! Zgadzam się w 100% z Twoimi wypowiedziami. Ale moje pytanie jest tylko hipotetyczne, chcę wiedzieć, jak zarządza tym system operacyjny. Więc proszę pomiń takie rzeczy jak "znajdowanie innych błędów podczas zwalniania całej pamięci".


title: Czy Silverlight to tylko słodycze dla oczu, czy ma zastosowanie w biznesie?

text: Przyznając, że Silverlight może tworzyć przyciągające wzrok strony internetowe o wielkiej urodzie, czy jest jakieś uzasadnienie używania go do tworzenia praktycznych aplikacji internetowych, które mają poważne cele biznesowe? Chciałbym go użyć (aby się tego nauczyć) do nowego zadania, które mam, jakim jest zbudowanie aplikacji internetowej, która śledzi interfejsy danych używane w naszej organizacji, ale nie jestem pewien, jak to uzasadnić nawet do siebie. Jakieś przemyślenia na ten temat? Jeśli nie mogę tego uzasadnić, będę musiał zbudować aplikację przy użyciu tego samego starego, znużonego prostego podejścia ASP.NET, którego używałem (wydaje się) już setki razy.


title: Dziedziczenie tabeli klas... Do „wpisywania” lub nie do „wpisywania”

text: Obecnie mam bazę danych, która używa modelu dziedziczenia tabeli klas. Po tej tabeli dziedziczą trzy różne tabele. Tabele podrzędne mają wszystkie FK do tabeli nadrzędnej, a pola są odpowiednio indeksowane. Obecnie mamy pewne problemy na poziomie aplikacji, ponieważ trudno jest określić, do której tabeli podrzędnej odwołujemy się od rodzica. Poza tym zapytanie, w którym organizujemy według typu, wydaje się kosztowne. Jeden z programistów twierdzi, że powinniśmy po prostu połączyć wszystkie 3 tabele, aby dowiedzieć się, jakiemu dziecku odpowiada rekord nadrzędny, i dopóki tabele mają odpowiednie zapytania indeksujące, nie powinno to być kosztowne. Z drugiej strony moglibyśmy uniknąć wielu nieporozumień i problemów, jeśli dodamy pole rozróżniacza w tabeli nadrzędnej, w ten sposób będziemy wiedzieć, bez konieczności wykonywania łączeń, z jakim 'typem' rekordu mamy do czynienia. Również grupowanie według typu byłoby znacznie prostsze. * Czy powinniśmy dodać typ w tabeli nadrzędnej? * Jakie byłyby wady? * Czy łączenie się z wieloma tabelami (o ile są one odpowiednio zindeksowane) naprawdę nie jest kosztowne w porównaniu z posiadaniem pola dyskryminującego? * Inne przemyślenia? Obecnie używamy implementacji aktywnego rekordu dla PHP i nie obsługuje ona dziedziczenia tabeli klas.


title: Gdzie powinniśmy umieścić Biblioteki Zewnętrzne w naszym SVN?

text: Mamy następującą strukturę SVN. * Projekty: Nasza praca * Klienci: Projekty dla klientów, musi być inny * Shared: Współdzielone biblioteki, które stworzyliśmy * Docs: Dokumenty wyjaśniające, jak przebiega rozwój oprogramowania w firmie (i tak nie ma nic wspólnego z moim pytaniem) Gdzie należy umieścić biblioteki zewnętrzne? Powiedzmy, że z projektów open source itp. ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/dYENF.png)


title: Dla jakich aplikacji Python jest złym wyborem?

text: Właśnie zacząłem uczyć się Pythona i chciałbym uzyskać więcej kontekstu w języku. Zdaję sobie sprawę, że w wielu przypadkach Python jest powolnym językiem w stosunku do C lub C++. Dlatego Python prawdopodobnie nie jest najlepszym wyborem dla aplikacji, które muszą działać tak szybko, jak to możliwe. Poza tym wydaje się, że Python jest świetnym językiem ogólnego przeznaczenia, który jest łatwy do czytania i pisania. Dostępne biblioteki dają mu ogromną funkcjonalność. Gdzie jest zły wybór poza aplikacjami krytycznymi dla wydajności (i dlaczego)?


title: Jak mogę oddzielić dane konfiguracyjne od programu, który z nich korzysta?

text: Jestem początkującym programistą, który napisał aplikację typu spider w PHP. Obecnie są trzy części: 1) Pająk (spider.php) 2) Harvester (harvest.php) 3) Plik konfiguracyjny (na przykład craigslist_config.php) Używam pająka do wyszukiwania w sieci elementów, które chcę Kup. Element można znaleźć na dowolnej stronie internetowej, takiej jak ebay, craigslist itp. Harvester udostępnia trzy funkcje do pająka, dzięki czemu może działać na znalezionych danych - `get_title_from($markup)`, `get_description_from($markup)` oraz `get_price_from($markup)`. Każda witryna internetowa, którą chcę przetworzyć, ma oczywiście inny znacznik otaczający dane, które chcę wyodrębnić. Mój plik konfiguracyjny zawiera tablicę konfiguracyjną, która przechowuje wzorce wyrażeń regularnych dla każdego z elementów, które chcę znaleźć. Struktura pliku jest zawsze taka sama, jedyne, co się zmienia, to wzorce wyrażeń regularnych. Więc miałbym craigslist_config.php, ebay_config.php, itp. $conf = array( 'title' => ' wzorzec tytułu specific_site', 'description => 'wzorzec opisu specific_site', 'cena' => 'wzór ceny specific_site ' ); Mój problem polega na tym, że chcę dodać nową stronę internetową. Muszę wyedytować plik Spider.php i dodać do ciągle rosnącej instrukcji "if, elseif", która wykrywa, jaka strona jest aktualnie odczytywana, i załadować poprawny plik konfiguracyjny, który z kolei dostarcza poprawne dane REGEX do funkcji harwestera . Jak mogę oddzielić moją konfigurację od pliku Spider.php? To, co zaprojektowałem, nie wydaje się elastycznym, skalowalnym rozwiązaniem i nie chcę grzebać w spider.php za każdym razem, gdy chcę dodać lub usunąć nową witrynę. Ostatecznie to, co staram się osiągnąć, to możliwość po prostu wrzucenia nowego pliku konfiguracyjnego do mojego katalogu config i przeniesienia logiki 'if, elseif' w inne miejsce, aby funkcje pająka i harverstera nigdy nie musiały się martwić o to, jakie pliki są lub nie są zawarte w katalogu config. To „gdzie indziej”, z którym mam problem. Właściwie byłoby jeszcze lepiej, gdybym mógł całkowicie pozbyć się logiki „jeśli inaczej”, aby wszystko po prostu „działało”. Mój obecny projekt nie jest podejściem OOP, jednak nie jestem mu przeciwny. Obecnie czytam "Obiekty PHP, wzorce i praktyka", aby szybko zapoznać się z OOP i powiązanymi wzorcami projektowymi, więc nie krępuj się sugerować w tym kierunku, jeśli uważasz, że jest to rozwiązanie. **EDYTUJ:** Na podstawie wskazówek doktora Browna wymyśliłem następujące. Mam indywidualne pliki konfiguracyjne o treści takiej jak: $conf['specificwebsite1.com'] = array( 'title' => 'title pattern', 'price' => 'price pattern', etc... ); W moim pliku Harvester mam nową funkcję o nazwie `load_config($url, $config)`. Zgodnie z sugestią, przechodzę przez wszystkie pliki konfiguracyjne i ładuję je do jednej dużej tablicy $conf. Następnie funkcja `load_config` sprawdza, czy klucz jest podłańcuchem adresu URL, który aktualnie czytam. Jeśli tak, ładuje wszystkie niezbędne wartości, aby kontynuować analizowanie. Oto funkcja: function load_config($url, $config){ foreach($config as $key => $value){ if(stristr($url, $key) !== FALSE){ ## zobacz, czy klucz w naszym pliku konfiguracyjnym ## jest podciągiem naszego adresu URL. $konf = $konfiguracja[$klucz]; przerwanie; } else { $konf = FAŁSZ; } } return $conf; } Działa to naprawdę dobrze, więc przyjmę to jako odpowiedź. Ale zachęcamy do zgłaszania sugestii dotyczących ulepszeń w komentarzach lub jako inną odpowiedź.


title: Która z tych odpowiedzi dotyczących funkcji jest nieprawidłowa?

text: Tak więc, kiedy robiłem kilka długich kompilacji, postanowiłem wziąć udział w ogólnym teście C++ na ODesk i natknąłem się na to pytanie. ![To pytanie](http://i.imgur.com/tyX95lv.png) Jeśli się nie mylę, biorąc pod uwagę sformułowanie (lub jego brak) **wszystkie** mogą być prawdziwe. **a.** int Foo() { } int Foo(int bar) { } **b.** Cóż, _"return`void`"_ byłoby niepoprawne semantycznie, ale funkcje mogą oczywiście mieć typy zwracane `void` . void Foo() { } **c.** To jest definicja funkcji wbudowanych, tak. **d.** Bez wchodzenia w szczegóły dotyczące umieszczania następujących elementów, typedef void (*Func)(int); Funkcje funkcyjne [2]; void Foo(int bar) { } void Bar(int foo) { } functions[0] = &Foo; funkcje[1] = &Bar; Co więcej, zawsze możesz to zrobić za pomocą lambd i funktorów. **e.** void Foo(int& bar) { ++bar; } int foobar = 5; Foo(foobar); **f.** int bar = 5; int& GetBar() { return bar; } GetBar() = 6; **g.** int bar = 5; int* GetBar() { return &bar; } (*PobierzBar()) = 5; * * * Nie widzę, gdzie to pytanie ma jakieś _naprawdę fałszywe_ odpowiedzi. Czy czegoś mi brakuje? Nie trzeba dodawać, że zabrakło mi czasu i wszystko zawiodło. Chyba jestem złym programistą C++. :(


title: Pytanie o próbkę kodu firmy na rozmowie kwalifikacyjnej

text: Proszenie osoby poszukującej pracy o pokazanie kodu jest dość powszechną praktyką w firmie programistycznej. Jednak czy byłoby dopuszczalne, aby kandydat poprosił ankietera o pokazanie mu małego fragmentu kodu, który jego zdaniem jest dobrze napisany?


title: Freelancing - Otrzymywanie zapłaty za wycenę lub kosztorys

text: Często konieczne jest poświęcenie czasu na zaprojektowanie rozwiązania, rozbicie projektu na zadania i podzadania oraz oszacowanie czasu potrzebnego na wykonanie każdego zadania w celu uzyskania rozsądnego oszacowania lub wyceny zadania programistycznego. Proces ten może być poważną inwestycją czasu, często bez żadnej gwarancji, że kosztorys/wycena będzie do zaakceptowania przez potencjalnego klienta, a częściej, że nie został on „zmarnowany” bez nadziei na otrzymanie zapłaty (w przypadku nie zdobywając pracy). Czy jest to koszt prowadzenia działalności i co można zrobić, aby zminimalizować ten nieopłacony czas?


title: Wersja Bump przed rozpoczęciem nowego rozwoju lub podczas oznaczania wydania, która jest lepsza?

text: Niektóre projekty podbijają wersję przed rozpoczęciem nowego rozwoju, podczas gdy inne projekty podbijają wersję podczas oznaczania wydania. Które podejście jest lepsze? Jeśli numer wersji nie zostanie zmieniony na początku nowej fazy, programiści mogą zapomnieć o jego zmianie i po prostu wydać program. Jeśli numer wersji zmienił się przed wydaniem znaczników, 2 numery wersji (znacznik i Makefile/AssemblyInfo.cs) nie są zgodne. `Git description` może dać wersję v1.2.3.4-15-g1234567, jeśli aktualna wersja jest po v1.2.3.4, ale już zmieniłeś pliki na v1.2.3.5


title: Jak sprawić, by metody C# działały jak funkcje javascript?

text: Zachowam prostotę, chcę, aby metody C# działały jak funkcje javascript. Głównie dlatego mogę to przekonwertować - function makeVariable(terp) { var me = {value: 0}; funkcja powrotu () { terp.stack.push(me); }; } do C#. Czy jest JAKIŚ sposób, bez względu na to, jak skomplikowany lub czasochłonny, aby to zrobić?


title: Zdalne programowanie par konfigurowane przez maszynę wirtualną

text: Poszukujemy nowego sposobu programowania w parach. Wygląda na najlepszy sposób programowania, jest szybszy i wypychasz świetny, przetestowany kod. Ale są pewne wady. Wyskakujące elementy ad hoc. upaść. kopie zapasowe. jest tylko jeden kierowca. Naszym zdaniem najlepszym możliwym środowiskiem jest serwer z maszyną wirtualną. Zarówno ja, jak i mój partner programistyczny SSH wewnątrz i uruchamiamy jakiś rodzaj VNC lub teamviewer lokalnie pomiędzy, abyśmy mogli jednocześnie pracować nad plikami i powiedzieć, że jedna osoba pracuje nad widokami, a druga pracuje nad konfiguracją Apache. Więc patrzymy na pracę na tym samym systemie z dwóch różnych komputerów jednocześnie. W ten sposób moglibyśmy w razie potrzeby połączyć się z naszymi innymi oddziałami i mieć parowane „systemy”, które chcielibyśmy. Lub jeśli ktoś musi wyskoczyć i popracować nad czymś innym, druga osoba może działać bez niego. Czego musimy się nauczyć, aby stworzyć takie środowisko lub osiągnąć coś takiego?


title: Czy NASA udziela licencji na oprogramowanie, które rozwija?

text: NASA dostarcza oprogramowanie do wizualizacji o nazwie Panoply. Istnieje strona Podziękowania i potwierdzenia, która potwierdza i wymienia licencje zależności oprogramowania, ale nie zawiera informacji o własnej licencji. Spojrzałem na inne oprogramowanie wyprodukowane przez NASA, w tym na kod źródłowy GISS i nie mogę znaleźć żadnych informacji o licencji. Najbliższe informacje, jakie mogę znaleźć, znajdują się w FAQ dla globalnego modelu klimatycznego EdGCM Global, który mówi, że kod znajduje się w „domenie publicznej” * czy standardową praktyką w NASA jest udostępnianie kodu do domeny publicznej? * czy są wyjątki? * Czy mogę założyć, że Panoply jest domeną publiczną i może być używane bez ograniczeń innych niż te narzucone przez licencje zależności oprogramowania? * Czy brak konkretnego pozwolenia na ponowne wykorzystanie kodu jest problemem (kwestia ta została podniesiona w odpowiedzi na osobne pytanie) * Jak powszechna jest ta praktyka w agencjach rządowych?


title: Moja pierwsza praca programistyczna w firmie, na co zwrócić uwagę?

text: Tak więc cały czas pracowałem sam, sprzedając oprogramowanie, tworząc samodzielnie kilka aplikacji internetowych. Miałem wykształcenie artystyczne, byłem samoukiem. Trochę trudno było znaleźć pozycję deweloperską po niekończących się próbach, w końcu wylądowałem na pozycji LAMP. Zdałem sobie sprawę, że to wszystko kwestia zaufania. Wcześniej, gdy nie wiedziałem kilku rzeczy, wpadałem w panikę, ale po spędzeniu tak długiego czasu na pracy nad własnymi projektami i rozwiązywaniu różnych problemów, czułem się na tyle pewny siebie, że mogę sam spełnić wymagania. Mam nadzieję, że pomoże to innym osobom ubiegającym się o pracę Po raz pierwszy będę się rozwijał z innymi członkami zespołu w biurze, czy jest coś, co powinienem przygotować na pierwszy dzień w pracy w przyszłym tygodniu? Jakieś wskazówki i wskazówki dotyczące pracy jako programista w firmie? Jestem trochę zdenerwowany, ale podekscytowany.


title: Bardziej dokładny losowy w C

text: Mam 3 adresy IP i każdy adres IP ma wagę, chcę zwrócić adresy IP zgodnie z ich wagami za pomocą funkcji losowej. Na przykład jeśli mamy 3 IP * X o wadze 3 * Y o wadze 3 * i Z o wadze 3 chcę zwrócić X w 33,3% przypadków i Y w 33,3% przypadków i Z w 33,3% przypadków, w zależności od losowa funkcja w C. Próbowałem tego kodu: double r = rand() / (double)RAND_MAX; podwójny denom = 3 + 3 + 3; if (r < 3 / denom) { // wybierz X } else if (r < (3 + 3) / denom) { // wybierz Y } else { // wybierz Z } Powtarzam funkcję 1000 i otrzymuję: Wybierz x 495 razy i Wybierz y 189 razy i wybierz z 316 razy. Ale chcę uzyskać X:333 y:333 Z:334 Jak losowość ważona może być dokładniejsza?


title: Czy brytyjski programista może przenieść się do USA?

text: Rozważam zmianę kariery po tym, jak przez ostatnie 8 lat pracowałem jako programista oprogramowania finansowego w Londynie. Bardzo chciałbym przenieść się do Doliny Krzemowej, ale nie mam jasności co do praktycznych aspektów. 1) Biorąc pod uwagę wymagania wizowe, czy jestem ograniczony do dołączenia do dużej firmy programistycznej, takiej jak Google? A może startupy lub samozatrudnienie są dla mnie otwarte? 2) Czy wymóg wizowy stawia mnie w niekorzystnej sytuacji w porównaniu z lokalnymi pracownikami?


title: Jak zaimplementować uwierzytelnianie kart inteligentnych za pomocą klienta .NET Fat?

text: Ogólnie niewiele wiem na temat uwierzytelniania kart inteligentnych, więc proszę o wskazanie lub poprawienie mnie, jeśli cokolwiek poniżej nie ma sensu. Powiedzmy, że mam: * Kartę inteligentną urzędu certyfikacji "X"-s (nieeksportowalny klucz prywatny) * Sterowniki tej karty inteligentnej napisane w C * Czytnik kart inteligentnych * Usługa sieciowa OCSP uwierzytelniania CA-s * **Wymaganie zaimplementować uwierzytelnianie użytkownika w aplikacji klienckiej .NET Fat za pomocą karty inteligentnej, która została wydana przez CA „X”.** Próbowałem wyszukiwać informacje w Internecie, ale bez przewagi. Jakie byłyby kroki? Moja pierwsza myśl brzmiała: Skonfiguruj usługę sieciową, która pozwoliłaby zapisywać (na przykład) wyniki gry w ping ponga dla każdego użytkownika. Za każdym razem, gdy ktoś próbuje przesłać ocenę za pośrednictwem aplikacji klienckiej, może to zrobić tylko poprzez włożenie karty inteligentnej do czytnika. Następnie klucz publiczny jest odczytywany z karty inteligentnej przez natywne wywołania c za pośrednictwem platformy .NET i wysyłany do mojej niestandardowej usługi sieciowej, która w zamian używa usługi sieciowej OCSP uwierzytelniania urzędu certyfikacji, aby udowodnić ważność klucza publicznego/certyfikatu publicznego (? ). Jeśli klucz publiczny jest prawidłowy i prawidłowy, zaszyfruj losową sekwencję bajtów kluczem publicznym i wyślij go do aplikacji klienckiej. Jeśli aplikacja kliencka odeśle poprawnie odszyfrowaną losową sekwencję bajtów wraz z wynikiem gry w ping ponga, to wynik zostanie zapisany w bazie danych dla danego użytkownika. Moje pytanie brzmi, czy to jest właściwy sposób? Co jeszcze powinienem wiedzieć o uwierzytelnianiu kartą inteligentną?


title: Połączenia SharePoint + InfoPath

text: Próbuję zrobić coś wyjątkowego, a najlepszą ścieżką, jaką mogę znaleźć w tej chwili, jest użycie złączeń List, ale nie jestem pewien, czy jest to możliwe. Mam nadzieję, że ktoś zasugeruje najlepszy sposób postępowania. Problem w tej chwili polega na tym, że mam kilka list (tj. Pracownicy), z których wszystkie mają odnośnik do listy aktywów. Mam również listę planowania, która zawiera daty rozpoczęcia i zakończenia, w których zasoby są niedostępne, a także zawiera odnośnik do listy zasobów. Próbuję znaleźć sposób na filtrowanie listy wyboru w formularzu programu InfoPath tak, aby zawierała tylko tych pracowników, którzy są dostępni. Problem polega na tym, że mam do czynienia z pięcioma lub sześcioma rodzajami Aktywów, więc nie mogę pozwolić, aby lista Planowanie bezpośrednio przeszukiwała listę pracowników (lub jakikolwiek inny typ zasobu). Staram się znaleźć sposób na wykonanie tej pracy po stronie serwera, aby formularz nie był zbyt ciężki. Uzyskuję dostęp do list za pośrednictwem interfejsu API REST wbudowanego w SharePoint i zajmuję się projektowaniem formularza za pomocą projektanta programu InfoPath. Jakieś myśli, jak mogę sprawić, by ten formularz działał? **AKTUALIZACJA 1:** Obecnie uważam, że lepiej będzie, jeśli podzielę tabelę harmonogramów na osobne listy dla każdego typu zasobu, a potem znajdę sposób na zrzucenie wszystkiego z powrotem, gdy będę tego potrzebować później. Czy to wydaje się rozsądne? Nie mam pojęcia, jak trudno byłoby później złożyć je w całość – czy ktoś próbował czegoś takiego? **AKTUALIZACJA 2:** Nowa linia – zrezygnowałem z tego, że nie mogę wykonać złączeń, które chciałbym wykonać, a zamiast tego staram się osiągnąć swój cel, filtrując dane pojawiające się na listach wyboru. Pobieram odpowiednie dane z listy Planowanie i wszystkie dane z Listy pracowników i próbuję filtrować Listę pracowników pod kątem wpisów NIE NA LIŚCIE Planowanie. Czy ktoś wie, jak to zrobić, ponieważ zrealizuje to cel bez konieczności pobierania ZBYT wielu zbędnych danych do formularza...


title: odwołanie podklasy do innej podklasy

text: Wyobraź sobie, że mam następujący kod: class A: pass class B(A): pass class C(A): def __init__(self): self.b = B() Czy powyższy kod jest poprawny pod względem poprawnego dziedziczenia? Chodzi mi o to, czy odwoływanie się do innej podklasy w podklasie jest dobrą praktyką?


title: Rozpoczęcie programowania kart inteligentnych

text: Mam komputer Compaq nw8440 z czytnikiem kart inteligentnych, który jest: > Zgodny z kartami inteligentnymi zgodnymi z normą ISO 7816. Obsługa interfejsu PC/SC Interesowałem się kartami inteligentnymi i chciałem się nimi pobawić. Gdybym chciał zająć się programowaniem kart inteligentnych, gdzie mogę znaleźć zasoby, jak to zrobić i czy potrzebuję dodatkowego sprzętu innego niż ten, który zapewnia mój laptop (oprócz kart do zaprogramowania)?


title: Jak powinienem zająć się nauką nowych technologii?

text: W karierze inżyniera oprogramowania bardzo często trzeba uczyć się nowych technologii i zawsze w krótszym czasie ze względu na terminy. Więc wystarczy wiedzieć, jak programiści powinni bardzo szybko i dokładnie nauczyć się technologii. Jakie podejście stosujesz?


title: Jak poradzić sobie z nową wersją katalogu visual studio?

text: Podczas aktualizacji Visual Studio do nowszej wersji tworzony jest nowy katalog, np. „Studio wizualne 2013”. Rozumiem, że ma to sens, ponieważ chcemy rozróżnić kod skierowany do różnych wersji .net. Ale ponieważ niektóre projekty używają innych projektów jako swoich bibliotek dll dla jakiegoś powtarzającego się kodu - to rodzi pytanie - czy powinniśmy skopiować wszystko i mieć wszystko oddzielnie dla .net 4.0 od .net 4.5, czy też powinniśmy mieć jedną bibliotekę, która działa dla obu (ponieważ 90% kodu będzie taka sama) i utworzyć tylko specjalną bibliotekę dla kodu, który nie może działać w wersji 4.0? Samo sugerowanie robienia „cokolwiek działa dla ciebie” nie jest dobrym rozwiązaniem – w tej chwili obie strony wyglądają na wykonalne. Jeśli jedna z opcji ma jakieś wady, mogą się one ujawnić dopiero po tym, jak mamy wiele wewnętrznych linków od rozwiązania do rozwiązania, a nie ma realnej możliwości zmiany wszystkich linków na raz - trzeba poszukać każdego z nich ręcznie, mając nadzieję, że nie przegap coś. Ponieważ oczywiście nie jesteśmy pierwszymi, którzy zmagają się z tym pytaniem, chciałbym usłyszeć od osób z doświadczeniem w tej sprawie. (lub oczywiście kogokolwiek innego.) (Chociaż może nie być jednoznacznej odpowiedzi na to pytanie, mam nadzieję, że będzie to dozwolone tutaj, tak jak pytanie o najwyższą liczbę głosów na tej stronie.)


title: Jakie są zalety przekazywania wartości?

text: Zawsze myślałem, że przekazywanie przez wartość jest spuścizną po wczesnych językach, ponieważ projektanci nigdy nie widzieli niczego innego. Ale po zobaczeniu zupełnie nowych języków, takich jak Go, dostosowujących tę samą zasadę, zmyliło mnie to. Jedyną korzyścią, o jakiej mogę pomyśleć, jest upewnienie się, że wartość, którą przekazujesz, nie zostanie zmodyfikowana. Ale za każdym razem, gdy potrzebujesz przekazać dużą strukturę do funkcji, musisz przekazać wskaźnik (lub referencję), aby zapobiec kopiowaniu, jeśli język na to pozwala. Aby zapobiec modyfikacji parametrów, można wprowadzić pewien mechanizm „stałości” zamiast przekazywania wartości całego języka. Koduję od lat i rzadko musiałem przekazywać wartość. Prawie zawsze nie potrzebuję mojej wartości/obiektu do skopiowania do wywołania funkcji; i często nie potrzebuję go modyfikować wewnątrz funkcji*. Jaka motywacja stoi za tym, by współczesne języki przechodziły obok wartości? Czy są jakieś zalety, o których nie wiem? **Edytuj:** Kiedy mówię przekaż przez wartość, nie mam na myśli prymitywów. Ich wartość jest łatwa i tania. Skupiam się głównie na obiektach lub strukturach, które składają się z więcej niż jednego prymitywnego, a zatem są _kosztowne_ do skopiowania. *: Pytałem, a inni zgłaszali podobne rzeczy z użyciem ich parametrów.


title: Korzystanie z narzędzia współbieżnego Java z aplikacji internetowej

text: W mojej aplikacji mam następujące wiersze kodu: return "Usługa jest aktywna od: " + TimeUnit.MILLISECONDS.toMinutes(mxBean.getUptime()) + "minutes"; Używa następującego pakietu: import java.util.concurrent.TimeUnit; Moja aplikacja to aplikacja internetowa. Czy oznacza to, że logicznie coś jest nie tak, jeśli używam czegoś z pakietu współbieżnego w aplikacji internetowej?


title: Problem z otwieraniem JFrames z LWJGL

text: Tworzę program, który używa LWJGL do renderowania okna wyświetlania, a także nasłuchuje danych wejściowych z klawiatury, aby zachęcić go do otwarcia okna wahadłowego. Problem polega na tym, że po pierwszym monicie na klawiaturze okno otwiera się pomyślnie. Ale kiedy go zamkniesz i spróbujesz ponownie, wygląda na to, że okno LWJGL "przykleja się" do klawisza, który właśnie nacisnąłeś, i zamiast tego zaczyna otwierać nieskończone nowe okna Swing... Nie jestem pewien, jak rozwiązać ten problem. Oto kod, który zademonstruje mój problem... public class Launcher{ public static void main(String[] args){ new Launcher(); } public Launcher(){ loadGUI(); iść(); } public void go(){ while(!Display.isCloseRequested()){ listen(); glClear(GL_COLOR_BUFFER_BIT); Wyświetl.aktualizacja(); Display.sync(60); } } private void listen(){ if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)){ System.out.println("fk"); Przykład e = nowy Przykład(); } } private void loadGUI(){ try{ Display.setDisplayMode(new DisplayMode(480,480)); Display.setTitle("Przykład"); Wyświetl.tworzenie(); }catch(LWJGLException e){ e.printStackTrace(); Wyświetl.zniszcz(); System.wyjście(1); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho (0, 480, 480, 0, 1, -1); glMatrixMode(GL_MODELVIEW); } klasa private Przykład extends JFrame{ public Example(){ add(new JPanel(), BorderLayout.NORTH); Pakiet(); setResizable (prawda); setTitle("Test"); setVisible(prawda); } } }


title: Jaki jest najlepszy sposób na stworzenie interfejsu użytkownika w iOS?

text: Jestem sfrustrowany licznymi dostępnymi opcjami tworzenia UI w iOS. Każdy ma swoje wady. Lubię robić programowe interfejsy użytkownika, ale pętla kompilacji-debugowania jest dość wolna (10s każda kompilacja), co spowalnia mnie, gdy bez końca próbuję uruchomić programowe interfejsy użytkownika z automatycznym układem. Chciałbym wiedzieć, jakie jest najlepsze podejście do zastosowania na 2 konkretnych ekranach z przykładami kodu. Może to być dobry sposób na porównanie zalet i wad każdego podejścia. Oto dwa ekrany bardzo popularnego i prostego interfejsu - proces weryfikacji numeru telefonu WhatsApp: http://www.whatsapp.com/faq/iphone/20902747 # Opcje * Układ automatyczny * API Apple NSLyoutConstraint SDK * Język formatu wizualnego Apple * Apple Interface Builder * Biblioteka innej firmy * Czysty układ * Masonry/KeepLayout * Układ nieautomatyczny Dzięki!


title: Jakiego wzoru równoległego użyć?

text: Muszę napisać aplikację serwerową, która będzie pobierać wiadomości z różnych serwerów pocztowych/skrzynek pocztowych, a następnie przetwarzać/analizować te wiadomości. Tradycyjnie robiłbym to wielowątkowo, uruchamiając wątek do pobierania wiadomości e-mail (lub może jeden na skrzynkę pocztową), a następnie przetwarzać wiadomości e-mail. Coraz częściej przenosimy się na serwery, na których mamy 8+ rdzeni, więc chciałbym wykorzystać te rdzenie w jak największym stopniu (i nie używać 1 na 100% i pozostawić siedem pozostałych nietkniętych). Tak więc koncepcyjnie, jako przykład, fajnie byłoby, gdybym mógł napisać aplikację w taki sposób, że dwa rdzenie „w sposób ciągły” pobierają wiadomości, a cztery rdzenie „w sposób ciągły” przetwarzają/analizują wiadomości e-mail (ponieważ przetwarzanie i analizowanie wiadomości jest bardziej Intensywnie obciąża procesor niż pobieranie wiadomości). Wydaje się to dobrym pomysłem, ale po przestudiowaniu kilku równoległych wzorców nie jestem pewien, jak najlepiej to zaimplementować. Żaden ze wzorów naprawdę nie pasuje. Pracuję w VS2012, natywnym C++, ale myślę, że z punktu widzenia projektowania nie ma to większego znaczenia i tylko kilka wskazówek, jak to zorganizować, byłoby świetne!


title: Kiedy w cyklu życia projektu zmieściłbyś się w zewnętrznych testach penetracyjnych/bezpieczeństwa oprogramowania?

text: Zakładając, że pracujesz nad oprogramowaniem, które musi przejść test bezpieczeństwa/penetracji innej firmy przed udostępnieniem go klientowi, w którym momencie cyklu życia projektu wykonałbyś testy? Zaliczenie testu oznacza, że nie zostały wykryte żadne poważne wady lub, co bardziej prawdopodobne, wszelkie wykryte wady zostały odpowiednio poprawione przed wydaniem.


title: Jak ważne jest wybranie najlepszego IDE dla wybranego języka programowania?

text: Kiedy nauczyłem się podstawowych języków programowania, natknąłem się na dziesiątki IDE i dziesiątki kompilatorów. Większość osób, o które pytasz, powie ci „Idź z tym IDE lub idź z najlepszym” itp., Jednak nie podają odpowiedniego oświadczenia, dlaczego jest to ważne. Rozumiem, że dobre IDE zapewni Ci funkcje pozwalające zaoszczędzić czas i pieniądze, takie jak debugowanie lub szybkie wypełnianie słów, ale wątpię, by to był główny powód, dla którego programista wybiera dobre IDE. W szkole pracujemy na starych kompilatorach (pieniądze prawdopodobnie nie są powodem), ponieważ działa teoria „Dopóki się uczysz, to jest dobre”. Najważniejsze pytanie brzmi: jak ważne jest, aby wybrać najlepsze IDE dla swojego języka programowania? Masz Eclipse dla Javy, C++, Pythona i nie tylko, ale czy nie możesz po prostu użyć innego? Jaka różnica między dobrym IDE a umiejętnościami programowania lub czasem programowania?


title: Podwójne licencjonowanie LGPL 2.1 i LGPL 3

text: Utrzymuję oprogramowanie, małą bibliotekę PHP, wydaną na licencji LGPL w wersji 3 (LGPLv3). Ktoś chce wykorzystać bibliotekę w swoim oprogramowaniu na licencji GPL w wersji 2. Ta matryca zgodności licencji sugeruje, że nie jest to możliwe bez zmiany warunków licencyjnych jednego z programów. Zostałem poproszony o udzielenie podwójnej licencji na mój kod w ramach LGPLv2.1 i LGPLv3. Czy to ma sens i jakie mogą być wady? Dziękuję Ci.


title: Wiele zamówień na jednej liście

text: Mam problem z systemem rankingowym, którego używam. Scenariusz: Gra online z około 10 000 graczy oblicza ranking punktów w czasie rzeczywistym, gdy nastąpi określone wydarzenie. Zdarzenia nie zdarzają się tak często, około 1 raz na minutę. Ranking ten jest przechowywany w pamięci podręcznej dla szybkich obliczeń, sortowania i dostępu. Teraz gracze mogą tworzyć grupy i grać przeciwko sobie, ale system punktacji jest taki sam, tylko ranking opiera się na graczach z tej grupy. Na początku stworzyłem dla każdej grupy osobny ranking, faktycznie mający takie same wyniki jak cały ranking, ale z różnymi pozycjami w rankingu. Jest to trywialne, ponieważ istnieje ponad 1000 grup i za każdym razem, gdy ma miejsce wydarzenie, wszystkie grupy musiałyby zostać zaktualizowane. Więc to, co zrobiłem teraz, to kiedy zażądano rankingu grupowego, weź tylko graczy, którzy są w tej grupie z pełnego rankingu i pokaż ich. Pozycje musiałyby zostać ponownie przeliczone. Problem polega na ponownym liczeniu. Ponieważ podlista jest odniesieniem z pełnej listy rankingowej, nie mogę zmienić pozycji gracza w podrankingu bez aktualizacji jej w pełnym rankingu, ponieważ jest to tylko odniesienie. Wymyśliłem dwa rozwiązania: * Utwórz kopię z rekordu za każdym razem, gdy jest to wymagane i wykonaj buforowanie danych wyjściowych (nie jest to zbyt pożądane, ponieważ rankingi są na żywo) * Utwórz kopię i przechowuj ją w pamięci podręcznej, która jest resetowana po zdarzeniu występuje. * Utwórz podlistę zawierającą tylko pozycje, które są aktualizowane w przypadku wystąpienia zdarzenia. I ostatnie rozwiązanie: licz pozycje na wyjściu zamiast po stronie biznesowej. Byłoby to najlepsze rozwiązanie, jedynym problemem jest to, że na niektórych stronach pojawia się tekst: „Jesteś na pozycji # w rankingu”, gdzie # to Twoja pozycja w rankingu. Ten numer byłby wtedy żmudny. Czy ktoś ma jakieś sugestie dotyczące tego problemu?


title: Wyświetlaj dynamiczną zawartość z wbudowanego serwera WWW

text: Mam wbudowane urządzenie z odchudzoną wersją serwera HTTP. Obecnie może wyświetlać statyczne strony HTML. Oto przykład, jak wyświetla statyczną stronę HTML: char *text="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n" "Witaj Świat!"; IPWrite(socket, (uint8*)tekst, (int)strlen(tekst)); IPZamknij (gniazdo); To, co chciałbym zrobić, to wyświetlać treści dynamiczne, m.in. odczyt z czujnika. Do tej pory myślałem o odświeżeniu strony co jakiś czas za pomocą <meta http-equiv="refresh" content="600"> i użyciu sprintf(), aby dołączyć odczyt czujnika do zmiennej _text_ w celu uzyskania odpowiedzi. Czy mogę to zrobić bez konieczności ciągłego odświeżania strony?


title: Czy istnieją rzeczywiste studia przypadków dotyczące przepisywania wskaźników sukcesu/niepowodzenia oprogramowania?

text: Widziałem wiele postów na temat przepisywania aplikacji, które są złe, doświadczenia ludzi na ten temat tutaj na Programistach i artykuł, który przygotowałem na ten temat napisany przez Joela Spolsky'ego, ale nie ma twardych dowodów ani studiów przypadku. Poza dwoma przykładami, które podał Joel i kilkoma innymi postami tutaj, co robisz ze złym kodem i jak decydujesz, co z nim zrobić, opierając się na prawdziwych badaniach? Na przykład są dwaj klienci, o których wiem, że obaj mają stary, starszy kod. Ciągle kuleje wraz z tym, ponieważ jak jeden z nich się dowiedział, przepisanie było katastrofą, było drogie i tak naprawdę nie działało, aby ulepszyć kod. Ten klient ma bardzo skomplikowaną logikę biznesową, o czym szybko przekonali się redaktorzy. W obu przypadkach są to aplikacje o znaczeniu krytycznym, które przynoszą firmie duże przychody. Ten, który próbował przepisać, czuł, że uderzy w ceglaną ścianę, jeśli starsze oprogramowanie nie zostanie zaktualizowane w pewnym momencie w przyszłości. Dla mnie tego rodzaju ryzyko wymaga badań i analiz, aby zapewnić udaną ścieżkę. Czy istniały rzeczywiste studia przypadków, które to zbadały? Nie chciałbym podejmować poważnych przeróbek bez znajomości najlepszych praktyk, pułapek i sukcesów opartych na rzeczywistych badaniach. **Następstwa:** ok, po dalszych poszukiwaniach znalazłem trzy interesujące artykuły na temat studiów przypadku: 1. Przepisz lub użyj ponownie. Przeprowadzili badanie dotyczące aplikacji Cobol, która została przekonwertowana na Javę. 2. Drugi dotyczył ponownego wykorzystania oprogramowania: Doświadczenia i opinie programistów. 3. Ponowne użycie lub przepisanie Kolejne badanie dotyczące kosztów utrzymania w porównaniu z przepisywaniem. Niedawno znalazłem inny artykuł na ten temat: The Great Rewrite. Wydaje się, że autor natrafił tam na niektóre z głównych kwestii. Wraz z tym pojawił się pomysł prototypowania przy użyciu proponowanego stosu nowych technologii i mierzenia, jak szybko twórcy go podnieśli. To wszystko było preludium do przepisania, co moim zdaniem było świetnym pomysłem!


title: Struktura danych używana do złożonych wyszukiwań w silniku zdarzeń?

text: Jaki byłby optymalny sposób organizowania dowolnych typów danych w strukturę, która pozwala na złożone (nieoparte na indeksie) wyszukiwania danych bez wykonywania pełnych pętli? Na małym tle nie szukam odpowiedzi, jak zaprojektować silnik zdarzeń, a raczej szukam metod usprawnienia obecnej implementacji. W 5 sekundowej wycieczce mam architekturę z następującymi komponentami, * Sygnały - Sygnały, które uchwyty do wykonania * Uchwyty - Wykonuje po otrzymaniu sygnału * Kolejka - Zarządza uchwytami * Silnik - Zarządza kolejkami i przetwarza sygnały, nowe uchwyty itp. Moja obecna implementacja ma kilka pułapek, 1. Sygnały są obecnie połączone w kolejkę, dzięki czemu silnik może zidentyfikować kolejki w pamięci i sygnały, które reprezentują. 2. Istnieją dwa oddzielne magazyny kolejek, indeksowane i nieindeksowane, indeks istnieje dla wyszukiwań na ciągach / int, brak indeksu dla złożonych sygnałów, takich jak regex, porównania tablic itp. Myślę, że mogę mieć rozwiązanie, ale bym jak myśli innych, którzy rozwinęli podobne systemy. Z nową architekturą, o której myślałem, składałaby się ona z następujących elementów: 1. Kolejki przechowywałyby tylko właściwość „data”, a nie sygnał, który byłby przekazywany do silnika w celu porównania sygnałów. 2. Silnik nie miałby już magazynu bez indeksów i indeksów, a raczej byłby używany pojedynczy magazyn, który wymagałby wyszukiwania w pętli. Biblioteka jest napisana w PHP (jeśli to ma znaczenie), jeśli chcesz zobaczyć źródło, to jest na http://www.github.com/nwhitingx/prggmr.


title: Testowanie jednostkowe/integracyjne mojego DAL

text: Więc zrobiłem trochę badań na ten temat, ale nie mogłem dojść do końca, więc pomyślałem, że zapytam, czy mogę uzyskać inne opinie. Cały mój dostęp do bazy danych jest obecnie wykonywany za pomocą procedur składowanych. Nie będę wykonywać bezpośrednich połączeń za pomocą niestandardowych zapytań. Z tego powodu mój DAL będzie całkiem prosty. Zasadniczo będzie zawierał tylko kilka metod, które w mniejszym lub większym stopniu łączą różne procedury składowane w bazie danych. Zawsze będzie zsynchronizowany z istniejącymi procedurami i nigdy nie będzie odwoływał się do bazy danych w żaden inny sposób. Nie jestem pewien, czy jest to najlepszy sposób na robienie rzeczy, i zdaję sobie sprawę z zalet i wad korzystania tylko z procedur składowanych, ale tak po prostu wybrałem. Myślę, że na dłuższą metę będzie to najczystsze. Ale chcę przetestować ten DAL. Chcę to przetestować na niskim poziomie, w przeciwieństwie do testowania tylko za pośrednictwem obiektów biznesowych, które będą powiązane z tymi wywołaniami. Myślę, że zrobienie tego da mi pewność, że procedury działają poprawnie, a na wysokim poziomie mogę to po prostu wykpić i przetestować logikę biznesową - ale walczę z tym, jak testuję te rzeczy. Jeśli piszę testy jednostkowe według książki, wyśmiewałbym rzeczywiste wywołania do bazy danych i po prostu upewniłbym się, że są one wywoływane, lub utworzył kilka kodów pośredniczących lub cokolwiek, które zwracają fałszywe dane i zrobię to w ten sposób (oba upewnij się, że funkcja jest faktycznie nazywany). Jednak co z tego, jeśli _jedyną_ rzeczą, którą robią te metody, jest pobieranie parametrów i wywoływanie procedury składowanej? Wszystko, co robiłbym, to upewnianie się, że wywołuję metodę z testu mniej więcej, a to wydaje się ogromną stratą czasu i nie jest tak skuteczne. Teraz, jeśli przetestuję te rzeczy integracyjne, mógłbym mieć do czynienia z prawdziwymi danymi testowymi, prawdziwymi wywołaniami baz danych, co jest w porządku, ale wtedy nie byłoby to w 100% uważane za test jednostkowy, a ponieważ w Business Objects wyśmiewam je woła, technicznie rzecz biorąc, nigdy nie miałbym oficjalnych testów jednostkowych dla tych rzeczy, tylko te integracyjne. Czy to wszystko ma sens? Zasadniczo wydaje mi się, że to w porządku. Przeprowadź testy integracji dla DAL i niech będzie to jedyny czas testowania samego DAL. Kiedy testuję logikę biznesową i wyśmiewam DAL, wiedziałbym, że poprawnie obsługuje dane, a to byłoby dla mnie wystarczająco pocieszające. Pytam, czy podchodzę do tego prawidłowo? Czy jest coś jeszcze, co robicie, czego mi tutaj brakuje, co mogłoby rzucić trochę światła na te rzeczy? Wszelkie opinie są mile widziane :)


title: Dlaczego dołączony szablon MVC3 firmy Microsoft nie jest zgodny z grubymi modelami, chudymi kontrolerami?

text: **Z własnego, wbudowanego szablonu Microsoft dla MVC3** Model jest bardzo chudy, w zasadzie nie ma kodu. **Model** public class RegisterModel { [Wymagane] [Wyświetlanie(Nazwa = "Nazwa użytkownika")] public string NazwaUżytkownika { get; ustawić; } [Wymagane] [DataType(DataType.EmailAddress)] [Display(Name = "Adres e-mail")] ciąg publiczny Email { get; ustawić; } [Wymagane] [StringLength(100, ErrorMessage = "{0} musi mieć co najmniej {2} znaków.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password") ] ciąg publiczny Hasło { get; ustawić; } [DataType(DataType.Password)] [Display(Name = "Potwierdź hasło")] [Compare("Password", ErrorMessage = "Hasło i hasło potwierdzające nie są zgodne.")] public string ConfirmPassword { get; ustawić; } } Chociaż kontroler z drugiej strony wydaje się gruby, robi więcej niż proste routing... **Controller** [HttpPost] [AllowAnonymous] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { // Próba zarejestrowania użytkownika MembershipCreateStatus createStatus; Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus); if (createStatus == MembershipCreateStatus.Success) { FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */); return RedirectToAction("Indeks", "Strona główna"); } else { ModelState.AddModelError("", ErrorCodeToString(createStatus)); } } // Jeśli doszliśmy tak daleko, coś się nie udało, wyświetl ponownie formularz return View(model); }


title: Czy nauka więcej niż jednego języka programowania jako początkujący jest myląca?

text: Intuicyjnie wydaje się, że tak może być. Czy istnieją prawdziwe badania lub wiarygodne dane anegdotyczne (tak, proszę) potwierdzające (lub zaprzeczające) tej teorii?


title: Które samobalansujące drzewo binarne poleciłbyś?

text: Uczę się Haskella i jako ćwiczenie tworzę drzewa binarne. Po stworzeniu zwykłego drzewa binarnego chcę dostosować je do samobalansowania. A więc: * Który jest najbardziej wydajny? * Który jest najłatwiejszy do wdrożenia? * Który jest najczęściej używany? Ale przede wszystkim, co polecasz? _Zakładam, że to należy tutaj, ponieważ jest otwarte na debatę._


title: Dlaczego musimy używać divów?

text:
Dziś rano, kiedy pisałem trochę html i haml, przyszło mi do głowy, że sposób używania divów jest śmieszny. Dlaczego znaki div nie są implikowane? Wyobraź sobie, że to:

 było to: <hero-img>  </hero-img> Gdyby założyć część elementu „div class”, HTML byłby bardziej semantyczny i nieskończenie bardziej czytelny z pasującymi znacznikami zamykającymi! Jest to podobne do HAML, gdzie mamy: .content Witaj świecie! Który staje się:
Witaj świecie!
 Wydaje mi się, że jedyną rzeczą, która musiałaby się wydarzyć, aby to zadziałało w przeglądarkach, jest to, że przeglądarki mogą zacząć interpretować każdy element bez istniejącego kodu HTML definicja elementu jako implikująca `<div class="<nazwa elementu>">`. Może to być całkowicie kompatybilne wstecz; w przypadku selektorów CSS i jQuery itp. „div.hero-img” może nadal działać i być wymaganą składnią do wybierania elementów. Wiem o nowej specyfikacji komponentów webowych, ale jest to znacznie bardziej skomplikowane niż to, co jest sugerowane tutaj. Czy możesz sobie wyobrazić, jak przyjemnie byłoby zajrzeć do źródła strony i zobaczyć html, który wyglądał tak?! Dlaczego więc musimy używać divów? Jeśli spojrzysz na listę elementów html5 Mozilli, każdy element ma znaczenie semantyczne, a potem dojdziemy do `<div>` i mówi: „Reprezentuje ogólny kontener bez specjalnego znaczenia”. ..a następnie wymieniają dowolne elementy, które dodają do html5, np. `<details>`. Oczywiście, gdyby ta koncepcja implikowanych divów została dodana do specyfikacji html, zajęłoby to dziesięć lat, aby stać się standardem, co oznacza milion lat w czasie sieciowym. Więc myślę, że musi być dobry powód, dla którego to się jeszcze nie wydarzyło. Proszę, wyjaśnij mi to!


title: Czy istnieją jakieś znaczące korzyści z używania języka ojczystego do tworzenia aplikacji mobilnych?

text: Wybacz mi, jeśli na to pytanie już udzielono odpowiedzi, ale nie mogłem znaleźć odpowiedzi, której szukałem. Chciałem wiedzieć, czy jest jakaś znacząca korzyść z używania języka natywnego podczas tworzenia i wdrażania aplikacji w środowisku mobilnym? Powodem, dla którego pytam, jest to, że od dłuższego czasu używam Objective-C, natywnego języka Apple dla iOS, do tworzenia moich aplikacji. Jednak zastanawiałem się, czy jest jakaś realna korzyść z robienia tego, czy nie, nad używaniem języka obcego, takiego jak JavaScript, a następnie wdrażaniem go za pośrednictwem usługi takiej jak „Phone Gap”? Podkreślam _'znaczące'_ zalety, ponieważ języki natywne zawsze mają większą przewagę, jeśli chodzi o szybkość i dostęp do najnowszych interfejsów API. Jednak generalnie nie widzę używania języka obcego lub usługi takiej jak „Przerwa w telefonie” powodującej i poważnie spowalniającej moje aplikacje lub ograniczającej mój rozwój. Dodatkowo posiadanie możliwości wdrażania w wielu usługach jest również bardzo przydatne. Dlatego zadaję pytanie, czy są jakieś znaczące korzyści z używania języka ojczystego do tworzenia aplikacji mobilnych?


title: Pisanie umowy partnerskiej dla strony internetowej

text: Mój szef zaoferował mi 25% udziału, w zamian za większy wkład z mojej strony, strony internetowej (silnik indeksujący w php i frontend wykorzystujący ajax), którą dla niego stworzyłem. Jakie rzeczy powinienem wziąć pod uwagę na piśmie w umowie, aby mój udział był zabezpieczony na przyszłość?


title: TDD z ograniczonymi zasobami

text: Pracuję w dużej firmie, ale w zaledwie dwuosobowym zespole tworzącym desktopowe aplikacje LOB. Zajmuję się TDD od dłuższego czasu i chociaż łatwo jest dostrzec jego zalety w większych aplikacjach, trudno mi uzasadnić czas rozpoczęcia korzystania z TDD na skalę naszych aplikacji. Rozumiem jego zalety w automatyzacji testów, poprawie pielęgnowalności itp., ale na naszą skalę pisanie nawet podstawowych testów jednostkowych dla wszystkich naszych komponentów może z łatwością podwoić czas rozwoju. Ponieważ mamy już zbyt mało personelu i ekstremalne terminy, nie jestem pewien, w jakim kierunku iść. Podczas gdy inne praktyki, takie jak zwinne iteracyjne tworzenie oprogramowania, są doskonałe od tego czasu, jestem trochę rozdarty z powodu kompromisów produktywności TDD w małym zespole. **Czy zalety TDD są warte dodatkowego czasu na rozwój w małych zespołach o bardzo napiętych harmonogramach?**


title: Klasy danych: gettery i settery lub projektowanie różnych metod

text: Próbowałem zaprojektować interfejs dla klasy danych, którą piszę. Ta klasa przechowuje style znaków, na przykład czy znak jest pogrubiony, kursywa czy podkreślony. Ale także rozmiar czcionki i rodzina czcionek. Więc ma różne typy zmiennych składowych. Najłatwiejszym sposobem na zaimplementowanie tego byłoby dodanie pobierających i ustawiających dla każdej zmiennej składowej, ale to po prostu wydaje mi się niewłaściwe. Wydaje się o wiele bardziej logiczne (i więcej OOP), aby wywołać `style.format(BOLD, true)` zamiast `style.setBold(true)`. Więc użyć metod logicznych zamiast getterów/setterów. Ale podczas implementacji tych metod napotykam dwa problemy: potrzebowałbym dużej instrukcji switch ze wszystkimi zmiennymi składowymi, ponieważ nie można uzyskać dostępu do zmiennej przez zawartość ciągu w C++. Co więcej, nie możesz przeciążać przez typ zwracany, co oznacza, że nie możesz napisać jednego gettera, takiego jak `style.getFormatting(BOLD)` (wiem, że jest kilka trików, aby to zrobić, ale te nie pozwalają na parametry, które oczywiście bym potrzebował). Jednak gdybym miał zaimplementować gettery i settery, są też problemy. Musiałbym zduplikować sporo kodu, ponieważ style mogą mieć również style nadrzędne, co oznacza, że pobierający muszą patrzeć nie tylko na zmienne składowe tego stylu, ale także na zmienne stylów nadrzędnych. Ponieważ nie byłem w stanie wymyślić, jak to zrobić, postanowiłem zadać pytanie kilka tygodni temu. Zobacz Programowanie zorientowane obiektowo: metody pobierające/ustawiające lub nazwy logiczne. Ale w tym pytaniu nie podkreśliłem, że będzie to tylko obiekt danych i że nie tworzę silnika renderującego tekst, co było powodem, dla którego jedna z osób, które odpowiedziały, zasugerowała, żebym zadał inne pytanie podczas wyjaśniania tego (ponieważ jego rozwiązanie, wzór dekoratora, nie pasuje do mojego problemu). Proszę zauważyć, że nie tworzę własnego silnika renderującego tekst, po prostu używam tych klas do przechowywania danych. Ponieważ nadal nie udało mi się znaleźć rozwiązania tego problemu, chciałbym zadać to pytanie ponownie: jak zaprojektowałbyś taką klasę stylów? A dlaczego miałbyś to zrobić?


title: Jedna strona używająca ciągu zapytania czy wiele folderów i stron?

text: Mam aplikację, w której mam kod 'core' w jednym folderze, dla którego w katalogu głównym znajduje się katalog wirtualny, dzięki czemu mogę dołączyć dowolne pliki rdzenia za pomocą /myApp/core/bla.asp. Następnie mam dwa foldery poza tym z default.asp, które obecnie używają ciągu zapytania do określenia, jaka strona powinna być wyświetlana. Jedna strona jest przeznaczona dla zwykłych użytkowników, druga będzie dostępna tylko dla użytkowników, którzy mają uprawnienia do zarządzania użytkownikami / grupami użytkowników / uprawnieniami. Podstawowy kod sprawdza ciąg zapytania, a następnie sprawdza uprawnienia dla tego użytkownika. Przykładem tego w obecnej postaci jest default.asp?action=view&viewtype=list&objectid=server. Nie martwię się o SEO, ponieważ jest to aplikacja wewnętrzna i korzysta z Windows Auth. Moje pytanie brzmi, czy jest lepiej tak, jak jest teraz, czy też lepiej byłoby mieć coś takiego: * /server/view/list/ * /server/view/?id=123 * /server/create/ * / server/edit/?id=123 * /server/remove/?id=123 W powyższych folderach miałbym stronę domową, która definiuje wszystkie zmienne, które są aktualnie określone w ciągu zapytania - np. w /server/create/ Zdefiniowałbym akcję jako 'create', nazwę obiektu jako 'server' i tak dalej. Jeśli chodzi o dalszy rozwój, naprawdę nie mam pojęcia, która metoda byłaby najlepsza. Myślę, że druga metoda byłaby najlepsza, jeśli chodzi o śledzenie, która strona robi co, ale jest to tak duża zmiana do wprowadzenia na tym etapie, że bardzo chciałbym trochę opinii, najlepiej opartych na doświadczeniu. PS Przepraszam, jeśli tagi są błędne - jestem nowy na tym forum i pomyślałem, że to trochę za dużo dyskusji dla StackOverflow, ponieważ jest to bardzo dobra / zła odpowiedź. Wpadłem na pomysł, że SE jest bardziej oparte na dyskusji.


title: C Minishell Drukowanie bezużytecznych rozszerzeń poleceń

text: Piszę minishell uniksowy w C i jestem w punkcie, w którym dodaję rozszerzenie poleceń. Mam na myśli to, że mogę zagnieżdżać polecenia w innych poleceniach, na przykład: $> echo hello $(echo world! ... $(echo i takie tam)) hello world! ... i takie tam, myślę, że to działa głównie, jednak nie oznacza poprawnie końca rozszerzonego ciągu, na przykład, jeśli robię: $> echo a $(echo b $(echo c)) a b c $> echo d $(echo e) d e c Zobacz, że wypisuje c, nawet jeśli o to nie prosiłem. Oto mój kod: msh.c - http://pastebin.com/sd6DZYwB expand.c - http://pastebin.com/uLqvFGPw Mam więcej kodu, ale jest go dużo, a to są części, które Mam w tej chwili problem. Postaram się opowiedzieć, w jaki sposób to robię. Main znajduje się w msh.c, tutaj pobiera linię danych wejściowych z wiersza poleceń lub pliku powłoki, a następnie wywołuje linię procesową (char *line, int outFD, int waitFlag), gdzie line to linia, którą właśnie otrzymaliśmy, outFD to deskryptor pliku wyjściowego, a waitFlag mówi nam, czy powinniśmy czekać, czy nie. Kiedy nazywamy to z main robimy to tak: processline (bufor, 1, 1); W linii procesu alokujemy nową linię: char expand_line[EXPANDEDLEN]; Następnie wywołujemy expand, w expand.c: expand(line, expand_line, EXPANDEDLEN); W expand kopiujemy znaki dosłownie z linii do expand_line, aż znajdziemy $(, które następnie wywołuje: static int expCmdOutput(char *orig, char *new, int *oldl_ind, int *newl_ind) orig to linia, a new to rozwinięta linia oldl_ind i newl_ind to odpowiednio bieżące pozycje w linii i rozwiniętej linii Następnie potokiem i rekurencyjnie wywołujemy linię procesową, przekazując jej zagnieżdżone polecenie (na przykład, jeśli mamy "echo a $(echo b)", przekażemy linię procesową „echo b"). W tym miejscu zaczynam się mylić, za każdym razem, gdy wywoływane jest expand, czy to alokuje nowy kawałek pamięci EXPANDEDLEN long? Jeśli tak, to źle, bo naprawdę zabraknie mi miejsca na stosie szybko (w przypadku bardzo zagnieżdżonych danych wejściowych w wierszu poleceń).W expand wstawiam znak null na końcu rozwiniętego ciągu, więc dlaczego drukuje po nim?Jeśli potrzebujesz więcej kodu lub wyjaśnień, po prostu zapytaj. Po drugie, umieściłem kod w pastebin, ponieważ jest go mnóstwo, a z mojego doświadczenia wynika, że ludziom się to nie podoba kiedy zapełnię kodem kilka stron. Dziękuję.


title: nazewnictwo funkcji: liczba mnoga „jeśli nie istnieje”

text: To jest pytanie o nazewnictwo funkcji. Piszę kod, który aktualizuje strukturę bazy danych zgodnie ze specyfikacją. Gdzieś w tym kodzie mam coś takiego: void createIndices(Table tbl){ for(Index idx: table.getIndices()){ if(notExists(idx)){ createIndex(idx); } } } void createIndex(Index idx){ ... } Jak widać, funkcja `createIndices` nie jest dobrze nazwana, ponieważ nie do końca tworzy indeksy. Tworzy tylko te indeksy, które jeszcze nie istnieją. Mogę wymyślić różne nazwy dla funkcji: * `createIndicesIfNotExist` * `createIndicesThatDoNotExist` * itd. Ponieważ jednak „jeśli nie istnieje” jest tak powtarzającym się idiomem w programowaniu, zastanawiałem się, czy istnieje jakiś standard dla jego liczby mnogiej. Podobnie jak `createIndexIfNotExists` można uznać za standardową formę liczby pojedynczej, nawet jeśli nie jest poprawna gramatycznie.


title: Funkcja owijania w zamknięciach w celu stworzenia funkcji testowalnych

text: W moim projekcie nodejs mam takie funkcje dla socketio. socket.on('draw', function (data) { socket.broadcast.to(socket.room).emit('draw', data); addEvent(socket, ["draw", data]); }); Chciałbym je przepisać na coś takiego: function onDraw(socket, config) { funkcja powrotu (dane) { socket.broadcast.to(socket.room).emit('draw', data); addEvent(gniazdo, ["rysuj", dane]); } } socket.on('draw', onDraw(socket, config)); Pomysł polega na tym, że umieszczając wszystkie moje funkcje w prostych domknięciach takich jak to, mogę umieścić je w różnych modułach i ułatwi to testowanie, przekazując obiekty makiety do funkcji, która konstruuje wywołanie zwrotne. **Zastanawiałem się, czy to przesada, czy może istnieje lepszy sposób na przetestowanie mojego kodu?**


title: Czy licencja open source na mój kod ogranicza mnie później?

text: Załóżmy, że opracowuję użyteczną bibliotekę i postanawiam opublikować ją jako open source. Jakiś czas później mam biznesową potrzebę zrobienia czegoś, co nie byłoby zgodne z licencją open source. Czy mogę to zrobić? Jak opublikować oprogramowanie w taki sposób, aby zachować prawo własności i w żaden sposób nie blokować sobie możliwości korzystania z biblioteki w przyszłości? Pamiętaj, że przynajmniej teoretycznie inni programiści mogą zdecydować się na udział w moim projekcie open source. Czy mogę określić w licencji, że ja jako pierwotny programista również otrzymam prawo własności do ich wkładu? Nie zrozum mnie źle, nie staram się być zły i uzyskać własność cudzej pracy - chcę tylko zachować własność mojej pracy, a jeśli ktoś opublikuje ważną poprawkę błędu, mogę być niezdolny do korzystania z oryginalnego kodu, chyba że Korzystam również z jego pracy.


title: Jak opłacalny jest doktorat z badań nad bezpieczeństwem oprogramowania?

text: Planuję zrobić doktorat z bezpieczeństwa oprogramowania. Moja szkoła przyznaje pełne stypendium na projekt "Wykrywanie luk bezpieczeństwa z kodu źródłowego i kodu binarnego". Czy warto go brać? Uważam, że bezpieczeństwo oprogramowania jest nieco nasyconą dziedziną, mam na myśli to, że na rynku dostępnych jest już wiele narzędzi do wykrywania luk w oprogramowaniu. Czy to nadal opłacalne pole badawcze? Czy bezpieczeństwo oprogramowania to rozwiązany problem?


title: Czy R6RS jest wstecznie kompatybilny z R5RS?

text: Czy nowy standard Scheme, R6RS, który został opublikowany w 2007 roku, jest wstecznie kompatybilny ze starszym standardem R5RS? Jeśli nie, czy w R6RS jest tryb zgodności?


title: Czy oddzielenie systemu członkostwa jest dobrą praktyką?

text: Obecnie rozwijam projekt, który w zasadzie opiera się na ASP.NET Web API. System członkostwa, którego używam, to ASP.NET Identity. Jedynym problemem, jaki widzę z tym, jest to, że system członkostwa jest silnie powiązany z interfejsem API, który buduję. W takim przypadku pomyślałem o budowaniu interfejsów, aby ujawnić funkcje systemu członkostwa, których potrzebuje aplikacja, a następnie użyć iniekcji zależności, aby wstrzyknąć bieżący system tożsamości. Jedyną rzeczą jest to, że przez cały czas, gdy szukałem w Internecie na temat uwierzytelniania i autoryzacji w ASP.NET, nigdy nie wydawało mi się, że to zrobiono. Więc zacząłem się zastanawiać, czy jest to dobra praktyka, czy nie. Czy to dobra praktyka, czy nie? Jeśli nie, dlaczego?


title: Jak radzisz sobie z obiektami, które wymagają niestandardowego zachowania i muszą istnieć jako jednostka w bazie danych?

text: Dla prostego przykładu załóżmy, że Twoja aplikacja wysyła powiadomienia do użytkowników w przypadku wystąpienia różnych zdarzeń. Tak więc w bazie danych mogę mieć następujące tabele: TABLE Event EventId uniqueidentifier EventName varchar TABLE User UserId uniqueidentifier Nazwa varchar TABLE EventSubscription EventUserId EventId UserId Same zdarzenia są generowane przez program. W aplikacji są więc zakodowane punkty, w których generowane jest wystąpienie zdarzenia, które musi powiadomić wszystkich subskrybowanych użytkowników. Tak więc sama aplikacja nie edytuje tabeli `Event`, z wyjątkiem początkowej instalacji i aktualizacji, w której może zostać utworzone nowe `Event`. W pewnym momencie, gdy generowane jest zdarzenie, aplikacja musi wyszukać „Zdarzenie” i uzyskać listę „Użytkowników”. Jaki jest najlepszy sposób połączenia zdarzenia w kodzie źródłowym ze zdarzeniem w bazie danych? ## Opcja 1: Zapisz `EventName` w programie jako stałą stałą i wyszukaj ją według nazwy. ## Opcja 2: Zapisz `EventId` w programie jako statyczny `Guid` i wyszukaj go według ID. ## Extra Credit W innych podobnych okolicznościach mogę chcieć dołączyć niestandardowe zachowanie do typu zdarzenia. Oznacza to, że będę potrzebował podklas mojej klasy encji `Event` z różnymi zachowaniami, a kiedy wyszukuję zdarzenie, chcę, aby zwróciło instancję mojej podklasy. Na przykład: class Event { public Guid Id { get; } publiczny Guid EventName { get; } public ReadOnlyCollection<EventSubscription> EventSubscriptions { get; } public void NotifySubscribers() { foreach(var eventSubscription w EventSubscriptions) { eventSubscription.Notify(); } this.OnSubscribersNotified(); } public virtual void OnSubscribersNotified() {} } class WakingEvent : Event { private readonly IWaker waker; public WakingEvent(IWaker waker) { if(waker == null) wyrzuć nowy ArgumentNullException("waker"); this.waker = budzący; } publiczne nadpisanie void OnSubscribersNotified() { this.waker.Wake(); base.OnSubscribersNotified(); } } Oznacza to, że muszę zmapować `WakingEvent` na dowolny klucz, którego używam do wyszukiwania go w bazie danych. Załóżmy, że to „Id zdarzenia”. Gdzie mam przechowywać tę relację? Czy znajduje się w klasie repozytorium zdarzeń? Czy `WakingEvent` powinien wiedzieć, że deklaruje swój własny identyfikator w statycznej składowej lub metodzie? ...a w takim razie, czy to wszystko na odwrót? Jeśli wszystkie zdarzenia mają podklasę, to zamiast pobierać zdarzenia według identyfikatora, powinienem prosić moje repozytorium o `WakingEvent` w ten sposób: public T GetEvent<T>() gdzie T : Event { ... // co tu idzie ? ... } Nie mogę być pierwszym, który się tym zajmie. Jaka jest najlepsza praktyka?


title: Czy dobrą praktyką jest używanie automatycznego formatowania tekstu?

text: Używam Eclipse i opowiem o tym jako przykładzie, ale jestem pewien, że tak jest w każdym innym IDE. Eclipse posiada komendę `CTRL`-`Shift`-`F`, która automatycznie formatuje kod. Czy korzystanie z tego rodzaju formatowania to dobra praktyka? Pytam w kontekście dużego projektu, w którym może być wielu programistów pracujących na tych samych plikach, a wszystkimi tymi administruje system CSV. Dziękuję Ci!


title: Krótkie wyjaśnienie plików wykonywalnych w łańcuchu narzędzi GNU/Clang?

text: Z grubsza rozumiem, że cc, ld i inne części są wywoływane w określonej kolejności zgodnie ze schematami, takimi jak Makefiles itp. Niektóre z tych poleceń są używane do generowania tych konfiguracji i plików Makefile. Do obsługi bibliotek używa się także innych narzędzi. Ale do czego służą inne części? Jak są nazywani w tym procesie? Które narzędzie używałoby różnych generatorów parserów? Która część jest opcjonalna? Czemu? Czy istnieje krótkie podsumowanie, aby wyjaśnić, w jaki sposób narzędzia w łańcuchu narzędzi GNU lub LLVM/Clang są zorganizowane i wywoływane w tworzeniu projektu C/C++? Z góry dziękuję. EDYCJA: Oto lista plików wykonywalnych dla Clang/LLVM na Mac OS X: ar clang dsymutil gperf libtool nmedit rpcgen unwinddump as clang++ dwarfdump gprof lorder otool segedit vgrind asa cmpdylib dyldinfo wcięcie m4 pagestuff rozmiar whatcatey gflex_allib++ ctags flex++ ld mkdep rebase unifdef cc ctf_insert gm4 lex nm redo_prebinding unifdefall


title: wskazówki, wskazówki, punkty, o których należy pamiętać przy renderowaniu profesjonalnego kodu?

text: Mówię o dawaniu klientom profesjonalnie wyglądającego kodu. Całe dziewięć jardów, wszystko, co robicie tutaj, co wy, profesjonalni, profesjonalni programiści z dużym doświadczeniem, prawdopodobnie robicie, kiedy kodujecie jako freelancer lub dla firmy, w której pracujecie. Jestem świeżo po studiach i zaczynam pracę jako freelancer. Chcę tylko mieć pewność, że moje pierwsze projekty zostawią w pamięci klientów dobry posmak profesjonalizmu. Kiedy wyszukiwałem w Google to, o co tutaj pytam, dostałem strony, które pokazywały różne witryny i narzędzia, które pozwalają tworzyć krzykliwe witryny i szablony itp. `Pakiet $N` i takie rzeczy. Nie pamiętam słowa, którego używają do tego eksperci. Standard, framework [wiem, że to nie to]. Angielski nie jest moim pierwszym językiem, więc przepraszam, że tak naprawdę nie znam dokładnego wyrażenia. Ten abstrakcyjny sposób pisania kodu, który sprawia, że nie wyglądasz na niechlujnego programistę. Wspomniany wyżej sposób programowania **stron internetowych i oprogramowania komputerowego [w python/C/C++/Java]**. EDYCJA: Mogę pracować nad gromadzeniem ogromnej wiedzy i know-how, budowaniem logiki itp. To, o co proszę, to standard/wytyczne programowania, które przestrzegacie, aby klient widząc kod poczuł, że jest to profesjonalne rozwiązanie. Podobnie jak bloki komentarzy, określony styl wcięć, coś w tym stylu. Czy jest na nim jakaś książka lub konkretna lista punktów za kodowanie typu przedsiębiorstwa? Zwłaszcza tutaj, jak w moim przypadku, do budowy stron internetowych [na razie php..] i oprogramowania desktopowego [c/c++/java/python]


title: Czy testy powinny znajdować się w tym samym pliku Ruby, czy w oddzielnych plikach Ruby?

text: Używając Selenium i Ruby do testów funkcjonalnych, martwię się o wydajność. Czy lepiej jest dodać wszystkie metody testowe do tego samego pliku Rubiego, czy powinienem umieścić każdą z nich w oddzielnych plikach kodu? Poniżej przykład ze wszystkimi testami w tym samym pliku: # kodowanie: utf-8 wymaga "selenium-webdriver" wymaga klasy "test/unit" Testy < Test::Unit::TestCase def setup @driver = Selenium::WebDriver.for :firefox @base_url = "http://mysite" @driver.manage.timeouts.implicit_wait = 30 @verification_errors = [] @wait = Selenium::WebDriver::Wait.new :timeout => 10 end def rozerwanie @driver. quit attach_equal [], @verification_errors end def element_present?(jak,co) @driver.find_element(jak,co) true rescue Selenium::WebDriver::Error::NoSuchElementError false end def Verify(&blk) yield rescue Test::Unit ::AssertionFailedError => ex @verification_errors << ex end def test_1 @driver.get(@ base_url + "/") # duży test tutaj end def test_2 @driver.get(@base_url + "/") # duży test tutaj end def test_3 @driver.get(@base_url + "/") # ogromny test tutaj end def test_4 @driver.get(@base_url + "/") # duży test tutaj end def test_5 @driver.get(@base_url + "/") # duży test tutaj end end


title: Metoda alternatywna do zależnej, zagnieżdżone instrukcje if sprawdzające wiele stanów

text: Czy istnieje prostszy sposób przetwarzania wielu stanów prawda/fałsz niż używanie zagnieżdżonych instrukcji if? Myślę, że jest, i byłoby to stworzenie sekwencji stanów, a następnie użycie funkcji takiej jak `kiedy`, aby określić, czy wszystkie stany są prawdziwe, i odrzucenie, jeśli nie. Zadaję pytanie, aby upewnić się, że nie ma preferowanego sposobu Clojure, aby to zrobić. Oto tło mojego problemu: mam aplikację, która opiera się na kilku plikach wejściowych. Aplikacja jest zależna od raportów danych w formacie .csv; nagłówki kolumn dla każdego raportu (również pliki .csv), dzięki czemu każdą sekwencję w sekwencji sekwencji można spakować razem z jej kolumnami w celu utworzenia mniejszej sekwencji; i pliki kolumn dla danych wyjściowych. Używam następujących funkcji, aby sprawdzić, czy plik jest obecny: (defn rodzaj [nazwa pliku] (let [f (File. nazwa pliku)] (cond (.isFile f) "plik" (.isDirectory f) "katalog" (. istnieje f) "inne" :else "(nie można znaleźć)" ))) (defn look-for [oczekiwany-typ-pliku] (let [znajdź-status (nazwa pliku-statu oczekiwany-typ)] znajdź-status)) A oto kilka pierwszych linijek wielokrotności if, która wygląda brzydko i jest trudna do utrzymania: (defn extract-re-values „Zwykła, staromodna podprocedura do przetwarzania wartości nieruchomości / ekstrakt z rachunków z trzeciego kwartału.” [ opts] (if (= (utl/look-for (:ifm1 opts) "f") 0) ; masz ponownie kolumny? (if (= (utl/look-for (:ifn1 opts) "f") 0) ; (if (= (utl/look-for (:ifm3 opts) "f") 0) ; czy masz kolumny wyjściowe wartości re? (if (= (utl/look-for (:ifm4 opts) "f") ) 0) ; g nie re_mixed_use_ratio kolumn? (let [re-in-col-nams (pierwszy (utl/fetch-csv-data (:ifm1 opts)))) re-in-data (utl/fetch-csv-data (:ifn1 opts)) cols-out (pierwszy (utl/fetch-csv-data (:ifm3 opts))) mu-val-cols-out (pierwszy (utl/fetch-csv-data (:ifm4 opts)))) chk-results (utl/ chk-seq-len re-in-col-nams (pierwsza re-in-data) re-rec-count)] Nie szukam dyskusji o najlepszym sposobie, ale co jest w Clojure, co ułatwia rozwiązanie problemu typu ten.


title: Dlaczego rozmiar sterty jest ustalony na maszynach JVM?

text: Czy ktoś może mi wyjaśnić, dlaczego JVM (nie sprawdzałem zbyt wielu, ale nigdy nie widziałem, aby nie robiło tego w ten sposób) muszą działać na stałym rozmiarze sterty? Wiem, że łatwiej jest ją zaimplementować na prostej, ciągłej stercie, ale Sun JVM ma już ponad dekadę, więc spodziewam się, że mieli czas, aby to poprawić. Konieczność zdefiniowania maksymalnego rozmiaru pamięci programu podczas uruchamiania wydaje się być czymś do zrobienia w latach 60., a ponadto występują złe interakcje z zarządzaniem pamięcią wirtualną systemu operacyjnego (pobieranie przez GC zamienionych danych, niemożność określenia, ile pamięci zajmuje proces Java _naprawdę_ używanie od strony systemu operacyjnego, ogromne ilości zmarnowanej przestrzeni VM (wiem, że nie obchodzi cię twoje fantazyjne 48-bitowe maszyny...)). Przypuszczam również, że różne smutne próby budowania małych systemów operacyjnych wewnątrz JVM (serwery aplikacji EE, OSGi) są przynajmniej częściowo odpowiedzialne za tę okoliczność, ponieważ uruchamianie wielu procesów Java w systemie niezmiennie prowadzi do marnowania zasobów, ponieważ trzeba daj każdemu z nich pamięć, której może potrzebować w szczytowym momencie. Co zaskakujące, Google nie wywołało burzy oburzenia z powodu tego, czego bym się spodziewał, ale mogły po prostu zostać pochowane pod milionami ludzi, którzy dowiadują się o stałym rozmiarze stosu i po prostu akceptują to jako fakt.


title: Moja praca nie jest wykorzystywana... co mogę/ powinienem zrobić?

text: Kilka miesięcy temu zgłosiła się do mnie mała firma, która wcześniej widziała moją pracę i poprosiła o stworzenie dla nich strony internetowej. Od tego czasu strona nie zmieniła się ani trochę i nie usłyszałem od nich ani słowa. To jest dla nich do bani, ponieważ zapłacili za stronę internetową i nie korzystali z niej. Jest to dla mnie frustrujące, ponieważ spędziłem dużo czasu na stronie i czuję, że cały ten wysiłek poszedł na marne, a ponadto nie czuję, że mogę użyć strony w moim portfolio/ CV. Myślałem o zaoferowaniu, że udam się na jeden dzień do ich biura i od czasu do czasu zaktualizuję dla nich stronę internetową; ale potrzebowałbym ich wsparcia, gdy tam byłbym (aby uzyskać treść strony z informacjami, aby uzyskać informacje o ich produktach itp.) I nie chcę zakłócać ich dnia pracy, ani nie chcę siedzieć tam jak koło zapasowe i donikąd. Ponadto, jeśli miałbym to zrobić, czy powinienem oczekiwać, że otrzymam za to pieniądze? To dzień mojego życia, ale robię to dla własnej korzyści, a nie dla nich (ale oni też korzystają). Czy ktoś inny miał doświadczenie z klientem, który nie korzystał z jego produktu; jak sobie z tym poradziłeś? **Dodatkowe tło dla tych, którzy tego chcą:** Firma jest lokalnym biurem podróży, a strona internetowa udostępnia im oferty i lokalizacje CRUD oraz ma kilka innych statycznych stron (o firmie, kontakt itp.) W momencie tworzenia strony statycznej wypełniłem lipsum, a oferty i lokalizacje fałszywymi informacjami, aby dać firmie wyobrażenie o tym, jak będą wyglądały finalne strony; podczas przekazywania poprowadziłem ich przez formularze CRUD (robili notatki) i powiedziałem, że jeśli prześlą mi tekst na strony, zaktualizuję go.


title: Jak zarządzać plikiem języka skryptowego (na przykład Python)?

text: Piszę w Pythonie, ale uważam, że mogę umieścić wszystkie pliki skryptów w katalogu, ale wydaje się to bardzo niechlujne. Czy w społeczności istnieją jakieś konwencje dotyczące plików skryptów? Dziękuję.


title: Jak przełożyć formuły na formę języka naturalnego?

text: Ostatnio pracuję nad projektem, którego celem jest ocena, czy aplikacja na Androida ulega awarii, czy nie. Proces oceny to 1. Zbierz dzienniki (które rejestrują proces wykonywania aplikacji). 2. Generuj formuły, aby przewidzieć wynik (wzory są generowane przez GP) 3. Oceniaj logi według formuł Teraz mogę tworzyć formuły, ale dla wygody użytkowników chcę przetłumaczyć formuły na formę języka naturalnego i powiedzieć użytkownikom, dlaczego doszło do awarii .(Myślę, że to wygląda jak „odwrotne przetwarzanie języka naturalnego”.) Aby lepiej wyjaśnić tę ideę, wyobraź sobie, że masz taką formułę: 155 - count(onKeyDown) >= 148 To oczywiste, że jeśli count(onKeyDown) > 7, wynik "155 - count(onKeyDown) >= 148" jest fałszywy, więc log zawiera więcej niż 7 zdarzeń onKeyDown zostanie przewidzianych jako "Failed". Chcę pokazać użytkownikom, że jeśli zdarzenie onKeyDown pojawi się więcej niż 7 razy (155-148=7), ta aplikacja ulegnie awarii. Jednak prawdziwa formuła jest znacznie bardziej skomplikowana, na przykład: (< !( ( SUM( {Att[17]}, Event[5]) <= MAX( {Att[7]}, Att[0] >= Att [11]) OR SUM( {Att[17]}, Event[5]) > MIN( {Att[12]}, 734 > Att[19]) ) OR count(Event[5]) !=1 ) > (< count(Att[4] = Att[3]) >= count(702 != Att[8]) + 348 / SUM( {Att[13]}, 641 < Att[12]) mod 587 - SUMA( {Att[13]}, Att[10] < Att[15]) mod MAX( {Att[13]}, Event[2]) + 384 > count(Event[10]) != 1)) Próbowałem zaimplementuj tę funkcję przez C++, ale jest to dość trudne, oto fragment kodu, nad którym teraz pracuję. Czy ktoś wie, jak szybko zaimplementować tę funkcję? (może za pomocą jakichś narzędzi lub wyników badań?) Każdy pomysł jest mile widziany: ) Z góry dziękuję.


title: O kompilatorach, kodowaniu, dużych bazach kodu i innych rzeczach

text: To nie jest wyłącznie pytanie programistyczne. Pracuję w dużej firmie. Mamy dużo kodu napisanego w języku C++: 1. Wiele jednoczesnych projektów w toku i implementacji, które muszą być wspierane. 2. Wiele ścieżek kodu z pierwszego powodu. Niektóre mają około 10 lat. 3. Wiele platform docelowych. Większość kodu musi być standardowa. Kod specyficzny dla kompilatora jest niemile widziany. (Co jest dobrą rzeczą, jak sądzę) 4. Duża liczba procesów (>30 łatwo), z których każdy ma ponad 10k linii, nawet w mniejszych procesach. 5. Wielu programistów na proces, wiele procesów na programistę, wielu właścicieli procesu w czasie (którzy mogą być teraz niedostępni, ponieważ niektóre procesy miały sporą liczbę właścicieli). Oznacza to, że dla niektórych procesów nie ma określonego autorytetu w procesie. 6. Nie wszystkie funkcjonalności wszystkich procesów są wykorzystywane przez cały czas. Może istnieć wiele błędów w twoim procesie, o których nie wiesz, ponieważ nie spotkałeś się z sytuacją, w której pewna gałąź kodu jest wykonywana w czasie wykonywania. Wyeliminowanie tych wszystkich nie jest takie proste. 7. Ograniczenia czasowe i przydział do wielu projektów i wielu procesów oznaczają, że programiści zwykle nie mają wyboru, zamiast zadowolić się istniejącym kodem i próbować obejść ograniczenia, zamiast radykalnie zmieniać kodowanie procesu, aby mógł być dużo lepiej. 8. Większość procesów ma krytyczne znaczenie dla wydajności. Jest to ogromna zachęta dla ludzi do trzymania się kodowania w stylu C i unikania OOP. 9. użycie szablonów, STL i metaprogramowania prawie nie istnieje. 10. Korzystanie z bibliotek obcych jest prawie niemożliwe. czyli bez doładowania! Wyjątkiem jest Oracle. 11. Podstawowe potrzebne funkcjonalności są zaimplementowane w bibliotekach, które eksponują interfejsy w stylu C, które sprawiają, że wyglądasz jak idiota, jeśli próbujesz napisać coś w OOP lub używasz szablonów, ponieważ za każdym razem, gdy ich używasz, musisz je zawinąć, aby ukryć C jak interfejs lub po prostu zapomnij o wszystkim i rób C jak kodowanie. Nie wspominając o dodatkowych błędach, które możesz wprowadzić, próbując zawinąć. Same biblioteki były intensywnie używane i w większości przypadków są dość niezawodne. Naturalną skłonnością jest więc pójście z nimi w ograniczonym czasowo projekcie. 12. Ludzie nie są zbyt otwarci na nowe pomysły. Nie mam **ŻADNEGO** pomysłu, jak temu zaradzić. Sama jestem ciekawa i chętna do wypróbowania nowych rzeczy. Trudno mi zaakceptować, że inni ludzie tego nie robią. Zwłaszcza, gdy ci ludzie nie są na stanowiskach kierowniczych. Decyzje kierownictwa, które mogę tolerować, nawet jeśli się nie zgadzam. Ale co można zrobić z dekadencją deweloperów? P1: Jakie pytania powinienem sobie zadać? Proszę zauważyć, że uwielbiam C++ i nie mam najmniejszego zamiaru odchodzić z pracy, ponieważ firma jest świetna. I jest najlepszy w moim kraju. P2: Jakie są sposoby, w jakie mogę pomóc innym ulepszyć? P3: Rozmawiałem z kierownikiem programistów na temat aktualizacji naszego kompilatora do nowszej wersji, ponieważ ma on wiele fajnych funkcji w c++0x i pomyślałem, że im szybciej spróbujemy się do nich dostosować, tym lepiej. Jego zmartwieniem było związane z tym ryzyko. Rozumowanie: 1. Czy naprawdę potrzebujemy tych cech? 2. Nasz obecny główny system operacyjny nie obsługuje wersji kompilatora XXX. Oczywiście zawsze możemy użyć XXX, ale jeśli coś pójdzie nie tak, system operacyjny może powiedzieć „Hej, nie obsługujemy tego!”. 3. Musi to być proces stopniowy, a nie z dnia na dzień. (Moim zdaniem oznacza to, że zawsze powinniśmy być kilka lat lub więcej za obecnym frontem) Wiem, że nie jest to pytanie „tak, nie”, ale jakie jest właściwe podejście do tego problemu? P4: Czy wszystkie lub niektóre z powyższych głupich pytań? Dzięki za wszelkie uwagi. p.s. Napisanie tego uświadomiło mi również rzeczy, które wcześniej nie przyszły mi do głowy. Myślę więc, że nie poszłoby na marne, gdyby ktoś miał to zamknąć nawet bez jednej odpowiedzi (co mam nadzieję, że się nie stanie). :)


title: Jak oceniasz Hosting?

text: 1) Czas działania 2) Opóźnienia 3) Przepustowość 4) Oprogramowanie serwera, takie jak SQL itp. 5) $$$ — transfer, nadwyżki itp. Co jeszcze? I czy istnieje ocena hostów witryn internetowych według tych kryteriów, która jest rzeczywiście wiarygodna, a nie po prostu nieuczciwa witryna reklamowa ... czy macie jakieś zalecenia? (Przy okazji, ktoś z ponad 150 przedstawicielami powinien utworzyć tagi „hosting” i „webhosting”).


title: Jak mogę ułatwić przeglądanie kodu przez kogoś, kto nie zna języka?

text: Jestem w zespole, w którym jestem jedynym programistą Java. Reszta zespołu ma BARDZO doświadczenie we własnym języku programowania, ale ich obszar wiedzy nie jest zorientowany obiektowo. Za pierwszym razem, gdy miałem przegląd kodu, był to długi proces, który wymagał wielu stycznych, jak działa Java, jak działa OOP itp. Za drugim razem złapaliśmy się na czymś i musieli się wycofać, ponieważ trwało to zbyt długo. **Jak mogę ułatwić ten proces**? Desperacko chcę, aby mój kod został przejrzany, ponieważ sam jestem całkiem nowy w programowaniu w Javie i ogólnie w programowaniu, ale zajmuje to dużo czasu (zwłaszcza, że na przykład piszę dość duże fragmenty kodu poprzez refaktoryzację starego kodu, który ostatni programista Javy, nad którym pracował).


title: Wewnętrzne ujawnienie szczegółów implementacji dotyczących dziedziczenia

text: Czytam książkę "Efektywna Java", która sugeruje przedkładanie kompozycji nad dziedziczenie. Przykład, który podaje, pokazuje mniej więcej tak: public class InstrumentedHashSet<E> extends HashSet<E> { // Liczba prób wstawienia elementu private int addCount = 0; public InstrumentedHashSet() {} public InstrumentedHashSet(int initCap, float loadFactor) { super(initCap, loadFactor); } @Zastąp public boolean add(E e) { addCount++; zwróć super.dodaj(e); } @Override public boolean addAll(Collection<? extends E> c) { addCount += c.size(); return super.addAll(c); } public int getAddCount() { return addCount; } } Stanowi to problem, ponieważ implementacja `addAll` w `HashSet` wykorzystuje metodę `add`. Tak więc przy wywołaniu `addAll` każdy nowy element jest liczony dwukrotnie — raz w `addAll` i raz w `add`. W następnym rozdziale wyjaśniono, że jeśli zdecydujemy się na rozszerzenie naszej klasy, powinniśmy jawnie wyjaśnićwewnętrzne działanie naszych metod używających metod nadpisywalnych (co oznacza - w dokumentacji `addAll` powinniśmy określić jej użycie `add` i commit do tej realizacji **na zawsze** ). Myślę, że lepszą praktyką byłoby postanowienie, że każda metoda, która jest zarówno nadrzędną metodą API, jak i używana przez wewnętrzną implementację, powinna zostać wyodrębniona do wewnętrznej, prywatnej metody. Zatem nasz idealny `HashSet` miałby następujące metody: public class HashSet<E> implements Set<E> { // Ignoruj nieistotny kod @Override public boolean add(E e) { // Nowa implementacja add opakowuje tylko metodę innerAdd return wewnętrznyDodaj(e); } @Override public boolean addAll(Collection<? extends E> c) { // Wykonaj tę samą logikę co poprzednio, ale użyj innerAdd zamiast add } private boolean innerAdd(E e) { // Oryginalna logika dodawania zostanie przeniesiona tutaj } } W ten sposób hermetyzujemy wewnętrzną implementację i pozwalamy na rozszerzenie klasy bez obawy o przesłonięcie metody używanej przez wewnętrzną implementację. Oczywiście możemy użyć oryginalnego add jak poprzednio, ponieważ wywołując `super.add(e)` de facto używamy `innerAdd`, więc to nie jest problem. Chciałbym wiedzieć, czy to może być dobra praktyka (nie dla `HashSet<E>`, który jest już zatwierdzony do kodu, który go używa, ale do nowych klas, które mają zostać nadpisane)?


title: Jak utrzymać plik „LICENCJA”?

text: Wiele projektów na Github zawiera plik `LICENSE`, zwykle wyglądający tak: Copyright (C) 2012-2013 Mr. Creator Uprawnienie jest niniejszym udzielane bezpłatnie każdej osobie uzyskującej kopię tego oprogramowania i powiązanych plików dokumentacji („ Oprogramowania”), w celu korzystania z Oprogramowania bez ograniczeń, w tym między innymi praw do używania, kopiowania, modyfikowania, łączenia, publikowania, rozpowszechniania, udzielania sublicencji i/lub sprzedaży kopii Oprogramowania oraz zezwalania osobom, którym Oprogramowanie jest dostarczona do tego, pod następującymi warunkami: ...itd... Moje problemy to: 1. Jeśli tworzę projekt, czy powinienem dodać nazwę każdego kontrybutora w `LICENCJI`? 2. Jeśli rozwidlam projekt innej osoby, czy powinienem dodać swoje imię w jego `LICENCJI`? 3. Co jeśli dodam kilka plików na innej licencji?


title: Czy hadoop jest przeznaczony tylko do „prostych” zadań przetwarzania danych, w których komunikacja między rozproszonymi węzłami jest rzadka?

text: Nie jestem zawodowym koderem, a raczej inżynierem/matematykiem, który używa komputera do rozwiązywania problemów numerycznych. Jak dotąd większość moich problemów dotyczy matematyki, takich jak rozwiązywanie wielkoskalowych systemów liniowych, wykonywanie operacji algebry liniowej, fft, optymalizacja matematyczna itp. Na mniejszą skalę najlepiej radzi sobie z nimi Matlab (i podobne wysokopoziomowe pakiety matematyczne). . Jednak na dużą skalę muszę uciekać się do staroświeckich (i BARDZO ŻMUDUJĄCYCH) języków niższego poziomu, takich jak Fortran czy C/C++. To nie wszystko, gdy problem staje się zbyt duży, równoległość staje się konieczna, a MPI pod tym względem to koszmar, z którym trzeba się zmagać. Ostatnio regularnie słyszę o hadoop i „big data”. Ale moje wrażenie było takie, że hadoop NIE jest paradygmatem obliczeń równoległych ogólnego przeznaczenia, w tym sensie, że obsługuje dane, które wymagają minimalnej wzajemnej komunikacji (popraw mnie, jeśli się mylę). Na przykład w ogólnej operacji LA na dużym zbiorze danych rozproszonym między wiele węzłów, zamiast przetwarzać własne dane niezależnie, każdy węzeł musi komunikować się z KAŻDYM innym węzłem, aby wysłać/pobrać informacje, zanim jego własne dane będą mogły zostać poprawnie przetworzone, a cały zestaw danych jest aktualizowany dopiero po wykonaniu WSZYSTKICH komunikacji. Mam nadzieję, że jasno przedstawiłem swój punkt widzenia: w zastosowaniach numerycznych przetwarzanie danych jest naturalnie GLOBALNE, a „wykres” komunikacji często jest PEŁNYM WYKRESEM (chociaż SĄ wyjątki). Moje pytanie brzmi, czy hadoop nadaje się do tego celu, czy jest przeznaczony tylko do „prostych” zadań przetwarzania danych, w których komunikacja między rozproszonymi węzłami jest rzadka?


title: Czy wschodni algorytm PKUFFT pokonał FFTW3 (najszybszy FFT na zachodzie) 20-krotnie?

text: Zastanawiam się, czy PKUFFT to chiński algorytm/biblioteka i czy naprawdę jest lepszy niż FFTW, MKL? Dziękuję Edytuj: omówię. Moje osobiste zainteresowania programistów dotyczą szybkich równoległych algorytmów, takich jak FFTW3, który był moim ulubionym, dopóki nie natknąłem się na chińskie twierdzenie o lepszym działaniu z PKUFFT. Jest w google, jeśli szukasz FFTW3, Intel MKL, GPU i innych rzeczy. Nie wiem nic o tej bibliotece, ale bardzo bym chciał się uczyć. Domyślam się, że PKU to skrót od Peking Univ. W sieci nie ma nic poza prezentacją i wzmianką o jakimś powszechnie dostępnym sprzęcie (GPU, infiniband itp.). wszystko, łącznie z kompilatorami, było dostępne przez lata. Poprawa o 2000% jest znacząca. Wiadomości mają 1 rok. Ale żadnych szczegółów na temat samego algorytmu. Interesujące będzie wiedzieć, czy istnieje prawdziwe odkrycie w algebrze, czy tylko efekt techniczny z nieuczciwą przewagą znajomości konkretnej platformy lepiej niż konkurencyjne zespoły.


title: Sprawdzanie programowania systemów, czego powinienem się nauczyć, z jakich zasobów?

text: Zajmowałem się tworzeniem aplikacji hobbystycznych, ale teraz jestem zainteresowany programowaniem systemów (głównie systemów operacyjnych, jądra Linuksa itp.). Znam języki niskiego poziomu, takie jak C, i znam minimalne ilości Assemblera x86 (czy powinienem to poprawić?). Jakie zasoby/książki/strony internetowe/projekty itp. polecacie, aby rozpocząć pracę z programowaniem systemów i jakie tematy są ważne? Zauważ, że prawie nic nie wiem na ten temat, więc wszelkie sugerowane przez ciebie zasoby powinny być zasobami wprowadzającymi. Nadal wiem, co _jest_ tematem i co zawiera itp., ale nie zajmowałem się wcześniej programowaniem systemów (ale tworzeniem niektórych aplikacji, jak wcześniej wspomniano, i jestem zaznajomiony z kilkoma językami programowania, a także ogólnie z inżynierią oprogramowania i algorytmy, struktury danych itp.).


title: Jakie są kroki w tworzeniu systemu operacyjnego w C?

text: Próbuję stworzyć własny system operacyjny. Służy to wyłącznie celom edukacyjnym, abym mógł zrozumieć wnętrze, a także uzyskać dobry pomysł na programowanie na niskim poziomie. Mam pewne wcześniejsze doświadczenie w tworzeniu aplikacji w C#/python/C++/C. Jestem noobem w asemblerze (mniej doświadczenia i wiedzy). Rozumiem, że pisząc system operacyjny, nie możemy obejść się bez asemblera. Obecnie właśnie wydrukowałem ciąg znaków w asemblerze w sektorze rozruchowym za pomocą przerwań qemu i BIOS. To, czego chcę, to czy ktoś może konkretnie wskazać kroki, które muszę wykonać, aby moje systemy operacyjne uruchamiały programy w języku C. Tak więc mogę zacząć pisać mój system operacyjny w C. Każda inna rada, aby pomóc początkującemu, dotycząca tego samego, jest również mile widziana. Chociaż przejrzałem wiele samouczków/stron internetowych związanych z rozwojem systemu operacyjnego, nie mogę nigdzie znaleźć tych informacji.


title: Moc 2 i wydajność w SQL Server

text: Wiele operacji matematycznych (takich jak dzielenie, mnożenie itp.) ma być obliczanych szybciej, gdy mamy do czynienia z potęgą dwóch liczb (C++, C#?, ...) Na przykład 15 * 256 = 0x0e przesunięte w prawo (szybko) 8 bitów = 0x0e00 = 3840 Podczas gdy 15 * 255 = 0x0e pomnożone przez (wolno) 0xff = 0x0ef1 = 3825 Czy tego rodzaju optymalizacja ma miejsce w SQL Server? Chyba nie ma, próbowałem zmierzyć różnicę czasu wykonania zapytań takich jak: SET STATISTICS TIME ON SELECT AVG(N/256) FROM DBO.V_VIRTUAL_NUMBERS WHERE N <1048576 SELECT AVG(N/255) FROM DBO .V_VIRTUAL_NUMBERS GDZIE N < 1000000 SET STATISTICS TIME OFF co spowodowało: SQL Server Execution Times: CPU time = 0 ms, upłynięty czas = 0 ms. Czas analizy i kompilacji programu SQL Server: czas procesora = 0 ms, czas, który upłynął = 0 ms. (1 wiersze, których dotyczy problem) Czasy wykonywania programu SQL Server: czas procesora = 203 ms, czas, który upłynął = 207 ms. Czasy wykonania programu SQL Server: czas procesora = 0 ms, czas, który upłynął = 0 ms. Czas analizy i kompilacji programu SQL Server: czas procesora = 0 ms, czas, który upłynął = 0 ms. (1 wiersz lub wiersze, których dotyczy problem) Czasy wykonywania programu SQL Server: czas procesora = 218 ms, czas, który upłynął = 206 ms.


title: Jaki byłby prototyp printf?

text: przyjrzyj się uważnie tym wywołaniom: printf("hello, world\n"); printf("%d", 2); printf("%d%g\n", 2, 2.3); widzimy, że printf może przyjąć dowolny typ i dowolną liczbę argumentów. jednak wiemy, że funkcje w c przyjmują tylko argumenty o stałej długości i powinny mieć zgodny prototyp pasujący do arg. jaki byłby prototyp printf ?


title: Konfigurowanie CI z [Jenkins, TeamCity, itp.] – który kod źródłowy kontroluje?

text: Jestem przywiązany i zdeterminowany, aby ustawić CI w pracy. Grałem z Jenkinsem i po powrocie do domu ściągnę TeamCity (cholera pracujesz z wymuszonymi filtrami pobierania!). Nie mam wsparcia IT i mam tylko tyle wolnego czasu. Moje główne pytanie: czy Jenkins lub TeamCity można zintegrować z repozytoriami git lub mercurial, które istnieją tylko na dysku współdzielonym, a nie na prawdziwym serwerze (przez http, https, ssh itp.)? Chciałbym użyć DVCS z moją konfiguracją CI, ale byłbym w porządku z SVN, ponieważ jest znajomy i już skonfigurowany (ale nie ma projektów do migracji, jeśli zdecyduję się na DVCS). Znam zalety DVCS i nie sądzę, że będą one często pojawiać się w moim obecnym środowisku. Mój CI będzie działał na zwykłym komputerze z systemem Windows XP w sieci. Biorąc pod uwagę powyższe, czy będzie dość łatwo zintegrować Jenkinsa lub TeamCity z git/mercurialem, czy też powinienem po prostu pozostać przy SVN, ponieważ jest mniej lub bardziej gotowy do pracy?


title: Kolejność reguł dla list parsowania z LALR(1)

text: Tworząc gramatykę do parsowania listy (coś w rodzaju „`ITEM*`”) za pomocą parsera LALR(1), można to zrobić na dwa sposoby: list : lista ELEMENT | ; lub lista : ITEM lista | ; Jakie są plusy i minusy tych dwóch możliwości? Ogólnie, czy można udzielić porady, którą wybrać, czy też zależy to od pełnej gramatyki? A co z przypadkiem „`ITEM+`”, czyli list : list ITEM | PRZEDMIOT         ; i lista : ITEM lista | PRZEDMIOT         ; Czy te same plusy i minusy mają zastosowanie tutaj, czy też inne?


title: C++ i wyjątki systemowe

text: Dlaczego standardowy C++ nie uwzględnia wyjątków systemowych (obcych lub sprzętowych)? Np. gdy występuje dereferencja wskaźnika zerowego, stos nie jest rozwijany, destruktory nie są wywoływane, a RAII nie działa. Powszechną radą jest „użyj systemowego API”. Ale w niektórych systemach, w szczególności Win32, to nie działa. Aby umożliwić rozwijanie stosu dla tego kodu C++ // class Foo; // void bar(const Foo&); bar(Foo(1, 2)); należy wygenerować coś takiego jak ten kod C Foo tempFoo; Foo_ctor(&tempFoo); __try { bar(&tempFoo); } __finally { Foo_dtor(&tempFoo); } Foo_dtor(&tempFoo); i nie da się tego zaimplementować jako biblioteki C++. * * * **Aktualizacja:** Standard nie zabrania obsługi wyjątków systemowych. Wydaje się jednak, że popularne kompilatory, takie jak **g++**, nie respektują wyjątków systemowych na platformach _any_ tylko dlatego, że standard tego nie wymaga. Jedyną rzeczą, której chcę - jest użycie RAII, aby kod był czytelny i niezawodny. Nie chcę umieszczać ręcznie spreparowanego try\finally wokół każdego wywołania nieznanego kodu. Na przykład w tym kodzie wielokrotnego użytku `AbstractA::foo` jest takim nieznanym kodem: void func(AbstractA* a, AbstractB* b) { TempFile file; a->foo(b, plik); } Być może do `func` przekaże się taką implementację `AbstractA`, która w każdy piątek nie będzie sprawdzać czy `b` ma wartość NULL, więc nastąpi naruszenie praw dostępu, aplikacja zostanie zamknięta, a plik tymczasowy nie zostanie usunięty. Ile miesięcy ucierpi z powodu tego problemu, zanim autor `func` lub autor `AbstractA` coś z tym zrobi? * * * Powiązane: Czy `catch(...) { throw; }` zła praktyka?