title: Naruszenie zasady DRY

text: Jestem pewien, że gdzieś istnieje nazwa tego antywzoru; jednak nie znam na tyle literatury antywzorcowej, żeby ją poznać. Rozważmy następujący scenariusz: `or0` jest funkcją składową w klasie. Na dobre lub na złe, jest w dużym stopniu zależny od zmiennych składowych klasy. Pojawia się Programista A i potrzebuje funkcjonalności takiej jak `or0`, ale zamiast wywoływać `or0`, Programmer A kopiuje i zmienia nazwę całej klasy. Zgaduję, że nie wywołuje ona `or0`, ponieważ, jak mówię, jest ona silnie zależna od zmiennych składowych pod względem swojej funkcjonalności. A może jest młodszym programistą i nie wie, jak to wywołać z innego kodu. Więc teraz mamy `or0` i `c0` (c jak kopia). Nie mogę całkowicie winić Programisty A za takie podejście — wszyscy mamy napięte terminy i hakujemy kod, aby wykonać pracę. Kilku programistów utrzymuje `or0`, więc jest to teraz wersja `orN`. `c0` to teraz wersja `cN`. Niestety większość programistów, którzy utrzymywali klasę zawierającą `or0`, wydawała się być kompletnie nieświadoma istnienia `c0`\--co jest jednym z najsilniejszych argumentów, jaki przychodzi mi do głowy na rzecz mądrości zasady DRY. Mogło też istnieć niezależne utrzymanie kodu w `c`. Tak czy inaczej wygląda na to, że „or0” i „c0” były utrzymywane niezależnie od siebie. A radość i szczęście, w „cN” pojawia się błąd, który nie występuje w „orN”. Mam więc kilka pytań: 1.) Czy istnieje nazwa dla tego antywzorca? Widziałem to tak często, że trudno mi uwierzyć, że to nie jest nazwany antywzorzec. 2.) Widzę kilka alternatyw: a.) Napraw `orN`, aby wziąć parametr określający wartości wszystkich wymaganych zmiennych składowych. Następnie zmodyfikuj `cN`, aby wywołać `orN` z przekazanymi wszystkimi potrzebnymi parametrami. b.) Spróbuj ręcznie przenieść poprawki z `orN` na `cN`. (Pamiętaj, że nie chcę tego robić, ale jest to realistyczna możliwość.) c.) Przekopiuj `orN` do `cN`\--znowu, fuj, ale wymieniam to ze względu na kompletność. d.) Spróbuj dowiedzieć się, gdzie `cN` jest uszkodzony, a następnie napraw go niezależnie od `orN`. Alternatywa _a_ wydaje się najlepszym rozwiązaniem na dłuższą metę, ale wątpię, czy klient pozwoli mi ją wdrożyć. Nigdy nie ma czasu ani pieniędzy na naprawienie rzeczy, ale zawsze czas i pieniądze na naprawienie tego samego problemu 40 lub 50 razy, prawda? Czy ktoś może zaproponować inne podejścia, których być może nie brałem pod uwagę? Gdybyś był na moim miejscu, jakie podejście byś przyjął? Jeśli są tutaj inne pytania i odpowiedzi na podobne tematy, prosimy o przesłanie do nich linków. Nie mam nic przeciwko usunięciu tego pytania, jeśli jest to oszustwo, ale moje poszukiwania nie znalazły jeszcze niczego, co odnosi się do tego pytania. * * * EDIT: Dziękuję wszystkim za wszystkie przemyślane odpowiedzi. Zapytałem o nazwę dla antywzoru, żebym mógł sam go dalej badać. Jestem zaskoczony, że ta konkretna zła praktyka kodowania nie wydaje się mieć dla niej „kanonicznej” nazwy.


title: Jak ważny jest XML dla programisty?

text: Czy każdy programista musi znać XML? Jak ważny jest XML dla programisty? Jakieś sugestie...


title: Korzystanie z biblioteki na licencji GPL w aplikacji komercyjnej

text: Tworzę aplikację na Androida, a w swojej aplikacji korzystam z biblioteki (jar), którą pobieram z internetu. Ten jar jest open-source na licencji "GNU General Public License v2". Próbowałem przeczytać tekst licencji, ale miałem trudności ze zrozumieniem go. Moje pytanie brzmi: czy mogę używać tej biblioteki bez zmiany niczego w słoiku w aplikacji komercyjnej? Będę zarabiał na sprzedaży mojej aplikacji, która używa tego pliku .jar wydanego na licencji GPL. Jeśli to możliwe, chciałbym uniknąć konwersji mojej aplikacji na open source.


title: Konwencja nazewnictwa getterów i seterów

text: Na przykład, biorąc pod uwagę zmienną łańcuchową `variable`, konwencja jej ujawniania jest następująca: > public class SomeClass { > > > public String variable = ""; > public String getVariable() {zmienna zwracana;} > public void setVariable(String variable) {this.variable = variable;} > > > } Co wygląda następująco: > class.getVariable(); // Pobiera "zmienna" > > class.setVariable("Cześć"); // Ustawia "zmienną" * * * **Czy poniższa konwencja jest uważana za zły styl?** : > public class SomeClass { > > > public String zmienna = ""; > public String variable() {return variable;} > public void zmienna(String variable) {ta.zmienna = zmienna;} > > > } Co wygląda następująco: > class.variable(); // Pobiera "zmienna" > > class.variable("Hello"); // Ustawia "zmienną" * * * Należy pamiętać, że ustalony wzorzec projektowy interfejsu płynnego wydaje się sugerować tworzenie obiektów za pomocą czegoś takiego: > public class SomeClass { > > > public String zmienna = ""; > > public SomeClass(String variable) {this.variable = variable;} > > public String zmienna() {zwracana zmienna;} > public SomeClass zmienna(String zmienna) {return SomeClass(variable);} > > > } jak: > SomeClass sc = new SomeClass().variable("Hello"); // Tworzy instancję nowego obiektu > SomeClass ze zmienną równą „Hello”. Najwyraźniej słowo „zestaw” jest implikowane we wzorcu _fluent interface_. (Tak, technicznie rzecz biorąc, interfejs Fluent zwraca klasę zamiast void podczas ustawiania. To nie jest ważne.)


title: Jak zorganizować wiele projektów, które mogą być wersjonowane i wdrażane osobno?

text: Mój zespół jest w sytuacji, w której musimy stworzyć około 30 różnych procesorów. Przez procesory rozumiem kod, który pobiera dane z bazy danych i wysyła je do zdalnego serwisu w innym miejscu na świecie. Każdy z nich robi zasadniczo to samo, tylko z różnymi danymi. Tylko niektóre z tych procesorów zostaną wdrożone na serwerze A, niektóre na serwerze B itd. I nie wszystkie wersje w tym samym czasie. Jeśli dokonamy zmiany w procesorze X, zmienimy wersję i wyślemy X, pozostawiając resztę procesorów w spokoju. Wymyśliliśmy trzy możliwe opcje, z których każda ma swoje własne problemy: 1. Mieć 30 różnych rozwiązań 2. Mieć jedno rozwiązanie z 30 różnymi projektami 3. Mieć jedno rozwiązanie, z jednym projektem, z każdą funkcjonalnością procesora oddzieloną przestrzenią nazw Główną wadą #1 jest konieczność stworzenia i utrzymania 30 różnych rozwiązań. A jeśli musimy dokonać zmiany w wielu procesorach jednocześnie, będziemy musieli otworzyć n rozwiązań, aby to zrobić. Głównym problemem z #2 jest wersjonowanie. Jeśli rozgałęziamy kod, rozgałęziamy całość, nawet jeśli zmienił się tylko jeden projekt. Główny oszust z #3 jest taki sam jak z #2. A potem musimy również znaleźć sposób na wykluczenie niektórych procesorów z określonych serwerów w celu wdrożenia. #3 jest najłatwiejsze do zarządzania podczas programowania, ale najtrudniejsze podczas wdrażania. Czy jedna z tych opcji jest najlepszą opcją, czy jest coś, czego nie brałem pod uwagę?


title: Piszesz umowę z klientem na tworzenie stron internetowych?

text: Jestem niezależnym twórcą stron internetowych podczas mojego wolnego na uniwersytecie i mam kilka przerażających historii, jeśli chodzi o projektowanie witryn dla ludzi (nie, że witryny są złe - tylko klienci NIE WIEDZĄ, CZEGO CHCĄ), to _naprawdę_ grinduje mnie koła zębate. Aby ustawić kontekst, to jest to, czego chcę uniknąć: > Miałem klienta w zeszłym roku, który zbudował witrynę dla _ANON_. Uzgodniliśmy > cenę (200 funtów - jestem studentem, więc ich mentalność brzmi: „Och, jesteś studentem > to sprawia, że jesteś tani, prawda?”). Udało mi się wykonać stronę zgodnie z oryginalną > specyfikacją w ciągu około 3 dni (nic nie zostało kiedykolwiek spisane > koszty oryginalnej specyfikacji itp. wszystko zostało zrobione przez telefon/Skype) > klient _wtedy_ uznał, że jego oryginalny pomysł nie wyglądał zbyt dobrze w praktyce, więc powiedziano mi, żebym go wyrzucił i zaczął od nowa, w porządku, Jestem > profesjonalistą, mogę to znieść. > > Potem przerobiłem stronę do nowej specyfikacji, którą mi podał, zajęło to kolejne 3-4 dni > i znowu to samo, nie podoba mi się, zacznij od nowa. W tym czasie jestem > dość zirytowany brakiem konstruktywnej krytyki, więc przerabiam > stronę, aby zasadniczo wyglądała jak teraz (patrz URL powyżej), mówi „tak wygląda dobrze > wyślij ją”, więc zostaje umieszczona na web WTEDY decyduje: „Och, tak przy okazji, chcę i > rozwiązanie e-commerce ORAZ sekcja tylko dla członków, albo nie dostaniesz zapłaty > nic”. będąc w sytuacji, w której byłem, nie mogłem po prostu odmówić > ze względu na około 12 dni mojego życia, które stracił, więc zacząłem dodawać sekcje > e-commerce i tylko dla członków, co doprowadziło do **mnóstwo** > innych zmian. > > Na przykład istnieje strona z różnymi "pakietami", z których użytkownik może wybrać >, zrobiłem to w _chwalebnym_ CSS3, to znaczy wyglądało niesamowicie, naprawdę ... "To bzdura, zdobądź > pozbądź się tego, zrób to w Photoshopie i zamiast tego wstaw plik .jpg". Zakłopotany tym, jak > może to wyglądać "gównianie" zapytałem, jakiej przeglądarki używa... "IE6", mogłem > go zabić, ale powstrzymałem się i powiedziałem mu, żeby uaktualnił do Chrome lub > FF3.6, więc on uaktualnienia do FF, „Wow, to wygląda świetnie! ... Ale przerób to w > Photoshopie, aby ludzie z IE6 zobaczyli to dobrze” Próbowałem mu powiedzieć, że > dane demograficzne strony pokazały, że był JEDYNYM używającym IE6, ale był nie mając > żadnego z tego, więc spędzam trochę czasu robiąc to w PS, połóż je, wszystko było w porządku. > > _Wtedy_ , mówi "och przy okazji chcę zmienić ceny pakietów" ja mówię > "no cóż, gdybyś zostawił je w CSS3 i HTML, mogłeś to zrobić > sam", nie chciał tego słyszeć i zmusił mnie do przerobienia jpg - To > zdarza się **za każdym razem** ma nowy pakiet, który musi zostać złożony, tak jak ty > wyobraź sobie, że po pewnym czasie robi się to bardzo denerwujące i zaczynałem mieć dość >, ale zdecydował że z tym, jak to zostało zrobione, wyglądało to świetnie i utrzymywało go > szczęśliwy, wtedy zapytałem o wypłatę "Och, mam tylko 50 funtów, które mogę ci dać > ale mogę ci dać 2 x 12-tygodniowe pakiety szkoleniowe". Myślę, że okej zrobię >najlepszą złą sytuację i wezmę ją, więc zgadzam się, dostaję 50£ za 2-3tyg >praca i pakiet treningowy 1x12 tygodni, kończę to i pytam o drugą >jeden” Och, to było tylko wtedy, gdybym mógł sobie to dać, teraz nie mogę >, więc będziesz musiał za to zapłacić 120 funtów”. Nie tylko to, ale on ciągle nalega > abym wprowadzał drobne zmiany w witrynie, której go nauczyłem, > ale on nie chce wiedzieć, więc nie tylko nie dostaję zapłaty za żadne > zmiany, za które wprowadzę on grozi mi, że jeśli ich nie zmienię, rozprzestrzeni złą opinię o mnie wśród swoich klientów i wszystkich, których zna. Jak możesz sobie wyobrazić, bardzo mnie to zdenerwowało w kwestii klientów i chciałbym teraz opracować umowę, która: * Dla IE6 nie ma żadnych kompromisów. * 25% z góry, 25% w połowie i 50% po zakończeniu. * Mam _minimalny_ standard, według którego będę pracować, więc praca poniżej 500 funtów nie jest opłacalna. * Zmiany naprawcze i kwartalne są płatne według stawki godzinowej. * Zastrzegam sobie prawo do usunięcia dowolnej witryny, jeśli 50% po ukończeniu nie zostanie zapłacona w ciągu 30 dni. * Nie ma "zamienników gotówki" - brak gotówki - brak strony. Czy ktoś mógłby zasugerować, co dodać powyżej jako klauzule w mojej umowie i jeśli powyższe są odpowiednie, to czy odstraszą klientów? Wszelkie sugestie dotyczące jakiejkolwiek części umowy będą mile widziane, a także gdzie je spisać. Dziękuje wszystkim!


title: Skąd pochodzi termin „pełzanie cech”?

text: Jest przyzwoity artykuł na Wikipedii na temat „pełzania funkcji”, ale nie podaje pochodzenia. Wyszukiwarka Google prowadzi tylko do niejasnego artykułu, w którym twierdzi się, że termin ten ukuł „Harl Rich”, ale nie ma zbyt wiele kopii zapasowej dla tego twierdzenia. Jest komiks Dilberta z 2001 roku na ten temat, ale ton wydaje się sugerować, że termin ten istniał wcześniej; mniej więcej potwierdza fakt, że Google ma wyniki sprzed 2000 roku. Jednak znalezienie dokładnych dowodów pochodzenia jest trudne. Więc kto, jeśli w ogóle ktokolwiek, ukuł termin „pełzanie funkcji”? Skąd to pochodzi?


title: Prawa autorskie do prostego kodu JavaScript

text: Googlując znalazłem konkretną stronę: PCB za pomocą kalkulatora Szukając kodu strony, który znalazłem w kodzie JavaScript: > //copyright circuitcalculator.com > > //proszę nie kopiować bez pozwolenia Biorąc pod uwagę prostotę tego kodu, czy mogę napisać do tego własną funkcję JavaScript? Myślę, że niektóre powiązane linki mogą się przydać. * * * **UPD** : Mówiąc dokładniej, ten kod nie może być w żaden sposób oskarżany?


title: Najszybszy natywny wieloplatformowy kompilator C++, IDE i debugger

text: Jeśli zacznę tworzyć aplikacje wieloplatformowe, szybkość plików jest dla mnie bardzo ważna. Mam badania przed niż i znaleźć ten sam wynik na temat IDE: (zignorowałem zaćmienie, ponieważ bardzo java base, ale nie kompletne) dla IDE: > 1. NetBeans C/C++ IDE . > 2. Bloki kodu . > 3. CodeLite . > 4. lub inne . > A dla kompilatora || ramy || zestaw narzędzi : > 1. Zestaw narzędzi QT lub UnitTest++ . > 2. gnu g++ . > 3. gnu gcc . > 4. wxWidgets . > 5. cygwin . > 6. VC++ . > 7. lub inne. > Ale uważam, że niektóre aplikacje QT są bardzo zależne od bibliotek QT :( , To nie jest dobre i zmniejsza prędkość. Teraz moje prawdziwe pytanie, czy chcę rozpocząć projekt, jakie jest najlepsze IDE z debuggerem, jaki jest najlepszy kompilator, który zapewnia dużą szybkość natywny kod do mnie, lub wymuszam używanie multi-kompilatora dla dowolnego systemu operacyjnego?i proszę podać powód, dla którego to IDE i dlaczego ten kompilator.


title: Architektura procesora i matematyka zmiennoprzecinkowa

text: Próbuję owinąć głowę pewnymi szczegółami na temat wykonywania matematyki zmiennoprzecinkowej na procesorze, próbując lepiej zrozumieć, jakich typów danych użyć itp. Myślę, że dość dobrze rozumiem, jak wykonywana jest matematyka liczb całkowitych. Jeśli dobrze zrozumiałem i pomijając SIMD, 32-bitowy procesor generalnie wykona obliczenia całkowite z co najmniej 32-bitową precyzją itp. Czy to prawda, że matematyka zmiennoprzecinkowa jest zależna od obecności FPU? A że FPU na x86 jest 80-bitowy, więc matematyka zmiennoprzecinkowa jest wykonywana z tą precyzją, chyba że używasz SIMD? A co z ARM?


title: Jaki jest koszt biznesowy modelu domeny anemicznej

text: Chcę oszacować koszty lub problemy związane ze złymi praktykami tworzenia oprogramowania. W szczególności, czy oprogramowanie, które zostało opracowane, czego wynikiem jest anemiczny model domeny, może być mierzalne pod względem kosztów lub ryzyka biznesowego? Moje początkowe myśli (które są prawie niemożliwe do ogólnej ilościowej oceny) to: - * Zmniejszona elastyczność. * Możliwość zwiększenia kosztów wsparcia. Każda pomoc, jaką możesz zaoferować, byłaby bardzo mile widziana.


title: Symulacja jednoczesnych bytów

text: Rozważ potrzebę dokładnego zasymulowania zbioru encji. Wszystkie byty istnieją na sztucznej osi czasu. W „krokach” tej osi czasu wszystkie podmioty mogą wykonywać określone operacje. Konieczne jest, aby zdarzenia czasowe były obsługiwane dokładnie, a nie w kolejności przetwarzania. Tak więc proste wątkowanie nie jest właściwą symulacją, ani proceduralne przechodzenie przez wszystkie jednostki. Przetwarzanie może być powolne, kluczowa jest tutaj dokładność. Mam kilka pomysłów, jak to zrealizować, ale najprawdopodobniej coś takiego zostało zrobione wcześniej. Czy dostępne są jakieś ramy do tych celów? Czy istnieje bardziej odpowiedni paradygmat? AKTUALIZACJA: **przykład** dla wyjaśnienia Przykład: A i B wysyłają wiadomość C dokładnie w tym samym czasie. Załóżmy, że wysłanie wiadomości zajmuje czas w oparciu o odległość i oba znajdują się dokładnie w tej samej odległości od C. C powinien być w stanie obsłużyć tę akcję jako jednoczesne „zdarzenie”, a nie na podstawie kolejności przetwarzania, jeśli A przejedzie przed B.


title: Porady dotyczące nauki języków programowania i matematyki

text: Czuję, że ostatnio utknąłem, jeśli chodzi o naukę o rzeczach związanych z programowaniem; Pomyślałem, że zadam tutaj pytanie i zapiszę to wszystko w nadziei, że uzyskam wskazówki/rady od ludzi. Być może spisanie tego pomaga mi również spojrzeć na sprawy z innej perspektywy. Studiuję interaktywne projektowanie multimediów. Ten kurs opiera się na dwóch rzeczach: projektowaniu graficznym z jednej strony i tworzeniu stron internetowych z drugiej. Mam całkiem przyzwoitą znajomość języków internetowych (zwykły HTML/JS/PHP) iw przyszłym roku dostanę kurs na ASP.NET. W wolnym czasie nauczyłem się pracy z CodeIgniterem, a także zagłębiłem się w Ruby (i Rails) oraz podstawowe programowanie na iOS. Na pierwszym roku studiów zrobiłem też zajęcia z Javy (19/20 na końcowym wyniku). Ta ocena tak naprawdę nic nie znaczy; Mam podstawy programowania obiektowego, ale jeśli chodzi o Javę, nie nauczyliśmy się prawie niczego. Biorąc pod uwagę czas, w którym programowałem np. w PHP... nie mogę powiedzieć, że jestem w tym kiepski. Zdecydowanie nie jestem w tym dobry ani świetny, ale jestem przyzwoity. Moi nauczyciele mówią mi, że mam problem z programowaniem. Mówią mi tylko, że powinienem się uczyć. Więc to właśnie robię i staram się przyjąć jak najwięcej; jednak czasami nie jestem pewien, od czego zacząć i mam tendencję, by zawsze wątpić w siebie. Teraz na „pytanie”. Chcę zająć się programowaniem na iOS. Wiem, że programowanie na iOS sprowadza się do programowania w Cocoa Touch i Objective-C. Wiem też, że Obj-C jest nadzbiorem C. Kilka lat temu zrobiłem zajęcia na temat C, ale sromotnie mi się nie udało. Utknąłem na wskaźnikach i nigdy tak naprawdę ich nie rozumiałem.. Aż do jakiegoś miesiąca temu. Nagle „dostałem” to. Od około tygodnia pracuję nad książką o Celu-C i rozumiem podstawy (jestem mniej więcej w rozdziale 6). Jednak ciągle napotykam podobne problemy, jakie miałem, kiedy robiłem klasę C: jestem do niczego z matematyki. Nie naprawdę. Pochodzę ze szkoły łacińsko-nowoczesnej w liceum i wtedy prawie nie miałam zajęć z matematyki. Chciałem studiować informatykę, ale nie udało mi się tam z powodu marnego stanu mojej wiedzy matematycznej. Nie potrafię jednak wytłumaczyć, dlaczego nagle mówię tutaj o matematyce, ponieważ nie jest ona bezpośrednio związana z programowaniem... ale tak jest. Na przykład przykłady w książce, którą teraz czytam, dotyczą programowania kalkulatora ułamków. Wszystko dobrze, mogę programować, gdy zdobędę formuły.. ale zajmuje mi cały dzień lub więcej, aby faktycznie dotrzeć do tego punktu. Trudno mi też wymyślić dla siebie pomysły. Któregoś dnia zrobiłem jedną małą aplikację na iOS i jest to po prostu coś w rodzaju przycisku / etykiety. Kiedy naciskam przycisk, generuje losową liczbę. To naprawdę **wszystko, co mogłem wymyślić. Czy możesz się tego „nauczyć”? Prawdopodobnie sprowadza się to do kreatywności, ale najwyraźniej nie jestem zbyt dobry w byciu kreatywnym. Czy istnieją jakieś witryny lub zasoby, które zawierają coś w rodzaju podstawowej listy rzeczy, które możesz zaprogramować, gdy dopiero zaczynasz? Może skupiam się na zbyt wielu rzeczach na raz. Chcę utrzymać HTML/CSS na przyzwoitym poziomie, jednocześnie ucząc się PHP i CodeIgniter, zagłębiając się w Ruby on Rails i jednocześnie ucząc się Objective-C i iOS SDK. Chyba po prostu chcę być w czymś dobry. Problem polega na tym, że nie jestem zadowolony z moich rzeczy związanych z PHP. Chcę więcej, czegoś „twardszego”; dlatego zdecydowałem się na iOS. Jak powiedziałem, mam podstawy wielu różnych języków. Mogę zaprogramować coś prostego w Javie, w C, w Objective-C od tego tygodnia... ale na tym się kończy. Przede wszystkim dlatego, że nie potrafię wymyślić pomysłów na bardziej złożone aplikacje, a także dlatego, że po prostu wątpię w siebie: „Och, to zbyt skomplikowane, nigdy nie mogę tego zrobić”. I na tym się kończy. Na zakończenie mojej tyrady pozwolę sobie w zasadzie przeformułować moje pytania na część 'tl;dr'. A. Chcę zająć się programowaniem na iOS i mam podstawową wiedzę na temat C/Objective-C. Jednak mam trudności z wymyślaniem własnych pomysłów i ich wdrażaniem, a także do bani z matematyki, która jest czymś, co nie jest bezpośrednio związane z programowaniem, ale często jest potrzebne. Co mogę zrobić? B. Interesuję się wieloma różnymi językami programowania i nie mogę przestać czytać/uczyć się. Jednak nie czuję, że jestem w czymkolwiek dobry. Czy może powinienem skupić się na jednym języku przez rok lub dłużej, czy dalej brać to wszystko w tym samym czasie i mieć nadzieję, że w końcu je wszystkie zrozumiem? C. Czy są jakieś zasoby, które dostarczają podstawowych pomysłów na rzeczy, które mogę zaprogramować? Myślę o „prostych” aplikacjach wiersza poleceń, które pomogą mi w nauce C/Obj-C z dala od całego iPhone'a SDK. Jak powiedziałem, przykłady w mojej książce są głównie oparte na matematyce (kalkulator ułamków) i jest to trochę trudne. :( Bardzo dziękuję za przeczytanie mojego posta. Nie planowałem, że będzie tak długi, ale cóż. Z góry dziękuję za wszelkie odpowiedzi.


title: dlaczego zarówno index[array], jak i array[index] są poprawne w C?

text: Rozważmy na przykład: int index = 3; int tablica[4] = {0, 1, 2, 3}; wtedy zarówno `indeks[tablica]` jak i `tablica[indeks]` są poprawnymi wyrażeniami, podobnie jak `*(indeks + tablica)` i `*(tablica + indeks)`. Dlaczego w tablicach C jest to prawda? array[5] == 5[array] wyjaśnia, jak to działa. Moje pytanie brzmi: dlaczego projektanci języka postanowili na to zezwolić? Dlaczego nie wymusić po prostu, że `indeks[tablica]` jest nieprawidłowy, dla jasności?


title: Terminologia: kolejka kontra fifo

text: Odnosząc się do lub dokumentując typową, pozbawioną blokad, cykliczną strukturę danych (lub klasę lub obiekt) używaną do komunikacji między dowolnie długimi asynchronicznymi wątkami lub procesorami: powszechnie używane są „kolejka”, „fifo” lub „FIFO”. Czy istnieje techniczna przyczyna, dla której jeden termin może być bardziej dokładnym lub lepiej komunikatywnym użyciem w pewnej sytuacji niż drugi termin.


title: Jak przekonwertować ramki 64-bitowe na 32-bitowe?

text: Problem: Mamy aparat, który przechwytuje klatki w formacie 64-bitowym. Używamy oprogramowania 32-bitowego i działało to dobrze na starszych systemach 32-bitowych. Potem systemy zmieniły się na 64-bitowe, podobnie jak ramki, i moja aplikacja nie ma już dostępu do ramek obrazu. Udało nam się zapisać ramkę do pliku obrazu (tiff), a następnie otworzyć ten plik za pomocą naszej aplikacji, ale jest to bardzo powolne i wydaje się, że musi być lepszy sposób na zrobienie tego. Myślę, że mógłbym wywołać skrypt z mojej aplikacji, który uzyska dostęp do 64-bitowej ramki za pośrednictwem istniejącej biblioteki, przekonwertuje ramkę na 32-bitową i zwróci tę ramkę do mojej aplikacji. Problem polega na tym, że nie jestem nawet pewien, od czego zacząć: jak są przechowywane klatki, zanim zostaną zapisane do plików? Czy po uzyskaniu dostępu do ramki można przekonwertować ją na format 32-bitowy, aby moja główna aplikacja miała do niej dostęp?


title: lepszy sposób na zdefiniowanie wyjątku zgłoszonego przez metodę w Javie?

text: Wiem, jak definiować wyjątki i tak dalej, ale nie jestem pewien, czy sposób, w jaki to robię, jest najbardziej intuicyjny i czytelny dla innych użytkowników. Mam bardzo prostą metodę, którą napisałem, że chcę zgłosić wyjątek, ponieważ jest to łatwiejsze niż ręczne sprawdzanie zwracanych wartości; metoda jest prywatna i nie ma potrzeby definiowania publicznego typu wyjątku. Żaden z istniejących wyjątków Java nie pasuje dokładnie do błędu, więc próbuję dowiedzieć się, jaki typ wyjątku chcę tutaj zgłosić? Nie chcę po prostu rzucać wyjątku RuntimeException, chcę tylko złapać mój konkretny wyjątek, który rzucam, wszystkie inne wyjątki powinny się propagować. Pomyślałem, że zdefiniuję małą klasę wewnętrzną dla mojego wyjątku. Jednak tak naprawdę nie muszę nadpisywać niczego w klasie RuntimeException, chcę tylko przechwycić i wydrukować jego wiadomość. Więc teraz mam wiersz, który mówi coś w rodzaju prywatnej klasy MissingPropertyException extends RuntimeException{}; To nic nie daje, ale pozwala mi złapać _tylko_ wyjątek, który celowo wyrzucam, ignorując resztę. Czy to dobra składnia? dziwne jest definiowanie klasy wewnętrznej bez implementowania czegokolwiek w niej. Czy można to zrobić elegancko bez tworzenia pustej klasy wewnętrznej?


title: Przeczytaj K&R przed nauką C++ o niskim opóźnieniu?

text: Nigdy tak naprawdę nie robiłem dużej ilości programowania w C, ale jestem w trakcie uczenia się C++ o niskim opóźnieniu. Czy przeczytanie książki o programowaniu K&R C wyrządzi więcej szkody niż pożytku? Trochę się martwię, że będę czytał o konwencjach C, które mogą już nie obowiązywać w C++ (zwłaszcza z zamiłowaniem C do zmiennych globalnych).


title: Testowanie klienta REST na serwerze REST. Jak zrobić oprawy?

text: Podczas pisania testów jednostkowych często używa się urządzeń: mało testowalnych danych, więc możemy powiedzieć: 1\. Zdobądź wszystkich klientów, w tym Willy Wonka. 2\. Usuń klienta 3, a teraz pobieranie klientów nie powinno już zawierać Willy'ego Wonki. To jest dobre dla testów jednostkowych. Użyj setup/teardown, aby ponownie załadować urządzenia lub wycofać transakcję. Tak więc testowanie **tworzenie, aktualizacja i usuwanie odbywa się wewnątrz transakcji**. Nowe dane tymczasowe trwają tylko przez czas trwania tego testu, a następnie są resetowane. **Ale co z oddzieleniem serwera REST od klienta REST?** Chcemy się upewnić, że nasz klient REST nie tylko poprawnie odczytuje, ale także poprawnie tworzy, aktualizuje i usuwa. Nie byłem w stanie znaleźć żadnych przykładów ani sugestii **jak to zrobić ze zdalnym serwerem testowym REST.** Zakładając, że mam serwer testowy REST obsługujący tylko urządzenia. Cała bezstanowa natura protokołu HTTP oznacza, że trudno byłoby wysłać komunikat typu „ROZPOCZNIJ TRANSAKCJĘ” i „TRANSAKCJA WYCOFANIA” lub „PONOWNIE ZAŁADUJ URZĄDZENIA”, prawda? Nie mogę być pierwszym, który chce to zrobić, więc czuję, że potrzebuję innego sposobu myślenia o tym. Jakieś sugestie?


title: Czy inżynierowie zajmujący się licencjonowaniem oprogramowania podniosą poziom umiejętności i wynagrodzeń?

text: Kiedy ubiegam się o pracę, muszę konkurować ze zbyt wieloma innymi inżynierami oprogramowania, którzy mają niewielkie lub żadne umiejętności i rozrzedzają pulę kandydatów. Uważam, że to dewaluuje nasz zawód i ostatecznie obniża poziom wynagrodzeń wszystkich praktykujących inżynierów oprogramowania. Uważam, że moja kariera i kariera innych wykwalifikowanych inżynierów oprogramowania skorzystałaby, gdyby mniej niewykwalifikowani inżynierowie oprogramowania nie mogli wejść na pole, dopóki nie przejdą standardowego zestawu testów, aby uzyskać „licencję”, podobnie jak inne zawody, takie jak medycyna i prawo. bardzo utrudnili innym dołączenie do nich, tworząc sztuczny niedobór poprzez surowe licencje i tablice. Zarabiają dużo więcej niż większość inżynierów. A nawet inni inżynierowie mają egzaminy PE, zanim będą mogli „ćwiczyć”. Czy wymaganie licencji inżynierów oprogramowania lub posiadanie Rady Inżynierów Oprogramowania podniosłoby poziom umiejętności i wynagrodzeń w tej dziedzinie?


title: Czy dobrym pomysłem jest tworzenie wielu głowic z Mercurialem?

text: Właśnie wykonałem zatwierdzenie, które chcę cofnąć, ale chcę zachować złe zatwierdzenie w historii. Więc `hg update` do poprzedniego (dobrego) commita. Potem pracuję dalej. To zostawia mnie z nową głową: porzucone złe zatwierdzenie. Czy to zła praktyka? Jaki jest najlepszy sposób na zachowanie błędnych zatwierdzeń w historii, gdy ich nie używasz?


title: Wybór DOCTYPE dla e-booka online

text: Zaraz zaczynam pracę nad projektem, który polega na stworzeniu strony internetowej w stylu e-booka, która będzie zawierała wiele dużych dokumentów z tekstem i obrazami. Strona powinna mieć dość minimalistyczny wygląd, ale będzie zawierać interfejs użytkownika z kilkoma skryptami i animacjami, aby ułatwić przeglądanie dużych dokumentów. Zastanawiam się nad tym od dłuższego czasu i nie mogę się zdecydować, jakich znaczników użyć do takiego projektu. Czy powinien to być `HTML 4.0 strict`? `XHTML 1.0 ścisły`? Może „HTML5”? Jest prawdopodobne, że osoby, które nie są specjalnie obeznane z Internetem, odwiedzą tę witrynę ze względu na jej zawartość, dlatego uważam, że niektórzy użytkownicy mogą mieć stosunkowo stare przeglądarki. Czy `XHTML` lub `HTML5` może mnie pod tym względem zaszkodzić? Czytając o różnych formatach eBooków (w szczególności `EPUB`), dowiedziałem się, że wiele z nich używa wewnętrznie `XHTML`; czy to oznacza, że jeśli użyję `XHTML` (prawidłowo), witryna może również zostać spakowana i dostarczona jako `EPUB` w przyszłości? Surowość i czystość `XHTML`/`XML` również bardzo mi się podobają. Ogólnie najbardziej podoba mi się `XHTML`, ale boję się konsekwencji jego użycia. Podobno został wycofany przez W3C na rzecz `HTML 5`. Jednak tak naprawdę nie widzę żadnych zalet używania `HTML5` nad `HTML 4 strict`, ponieważ nie będę używał żadnej z jego funkcji. Martwię się również o kompatybilność przeglądarki `HTML5`. Czy powinienem po prostu trzymać się starego dobrego „HTML 4 strict”?


title: Subversion/kontrola źródła tylko dla kodu produkcyjnego?

text: Rok temu ukończyłem studia na kierunku informatyka, a teraz pracuję w małej firmie zajmującej się tworzeniem stron internetowych (ja i jeszcze jeden programista, plus menedżerowie, obsługa klienta i tester). Aż do chwili, gdy zacząłem, nie było systemu kontroli źródeł. Teraz powoli zaczynamy wdrażać SVN, ale drugi (starszy) programista (odtąd nazywany Joe) nalega, aby jedyny kod, który powinien zostać zapisany w naszym repozytorium SVN, to ten, który został przetestowany i zatwierdzony jako gotowy do produkcji. Oznacza to, że w przypadku większych projektów może nie być zatwierdzeń przez kilka tygodni lub dłużej. Czy to normalna praktyka? Wydaje mi się, że tracimy wiele korzyści płynących z kontroli źródeł, w tym: * Dokładne śledzenie postępów projektu * Śledzenie pojawiających się i rozwiązywanych problemów * Łatwe cofanie błędów * Łatwe tworzenie kopii zapasowych kodu, więc nie nie stracisz dużo, jeśli stacja robocza ulegnie awarii * Łatwiej jest zidentyfikować dokładnie, jaki kod działa w jakich zakładach produkcyjnych, zakładając, że stemplujemy wersje w plikach wykonywalnych, jak opisano tutaj * Łatwa współpraca (chociaż nie pracujemy zespołowo; to wszystko są projekty solo) * Itd. EDIT: Powinienem podkreślić, że historycznie w tej firmie nie było żadnej prawdziwej pracy zespołowej; tylko dwóch programistów pracujących nad osobnymi projektami. Poza tym wiele projektów jest niewielkich, więc można je zrealizować w kilka tygodni. A firma działa od ponad dekady i radzi sobie dobrze bez kontroli źródła. Projekty są zazwyczaj realizowane w szacowanym terminie.


title: Jakie są najlepsze pytania FizzBuzz podczas rozmowy kwalifikacyjnej z kandydatem na stanowisko programisty?

text: Szukam porady na temat rozmów kwalifikacyjnych z kandydatami technicznymi. Poruszyłem to krótko w pytaniu, które zadałem wcześniej: szablonowe pytania podczas wywiadu technicznego i zostałem poinformowany, że pytania FizzBuzz mają na celu wyeliminowanie kandydatów, których zdecydowanie nie chcesz zbliżać do swojego kodu. Przechodząc od tego, chciałbym wiedzieć, które pytania FizzBuzz działają najlepiej? Z własnego doświadczenia, najczęstszym, który widziałem, jest „Czy możesz napisać metodę, aby określić, czy liczba jest liczbą pierwszą, czy nie?”. Osobiście uważam, że jest to trochę za łatwe (napisanie najskuteczniejszego to inna historia). Czy są lepsze pytania FizzBuzz, których można użyć? Jakie dałbyś kandydatowi?


title: Dlaczego w AngularJS używamy scope zamiast $scope w łączu dyrektywy?

text: Ciekawe, dlaczego za każdym razem, gdy widzę przykład dyrektywy używającej linku, parametrem zakresu jest zakres, a nie $zakres? To zawsze mnie gryzie, ponieważ jestem tak przyzwyczajony do pisania $scope, że mój mózg automatycznie to wpisuje i muszę się cofnąć i poprawić.


title: Czy studiowanie zagadek logicznych pomaga zdawać rozmowy kwalifikacyjne, czy ogranicza cię?

text: Nadal jest kwestionowane – pytanie Programrs.SE – czy kompetencje w rozwiązywaniu zagadek logicznych są dobrą oceną umiejętności programistycznych. Niemniej jednak są nadal używane i istnieje duże prawdopodobieństwo, że wpadniesz na takie pytanie, gdy następnym razem zdecydujesz się zmienić pracodawcę. Pan Job zaleca w komentarzu do odpowiedzi, że należy po prostu „przestudiować zagadki i zdać wywiad”. Rzeczywiście, jest ich mnóstwo i możesz mieć dużo zabawy i poćwiczyć ich rozwiązywanie, a prawdopodobnie zademonstrujesz (tylko sobie, niestety) swoją zdolność do ich złamania bez żadnej pomocy. Nie jestem jednak pewien, jak pomogłoby ci to na rozmowie kwalifikacyjnej. Załóżmy, że przestudiowałeś wiele z tych łamigłówek i przyjdź na rozmowę o pracę. Prowadzący rozmowę prosi cię o rozwiązanie X i... już wiesz jak, bo już to rozwiązałeś. Mówisz, że już wcześniej rozwiązałeś tę zagadkę, ale nie ma znaczenia, że ją **rozwiązałeś**: liczy się to, że **widziałeś** ją, a zatem osoba przeprowadzająca rozmowę kwalifikacyjną nie może stwierdzić, czy jesteś w stanie go rozwiązać lub po prostu przeczytaj rozwiązanie wymyślone przez kogoś innego. Wybiera kolejną zagadkę – i ty też ją widziałeś. I znowu i znowu. W końcu ankieter znajduje problem, którego nie widziałeś: źle sformułowany, z dość głupim i nielogicznym rozwiązaniem (dlatego nie spotkałeś się z nim podczas praktyki). Nic dziwnego, że nie udaje ci się go rozwiązać. Ale ocena została już dokonana: nie udało ci się rozwiązać zagadki, do której się kwalifikowałeś. Pytanie brzmi, jak powinieneś się zachowywać, jeśli lubisz łamigłówki logiczne, wiele z nich rozwiązujesz (samodzielnie) i spotykasz je na rozmowie kwalifikacyjnej?


title: Dlaczego XMLHttpRequest nie jest zgodny z konwencją nazewnictwa?

text: Ostatnio pracowałem z obiektem XMLHttpRequest w JavaScript i nie mogłem nie zauważyć, że wielkość liter o tej nazwie nie ma sensu. Dlaczego „XML” jest zapisany wielkimi literami, a „Http” nie? Oba są akronimami! Z pewnością bardziej sensowne byłoby, gdyby nazwa była jedną z następujących: * XmlHttpRequest _(PascalCase, najlepsze praktyki dla nazw klas w JavaScript)_ * xmlHttpRequest _(camelCase, również powszechne, choć nie dla klas)_ * XMLHTTPRequest _( wersaliki dla akronimów, rzadko używane w programowaniu?)_ Jestem pewien, że musi być jakiś powód i nie chciałbym myśleć, że jest to teraz wyryte w kamieniu tylko dlatego, że nikt tego nie kwestionował w tamtym czasie. Czy istnieje inna konwencja nazewnictwa, której nie znam? Dziękuję! Specyfikacja XMLHttpRequest: http://www.w3.org/TR/XMLHttpRequest/


title: Zmienny domyślny argument Pythona: Dlaczego?

text: Wiem, że domyślne argumenty są tworzone w momencie inicjalizacji funkcji, a nie za każdym razem, gdy funkcja jest wywoływana. Zobacz następujący kod: def ook (pozycja, lst=[]): lst.append(item) print 'ook', lst def eek (pozycja, lst=None): jeśli lst jest None: lst = [] lst.append (pozycja) print 'eek', lst max = 3 for x in xrange(max): ook(x) for x in xrange(max): eek(x) Czego nie rozumiem, to dlaczego zostało to zaimplementowane w ten sposób. Jakie korzyści oferuje to zachowanie w porównaniu z inicjalizacją w czasie każdego połączenia?


title: Czy obiekt architektury Entity Component System jest z definicji zorientowany?

text: Czy architektura Entity Component System jest z definicji zorientowana obiektowo? Wydaje mi się to bardziej proceduralne lub funkcjonalne. Moim zdaniem nie przeszkadza ci to zaimplementować go w języku OO, ale nie byłoby idiomatyczne robienie tego w zaciekły sposób OO. Wygląda na to, że ECS oddziela dane (E i C) od zachowania (S). Jako dowód: > Pomysł polega na tym, aby w jednostce nie było wbudowanych metod gry. I: > Komponent składa się z minimalnego zbioru danych potrzebnych do konkretnego > celu > > Systemy to funkcje jednocelowe, które przyjmują zbiór encji, które mają > określony komponent * * * Myślę, że nie jest to zorientowane obiektowo, ponieważ duży częścią bycia zorientowanym obiektowo jest łączenie danych i zachowań. Jako dowód: > W przeciwieństwie do tego, podejście obiektowe zachęca programistę do umieszczania > danych tam, gdzie nie są one bezpośrednio dostępne dla reszty programu. > Zamiast tego dostęp do danych uzyskuje się poprzez wywołanie specjalnie napisanych funkcji > powszechnie nazywanych metodami, które są dołączone do danych. Z drugiej strony ECS wydaje się polegać na oddzieleniu twoich danych od twojego zachowania.


title: sugestie dotyczące uwierzytelniania identyfikatora personelu

text: Tworzę aplikację na iPada do zarządzania frekwencją HR, więc chodzi o to, aby pracownicy przychodzili do centrum, wybierali swoje nazwisko z tabeli i spisywali swój osobisty identyfikator, na czas przybycia i czas odejścia, nadal oceniając pod kątem wymagań, czy chcą, aby czas był automatycznie zaoszczędzony, czy personel zapisywał czas (z dyskiem rolkowym), czy też jedno i drugie, więc jaki inny sposób uwierzytelniania za pomocą iPada przychodzi na myśl? (inne niż wpisanie kodu), (ipad 2 nie chciał), więc nie chcą zdjęć. także jak uniknąć pisania kodu przez jedną osobę dla znajomego??, dane będą przechowywane w coredata i synchronizowane z serwerem, dziękuję!


title: Co mam zrobić z dziennikami błędów produkcyjnych?

text: Mamy intranetową witrynę PHP, którą uruchamiamy z logowaniem ostrzeżeń/błędach (ponieważ nie jest mocno obciążona i pozostało wiele błędów/złego kodu do znalezienia). Ponieważ strona jest stosunkowo niestabilna i aktywnie rozwijana, usuwam logi błędów produkcyjnych po wypuszczeniu każdej nowej wersji, aby uzyskać dokładny wgląd w problemy, z którymi mamy do czynienia. _zazwyczaj_ nie zwalniamy, dopóki wszystkie zarejestrowane problemy zidentyfikowane w ostatniej wersji produkcyjnej nie zostaną naprawione. Nadal przechowuję dzienniki błędów Apache, ponieważ nasz kod nie powinien zepsuć Apache (a jeśli tak, to jest to wielka sprawa), więc jeśli coś jest nie tak, chcę wiedzieć. Zastanawiam się, jaka jest tutaj dobra praktyka; nasza poprzednia baza kodu rejestrowała _histerycznie_ szczegółowo, więc próbowałem ograniczyć dzienniki, aby były to rzeczywiście użyteczne informacje, ale samo wyczyszczenie dzienników również wydaje się podejrzane. Dla porównania, większość dzienników to niezdefiniowane zmienne, ponieważ były programista lubił używać `if (!$var)` zamiast `if (empty($var))`. Bardzo chciałem usunąć _te_ wpisy, ponieważ aplikacja nie wykonuje żadnych nieoczekiwanych działań, ale codziennie otrzymywałem dziesiątki tych samych ostrzeżeń, dopóki tego nie naprawiliśmy. Dlatego też pozostawiłem ostrzeżenie o logowaniu w produkcji. **Czy powinienem zachować wszystkie moje dzienniki błędów na przyszłość?** Czy powinienem jakoś segregować stare dzienniki i oznaczać je tagami, aby utworzyć numery?


title: Czy istnieje kanoniczna książka o programowaniu na Androida?

text: Wchodzę w programowanie na Androida i potrzebuję książki, która pomoże wypełnić niektóre luki. Czy istnieje książka, która jest de facto standardem opisującym najlepsze praktyki, metodologie projektowania i inne przydatne informacje dotyczące programowania na Androida? Co w tej książce czyni ją wyjątkową?


title: Jak w agile (scrumie) rozbić historyjkę użytkownika?

text: W agile (scrumie), jak najlepiej podzielić rzeczy na historyjkę użytkownika. Wielkość zespołu to około 6 programistów, jeśli to robi różnicę, a iteracje trwają 3 tygodnie. Czy łamanie historyjki użytkownika punktami i godzinami jest uważane za zwinne, czy jest to TYLKO punkty użytkownika za daną historyjkę użytkownika? Czy powinniśmy również podzielić historyjkę użytkownika na zadania? W rzeczywistym przepływie pracy dla historyjki użytkownika masz takie rzeczy jak: 1. zbieranie wymagań 2. przegląd historyjki użytkownika przez menedżerów itp. 3. zadania powiązane z qa w przepływie pracy użytkownika Jak te rzeczy są obsługiwane w zwinnym środowisku?


title: Czy użycie wielu zestawów rekordów w jednym żądaniu bazy danych będzie bardziej wydajne?

text: I 'm przebudowa starej witryny e-commerce, która jest obecnie napisana w C# ASP.NET 2.0. Ponieważ jest to witryna o dość dużym natężeniu ruchu i ma problemy z wydajnością, chcę rozwijać ją w jak najbardziej efektywny sposób. Aby zminimalizować podróże do bazy danych (przy użyciu SQL Server 2012), ponieważ wydajność bazy danych jest zwykle wąskim gardłem w bieżącym systemie, zamierzam utworzyć procedury składowane, które zwracają wszystko, co jest wymagane dla bieżącej strony w jednym zapytaniu, jako wiele zestawów rekordów. Na przykład zapytanie na stronie głównej może zwrócić nazwy plików i tekstów obrazów banerów promocyjnych, nowe produkty, najlepiej sprzedające się produkty itp. Strona produktu może zwrócić szczegóły produktu, produkty powiązane itp. Nie pamiętam, jak widziałem tę technikę używane często, jeśli w ogóle. Czy zwracanie wszystkich danych w jednym żądaniu bazy danych jest bardziej wydajne niż pobieranie tych samych danych w kilku żądaniach bazy danych? Czy są w tym jakieś wady?


title: Jak usunąć zbędny kod, który włącza przycisk. Lub stwierdzenie „jeśli”

text: Mam prawdopodobnie problem z mikrooptymalizacją. Mam przyciski **„Numer w historii”** , **„Następny numer”** , **„Resetuj”** oraz **„etykieta”** dla tekstu. Za każdym razem, gdy klikam przycisk **"Następny numer"**, chcę pokazać losową liczbę w **etykiecie** i dodać ją do **tablicy historii**, gdzie śledzę ostatnią liczbę. Za każdym razem, gdy kliknę **"Liczba historii"**, losowo wyświetli się jedna z liczb losowych z **tablicy historii**. Za każdym razem, gdy kliknę przycisk **"Resetuj"**, po prostu wyczyści to **tablicę historii**. I widać, że kliknięcie na **"Historia number** ma sens tylko wtedy, gdy **tablica historii** NIE jest pusta. I zastanawiam się, jak to zrobić, bez zbędnej instrukcji **"if"** przy wywołaniu zwrotnym **"numer historii"**. Lub Dezaktywacja przycisku **"numer historii"** na starcie programu. Następnie aktywuj go **KAŻDY** po kliknięciu **"następnego numeru"** (co jest brzydkie). I ponownie dezaktywuj ten przycisk na przycisku **„Resetuj”**. Ten schemat na tablicy pokazuje, co mam na myśli: ![Schemat, który demonstruje etykietę i koncepcję przycisków](http://i.stack.imgur .com/GOwQB.jpg) A ja mam kod JavaScript, w którym zaimplementowałem jedno z brzydkich rozwiązań (to drugie, z dezaktywacją i aktywacją przy odpowiednich callbackach) http://jsbin.com/aJESAYu/17/edit PS: Natknąłem się na ten problem z pisaniem w Objective-C, ale pomyślałem, że byłoby głupio opublikować repozytorium z kodem iOS Objective-C, podczas gdy nie wszyscy muszą mieć Xcode.Więc zrobiłem przykład JavaScript.Więc nie ograniczaj swojej odpowiedzi s tylko na język. PS2: Pomyślałem o dwóch funkcjach **"następny numer"**. 1) Ten, który miałby wiersz kodu, który włącza przycisk **„numer historii”** i 2) drugi bez. Na początku funkcja 1) byłaby funkcją obsługi. I na końcu tej funkcji 1), moduł obsługi zamieni się na funkcję 2). Również procedura obsługi **"reset"** umieściłaby ponownie procedurę obsługi funkcji 1) . PS3: Wiem, to może być przesada. Ale tylko kilka razy zmagałem się z taką sytuacją. I zastanawiam się, czy jest lepsze rozwiązanie. Z góry bardzo, bardzo dziękuję.


title: Kontrola wersji danych aplikacji

text: Mówiąc najprościej, produktem mojej firmy jest aplikacja internetowa z zapleczem bazy danych. Mamy środowisko sceniczne i środowisko produkcyjne dla każdego z około 100 klientów. Dla każdego środowiska istnieje osobna baza danych. Zawartość bazy danych pochodzi z wielu plików CSV, które są tworzone i utrzymywane przez nasz (nietechniczny) zespół danych. Dane są specyficzne dla klienta i muszą być również aktualizowane, gdy programista dodaje nowe funkcje do produktu. Jednak nie wszyscy klienci korzystają z tej samej wersji produktu, więc nie tylko zawartość, ale także struktura plików CSV różni się w zależności od klienta. Obecnie pliki CSV są wersjonowane w SVN. Jednak nie ma rozdziału między testowanymi i nieprzetestowanymi danymi. Mój zespół jest odpowiedzialny za ładowanie nowych danych do środowisk klientów, ale wcześniej byliśmy spaleni, ładując nieprzetestowane dane do środowiska produkcyjnego. Oczywistą odpowiedzią na to jest naśladowanie konfiguracji programistycznej i utworzenie łącza, gałęzi i tagów, gdzie łącze jest zawsze stabilne (dane testowane), gałęzie zawierają eksperymentalne/nietestowane zmiany, a tagi są tworzone za każdym razem, gdy nowe dane są ładowane do środowisko. Moje pytanie dotyczy zależności między danymi a kodem... kiedy dev wydaje wydanie zawierające nowe funkcje, dane muszą zostać zaktualizowane, aby uwzględnić te funkcje, zanim będziemy mogli uaktualnić kod w środowisku. Jak możemy śledzić, czy dane dla konkretnego klienta są kompatybilne z konkretną wersją kodu? Moim pierwszym odruchem jest tworzenie oddziału w repozytorium danych za każdym razem, gdy planowana jest aktualizacja kodu dla danego klienta. Nazwa oddziału odpowiadałaby numerowi wydania. Ponieważ jednak wersja kodu na naszych produkcyjnych boksach zwykle pozostaje znacznie w tyle za wersją na naszych środowiskach scenicznych, zespół danych musiałby pracować jednocześnie w dwóch gałęziach, zapewniając, że nowe funkcje dla najnowszego i najlepszego kodu trafiają tylko do najnowszej gałęzi, ale poprawki są nadal wprowadzane również w starszej gałęzi. Oczywiście, gdy kod na scenie i w produkcji się rozejdą, nie możemy być w 100% pewni, że poprawki danych, które testujemy na scenie, będą działać na starszym kodzie zainstalowanym w środowisku produkcyjnym. Czy ktoś ma jakieś pomysły, jak możemy lepiej zarządzać tym procesem?


title: Uzyskaj dane po stronie klienta lub serwera specyficznego dla użytkownika

text: Witryny, które mają systemy członkostwa i koszyki, zwykle wyświetlają różne informacje na stronie w zależności od tego, czy użytkownik jest zalogowany, czy nie, czy są produkty w koszyku itp. Reszta strony jest często taka sama dla wszystkich użytkowników, zalogowany lub nie. Aby wyświetlić te informacje specyficzne dla użytkownika, możesz to zrobić po stronie serwera podczas renderowania strony lub po stronie klienta za pomocą wywołania AJAX podczas ładowania strony. Wykonanie tego po stronie klienta może przynieść pewne korzyści w zakresie wydajności serwera, ponieważ obciążenie po stronie serwera jest zmniejszone, ponieważ strona może być obsługiwana z pamięci podręcznej i chociaż dane specyficzne dla użytkownika nadal muszą być generowane na żądanie, będą one minimalne. Wadą jest oczywiście kolejna prośba do serwera. Poszukiwanie opinii na temat zalet i wad każdej techniki oraz tego, co jest powszechne na dużych, wysokonakładowych stronach internetowych. Co robi stos?


title: Jak wyjaśnić, że kodowanie to nie tylko kopiowanie i wklejanie dla programistów niebędących programistami?

text: W mojej grupie jest 6 osób. Mój szef i pozostali są programistami SQL, którzy nie rozumieją programowania, wzorców projektowych, dobrego projektowania obiektowego itp. Ale wszyscy ukończyli kurs Java na studiach. Kiedy pojawiają się nowe projekty, zwykle proszony jestem o podanie szacunkowego czasu, jak długo zajmie moja część. Jeśli ten projekt jest potrzebny z szybkim odwróceniem i nie podoba im się oszacowanie, które im podałem, spojrzą na poprzednie moduły/portlety, które zbudowałem i powiedzą rzeczy w stylu: „Wygląda zasadniczo tak samo jak Projekt X, więc możesz powinien być w stanie po prostu skopiować/wkleić ten kod i trochę zmodyfikować SQL.Powinieneś być w stanie zrobić to w połowie czasu, który nam dałeś”. Ostatnio było tak źle, że mój szef wezwał mnie na codzienne spotkanie aktualizujące status z tamtejszą grupą, a każdy z programistów SQL zapytał mnie, dlaczego nie mogę po prostu skopiować/wkleić istniejącego kodu. Nawet `wzięli dokumentację wiki, którą stworzyłem` z poprzednich projektów i **zaczęli mi wyjaśniać moją dokumentację**. Czy ktoś jeszcze w to wpadł? Jak sobie z tym radzisz?


title: Jak Observer tworzy luźno sprzężony projekt?

text: Całkowicie rozumiem wzorzec projektowy Observer, do czego służy i jak go zaimplementować. Rozumiem również, co oznacza termin „luźno sprzężony”. Ale nie jestem pewien, w jaki sposób Observer sprawia, że projekty są bardziej luźno połączone. Na przykład, powiedzmy, że chcę, aby obiekty B i C otrzymywały aktualizacje z obiektu A dotyczące jego stanu. Wzór Observer to świetny sposób na zrobienie tego. Ale można to również zaimplementować w sposób bardziej „brutalny”, bez użycia wzorca. Wyjaśnij mi, w jaki sposób wzór Observer pozwala na tworzenie luźniejszych projektów. Nie jestem pewien, czy całkowicie rozumiem. Dzięki _(Ponownie rozumiem, co oznacza 'luźno sprzężone', ale nie do końca w jaki sposób Observer pozwala na bardziej luźne sprzężenie projektów)._


title: Czego ktoś powinien się nauczyć, aby do 2015 roku zostać świetnym twórcą aplikacji internetowych?

text: Mój brat właśnie zaczął uczyć się html/css w szkole i uwielbia to. Poprosił mnie o radę, jakich języków się uczyć, aby tworzyć świetne aplikacje internetowe, zanim skończy szkołę. (2015 lub coś w tym stylu.) Zrobiłem trochę researchu, a teraz chcę mu powiedzieć (w tej konkretnej kolejności): * HTML -> HTML5 * CSS -> CSS3 * Javascript -> jQuery -> AJAX * PHP -> Zend Framework * MySQL * Ruby -> RoR Chciałbym wiedzieć, czy to jest poprawne, zanim zmarnuję jego czas. Stackoverflow wydaje się być miejscem, w którym ludzie znają odpowiedzi na tego typu pytania ;). Dziękuję!


title: Projektowanie klas zawierających te same obiekty, ale różną ich ilość

text: Tworzę główny obiekt, MACHINE, który będzie zawierał różnorodność kilku innych obiektów - OŚ, WZMACNIACZ, ENDEFECTOR, itp. Liczba zawartych obiektów będzie się różnić w zależności od obiektu modelu MACHINE, którego używam. Na przykład pewna maszyna może mieć jedną OSI i jeden ENDEFECTOR; kolejne 3 AXIS i 2 ENDEFFECTORY itp. Planowałem stworzyć podklasy z każdym modelem maszyny i zainicjować odpowiednią liczbę zawartych obiektów w zależności od modelu. Obawiam się, że nastąpi eksplozja modeli maszyn, a także sporo powtarzającego się kodu i ustawień wśród podklas. Mam wrażenie, że istnieje czystszy sposób na wdrożenie tego, ale nie jestem pewien, jak to zrobić. Wszelkie pomysły będą mile widziane.


title: Czy funkcje transparentne referencyjnie mogą mieć skutki uboczne?

text: Wszędzie czytałem, że przejrzystość referencyjna i efekty uboczne wykluczają się wzajemnie dla wszystkich funkcji, jednak co z przypadkiem, w którym funkcja zmienia jakiś stan, który nie ma wpływu na jej wyjścia. Na przykład: global_variable = 0 def foo(a,b): global_variable += 2 return a + b # Inny kod ... Teraz, jeśli wywołasz tę funkcję, wydaje się, że pasuje do standardowej definicji przezroczystości referencyjnej, chociaż również się zmienia stan, a tym samym ma skutki uboczne. Mając to na uwadze, zastanawiam się, czy źle rozumiem referencyjną przejrzystość, a nawet ideę efektu ubocznego? Czy słuszne jest stwierdzenie, że funkcja foo jest zarówno referencyjnie przejrzysta, jak i ma skutki uboczne? Do pewnego stopnia uważam, że rozszerzenie definicji przezroczystości referencyjnej o warunek, że efekty uboczne bez wpływu na wartość zwracaną przez funkcję nadal wykluczają funkcje z uznania ich za przezroczyste referencyjne, przynosi efekt przeciwny do zamierzonego.


title: Czy istnieją algorytmy dzielenia lub łączenia słów w ich bardziej powszechną formę?

text: Czy istnieją algorytmy, które mogą przeglądać listę słów i dzielić lub łączyć słowa w bardziej powszechną formę? Na przykład mam listę wielu nazw firm z branży opieki zdrowotnej. Słowo „opieka zdrowotna” często zapisuje się jako „opieka zdrowotna”. Istnieją również nazwy firm, które można dzielić lub łączyć, takie jak „`Walmart`” i „`Walmart`”. Czy są jakieś algorytmy, które mogą spojrzeć na moją listę słów i zidentyfikować, że „`opieka zdrowotna`” jest częściej pisana jako dwa słowa, a „`Wal mart`” jest częściej pisana jako jedno słowo? Szukam nazw istniejących algorytmów (które mogą pomóc w przeszukiwaniu sieci) lub linków do istniejących white papers lub postów na blogu. Wolałbym algorytm, który nie zależy od słownika lub innej zewnętrznej listy słów lub nazw firm. EDYCJE: Tło: Mam już kod, który jest umiarkowanie skuteczny w tym zadaniu. Kod został złożony bez większego rygoru. Miałem nadzieję, że istnieją pewne ustalone algorytmy, które prawdopodobnie będą bardziej akademickie i kompletne niż to, co wymyśliłem. To pytanie nie dotyczy metody, którą wymyśliłem, ale stwierdzenie „to niemożliwe” mnie nie przekonuje. Wyjaśnienie: „Bardziej powszechna forma” słowa to sposób, w jaki słowo (słowa) są najczęściej pisane. Na przykład „`Walmart`” pojawiał się wiele razy, a „`Walmart`” pojawiał się wiele razy, ale „`Walmart`” pojawiał się częściej niż „`Walmart`”, a więc „`Walmart`” to „więcej wspólna forma” tego słowa. Nie oczekuję, że ten algorytm przyniesie doskonałe rezultaty. Jak każdy problem z uczeniem maszynowym, oczekuję, że wyniki będą zależne od jakości danych, które im podam, i ilości danych, które posiadam.


title: Pytania dotyczące interfejsu dotyczące jednoczesnego używania wzorca poleceń i wstrzykiwania zależności

text: Mam wiele projektów, które mają zasadniczo ten sam wysoki poziom wymagań: testowanie całego sprzętu na urządzeniu. Każde urządzenie może mieć inny protokół komunikacyjny, wymaga innego sprzętu testowego do ćwiczenia urządzenia itp. Tak więc na wysokim poziomie test jest zasadniczo następujący: 1. uzyskanie uchwytów do sprzętu testowego 2. zastosowanie bodźca do urządzenia 3. pomiar/ wykryć/nagrać coś mierzalnego 4. usunąć bodziec 5. przechowywać wyniki 6. obsługiwać błędy Stworzyłem klasę interfejsu ( CTestEquipment ) ponieważ każdy sprzęt testowy może być konkretną klasą z unikalną implementacją. Testowane urządzenie można również uznać za urządzenie testowe. Używam Dependency Injection dla sterownika sprzętu testowego. Ma to na celu umożliwienie łatwej zmiany jednego kierowcy na drugiego i utrzymanie nieco rozdzielenia kierowcy i sprzętu. Na przykład zasilacz może używać sterownika GPIB, sterownika VISA lub surowych poleceń szeregowych. Każdy projekt może wybrać, który ma zastosowanie i zmienić jedną linię (instancja sterownika). Następnie stworzyłem klasy do implementacji wzorca poleceń dla sprzętu/urządzenia testowego. Tak więc CTestEquipment dziedziczy po CCmdReceiver. Konkretna klasa poleceń wywołuje metodę execute, która poprzez odbiornik wywołuje metody tx/rx urządzenia testowego. Te metody wywołują podstawowy sterownik. Pytania/Problemy: Jak wyodrębnić otrzymane dane z polecenia? W tej chwili execute nie ma argumentów i nic nie zwraca. Konkretne polecenie może tylko przesyłać, tylko odbierać lub wykonywać jedno i drugie, więc interfejs wykonania musi albo zwrócić wartość, nawet jeśli nie ma odebranych danych, albo w inny sposób muszę mieć do nich dostęp. CSetSerialNumber nie ma odebranych danych. CGetMode tak. Ponieważ polecenie wywołuje tx/rx, które ostatecznie wywołuje tx/rx sterownika, jak mam spakować dane do tych wywołań, ponieważ każdy sterownik może przyjąć coś innego? Rozważałem interfejs CPacket i różne konkretne implementacje, ale w jaki sposób mogę się upewnić, że przekazanie konkretnej klasy, która nie pasuje do sterownika, zostanie przechwycone? //------------------------------------------------ -------------------------------------- // CCommand // Abstrakcyjny interfejs definiujący metodę wykonania //------------------------------------------------ --------------------------- class CCommand { protected: CCmdReceiver * _rcvr_p; // interfejs odbiornika // Default Constructor CCommand() {} public: // Constructor CCommand ( CCmdReceiver * r // interfejs odbiornika ) : _rcvr_p ( r ) {} // Destruktor wirtualny ~CCommand() {} // Metoda wykonania Polecenie wirtualne void execute() = 0; }; //------------------------------------------------ --------------------------- // CCmdReceiver // Abstrakcyjny interfejs definiujący akcję polecenia //------------------------------------------------ --------------------------- class CCmdReceiver { public: wirtualny void flush() = 0 ; virtual void rx( std::vector< unsigned char > & v ) = 0; //wirtualny void tx( std::string const & s ) = 0; wirtualny void tx( CPacket * p ) = 0; }; /*------------------------------------------------ ------------------------------ Sterownik sprzętu testowego abstrakcyjna klasa bazowa -------------- -------------------------------------------------- --------------*/ class CDriver { public: /*--------------------------- ----------------------------------------------- Konstruktor -- -------------------------------------------------- -----------*/ CDriver() : _is_open ( false ) {} /*-------------- -------------------------------------------------- ---------- Destruktor --------------------------------------- -----------------------------------*/ virtual ~CDriver() {} //protected: /* -------------------------------------------------- ------------------------ Zamknij sterownik Musi być zaimplementowany w klasie pochodnej ---------------- -------------------------------------------------- --------*/ wirtualna pustka close() = 0; /*------------------------------------------------ -------------------------- Uzyskaj otrzymane dane -------------------- -------------------------------------------------- ----*/ szablon< nazwa_typu tVal > tVal getRxData(); /*------------------------------------------------ -------------------------- Określ, czy sterownik jest otwarty ------------------ -------------------------------------------------- ------*/ wirtualny bool isOpen() { return( _is_open ); } /*--------------------------------------------------------------- --------------------------- Otwórz sterownik Musi być zaimplementowany w klasie pochodnej ------------- -------------------------------------------------- -----------*/ wirtualna pustka open() = 0; /*------------------------------------------------ --------------------------     Otrzymywać dane     ---------------------- -------------------------------------------------- --*/ virtual void rx() {} /*------------------------------------- ------------------------------------- Ustaw państwo bandery otwarte/zamknięte ------- -------------------------------------------------- -----------------*/ inline void setOpenState ( bool const & open = true ) { _is_open = open; } /*--------------------------------------------------------------- --------------------------- Transmisja danych --------------------- -------------------------------------------------- ---*/ virtual void tx ( std::string const & cmd // polecenie do przesłania ) {} private: bool _is_open; // flaga wskazująca, czy protokół jest otwarty }; //------------------------------------------------ --------------------------- // Klasa abstrakcyjnego sprzętu testowego // Wykorzystuje DI konstruktora dla sterownik urządzenia // Wykorzystuje RAII do otwierania/zamykania //------------------------------------------ ------------------------------------------------ klasa CTestEquipment : public CCmdReceiver { public: /// Constructor CTestEquipment ( boost::shared_ptr< CDriver > const & drvr // sterownik urządzenia ) : _drvr ( drvr ), _init_cnt ( 0 ) { _drvr->open(); incInitCnt(); } /// Destruktor wirtualny ~CTestEquipment() { if( isInitialized() ) { _drvr->close(); } } /// Funkcja dostępu do wbudowanego sterownika urządzenia::shared_ptr< CDriver > const & accessDriver() const { return( _drvr ); } // accessDriver() /// Zmniejsz licznik inicjalizacji inline void decInitCnt() { --_init_cnt; } // decInitCnt() /// Pobranie licznika inicjalizacji inline int getInitCnt() const { return( _init_cnt ); } // getInitCnt() /// Zwiększenie licznika inicjalizacji inline void incInitCnt() { ++_init_cnt; } // incInitCnt() /// Sprawdź, czy wystąpiła inicjacja inline bool isInitialized() const { return( _init_cnt >= 1 ); } // isInitialized() /// Określa, czy sterownik jest otwarty inline bool isOpen() const { return( _drvr->isOpen() ); } // isOpen() protected: /// Zresetuj sprzęt wirtualny void reset() { //_drvr->reset(); } /// Funkcja do odbioru danych z urządzenia inline void rx() { _drvr->rx(); } /// Funkcja ustawienia urządzenia do stanu domyślnego virtual void setToDflts() {} /// Funkcja przesłania polecenia do urządzenia inline void tx( std::string const & cmd ) { _drvr->tx( cmd ); } /// Funkcja przesyłania polecenia, odbierania odpowiedzi i zwracania szablonu przeanalizowanej wartości< nazwa_typu tVal > tVal txRx ( std::string const & cmd // polecenie do przesłania ) { _drvr->tx( cmd ); _drvr->rx(); return( _drvr->getRxData< tVal >() ); } protected: boost::shared_ptr< CDriver > const & _drvr; // sterownik urządzenia int _init_cnt; // licznik inicjalizacji }; class CGetMode : public CCommand { public: CGetMode ( CCmdReceiver * rcvr // odbiornik poleceń ); void execute() { // G: jakiego typu jest cmd? // G: jakiego typu jest bufor? // G: jak mamy dostęp do bufora? _rcvr_p->opróżnianie(); _rcvr_p->tx( cmd ); _rcvr_p->rx(bufor); } }; //------------------------------------------------ -------------------------------------- // CSetSerialNumber // Rozszerza interfejs poleceń. Implementuje metodę execute i wywołuje ją w odbiorniku. //------------------------------------------------ --------------------------- class CSetSerialNumber : public CCommand { public: // Konstruktor CSetSerialNumber ( CCmdReceiver * rcvr // odbiornik poleceń ); void execute() { // G: jakiego typu jest cmd? _rcvr_p->tx( cmd ); } };


title: Ile wysiłku powinienem zainwestować w tworzenie luźno powiązanych projektów?

text: Obecnie uczę się wzorców projektowych. Myślę, że większość ludzi zgodziłaby się, że te wzorce są świetnymi narzędziami, ale powinny być używane z umiarem, a nie jako odpowiedź na wszystko. Używanie ich zbyt często skomplikowałoby aplikację z niewielkimi korzyściami. Wzorów należy używać tylko tam, gdzie mogą być najlepszym rozwiązaniem lub pomóc w stworzeniu dobrego rozwiązania (zgadzasz się?). Mając to na uwadze: książka, którą czytam (Wzorce projektowe na pierwszym miejscu) często podkreśla znaczenie **luźnego połączenia**. To luźne połączenie jest osiągane przez przestrzeganie zasad, takich jak „program do interfejsu, a nie implementacja” i „enkapsulacja tego, co się zmienia”. Zasadniczo większość wzorców, których się do tej pory nauczyłem, istnieje głównie po to, aby projekty mogły być luźno połączone, a przez to bardziej elastyczne. Rozumiem znaczenie i zalety luźnego połączenia. Ale moje pytanie brzmi: **ile wysiłku należy naprawdę zainwestować w tworzenie luźno powiązanych, elastycznych projektów?** Ci, którzy sprzeciwiają się wzorcom projektowym, twierdzą, że koszty korzystania z tych wzorów często przewyższają korzyści. Inwestujesz dużo czasu w tworzenie luźno powiązanego projektu przy użyciu jakiegoś wzorca, **gdzie w rzeczywistości - luźne połączenie, 'programowanie do interfejsu, a nie implementacji' i wszystkie te zasady - mogą nie być tak ważne. ** Chciałabym wiedzieć, ile wysiłku powinienem faktycznie włożyć w tworzenie dodatkowych poziomów abstrakcji i projektów, aby moja aplikacja mogła przestrzegać zasad OO, takich jak luźne sprzęganie, programowanie do interfejsu itp. Czy to jest naprawdę warto? Ile wysiłku powinienem w to włożyć?


title: Przedwczesna optymalizacja w podejmowaniu decyzji o optymalizacji?

text: Mamy klasę, która została poprawnie zidentyfikowana do optymalizacji. Zrobiliśmy profilowanie i testowanie i to jest problem. Teraz mamy dwa możliwe podejścia do optymalizacji tej klasy: 1. Istnieje kilka bardzo nisko wiszących owoców. Możemy to przepisać w ciągu kilku dni w taki sposób, aby interfejs i wyniki nie uległy zmianie, dzięki czemu nie musimy zmieniać żadnego kodu, który używa tej klasy. Możemy zobaczyć, jaki ma to wpływ na wydajność i stąd wyjść. Wydaje mi się, że jest to podejście o bardzo niskim ryzyku i niskim poziomie inwestycji. 2. Ponieważ już zamierzamy wprowadzać zmiany, możemy pójść na całość w naszej optymalizacji. Sugerowane podejście polegałoby na zaimplementowaniu silnika innej firmy i wymagałoby od nas zmiany kodu korzystającego z tej klasy, a także przekształcenia istniejących danych klienta, które są wysyłane do klasy, do formatu używanego przez silnik innej firmy. Kodowanie może nie trwać zbyt długo, ale wymagałoby znacznie więcej testów. Wydaje się to być bardzo ryzykowną i wymagającą dużych inwestycji zmianą i będzie wymagało wielu dodatkowych testów, aby upewnić się, że nie złamiemy kodu wywołującego i nie złamiemy istniejących danych klienta. Oczywiście nie mogę testować z wyprzedzeniem, ale drugie podejście _prawdopodobnie_ wykona się szybciej i będzie bardziej wydajne pod względem pamięci. Jednak nie jestem pewien, o ile szybciej i nie jestem pewien, czy dodatkowy wysiłek w ogóle będzie tego wart. Nie jestem pewien, czy po wprowadzeniu zmian o niskim ryzyku nadal uznalibyśmy kod za prawidłowy cel optymalizacji. Pewnie domyślacie się, które podejście bym wolał. Nie zgadzam się ze współpracownikiem w tej sprawie. Oto moje pytanie: czy druga opcja to przedwczesna optymalizacja, mimo że zidentyfikowaliśmy już ten kod do optymalizacji? Jakie podejście należy przyjąć w tej sytuacji?


title: Cofanie się z Killer Sudoku

text: Tworzę solver Killer Sudoku do szkolnego projektu. Zaprogramowałem 10 ludzkich strategii pokazujących, co robią, aby były jak najbardziej edukacyjne. Może teraz rozwiązać trudne Killer Sudoku, ale mój nauczyciel zaproponował, abym użył nawrotu do rozwiązania każdej możliwej siatki. Przez tydzień próbowałem szukać ogólnych zasobów dotyczących backtrackingu lub zasobów opartych na Sudoku... Faktem jest, że w Killer Sudoku nie można po prostu powiedzieć, że komórka ma rozwiązanie bez polegania na strefach i na tym, co wcześniej napisane komórki wskazują na strefy i możliwości wszędzie. To, co chciałbym zrobić, to coś, co zastosuje wszystkie moje strategie za każdym razem, gdy zasugeruje liczbę, aby była bardziej wydajna i zwracała jedyne rozwiązanie. Ale żeby zastosować strategie, potrzebujemy kopii siatki, prawda? Mogę więc całkowicie sklonować moje obiekty za pomocą niektórych metod i mogę zastosować moje strategie za pomocą innej metody. Jaka byłaby struktura tej funkcji? PS: Próbowałem kilka razy napisać kod i za każdym razem zwracane rozwiązanie było nieprawidłowe. (Siatkę można łatwo sprawdzić pod kątem poprawności) To było mniej więcej tak: def bt(sudoku) if sudoku.valid? wtedy prawda else sudoku2 = sudoku.clone sudoku2.first_cell_not_solved.possibilities.each do |p| sudoku2.first_cell_not_solved.solution = czy kończy się sudoku2.apply_all_strategies, jeśli sudoku.completed? zwrócić sudoku.valid? w przeciwnym razie bt(sudoku2) koniec koniec koniec


title: Jak renderować teren za pomocą map wysokości i uzyskać podstawowe wykrywanie kolizji na górze terenu i kamerze (poruszanie się po terenie)

text: Załadowałem plik .RAW do tablicy 2x2 w mojej klasie. Sposób, w jaki renderuję, działa dobrze, ale staram się, aby kamera poruszała się po terenie. Teren renderuje się od 0,0,0 (x,y,z), bo tam umieściłem aparat. Moja klasa kamery pozwala "kamerze" na poruszanie się po scenie. Chcę móc „chodzić” po terenie z podstawowym wykrywaniem kolizji (jeśli to możliwe). Jakieś wskazówki, gdzie się udać lub jakieś wskazówki?


title: Jakie są trzy główne technologie przeprojektowania starego systemu COBOL?

text: Istnieje aplikacja, która raportuje dane finansowe banku do banku narodowego (wszystkie zlokalizowane w Europie). Jest to przestarzały system napisany głównie w języku COBOL. Tylko interfejs użytkownika jest napisany w Javie. Logika biznesowa jest przechowywana w postaci złożonych tabel i wpisów w bazie danych. Bez znajomości wszystkich elementów wewnętrznych trudno jest zmienić system zgodnie z nowymi przepisami finansowymi. Tak więc obecny system jest bardzo trudny do debugowania i niemożliwy do utrzymania. Moim celem jest teraz zidentyfikowanie najnowocześniejszych technologii/metod przeprojektowania i przepisania całego systemu. Jakie trzy najważniejsze technologie uznałbyś za przepisane w systemie COBOL w finansach? Bieżące rozważania obejmują: 1. Korzystanie z podejścia DSL (język specyficzny dla domeny) 2. Korzystanie z nowoczesnego języka programowania, takiego jak Scala 3. Kostka MS OLAP (sugerowana przez kolegę, nie przeze mnie)


title: Czy używanie Dropbox w instalatorze internetowym jest w porządku?

text: Więc pracuję w projekcie modowania i dali mi część instalacyjną do zrobienia. Planujemy opublikować go między **30 sierpnia a 1 września** **Moje pytanie;** czy logiczne jest używanie **Dropbox** do pobierania plików w **instalatorze sieciowym**? Widziałem, że folder publiczny Dropbox ma **10 GB przepustowości pobierania** dziennie, po osiągnięciu tego limitu; blokują konto. Mogę wstawić funkcję limitu i mogę korzystać z więcej niż jednego konta Dropbox. Ale wydaje się (nie jestem pewien, ale) jest to nielegalne lub sprzeczne z polityką firmy. Nie wiem, czy ten sam limit przepustowości dotyczy pobierania bezpośrednio z **folderu głównego.** Również całkowity rozmiar paczek sięga **1 GB**. Dlatego boję się limitu przepustowości. A jeśli **nie polecasz** korzystania z Dropbox, co byś doradził? Myślę, że prosty automat sieciowy z **Mediafire** to dobry wybór, ale wznowienie pobierania **nie będzie** możliwe. Mam też **Fileserve Premium Account** (przyjaciel dał mi w prezencie), ale najprawdopodobniej zostanie zbanowane po użyciu jednocześnie różnych adresów IP. Jeszcze jedna rzecz, którą piszę w **C#**. Dziękuję...


title: GUI systemu Windows: jak długo będą działać „przestarzałe” interfejsy API?

text: Zauważ, że powiedziałem „przestarzały”, a nie „abstrakcyjny”. W czasach MFC, WinAPI nie było przestarzałe, ponieważ z tego, co przeczytałem, MFC po prostu wyabstrahowało WinAPI. Jest różnica, ponieważ przestarzały interfejs API to taki, którego funkcjonalność ma nowszy zamiennik wsuwany, a nie warstwę na górze. Pytam w świetle kierunku, w jakim obrała Windows. Po pierwsze, obiekty GDI zostały ominięte za pomocą WPF przy użyciu DirectX. O ile nie przeczytałem dezinformacji, oznacza to, że GUI systemu Windows mogło zostać ponownie zaimplementowane w interfejsie API, który nie wymaga pod spodem GDI. Potem przyszedł Windows 8, zapowiadając przejście na interfejsy HTML/JavaScript, co oznacza, że DirectX też nie jest potrzebny. Ha. Oczywiście tak jest, silnik IE obsługujący takie interfejsy prawdopodobnie używa obecnie akceleracji sprzętowej zapewnianej przez DirectX. Ale GDI nie jest potrzebne, prawda? W rzeczywistości, ponieważ GDI nie jest już potrzebne, czy nie oznacza to deprecjacji GDI, GDI+, MFC i różnych innych bibliotek szablonów zbudowanych na GDI? Teraz, wbrew powszechnemu mniemaniu, wiadomo, że Windows tradycyjnie bardzo poważnie podchodził do wstecznej kompatybilności. Ale jak długo potrwają, zanim porzucą GDI? Ile czasu upłynie, zanim podstawowe biblioteki .NET zostaną przepisane, aby wywoływać jądro i prywatne niskopoziomowe procedury Windows bezpośrednio dla usług bez przechodzenia przez samo WinAPI? W końcu C# obsługuje niebezpieczny kod, więc omijanie publicznej warstwy WinAPI nie jest nie do pomyślenia nawet dla rzeczy niższego poziomu. Nie mówię o wyeliminowaniu kodu C czy czymś w tym rodzaju. Zastanawiam się tylko, czy niektóre publiczne interfejsy prezentowane przez system Windows mogą nie być dostępne, jeśli MS uzna je za niepotrzebne w przyszłości.


title: Jak zdobyłeś dobre praktyki dla swoich projektów OOP?

text: Zdałem sobie sprawę, że mam trudności z tworzeniem projektów OOP. Spędziłem wiele czasu na decydowaniu, czy ta właściwość jest poprawnie ustawiona na klasę X. Na przykład jest to post, który ma kilka dni: http://codereview.stackexchange.com/questions/8041/how-to-improve-my-factory-design Nie jestem przekonany do mojego kodu. Dlatego chcę ulepszać moje projekty, a ich tworzenie zajmuje mniej czasu. Jak nauczyłeś się tworzyć dobre projekty? Niektóre książki, które możesz mi polecić?


title: Dylemat kontroli jakości a iteracje

text: W mojej firmie z powodzeniem pracujemy na zwinnych praktykach – ale bez stosowania iteracji. Głównym powodem jest to, że nie możemy znaleźć prostego sposobu na dopasowanie się do QA w cyklu iteracyjnym. Rozumiemy kontrolę jakości jako dodatkową weryfikację _pewnej kompilacji_ (kandydat do wydania) przed wdrożeniem tej kompilacji u klienta. Chodzi o to, aby pojedyncze złośliwe zatwierdzenie nie uszkodziło całego wydania. Ponieważ nigdy nie wiadomo, który to jest, kontrola jakości musi poczekać, aż _wszystkie_ funkcje/zatwierdzenia dla wydania znajdą się w kompilacji. (Żadne słynne ostatnie słowa „To była tylko drobna zmiana”.) Jeśli kontrola jakości znajdzie błędy w kandydacie do wydania, programiści naprawiają je w odpowiedniej gałęzi wydania (i łączą ją z głównym). Gdy wszystkie błędy zostaną naprawione, nowa kompilacja zostanie wdrożona, aby kontrola jakości została ponownie przetestowana. Tylko wtedy, gdy nie zostaną znalezione żadne błędy w określonym kandydacie do wydania, jest on oferowany klientowi do weryfikacji. Zwykle zajmuje to około dwóch do trzech kandydatów, około tygodnia, na wydanie. Czas na napisanie poprawek jest zwykle znacznie krótszy niż wysiłek związany z testowaniem. Aby programiści byli zajęci, pracują nad wydaniem N+1, podczas gdy kontrola jakości działa na N. Bez używania iteracji nie stanowi to problemu, ponieważ możemy nakładać się na pracę nad wydaniami N i N+1. Jednak z tego, co rozumiem, nie jest to zgodne z podejściami opartymi na iteracji, takimi jak Scrum lub XP. Żądają, aby iteracja była możliwa do wydania na jej końcu, a wszystkie wysiłki związane z testowaniem zostały włączone do iteracji. Uważam, że to z konieczności prowadzi do jednego z następujących niepożądanych wyników: **(A)** Deweloperzy są bezczynni pod koniec iteracji, ponieważ kontrola jakości potrzebuje czasu na weryfikację kandydata do wydania, a praca nad poprawą błędów nie zapewnia w pełni zajętości programistom. **(B)** Kontrola jakości zaczyna działać jeszcze przed przygotowaniem pierwszego kandydata do wydania. To jest najczęściej zalecane na Stack Exchange. Ale to nie jest to, co moja firma rozumie jako QA, ponieważ nie ma testowanego konkretnego kandydata do wydania. A „drobną zmianę”, która wszystko psuje, wciąż można wprowadzić niezauważona. **(C)** Błędy są przenoszone do następnej iteracji. Jest to również zalecane w przypadku wymiany stosów. Myślę, że to w ogóle nie jest rozwiązanie. Zasadniczo oznacza to, że nigdy nie otrzymamy zweryfikowanej wersji, ponieważ za każdym razem, gdy wprowadzane są poprawki błędów, do tej samej gałęzi dodawane są również nowe, niezweryfikowane zatwierdzenia. **Czy jest jakieś wyjście z tego dylematu?**


title: Czy zmiany w działaniu naruszają zasadę substytucji Liskov?

text: Powiedz, że mam: interfejs Rzecz { GetThing(); } class FastThing : Thing { public int GetThing() { return 1; } } class SlowThing : Thing { public int GetThing() { return GetThingFromDatabase(); } } Czy jest to naruszenie zasady substytucji Liskova?


title: Ilu programistów zanim ciągła integracja stanie się dla nas skuteczna?

text: Z ciągłą integracją wiąże się pewien narzut, np. konfiguracja, przeszkolenie, działania uświadamiające, zatrzymywanie w celu naprawienia „błędów”, które okazują się problemami z danymi, wymuszone rozdzielenie problemów, style programowania itp. W którym momencie następuje ciągła integracja zapłacić za siebie? **EDYTUJ: To były moje ustalenia** Konfiguracja to CruiseControl.Net z Nant, odczyt z VSS lub TFS. Oto kilka przyczyn niepowodzenia, które nie mają nic wspólnego z konfiguracją: _Koszt badania_: czas poświęcony na sprawdzenie, czy czerwone światło jest spowodowane prawdziwą logiczną niespójnością kodu, jakością danych lub innym źródłem, takim jak problem z infrastrukturą (np. problem z siecią, przekroczenie limitu czasu odczytu z kontroli źródła, awaria serwera innej firmy itp.) _Koszty polityczne związane z infrastrukturą_ : Rozważałem wykonanie sprawdzenia „infrastruktury” dla każdej metody w trakcie testu. Nie miałem rozwiązania problemu limitu czasu poza wymianą serwera kompilacji. Na przeszkodzie stanęła biurokracja i nie było wymiany serwerów. _Koszt naprawy testów jednostkowych_ : Czerwone światło z powodu problemu z jakością danych może wskazywać na źle napisany test jednostkowy. Tak więc testy jednostkowe zależne od danych zostały przepisane, aby zmniejszyć prawdopodobieństwo czerwonego światła z powodu złych danych. W wielu przypadkach niezbędne dane zostały wprowadzone do środowiska testowego, aby móc dokładnie uruchomić jego testy jednostkowe. Sensowne jest stwierdzenie, że czyniąc dane bardziej odpornymi, test staje się bardziej odporny, jeśli jest zależny od tych danych. Oczywiście zadziałało to dobrze! _Koszt pokrycia, czyli pisania testów jednostkowych dla już istniejącego kodu_ : Pojawił się problem pokrycia testów jednostkowych. Były tysiące metod, które nie miały testów jednostkowych. Tak więc, aby je stworzyć, potrzebna byłaby znaczna ilość osobodni. Ponieważ byłoby to zbyt trudne, aby przedstawić uzasadnienie biznesowe, zdecydowano, że testy jednostkowe będą stosowane dla każdej nowej metody publicznej w przyszłości. Te, które nie przeszły testu jednostkowego, nazwano „potencjalnie na podczerwień”. Interesujące jest to, że metody statyczne były kwestią sporną, w jaki sposób można jednoznacznie określić, w jaki sposób konkretna metoda statyczna zawiodła. _Koszt wydań na zamówienie_ : Skrypty Nant idą tylko tak daleko. Nie są one tak przydatne dla, powiedzmy, kompilacji zależnych od CMS dla EPiServer, CMS lub jakiegokolwiek wdrażania baz danych zorientowanych na interfejs użytkownika. Oto typy problemów, które wystąpiły na serwerze kompilacji w przypadku cogodzinnych testów i nocnych kompilacji kontroli jakości. Uważam, że są one niepotrzebne, ponieważ build master może wykonywać te zadania ręcznie w momencie wydania, szczególnie z jednoosobową opaską i małą kompilacją. Tak więc z mojego doświadczenia wynika, że kompilacje jednoetapowe nie uzasadniają stosowania CI. A co z bardziej złożonymi, wieloetapowymi kompilacjami? Może to być trudne do zbudowania, szczególnie bez skryptu Nant. Tak więc, nawet po stworzeniu jednego, nie odniosły one większego sukcesu. Koszty naprawienia problemów z czerwonym światłem przeważyły korzyści. Ostatecznie programiści stracili zainteresowanie i zakwestionowali ważność czerwonego światła. Po uczciwej próbie uważam, że CI jest drogie i jest dużo pracy na obrzeżach, zamiast po prostu wykonać zadanie. Bardziej opłacalne jest zatrudnienie doświadczonych programistów, którzy nie robią bałaganu przy dużych projektach, niż wprowadzenie i utrzymanie systemu alarmowego. Dzieje się tak, nawet jeśli ci programiści odejdą. Nie ma znaczenia, czy dobry programista odejdzie, ponieważ procesy, które stosuje, zapewnią, że napisze specyfikacje wymagań, specyfikacje projektowe, trzyma się wytycznych dotyczących kodowania i komentuje swój kod tak, aby był czytelny. Wszystko to jest weryfikowane. Jeśli tak się nie dzieje, oznacza to, że lider zespołu nie wykonuje swojej pracy, która powinna zostać podjęta przez jego menedżera i tak dalej. Aby CI zadziałało, nie wystarczy po prostu napisać testy jednostkowe, starać się utrzymać pełne pokrycie i zapewnić działającą infrastrukturę dla systemów o dużych rozmiarach. _**Konkluzja:_** Można mieć wątpliwości, czy naprawienie tylu błędów przed wydaniem jest w ogóle pożądane z biznesowego punktu widzenia. CI wymaga dużo pracy, aby wychwycić garść błędów, które klient może zidentyfikować w UAT lub firma mogłaby otrzymać zapłatę za naprawę w ramach umowy serwisowej klienta, gdy okres gwarancji i tak wygaśnie.


title: Kiedy ciągła integracja wnosi wartość dodaną?

text: > **Możliwy duplikat:** > Ilu programistów, zanim ciągła integracja stanie się skuteczna? Kiedy ciągła integracja (taka jak CruiseControl) dodaje wartość do projektu? Czy takie czynniki jak * liczba testów jednostkowych * częstotliwość wprowadzania zmian * rozwój oddziału * wielkość zespołu mają wpływ na wartość dodaną ciągłej integracji, czy jest to coś, co zawsze jest warte zachodu?


title: Obliczenia równoległe przy użyciu xcode

text: Tworzę fraktale mandelbrota w C przy użyciu Xcode i chcę użyć obliczeń równoległych, ale wszystko, czego próbowałem do tej pory, nie działa. Takich jak To pytanie i inne poradniki. Jaki jest najłatwiejszy sposób korzystania z frameworków, takich jak mpi.h, do równoległego uruchamiania mojego programu?


title: Wzorzec projektowy MVC. Przeciążanie obowiązków kontrolera

text: Zajmuję się tworzeniem aplikacji komputerowej z graficznym interfejsem użytkownika. Aby to zrobić, używam wzorca projektowego MVC dla części GUI. Na razie aplikacja składa się z jednego okna (widoku) z jednym kontrolerem współpracującym z backendem (modelem). Interakcja z dnia na dzień staje się coraz bardziej złożona, a kontroler otrzymuje coraz więcej metod do obsługi danych wejściowych i dodaje więcej zależności z obiektami modelu. Ponieważ najlepszą praktyką jest utrzymywanie małych klas i metod, mam ochotę delegować niektóre zadania, czy to prawda? Czy jest na to jakiś czysty sposób? Jeśli chodzi o zależności z modelem, używam obiektu fasady, ale znowu czuję, że jest zbyt przeciążony.


title: Refaktoryzacja metody 1500 LOC, która buduje tylko graficzny interfejs użytkownika

text: Obecnie zastanawiam się, jak zrefaktoryzować metodę, która w zasadzie buduje tylko interfejs użytkownika. Metoda ta ma ponad 1500 wierszy kodu (LOC) i jest liczona. Urosło, nie było planu, jak do tego podejść. **Może** uznasz to za znajome. W każdym razie jest to w zasadzie tylko jedna duża metoda, która wygląda mniej więcej tak: . . . # null checks null_checks_bx = Box(True) null_checks_ck = CheckBox() null_checks_ck.set_text('Null checks zgłasza wyjątki typu:') if 'doNullChecks' w opcjach: null_checks_ck.set_active(options['doNull_checklls._]) set_active(True) # dict do posortowanej listy: wyodrębnij wartości z dict według listy wyjątków rozumienia = posortowane([exception.get_full_name() dla wyjątku w JavaTypes.exception_types]) null_checks_se = Selector() null_checks_se.add_items(Exceptions) null_set_checks_se null_checks_ck.get_active()) if 'nullChecksExceptionFullClassName' in options: null_checks_se.set_value(options['nullChecksExceptionFullClassName']) else: # domyślnie do pierwszego wpisu Commons Lang NullAr gumentException) null_checks_se.set_value(JavaTypes.exception_types[0].get_full_name()) # callback Callbacks.sync_model_active_status(null_checks_ck, null_checks_se) null_checks_ck.add_clicked_callback(lambllsynd. , False, True) # fikcyjna etykieta wcięcia null_checks_bx.add(null_checks_ck, False, True) null_checks_bx.add(null_checks_se, False, True) # wywołania konstruktora klasy encji relacji relations_constructor_calls_bx = Box(Trulls_spaclation. .set_padding(3) relations_constructor_calls_ck = CheckBox() connection_constructor_calls_ck.set_text('Instancja encji relacji (jeśli występują wszystkie niezbędne kolumny)') if 'doRelationshipConCalls' w opcjach: relat ionship_constructor_calls_ck.set_active(options['doRelationshipConCalls']) else: relations_constructor_calls_ck.set_active(False) relations_constructor_calls_bx.add(Label(indent), False, True) # fikcyjna etykieta wcięcia relations_constructor_bxca. kontrole null: jest to opcja niezależna od testów null! relations_not_null_checks = Box(True) #relationship_not_null_checks.set_spacing(5) #relationship_not_null_checks.set_padding(3) relations_not_null_checks_ck = CheckBox() connection_not_null_checks_ck.set_text('Sprawdzenie niezerowe. null_checks_ck.get_active())              if 'doRelationshipNotNullChecks' in options:             relationship_not_null_checks_ck.set_active(options['doRelationshipNotNullChecks'])         else:             relationship_not_null_checks_ck.set_active(True)              # callback         Callbacks.sync_convenience_constructor_options(null_checks_ck, relationship_constructor_calls_ck, relationship_not_null_checks_ck)              null_checks_ck.add_clicked_callback(lambda: Callbacks.sync_convenience_constructor_options(null_checks_ck, relations_constructor_calls_ck, relati onship_not_null_checks_ck)) relations_constructor_calls_ck.add_clicked_callback(lambda: Callbacks.sync_convenience_constructor_options(null_checks_ck, relacja_constructor_calls_ck, relacja_not_null_checks_ck))(checkeldent,. # fikcyjna etykieta wcięcia connection_not_null_checks.add(relationship_not_null_checks_ck, False, True) # skompiluj finalne okno checks_bx = Box(False) checks_bx.set_spacing(5) #checks_bx.set_padding(3) checks_bx.set_autonss_comcrement_bxlum. , True) checks_bx.add(omit_auto_timestamp_columns_bx, False, True) checks_bx.add(null_checks_bx, False, True) checks_bx.add(relationship_constructor_calls_bx, False, True) checks_rellation_checkd. # callback Callbacks.sync_model_active_status(convenience_constructors_ck, checks_bx) convenience_constructors_ck.add_clicked_callback(lambda: Callbacks.sync_model_active_status(convenience_constructors_ck, checks_bx)) # potrzeba opakowanego pola bx. #constructors_bx.set_homogeneous(True) constructors_bx.add(convenience_constructors_bx, False, True) constructors_bx.add(checks_bx, False, True) constructors_pn = Panel(TitledGroupPanel) constructors_pn.set_title('constructors_pstructors'. setters is_conversion_bx = Box(True) #is_conversion_bx.set_spacing(3) #is_conversion_bx.set_padding(3) is_conversion_ck = CheckBox() is_conversion_ck.set_text('Konwertuj odpowiednie nazwy kolumn g z "is_"') is_conversion_ck.set_tooltip("Kolumna is_incognito => getter isIncognito() (nie getIsIncognito()) i setter setIncognito()") if 'doIsConversion' w opcjach: is_conversion_ck.set_active(options['doIsConversion'] ) else: is_conversion_ck.set_active(True) is_conversion_bx.add(is_conversion_ck, False, True) # wygeneruj kod dla pobierających i ustawiających relacje w celu synchronizacji z polami kolumn sync_relationship_pk_fields_bx = Box(True) #sync_relationship_pk_set_fields_spacding_bx. 3) sync_relationship_pk_fields = CheckBox() . . . Dostajesz punkt. Nie widzę jednak kryteriów podziału tej metody, aby kod stał się łatwiejszy w zarządzaniu, bardziej zrozumiały itp. **Jakie są najlepsze praktyki?** Mogę stworzyć kilka metod, które będą tworzyć powtarzalne rodzaje paneli i widżetów, ale byłoby to dość żmudnym wysiłkiem, z czego nie widzę prawdziwego zysku. Ponownie, jakie są przydatne, praktyczne podejścia do dużych, niezdarnych metod, które budują tylko graficzny interfejs użytkownika? Dzięki PS: och i przy okazji, interfejs użytkownika jest pojedynczym oknem dialogowym w standardowej aplikacji okienkowej (bez sieci), a to okno dialogowe ma 6 zakładek, które zawierają głównie pola wyboru, przyciski radiowe i pola tekstowe. Jest to wtyczka do generowania kodu, z której użytkownik może wybrać wiele opcji. Mogę opublikować obraz, gdy tylko wtyczka znów będzie działać...


title: Co to jest atomowość?

text: Naprawdę staram się znaleźć konkretne, łatwe do zrozumienia wyjaśnienie atomowości. Jak dotąd rozumiem, że aby upewnić się, że operacja jest atomowa, umieszczasz kluczowy kod w szafce. Ale to mniej więcej tyle, ile faktycznie rozumiem. Definicje takie jak ta poniżej nie mają dla mnie żadnego sensu. > Operacja, podczas której procesor może jednocześnie odczytać lokalizację i > zapisać ją w tej samej operacji magistrali. Zapobiega to zapisywaniu lub odczytywaniu pamięci przez inny procesor lub urządzenie we/wy > do czasu zakończenia operacji. > Atomowość implikuje niepodzielność i nieredukowalność, więc operacja atomowa > musi być wykonana w całości lub wcale. Co oznacza ostatnie zdanie? Czy termin „niepodzielność” odnosi się do matematyki, czy do czegoś innego? Czasami żargon związany z tymi tematami bardziej myli, niż naucza.


title: Jak reprezentować strukturę drzewa w NoSQL

text: Jestem nowym użytkownikiem NoSQL i bawiłem się osobistym projektem na stosie MEAN (Mongo ExpressJs AngularJs NodeJs). Zajmuję się tworzeniem edytora dokumentów, który zarządza węzłami danych. Każdy dokument to właściwie drzewo. Mam CRUD api dla dokumentów, do tworzenia nowych drzew oraz CRUD api dla węzłów w danym dokumencie. Obecnie dokumenty są reprezentowane jako kolekcja, która zawiera wszystko, w tym węzły. Relacja dzieci-rodzic jest realizowana przez identyfikatory. Więc węzły są mapą według id, a każdy węzeł ma odniesienia do węzłów, które są ich dziećmi. Wybrałem to „płaskie” podejście, ponieważ łatwiej jest uzyskać węzeł według identyfikatora z dokumentu. Będąc przyzwyczajonym do posiadania tabeli relacji między węzłami a dokumentami, tabeli relacji między węzłami i węzłami podrzędnymi, wydaje mi się trochę dziwne, że muszę zapisywać całą mapę „węzłów” za każdym razem, gdy aktualizuję węzeł. Czy istnieje lepszy sposób reprezentowania takiego typu danych w NoSQL?


title: Dobre strategie wdrożeniowe do enkapsulacji współdzielonych danych w potoku oprogramowania

text: Pracuję nad refaktoryzacją niektórych aspektów istniejącej usługi sieciowej. Sposób implementacji interfejsów API usług polega na tym, że istnieje rodzaj „potoku przetwarzania”, w którym są zadania wykonywane kolejno. Nic dziwnego, że późniejsze zadania mogą wymagać informacji obliczonych przez wcześniejsze zadania, a obecnie jest to realizowane przez dodanie pól do klasy „stan potoku”. Myślałem (i miałem nadzieję?), że istnieje lepszy sposób na udostępnianie informacji między krokami potoku niż posiadanie obiektu danych z polami zillion, z których niektóre mają sens w niektórych krokach przetwarzania, a nie w innych. Byłoby dużym problemem, aby ta klasa była bezpieczna dla wątków (nie wiem, czy byłoby to możliwe), nie ma sposobu, aby uzasadnić jej niezmienniki (i prawdopodobnie nie ma żadnych). Przeglądałem książkę o wzorach projektowych Gang of Four, szukając inspiracji, ale nie czułem, że jest tam jakieś rozwiązanie (Memento było trochę w tym samym duchu, ale nie do końca). Szukałem również w Internecie, ale za drugim razem, gdy wyszukasz „potok” lub „przepływ pracy”, zostaniesz zalany informacjami o potokach uniksowych lub zastrzeżonymi silnikami i frameworkami przepływu pracy. Moje pytanie brzmi – jak podszedłbyś do kwestii rejestrowania stanu wykonania potoku przetwarzania oprogramowania, aby późniejsze zadania mogły korzystać z informacji obliczonych przez wcześniejsze? Myślę, że główną różnicą w przypadku potoków uniksowych jest to, że nie obchodzi cię tylko wynik bezpośrednio poprzedzającego zadania. ======== Zgodnie z żądaniem, trochę pseudokodu ilustrującego mój przypadek użycia: Obiekt "kontekst potoku" ma kilka pól, które mogą wypełnić/odczytać różne kroki potoku: public class PipelineCtx { ... // fields public Foo getFoo() { return this.foo; } public void setFoo(Foo aFoo) { this.foo = aFoo; } public Bar getBar() { return this.bar; } public void setBar(Bar aBar) { this.bar = aBar; } ... // więcej metod } Każdy z kroków potoku jest również obiektem: public abstract class PipelineStep { public abstract PipelineCtx doWork(PipelineCtx ctx); } public class BarStep extends PipelineStep { @Override public PipelineCtx doWork(PipelieCtx ctx) { // działa w oparciu o elementy w ctx Bar theBar = ...; // oblicz to ctx.setBar(theBar); zwróć ctx; } } Podobnie w przypadku hipotetycznego `FooStep`, który może wymagać przed nim Bar obliczonego przez BarStep, wraz z innymi danymi. A potem mamy prawdziwe wywołanie API: public class BlahOperation extends ProprietaryWebServiceApiBase { public BlahResponse handle(BlahRequest request) { PipelineCtx ctx = PipelineCtx.from(request); // tutaj dzieje się kilka kroków // ... BarStep barStep = new BarStep(); barStep.doPraca(crx); // może trochę więcej kroków // ... FooStep fooStep = new FooStep(); fooStep.doPraca(ctx); // ostatnie kroki ... return BlahResponse.from(ctx); } }


title: REST vs RESTful vs "normalna" usługa sieciowa - to samo czy nie?

text: Przeczytałem kilka definicji i dyskusji na temat aplikacji REST i/lub RESTful, ale nadal nie rozumiem ich prawdziwego znaczenia. Zwykle pracuję z aplikacjami, które albo pobierają dane przez GET, albo wysyłają dane przez POST do jakiegoś serwisu internetowego (zwykle skryptu PHP), który następnie albo pobiera dane z bazy danych, albo zapisuje do bazy danych. Czy to jest aplikacja RESTful? Jeśli nie, jaka byłaby aplikacja RESTful? Jaka jest różnica między koncepcją RESTful a koncepcją, nad którą pracowałem do tej pory? Proszę wyjaśnić na przykładzie. Ponadto ktoś mówi o REST, a ktoś o aplikacjach RESTful. Odkryłem, że termin REST odnosi się do koncepcji teoretycznej, podczas gdy RESTful jest używany, gdy mówimy o konkretnej aplikacji. Czy to prawda, czy istnieją rzeczywiste różnice między aplikacjami REST i RESTful?


title: Dlaczego istnieje luka między JBoss EAP a edycją JBoss AS/Community?

text: Wprawdzie nowy, ale chciałem zrozumieć, dlaczego istnieje luka między projektem JBoss EAP Red Hata (ich wersja _enterprise_) a projektem JBoss AS/Wildfly/community. Patrząc na ten post od Red Hata, wydaje się, że nie wstrzymują źródła/łatek. Ma to sens, ponieważ wstrzymanie dostępu do źródła byłoby naruszeniem GPL, które w duchu chce dystrybucji źródeł, aby użytkownicy końcowi mogli odtwarzać/ponownie wykorzystywać pliki binarne. Więc jeśli źródła są identyczne, to dlaczego wersja AS/community **_dokładnie_** nie jest taka sama jak wersja EAP? Czy nie powinny być one dokładne, jak te same wartości SHA256? Wygląda na to, że wersja AS/community zwykle jest opóźniona o kilkaset poprawek (stąd, sekcja „Wprowadzenie”) > _Rozmowa o najnowszym serwerze aplikacji JBoss jest zawsze trudna. Red Hat > jednocześnie oferuje dwie wersje JBoss: Community Edition, aktualne wydanie, gdzie jest 7.1.1-Final, oraz Enterprise Application Platform, EAP, wydanie, gdzie JBoss AS jest w wersji 7.1.3-Final. Różnica pomiędzy nimi to w rzeczywistości kilkaset poprawek błędów, co jest ogromne ..._ Ponieważ dystrybucja plików binarnych EAP jest kontrolowana przez Red Hat, z pewnością istnieje wystarczające zainteresowanie społeczności, aby sama społeczność odbudowała i rozprowadziła pliki binarne AS/Wildfly, które są na równi z plikami binarnymi EAP, prawda? (pojedynczy serwer Maven powinien wystarczyć). Mam na myśli spoglądanie na popularność CentOS (społecznościowa wersja Red Hat Enterprise Linux) - społeczność JEST zainteresowana używaniem oprogramowania w produkcji bez błogosławieństw/wsparcia RedHata. Czego mi tu brakuje?


title: Hashing + bezpieczeństwo, ponieważ dotyczy teoretycznej strony do udostępniania plików

text: W dzisiejszych czasach możliwe jest zaszyfrowanie pliku po stronie klienta, wysłanie go na serwer i sprawdzenie, czy ten plik jest już przesłany. Jeśli tak, możemy pominąć przesyłanie pliku i sprawić, że użytkownik będzie wyglądał, jakby przesyłał go niemal natychmiast. Może to również zaoszczędzić mnóstwo przepustowości dla dużej witryny. Ma to jednak pewne ważne implikacje dla bezpieczeństwa. 1. Jeśli użytkownik jest sprytny, może wykorzystać te informacje do ustalenia, jakie pliki znajdują się już na serwerze, w tym nielegalne lub wrażliwe dokumenty 2. Potrafi stworzyć miliony fałszywych skrótów, wysłać je na serwer i mieć nadzieję na kolizję z uzyskać dostęp do losowych dokumentów 3. Istnieje prawidłowa, ale niezamierzona kolizja, w której skróty są takie same, ale plik jest w rzeczywistości inny. Moje pytanie brzmi: czy warto iść na kompromis? Czy możemy złagodzić niektóre lub wszystkie z tych problemów? Jak?


title: Jak określić częstotliwość (w hercach, w czasie rzeczywistym) za pomocą dźwięku Java?

text: Rozglądałem się i znalazłem kilka pytań podobnych do moich, ale nigdy nie byłem zadowolony z odpowiedzi. Jestem mniej więcej Javą n00b, chociaż jestem umiarkowanie biegły w C++ i uważam się za średnio zaawansowanego do zaawansowanego, jako ogólnie programista. Chcę napisać program w Javie, który działa podobnie do tunera - chcę nagrać wysokość instrumentu w około 3 sekundowych ramach czasowych i zmierzyć średnie odchylenie. (To jest dla klasy zespołu.) Myślę, że będę miał dużą tablicę liczb, a każdy wpis w tablicy będzie liczbą pod względem częstotliwości. Chcę być w stanie przejść przez tablicę i obliczyć średni Hertz do wyświetlania go na ekranie lub coś takiego. Więc to, co chcę zrobić, to mieć jakiś sposób "odpytywania" (z braku lepszego słowa) mikrofonu, aby zobaczyć, jaka częstotliwość jest wprowadzana w tej chwili. Czy istnieje prosty sposób na akceptację sygnału wejściowego audio z mikrofonu w hercach? Będzie to w Javie pod platformą Windows.


title: Które książki lub odniesienia obejmują projektowanie języków specyficznych dla domeny?

text: Istnieje wiele książek o językach specyficznych dla domeny (DSL). Takie książki mówią o kompilatorach, interpreterach, parsowaniu, leksykowaniu, analizie semantycznej i innych różnych elementach, które ktoś potrzebuje, aby zaimplementować DSL. Już wiem, jak zaimplementować DSL; Zaimplementowałem kilka. Jednak kilka takich DSL było potworami do pracy. Zaczyna się od jakichkolwiek funkcji, które chce się obsługiwać w DSL, ale później okazuje się, że więcej funkcji zostanie dodanych później, co skutkuje bałaganem zwariowanych i niespójnych konwencji. Zamierzam tutaj zaprojektować nowy DSL i chcę zacząć od właściwej stopy, tym razem mając na uwadze przyszłą ekspansję języka. Kilka książek, które udało mi się znaleźć na temat projektowania języka, wydawało się koncentrować na projektowaniu języka ogólnego przeznaczenia (i wywodzącym się z C), co nie jest ścieżką, która ma sens w mojej dziedzinie. Jakie referencje lub książki są dostępne na ten temat?


title: Networkx / Python : Czy używanie klasy dla węzła jest lepszą praktyką niż definiowanie wielu atrybutów?

text: Przeczytałem samouczek i dokumentację NetworkX, ale nie mogłem znaleźć odpowiedzi na to pytanie w prawdziwym świecie. Zwykle używając NetworkX, mogę użyć łańcuchów do zdefiniowania węzłów, a następnie ustawić kilka atrybutów. np. G = nx.Graph() G.add_node('Jan Kowalski', kolor włosów = 'brązowy') G.node['Jan Kowalski'][wiek] = 22 Wydaje się jednak, że deklaracja klasy z elementami zamiast atrybutów jest lepiej w praktyce, zwłaszcza gdy jest wiele atrybutów i czytelność może być problemem. class Osoba: imię = Brak wiek = Brak Osoba p p.imię = 'Jan Kowalski' p.wiek = 22 G.add_node(p) Czy ktoś mógłby być na tyle uprzejmy, aby potwierdzić moje rozumowanie? Brakuje mi przewidywania, czy atrybuty węzła/krawędzi Networkx byłyby lepsze.


title: Uzupełnienie kodu Ruby IDE

text: Właśnie zacząłem pisać trochę ruby w wolnym czasie i obecnie używam Netbeans 7 z wtyczką Ruby and Rails v0.111. Jestem przede wszystkim programistą Java wywodzącym się z IntelliJ i Eclipse. Jedną z wad mojej konfiguracji programowania Ruby jest to, że moje Netbeans nie są zbyt pomocne, jeśli chodzi o uzupełnianie kodu. Wydaje się, że wynika to z faktu, że Ruby nie jest silnie typowany, a ponieważ IDE nie zna typu, nie może sugerować metod. W rezultacie muszę spędzić dużo czasu w przeglądarce, przeglądając dokumentację i przełączając się z powrotem do mojego IDE, aby ręcznie wpisać tam metodę. Czy są jakieś zmiany, które mogę wprowadzić w mojej konfiguracji, aby uzyskać uzupełnianie kodu dla Rubiego, czy jest to prawie niemożliwe ze względu na naturę języka? Jak inni programiści pracują z Rubim, poza zapamiętywaniem wszystkich metod z Biblioteki Podstawowej?


title: Przeskakiwanie z konsoli 16-bitowej do programowania gier w trybie chronionym.

text: Jestem małym skryptowym dzieciakiem, ale chcę przejść od robienia standardowych gier konsolowych w C++ do pełnych graficznych gier wideo. Zastanawiam się tylko, czy są jakieś dobre tutoriale Directx 11, od których mógłbym zacząć.