title: Jak zrefaktoryzować mój projekt, jeśli wydaje się, że wymaga on wielokrotnego dziedziczenia?

text: Ostatnio zadałem pytanie o klasy Java implementujące metody z dwóch źródeł (coś w rodzaju wielokrotnego dziedziczenia). Zwrócono jednak uwagę, że taka potrzeba może być oznaką wady konstrukcyjnej. Dlatego prawdopodobnie lepiej jest zająć się moim obecnym projektem, niż próbować symulować wielokrotne dziedziczenie. * * * Zanim zajmiemy się rzeczywistym problemem, kilka podstawowych informacji na temat konkretnej mechaniki w tej strukturze: Jest to prosty framework do tworzenia gier. Kilka komponentów alokuje pewną ilość pamięci (np. dane pikseli) i należy się jej pozbyć, gdy tylko jej nie potrzebujesz. Przykładem tego są duszki. W każdym razie zdecydowałem się zaimplementować coś ala ręczne liczenie referencji z celu C. Niektóre klasy, takie jak Sprites, zawierają wewnętrzny licznik, który jest zwiększany po wywołaniu `retain()` i zmniejszany po `release()`. W ten sposób powstała klasa abstrakcyjna `Resource`. Każda podklasa tej klasy otrzyma implementacje `retain()` i `release()` za darmo. Kiedy jego liczba osiągnie 0 (nikt nie używa tej klasy), wywoła metodę `destroy()`. Podklasa musi jedynie zaimplementować `destroy()`. Dzieje się tak, ponieważ nie chcę polegać na Garbage Collector, aby pozbyć się nieużywanych danych pikseli. * * * Obiekty gry są wszystkimi podklasami klasy Node - która jest głównym blokiem konstrukcyjnym, ponieważ dostarcza informacji takich jak pozycja, rozmiar, obrót itp. ![tutaj wpisz opis obrazu](http://i.stack. imgur.com/97UIS.png) Widzisz, w mojej grze często używane są dwie klasy. Sprites i etykiety. Ach... ale czekaj. Sprite'y zawierają dane pikseli, pamiętasz? W związku z tym muszą rozszerzyć „Zasób”. ![tutaj podaj opis obrazu](http://i.imgur.com/KwTcsLM.png) Ale tego oczywiście nie da się zrobić. Sprite SĄ węzłami, dlatego muszą podklasę `Node`. Ale do licha, one też są zasobami. * * * * **Dlaczego nie zrobić z Resource interfejsu?** * Ponieważ musiałbym ponownie zaimplementować `retain()` i `release()`. Unikam tego, ponieważ nie piszę w kółko tego samego kodu (pamiętaj, że istnieje wiele klas, które potrzebują tego systemu zarządzania pamięcią). * **Dlaczego nie kompozycja?** * Ponieważ nadal musiałbym implementować metody w `Sprite` (i podobnych klasach), które zasadniczo wywołują metody `Resource`. Nadal pisałbym ten sam kod w kółko! * * * Jaka jest twoja rada w tej sytuacji?


title: Na jakiej licencji udzielana jest licencja GPL?

text: Właściwa licencja GPL (tj. _tekst_ zawierający słowa _"Licencje na większość oprogramowania i innych prac praktycznych zostały zaprojektowane..."_) jest dokumentem; Zakładałbym zatem, że jest objęty jakimś rodzajem prawa autorskiego? Na jakiej licencji udzielana jest ta licencja? To znaczy, jeśli miałbym włączyć treść licencji GPL do swoich własnych projektów (i być może stworzyć pracę pochodną), jakie mam ograniczenia?


title: Praktyczny test z programowania podczas rozmowy kwalifikacyjnej dla programisty flex

text: szukam najlepszego sposobu na przetestowanie kandydata na stanowisko programisty fleksa testem praktycznym/interaktywnym przed komputerem 45-60 minutowym testem. trzeba przetestować podstawową wiedzę o flexie, umiejętność rozwiązywania problemów związanych z programowaniem UI i być może trochę flex mobile. jakieś pomysły?


title: Planowanie biblioteki

text: Szukałem w całym Internecie dokładnej odpowiedzi na moje pytanie. Mam nadzieję, że możesz mi pomóc. Zastanawiam się, jak profesjonalni programiści/koderzy planują swoje projekty? Biblioteki, podpakiety? Na przykład podczas tworzenia systemu użytkownika, jak do niego podchodzisz? Jak decydujesz o klasach, funkcjach, wymaganiach, strukturze bazy danych, zależnościach... Oto przykład planowania systemu użytkownika, którego próbowałem. Czy robię to dobrze? [planing] ## Ogólne * Tożsamość użytkownika powinna być wybieralna (e-mail, nazwa użytkownika itp.) * Hasła: użyj sha1. mieszany z solą * e-mail * meta użytkownika (wypełniacz profilu użytkownika) * grupa użytkowników * dostęp użytkownika (w oparciu o grupy) * zaproszenie * referer * data rejestracji i ostatniego logowania * .... ## System uwierzytelniania ### Rejestracja * Wymagane pola: * Nazwa użytkownika * e-mail * hasło * Pierwsze sprawdzenie * Nazwa użytkownika, e-mail, hasło są wypełnione? [/planing] Próbuję tego podejścia z planowaniem. Czy istnieje oprogramowanie do takiego planowania? Co powinienem zadać sobie? jakie są ważne pytania, które prowadzą mnie do końca? Dziękuję za rady, które wyślesz.


title: Jakich rzeczy możesz nauczyć się od faceta, który hakuje tylko istniejący kod?

text: W mojej poprzedniej pracy byłem głównym programistą i pracowałem z tym facetem, który był samozwańczym hakerem. Szanowaliśmy się nawzajem i mieliśmy wspaniały związek. Firmie było znacznie lepiej, bo połączyliśmy nasze talenty. Szukałbym eleganckiego, pełnego wdzięku rozwiązania, które moglibyśmy dodać do naszej biblioteki kodu. Miał tendencję do znajdowania, poprawiania i dopasowywania jakiegoś dziwnego fragmentu kodu do rozwiązania. Jedną z najcenniejszych lekcji, jakich się od niego nauczyłem, było to, że nie zawsze musisz budować rozwiązanie od zera, jest mnóstwo kodu, z którego możesz pożyczyć. Jakich rzeczy nauczyłeś się od hakera? **Edytuj - Dodano moją definicję hakera** Przez hakera rozumiem kogoś, kto w większości nie może stworzyć czegoś od zera. Jednak są bardzo dobrzy w morfingu kodu napisanego przez innych.


title: Gdzie należy wywoływać procedurę obsługi ACL w architekturze MVC?

text: Myśląc o listach kontroli dostępu związanych z architekturą webową MVC, mam wątpliwości, gdzie należy przeprowadzić weryfikację. W modelach? Kontrolery? FrontController? Wyobraź sobie wielomodułową aplikację internetową (np. stronę internetową). Mam witrynę publiczną i strefę administracyjną z ograniczeniami. * Wszystkie strony witryny publicznej są dostępne dla każdego. * Ograniczony obszar administracyjny jest dostępny tylko dla uwierzytelnionego użytkownika. * Istnieje kilka poziomów dostępu dla użytkowników, takich jak root, admin i zwykły użytkownik. Zastanowiłem się nad tym podczas dzisiejszego lunchu i pojawiły się pewne pomysły. Najpierw musiałem zadać sobie to pytanie: > Czy kontrola dostępu jest częścią logiki biznesowej? Po pewnym czasie zorientowałem się, że w większości przypadków odpowiedź powinna brzmieć **nie**. Normalnie w opisanej przeze mnie sytuacji logika biznesowa obszaru publicznego jest mniej więcej taka sama jak w przypadku obszaru ograniczonego. Kiedy nie jest dokładnie to samo, zwykle tworzę nadzbiór obu reguł logiki biznesowej, który zawiera całą potrzebną logikę. Tak więc, nawet jeśli w mojej aplikacji jest kilka modułów, zwykle mam tylko jedną warstwę modelu. Wykonywanie ACL w moich kontrolerach prowadzi do duplikacji kodu, ponieważ musiałbym to sprawdzać za każdym razem, gdy tego potrzebowałem. Ponadto uzyskałbym wysokie sprzężenie między kontrolerami a komponentem ACL. Myślenie o włożeniu go do FrontControllera wydaje się właściwym podejściem. W rzeczywistości moją pierwszą myślą było umieszczenie obsługi ACL jako zależności od FrontControllera. Takie podejście miałoby metody kontrolera (akcje) jako **zasoby** ACL, tworząc role dla moich użytkowników. Trochę pseudokodu (mieszanie Java, C#, PHP): aclHandler = new DefaultAcl(); aclHandler.addRole('brak'); // nieuwierzytelniony aclHandler.addRole('użytkownik'); aclHandler.addRole('admin', extend='użytkownik'); aclHandler.addRole('root', extend='admin'); aclHandler.addUser('john', 'root'); aclHandler.addUser('mary', 'admin'); aclHandler.addUser('jane', 'użytkownik'); aclHandler.addResource('admin.content.create'); // MODUŁ.KONTROLER.AKCJA aclHandler.addResource('admin.content.view'); aclHandler.addResource('admin.content.edit'); aclHandler.addResource('admin.content.remove'); aclHandler.addResource('public.treść.widok'); aclHandler.allow('*', 'public.*'); aclHandler.deny('*', 'admin.*'); // odmów wszystkim aclHandler.allow('user', 'admin.content.view'); // zezwól użytkownikowi na przeglądanie treści aclHandler.allow('admin', 'admin.content.{edit,create}'); // zezwól administratorowi na edycję i tworzenie treści aclHandler.allow('root', '*'); // root może zrobić wszystko W ten sposób mój FrontController będzie miał coś takiego: class DefaultFrontController implements FrontControllerInterface { AclInterface acl {get}; Użytkownik bieżącyUżytkownik {get;set}; public DefaultFrontController(AclInterface acl, użytkownik) { this.acl = acl; this.currentUser = użytkownik; // ... } public void dispatch(ControllerRequest request, ControllerResponse response) { try { this.acl.checkPrivileges(request.resource, this.currentUser); } catch (AclException e) { this.forbiddenAccessCallback(żądanie, odpowiedź, this.acl, this.currentUser); zwrócić; } // kontynuuj impl... } } fc = new FrontController(aclHandler, new User(name='John', role='root')); fc.wysyłka(...); // ... Ta implementacja sprawia, że komponent ACL jest obowiązkowym parametrem dla konstruktora FrontController, więc teraz jest częścią jego stanu. Może to stanowić problem, gdy nie potrzebuję listy ACL, ale można to obejść, tworząc symulowaną implementację komponentu ACL, taką jak `AllowFromAllAcl`, która pozwoliłaby wszystkim użytkownikom zrobić wszystko. Jakieś pomysły? Poprawki? Propozycje?


title: Czy godziny rejestrowania pracy oprogramowania to dobry pomysł?

text: Pracodawca, z którym rozmawiam, robi to, nigdy wcześniej nie słyszałem, żeby ktoś to robił i szczerze mówiąc, nie podoba mi się pomysł mikrozarządzania. Jak się z tym czuje społeczność?


title: Powiększ, aby dopasować punkty na powierzchni

text: Próbuję opracować część funkcjonalności za pomocą kontroli mapy innej firmy w aplikacji, która automatycznie przesuwa/przybliża powierzchnię mapy do najlepszego możliwego widoku danych punktów na mapie. Mapa powinna być wyśrodkowana i maksymalnie przybliżona bez wycinania jakichkolwiek punktów na mapie. Aby określić punkt centralny mapy, uśredniłem wszystkie punkty na powierzchni mapy. Wydaje się, że to działa dobrze, ale może istnieć lepsze podejście. Problem, z którym się spotykam, polega na tym, jak odpowiednio powiększyć lub pomniejszyć, aby pomieścić wszystkie punkty na mapie w „najlepszym” możliwym widoku. Nie znam się zbyt dobrze na technikach 3D, więc każda terminologia odnosząca się do tego problemu będzie dla mnie prawdopodobnie nowa. Niekoniecznie szukam konkretnego algorytmu (chociaż na pewno bym go nie odrzucał). Przede wszystkim chciałbym zrozumieć teorię stojącą za podejściem do takiego problemu, aby móc go wdrożyć.


title: Kolejka wiadomości: Który z nich jest najlepszym scenariuszem?

text: Piszę robota internetowego. Przeszukiwacz ma 2 kroki: 1. Pobierz stronę html 2. Następnie przeanalizuj stronę Chcę użyć kolejki komunikatów, aby poprawić wydajność i przepustowość. * * * Myślę, że 2 scenariusze: ## scenariusz 1: struktura: urlProducer -> queue1 -> urlConsumer -> queue2 -> parserConsumer urlProducer: pobierz docelowy adres URL i dodaj go do kolejki queue1 urlConsumer: zgodnie z informacją o zadaniu pobierz html i dodaj go do kolejki queue2 parserConsumer: zgodnie z informacją o zadaniu przeanalizuj stronę ## scenariusz 2: struktura: urlProducer -> queue1 -> urlConsumer parserProducer-> queue2 -> parserConsumer urlProducer : pobierz docelowy adres URL i dodaj go do queue1 urlConsumer : zgodnie z informacją o zadaniu, pobierz stronę html i zapisz ją do db parserProducer: pobierz stronę html z db i dodaj ją do kolejki2 parserConsumer: zgodnie z informacją o zadaniu, przeanalizuj stronę * * * Istnieje wielu producentów lub konsumentów w każda struktura. scenariusz1 lubi połączenie łańcuchowe. Trudno jest znaleźć punkt problemu, gdy pojawiają się błędy. scenariusz 2 oddziela kolejkę1 i kolejkę2. Gdy pojawiają się błędy, łatwo jest znaleźć punkt problemu. Nie jestem pewien, czy to pojęcie jest poprawne. Który z nich jest najlepszym scenariuszem? Lub inne scenariusze? Dzięki~


title: W jaki sposób programiści sprawdzają, czy zmiany wymagań oprogramowania w jednym systemie nie naruszają wymagań dalszych systemów oprogramowania?

text: W swojej pracy oprócz kodowania zajmuję się zbieraniem wymagań, analizą i projektowaniem rozwiązań biznesowych. Istnieje wiele systemów i pakietów oprogramowania, a programiści powinni pracować na każdym z nich, zamiast być przypisywanym do wprowadzania zmian tylko w jednym systemie lub tylko w kilku systemach. W jaki sposób programiści zapewniają, że zdobyli wszystkie niezbędne wymagania i rozwiązali wszelkie sprzeczne wymagania? Przykład tego typu scenariusza: Bob, deweloper, jest proszony o zmodyfikowanie systemu zgłoszeń problemów dla hipotetycznej firmy zajmującej się naprawą mediów. Zawarli umowę z lokalnym przedsiębiorstwem użyteczności publicznej na świadczenie tej usługi. W starym systemie istnieje mechanizm tworzenia przez klienta zewnętrznego biletu informującego o problemie z usługą komunalną pod danym adresem. Istnieje system harmonogramowania i system fakturowania, który jest zależny od tych danych. Nowy projekt Boba polega na zmodyfikowaniu systemu umieszczania biletów, aby umożliwić wprowadzanie wielu adresów przez właściciela lub innego klienta końcowego z wieloma nieruchomościami. System fakturowania rozlicza się za bilet, ale należy go zmodyfikować tak, aby rozliczał się za adres. Jakie praktyki pomogłyby Bobowi odkryć, że należy również zmienić system fakturowania? W jaki sposób Bob może odkryć, jakie inne systemy w jego firmie mogą wymagać zmiany, aby obsługiwać nowy model zmian/biznesu? Załóżmy, że istnieje udokumentowana specyfikacja dla każdego zaangażowanego systemu, ale jest wiele systemów i Bob nie jest zaznajomiony ze wszystkimi. Koniec przykładu. Często znajdujemy się w takim scenariuszu i mamy przeglądy projektów, ale kierownictwo nakłada ostateczną odpowiedzialność za wszelkie defekty (proces biznesowy lub proces tworzenia oprogramowania) na programistę, który wykonuje projekt i pracę. Niektóre organizacje wydają się być w tym lepsze niż inne. Jak udaje im się wykryć i rozwiązać sprzeczne lub niekompletne wymagania w różnych systemach oprogramowania? Obecnie posiadamy dużą wiedzę plemienną i tylko kilku programistów, którzy rozumieją cały łańcuch biznesowy i oprogramowania. Wydaje się to wysoce nieefektywne i prowadzi do problemów na poziomie wymagań.


title: Dlaczego musimy dołączyć .h, podczas gdy wszystko działa, gdy dołączamy tylko plik .cpp?

text: Dlaczego musimy dołączyć oba pliki `.h` i `.cpp` , podczas gdy możemy sprawić , że będzie to działać po utworzeniu tylko pliku `.cpp` , a następnie dołączeniu go . Na przykład utworzenie pliku `file.h` zawierającego deklaracje, a następnie utworzenie pliku `file.cpp` zawierającego definicje i zawierającego oba w pliku `main.cpp`. Lub utworzenie pliku `file.cpp` zawierającego deklaracje/definicje (bez prototypów) dołączając go do `main.cpp`. Obie pracowały dla mnie , ale nadal nie ma różnicy , ponieważ nie mam doświadczenia w procesie kompilacji i łączenia .


title: Jak zamodelować typ adresu w DDD?

text: Mam encję `User`, która ma `Set` of `Address`, gdzie `Address` jest obiektem wartości: class User{ ... private Set<Address> address; ... public setAddresses(Set<Address> address){ //ustaw wszystkie adresy jako pakiet } ... } `Użytkownik` może mieć `adres domowy` i `adres służbowy`, więc powinienem mieć coś, co działa jak wyszukiwanie w bazie danych: **tbl_address_type** ------------------------------------ ------------ | adres_typu_id | typ_adresu | ------------------------------------------------ | 1 | praca | ------------------------------------------------ | 2 | strona główna | ------------------------------------------------ i odpowiednio **adres_tablicy** ------------------------------------------------- ---------------------------------------- | adres_id | opis_adresu |identyfikator_typu_adresu| identyfikator_użytkownika | -------------------------------------------------- ----------------------------------- | 1 | główna ulica 123 | 1 | 100 | -------------------------------------------------- ----------------------------------- | 2 | 456 kolejna ulica | 1 | 100 | -------------------------------------------------- ----------------------------------- | 3 | 789 długa ulica | 2 | 200 | -------------------------------------------------- ----------------------------------- | 4 | 023 krótka ulica | 2 | 200 | -------------------------------------------------- ----------------------------------- 1. Czy typ adresu powinien być modelowany jako Entity czy Value? i dlaczego? 2. Czy obiekt „Address” Value może przechowywać odwołanie do encji „AdressType” (w przypadku modelowania jako encji)? Czy jest to wykonalne przy użyciu Hibernate/NHibernate? 3. Jeśli użytkownik może zmienić swój adres domowy, czy powinienem udostępnić funkcję `User.updateHomeAddress(Address homeAddress)` w samej encji `User`? Jak w takim przypadku wymusić podanie przez klienta adresu domowego, a nie służbowego? (przykładowa implementacja jest mile widziana) 4. Jeśli chcę uzyskać adres domowy użytkownika za pomocą funkcji `User.getHomeAddress()`, muszę załadować całą tablicę adresów, a następnie zapętlić ją i sprawdzić każdy pod kątem typu, aż znajdę właściwą wpisz, a następnie go zwróć? Czy istnieje skuteczniejszy sposób niż ten?


title: Czy istnieje pewien sposób, w jaki muszę dołączyć bibliotekę i jej licencję?

text: Wiem, że to może być głupie pytanie, ale mam tylko 15 lat, więc tak naprawdę nie wiem, jak działa prawna część tego. Kiedy wybieram plik .dll do uwzględnienia w moim projekcie, program Visual Studio dołącza do mojego projektu tylko plik .dll (oczywiście), więc po prostu kopiuję licencję i umieszczam ją w folderze o nazwie licencje. Ale teraz zamierzam stworzyć program na zawody, więc muszę się upewnić, że licencje są dobrze zrobione, bo inaczej zostanę zdyskwalifikowany. Czy jest więc jakaś konkretna lokalizacja, w której muszę przechowywać licencje w moim projekcie, czy istnieje sposób, aby program Visual Studio automatycznie skopiował licencję tak, jak robi to z plikami .dll i czy jest jeszcze coś, na co muszę uważać zgodnie z prawem? PS: Jeśli to ma znaczenie, biblioteki, których zamierzam teraz używać, to WriteableBitmapEx i AvalonDock Dzięki


title: Testy jednostkowe w celu udowodnienia zrównoważonego drzewa

text: Właśnie zbudowałem samobalansujące drzewo (czerwono-czarne) w Javie (język powinien być jednak nieistotny dla tego pytania) i staram się wymyślić dobry sposób testowania, czy jest odpowiednio zbalansowany. Przetestowałem wszystkie podstawowe operacje na drzewie, ale nie mogę wymyślić sposobu, aby sprawdzić, czy jest rzeczywiście dobrze i prawdziwie zrównoważony. Próbowałem wstawić duży słownik słów, zarówno wstępnie posortowanych, jak i nieposortowanych. Przy zrównoważonym drzewie powinny one zająć mniej więcej tyle samo czasu, ale niezrównoważone drzewo zajęłoby znacznie dłużej na już posortowanej liście. Ale nie wiem, jak podejść do testowania tego w jakikolwiek rozsądny, powtarzalny sposób. (Próbowałem robić na nich milisekundowe testy, ale nie ma zauważalnej różnicy — prawdopodobnie dlatego, że moje dane źródłowe są za małe.) Czy istnieje lepszy sposób na upewnienie się, że drzewo jest naprawdę zrównoważone? Powiedzmy, patrząc na drzewo po jego stworzeniu i sprawdzając, jak głęboko sięga? (Oznacza to, że bez modyfikowania samego drzewa przez dodanie pola głębi do każdego węzła, co jest po prostu marnotrawstwem, jeśli nie potrzebujesz go do niczego innego niż testowanie).


title: Izolowane testy jednostkowe i awarie drobnoziarniste

text: Jednym z powodów często podawanych do pisania testów jednostkowych, które wyśmiewają wszystkie zależności i są w ten sposób całkowicie izolowane, jest zapewnienie, że gdy błąd istnieje, tylko testy jednostkowe dla tego błędu zakończą się niepowodzeniem. (Oczywiście testy integracyjne również mogą się nie powieść). W ten sposób możesz łatwo określić, gdzie jest błąd. Ale nie rozumiem, dlaczego jest to użyteczna właściwość. Jeśli mój kod ulegał spontanicznym błędom, mogłem zrozumieć, dlaczego przydatne jest łatwe zidentyfikowanie punktu awarii. Ale jeśli test się nie powiedzie, to albo dlatego, że właśnie napisałem test, albo dlatego, że właśnie zmodyfikowałem testowany kod. W obu przypadkach już wiem, która jednostka zawiera błąd. Co jest przydatne w zapewnieniu, że test zakończy się niepowodzeniem tylko z powodu błędów w testowanej jednostce? Nie widzę, jak to daje mi większą precyzję w identyfikowaniu błędu niż dotychczas.


title: Jakie są zalety (i wady) korzystania z funkcji „Zaloguj się za pomocą Twittera/Facebooka” na nowej stronie internetowej?

text: Ja i mój przyjaciel zamierzamy uruchomić małą witrynę forum. Rozważam użycie API „Zaloguj się przez Facebooka/Twittera”, być może wyłącznie (np. Lanyrd) do logowania użytkownika. Nigdy wcześniej nie korzystałem z żadnego z nich, ani w ogóle nie prowadziłem witryny z loginami użytkowników. Jakie są zalety (i wady) tych interfejsów API? W szczególności: 1. **Jakie korzyści odnoszę jako programista z ich używania?** Jakie są wady? 2. Czy użytkownicy końcowi faktycznie ich lubią/nie lubią? 3. Czy wystąpiły jakieś problemy techniczne/logistyczne w szczególności z tymi interfejsami API? Oto zalety i wady, które mam do tej pory: ### Plusy * Wygodniejsze dla użytkownika („zarejestruj się” za pomocą dwóch kliknięć, zaloguj się jednym) * Prawdopodobnie nie ma potrzeby utrzymywania własnego systemu logowania ### * Brak kontroli nad naszym procesem logowania * Wykluczenie użytkowników Facebooka/Twittera, którzy martwią się, że mamy jakiś dostęp do ich kont. * Konta użytkowników w naszej witrynie są zagrożone, jeśli ich konta na Facebooku/Twitterze są zagrożone. * A jeśli nie utrzymujemy własnego alternatywnego systemu logowania: * Zależność naszego systemu logowania od Facebooka/Twittera * Wyklucz użytkowników spoza Facebooka/Twittera z naszej strony


title: Jakie są dobre wymagania dla inżyniera QA?

text: Zatrudnimy osobę do kontroli jakości i mam wymyślić kilka pytań do wywiadu. Prawda jest taka, że nie wiem zbyt wiele o tym, co dobry inżynier QA powinien wiedzieć, a tym bardziej, co może wiązać się z dobrymi pytaniami do rozmowy kwalifikacyjnej. Czy ktoś ma jakieś sugestie? Trochę informacji: Środowisko to dwie oddzielne (ale powiązane) aplikacje internetowe dla stosu Microsoft (ASP.NET, SQL Server, IIS).


title: Skryptowe interfejsy użytkownika/frameworki do automatycznego testowania interfejsu użytkownika

text: Planuję używać skryptów do automatycznego testowania interfejsu użytkownika. Główna aplikacja jest napisana w c# i chcę, aby była skryptowalna, abym mógł zrobić wszystko, co może zrobić użytkownik końcowy, ale programowo. Uniknę pytań opartych na opiniach, takich jak „Co sądzisz o oprogramowaniu, które zapewnia interfejs do skryptów, takim jak makra VBA w programie Excel?” lub „Czy to może być przyszłość wszelkiego programowania, dużych i małych?” chociaż niektóre w środku byłyby świetne. Tutaj pojawia się pytanie: * Który jest najbardziej odpowiedni do budowy takiego interfejsu dla własnej aplikacji, podejścia opartego na dll lub przez parsowanie własnego języka skryptowego?


title: Jakie są ostateczne wytyczne dotyczące niestandardowej obsługi błędów w ASP.NET MVC 3?

text: Proces wykonywania niestandardowej obsługi błędów w ASP.NET MVC (3 w tym przypadku) wydaje się być niezwykle zaniedbany. Przeczytałem różne pytania i odpowiedzi tutaj, w Internecie, strony pomocy dla różnych narzędzi (takich jak Elmah), ale czuję, że zatoczyłem pełne koło i nadal nie mam najlepszego rozwiązania. Być może z Twoją pomocą możemy ustalić nowe standardowe podejście do obsługi błędów. Chciałbym zachować prostotę i nie przesadzać z inżynierią. Oto moje cele: **Dla błędów/wyjątków serwera:** 1. Wyświetl informacje debugowania w dev 2. Wyświetl przyjazną stronę błędu w środowisku produkcyjnym 3. Loguj błędy i wyślij je e-mailem do administratora w środowisku produkcyjnym 4. Zwróć kod statusu HTTP 500 ** W przypadku błędów 404 Nie znaleziono:** 1. Wyświetl przyjazną stronę błędu 2. Rejestruj błędy i wyślij je pocztą e-mail do administratora w środowisku produkcyjnym 3. Zwróć kod stanu HTTP 404 Czy istnieje sposób na osiągnięcie tych celów za pomocą ASP.NET MVC?


title: Skład projektu stanu systemu

text: Rozważmy następujący kod Javy: public class HumanStateImpl implementuje HumanState { private boolean live; prywatny Kolor skinColor; // pobierające i ustawiające, inne pola stanu @Override public boolean isAlive() { return live; } } Teraz wyobraź sobie, że chcę mieć klasę, która reprezentuje `HandState` i odpowiedni `HandController`. **Czy lepiej wstrzykiwać obiekty stanu każdego poziomu z osobna, czy składać je w jeden najbardziej specyficzny obiekt stanu?** Jeśli to zależy, od czego to zależy? Aby wyjaśnić o co mi chodzi, oto implementacja obu stron, odpowiednio: public class HandState { private final Side handSide; prywatna wartość logiczna zamknięta; } public class HandController { private final HumanState humanState; prywatny końcowy HandState handState; public HandController(HumanState humanState, HandState handState) { this.humanState = humanState; this.handState = handState; } } Versus: public class HandState implementuje HumanState { private final HumanState outerState; prywatny finał Side handSide; public HandState(HumanState outerState, Side handSide) { this.outerState = outerState; this.handSide = handSide; } @Override public boolean isAlive() { return outerState.isAlive(); } } public class HandController { private final HandState handState; public HandController(HandState handState) { this.handState = handState; } }


title: Co definiuje wymiarowość tablicy?

text: Wiem, że kiedy mówimy o tablicy mającej 1, 2 lub 4 wymiary, mamy na myśli takie tablice: 1: [0] 2: [0,0] 3: [0,0,0] 4: [0, 0,0,0] ... Czy pierwsza „oś” tablicy jest jedyną rzeczą, która definiuje jej wymiarowość? Czy tablicę z 4 wymiarami można przedstawić w ten sposób? [0, [0,0,0]] [[0,0], [0,0]], czy też podpada to pod inną definicję wymiarowości? Inną opcją jest to, że 4-wymiarowa tablica miałaby postać [ [[ [0,..],[0,..] ], [ [0,..],[0,..] ]], [ [ [0,..],[0,..] ], [ [0,..],[0,..] ]], [[ [0,..],[0,..] ], [ [0,..],[0,..] ]], [[ [0,..],[0,..] ], [ [0,..],[0,..] ]] ]      np. [ [ [ [0,..],[0,..] ], [ [0,..],[0,..] ] ], [ [ [0,..],[0,..] ], [ [0,..],[0,..] ] ], [ [ [0,..],[0,..] ], [ [0,..],[0,..] ] ], [ [ [0,..],[0,..] ], [ [0,..],[0,..] ] ] ] Czy to tylko niuans nomenklatury, o którym mówię? Czy ta definicja odnosi się do dziedziny, o której mówimy (obliczenia a systemy fizyczne)? * * * _(myśliły się z tego pytania.)_


title: Czy dodając 7, 3 i 1 do czerwono-czarnego drzewa, muszę wykonać odpowiednią rotację?

text: Jeśli dodam następujące w tej kolejności do czerwono-czarnego drzewa: tree.Put(7) tree.Put(3) tree.Put(1) 7 3 / rotate(3) / \ 3 -----> 1 7 / 1 czy powinienem wykonać obrót w prawo po wstawieniu `1` ? Czytam Biblię algorytmów, ale pseudokod nie wskazuje, co robić.


title: wykorzystując obecność wartości do kontrolowania przepływu?

text: Mam następującą sytuację. Mam metodę fabryczną, która zwraca macierz. Ta macierz może być obliczona z dwoma poziomami dokładności: level1 i level2. Aby obliczyć macierz muszę przekazać garść informacji do metody fabrycznej, a ta informacja jest ładnie upakowana w innym obiekcie Info. Informacja jest przekazywana do metody fabrycznej i zwracana jest macierz. Informacje zawierają szczegóły, które są potrzebne dla obu poziomów dokładności. zestaw tych szczegółów jest używany tylko przez level1. Jeśli wymagany jest poziom 2, informacje muszą zawierać dodatkowe dane, które są używane do oceny dokładności poziomu 2. Mam dwie strategie do wykonania decyzji: 1. Przekazuję obiekt Info do metody fabryki. Jeśli znajdzie informacje dla level2, oblicza dokładność level2. Jeśli znajdzie tylko informacje o poziomie1, oblicza poziom1. 2. przekazujesz metodzie fabrycznej zarówno dane Info, jak i żądany poziom dokładności, a następnie używaj tylko zawartości Info przydatnej dla odpowiedniego poziomu. Może zaistnieć przypadek, w którym wymagany jest poziom 2, ale informacja nie zawiera żadnych informacji o poziomie2. W takim przypadku program zgłosi wyjątek. Którą opcję uważasz za lepszą?


title: Przekazywanie kontekstu za pomocą wstrzykiwania zależności

text: W projekcie, nad którym pracuję, używam Guice i staram się zrobić jak najwięcej z Dependency Injection. Jest jednak jeden mały szkopuł; wiele moich obiektów opiera się na obiekcie „Kontekst”. Jest to obiekt niezmienny, ale zawiera pewne informacje, których większość innych obiektów potrzebuje do prawidłowego funkcjonowania. Nigdy się nie zmienia dla klas, które działają w tym samym „Kontekście”, ale moja aplikacja musi być w stanie obsługiwać różne „Konteksty” w tym samym czasie, w tym samym zakresie. Mogę wymyślić trzy sposoby rozwiązania mojego problemu: 1. Obecnie piszę dużo kodu za pomocą AssistedInject, który prawie zawsze ma metody takie jak `Factory.create(Context c)`. Cały mój kod, który zależy od `Kontekstu` jest tworzony w ten sposób, nawet jeśli są one proste. 2. Zaczynam rozważać użycie `Provider`s i zmianę każdej linii `factory.create(context)` na `obj = provider.get(); obj.setContext(c);` ale nie chcę polegać na moim kodzie do wykonania obu wywołań, podoba mi się, że kompilator upewnia się, że każdy obiekt ma swój `kontekst` i że `kontekst` nie może się zmienić (nigdy nie będzie). 3. Moje badania wskazały mi ten wątek: http://stackoverflow.com/questions/16316719/guice-assisted-injection-deeper-down-the-dependency-hierarchy Pomysł łączenia każdego „Kontekstu” z „childInjectorem” który ma jedną linię `bind(Context.class).toInstance(ContextFactory.makeInstance(args))`, ale nie jestem pewien, jak upewnić się, że wszystko używa właściwego wstrzykiwacza podrzędnego. Wydaje się, że to może być najlepsze, ale poza tym wątkiem (który nie jest moim scenariuszem) nie jestem pewien, jak to zrobić lub czy jest to odpowiednie dla mojej sytuacji. Oto przykład tego, co można zrobić za pomocą opcji 3: public class GuiceChildTest { public static void main(String... args) { Injector inj = Guice.createInjector(new ParentModule()); Injector fooChildOne = inj.createChildInjector(new FooModule(new Foo(10))); Injector fooChildTwo = inj.createChildInjector(new FooModule(new Foo(20))); Pasek słupka = fooChildOne.getInstance(Bar.class); System.out.println(bar.baz()); bar = fooChildTwo.getInstance(Bar.class); System.out.println(bar.baz()); } private static class ParentModule extends AbstractModule { @Override protected void configure() { } } private static class Bar { private MyInterface intf; @Inject public Bar(MyInterface in) { this.intf = in; } public int baz() { return intf.doCoś(); } } private static class FooModule extends AbstractModule { private Foo f; publiczny FooModule(Foo f) { this.f = f; } @Override protected void configure() { bind(MyInterface.class).toInstance(f); } } private statyczna klasa Foo implementuje MyInterface { private int i; publiczne Foo(int i) { this.i = i; } @Override public int doSomething() { return i; } } prywatny statyczny interfejs MójInterfejs { int doCoś(); } }


title: Problemy biznesowe w trackerze problemów?

text: Większość trackerów problemów jest skierowana do programistów. Ale pracując w małym zespole, który składa się z ludzi biznesu: czy ma sens umieszczanie problemów niezwiązanych z programowaniem w trackerze? Muszę powiedzieć, że nigdy nie słyszałem o takiej kombinacji. W mojej pełnoetatowej pracy biznes załatwia się gdzie indziej. Ale w startupie, w którym masz ograniczoną gotówkę, dlaczego nie umieścić zadań biznesowych i zadań deweloperskich w tym samym trackerze?


title: Jakie języki programowania i umiejętności są dodatkowo wymagane przy tworzeniu platformy freelancerskiej z pythonem?

text: Mam pytanie o kompatybilność i kointegrację języków programowania, baz danych, frameworków, bibliotek, różnych API i nie tylko (łącznie określanych jako „elementy”). Dodałem listę elementów, które są planowane do użycia podczas budowania platformy/marketplace'u freelancera, ale chciałbym wiedzieć, czy czegoś mi brakuje, lub czy dana kombinacja może spowodować problemy z kompatybilnością. Zrobiłem rozeznanie na temat wspomnianych przedmiotów, ale wciąż istnieje lista rzeczy, które nie są jasne, więc byłbym wdzięczny za więcej informacji na ten temat. Przepraszam, jeśli jestem zły z terminologią, kryptonimami lub brakuje mi cennych punktów, aby uzyskać dokładną odpowiedź – dodam wszelkie dodatkowe informacje, jeśli zostaniesz poproszony o wyjaśnienie w jakiejkolwiek części. Oto podstawowe informacje, które pomogą odpowiedzieć na pytanie: Chcemy zbudować niezależną platformę z potrzebą: \- wysokiego poziomu modułowości i skalowalności; \- rozwój autonomiczny, który ma być przetwarzany przez częściowo/w pełni niezależne grupy zadaniowe; \- możliwość integracji/importu wielu zewnętrznych API (np. Facebook connect). Weźmy oDesk do benchmarkingu (a więc przynajmniej takie możliwości funkcjonalności są potrzebne), gdzie niektóre z nich to: \- Procesy biznesowe / przepływ pracy (połączenie klient – freelancer, połączenie klient – konsultant itp.); \- Lista użytkowników i szczegółowe profilowanie (portfele, ukończone projekty itp.); \- Wyszukiwanie semantyczne; \- … (tj. przynajmniej pełna aktualnie istniejąca funkcjonalność platform freelancerskich). Opracowałem listę elementów, które zostaną użyte w procesie budowania platformy freelance, która wygląda następująco: **Język programowania (i framework): PHP (Zend) vs. Python (Django)** Kryteria decyzyjne: modułowość (łatwość aktualizacji poszczególnych modułów | istniejąca biblioteka modułów | łatwość tworzenia nowych modułów) | dostępność wysoko wykwalifikowanej siły roboczej | czas rozwoju | standaryzacja (łatwość samodzielnego rozwoju). Rezultatem było wybranie Pythona v2.X/v3.X zamiast PHP5.X. Decyzja została oparta na części kryteriów decyzyjnych (argumenty za Pythonem): Możliwość aktualizacji/edycji danego modułu w większości przypadków bez konieczności zmiany innych modułów; Bez wielkiego kłopotu z tworzeniem nowych modułów od podstaw (a przynajmniej nie zajmuje więcej czasu ani zasobów w porównaniu do tego samego wyniku w php); Podejście programistów Pythona wydaje się stwarzać więcej możliwości samodzielnego rozwoju (osoba rozwija się w taki sposób, że inni mogą rozwijać swoje moduły (lub fragmenty modułów) osobno, lub dość łatwo przejąć zadanie od momentu, w którym ta osoba zakończyła, tj. aktualizacja). Ogólnie rzecz biorąc, Python wydaje się być rozwiązaniem bardziej zorientowanym na dłuższą metę, które nie stwarza żadnych dużych wad w krótkim okresie. **Baza danych: MySQL kontra …:** Kryteria decyzyjne: funkcjonalność | popularność | koszty początkowe | koszty ogólne MySQL został wybrany zamiast MsSQL, ponieważ wydaje się, że ma w pełni wystarczającą funkcjonalność (w wersji darmowej) i może zostać uaktualniony do wersji korporacyjnej, gdy będzie to miało sens finansowy pod względem narzutów przepustowości w stosunku do opłat licencyjnych. **Procesy biznesowe: Apache ODE vs. Oracle BPEL vs.…:** Reguły decyzyjne: zgodność z Pythonem | modułowość | dostosowywanie | dostępność wysoko wykwalifikowanej siły roboczej Nie ma jeszcze jasnej decyzji. Obecnym faworytem wydaje się być Apache ODE, ale przejmowanie modułów z jednej z bibliotek Pythona, dostosowywanie ich i tworzenie nowych wydaje się obecnie atrakcyjną opcją. **Front-end: HTML4/HTML5 + CSS2/CSS3 + AJAX;** Na początku będzie tylko webowy UI, później dodamy również UI na komputery stacjonarne i urządzenia mobilne. Wymieniłem elementy, które są obecnie brane pod uwagę w celu rozwoju platformy, proszę odnieść się do któregokolwiek z punktów przy podejmowaniu decyzji, jeśli uważasz, że są one wadliwe i jeśli powinienem rozważyć więcej lub inne kryteria decyzyjne, które mogą mieć wpływ na to, które przedmiot do wybrania itp. **Inne kwestie do rozważenia** 1) Czy wybrałem odpowiednią kombinację przedmiotów, biorąc pod uwagę, że będą one używane do rozwijania platformy freelancerskiej; (1.1) Czy brakuje mi jakichkolwiek elementów, które będą potrzebne (tj. język programowania / framework / platforma); 2) Czy rozsądne jest używanie frameworka django, aby zaoszczędzić czas na rozwoju i czy może to spowodować poważne problemy ze skalowalnością; (2.1) Jakich bibliotek należy użyć, aby zdobyć jak najwięcej gotowych modułów dla platformy freelancerskiej; 3) BPEL (tj. za pomocą Apache ODE) może być zaadaptowany do różnych procesów biznesowych (w tym połączenia klient-freelancer), ale czy nie spowodowałoby to dużych ograniczeń oferowanych przez nas rozwiązań; (3.1) Czy lepiej byłoby rozważyć rozwijanie własnych modułów w Pythonie, aby osiągnąć pożądany rezultat; (3.2) Czy jest jakaś biblioteka Pythona obsługująca BPEL; 4) Czy możliwe jest połączenie pythona z php w zakresie korzystania z bibliotek php (przykład: http://code.google.com/p/php-excel/) gdy nie są one dostępne w pythonie;(4.1) Jeśli tak, jakie moduły/platformy/rozwiązania są do tego potrzebne; W razie potrzeby zaktualizuję wszelkie części, gdy tylko otrzymam informację zwrotną na ich temat. Szukam Twoich odpowiedzi. Dziękuję!


title: Wdrażanie ogólnych procedur

text: Czy możliwe jest zaimplementowanie ogólnych procedur w dowolnym języku (C#, Java itp.). Przez ogólne procedury mam na myśli, w konkretnym przypadku handlery. Powiedzmy, że mam 2 przyciski i 2 pola tekstowe. Jeden przycisk po naciśnięciu pobiera tekst pierwszego pola tekstowego i konwertuje go na wielkie litery, a drugi przycisk drukuje długość ciągu w drugim polu tekstowym. Czy mogę mieć funkcję button(type, textbox) { if(type==1) /*Konwertuj na wielkie litery*/ else if(type==2) /*Drukuj długość*/ } Typ przyjmuje dowolną jako dane wejściowe i dalej je przetwarza. Chcę to zaimplementować ze względu na nadmiarowość w moim kodzie i chcę, aby mój kod był przenośny do innych języków. Tak, że muszę zmodyfikować tylko składnię, aby to działało. Czy to możliwe?


title: Czy mogę używać „historyjek użytkownika” do zadań doskonalenia procesów?

text: Obecnie używamy JIRA do śledzenia naszych prac rozwojowych. Moje kierownictwo chce sformatować i skategoryzować wszystko jako „historie użytkowników”, w tym zadania niezwiązane z tworzeniem oprogramowania. Na przykład: „Czy jako kierownik testów mogę przeprowadzać testy aplikacji przy użyciu wyłącznie testów automatycznych, bez testów ręcznych, aby móc jak najefektywniej przetestować aplikację? Kryteria akceptacji: 1\. Przekonwertuj 50 istniejących testów ręcznych na w pełni zautomatyzowane testy 2\. Testy muszą zostać wykonane w czasie krótszym niż 1 godzina" Chcę dowiedzieć się od społeczności, czy użycie "historyjek użytkownika" ma sens w pracy, która wspiera proces tworzenia oprogramowania, nie jest wykonywana przez programistów i nie nie skutkuje bezpośrednio w kodzie dostarczalnym. Czy też powinno to być traktowane/klasyfikowane w inny sposób (na przykład w JIRA)? Zaktualizowano 6/7/2011 – Przeformułowane pytanie, aby skupić się na określeniu „historia użytkownika”.


title: Budowanie aplikacji internetowej, która jest prawie całkowicie renderowana przez JavaScript, podczas gdy back-end dostarcza tylko Json. Robisz czy nie?

text: Jako programista i biorąc pod uwagę ogólną „zabawę” procesu, kusi mnie, aby rozpocząć projekt w Sinatrze, w którym jedyną troską zaplecza jest logika i zwrócenie Json API, a następnie napisanie aplikacji javascript, która wejdzie w interakcję z tym interfejsem API w celu renderowania rzeczywistej treści użytkownikowi. Jestem całkiem nowy w programowaniu i nigdy wcześniej nie robiłem czegoś takiego na odległość. Jakie byłyby pułapki, zalety i wady takiego całkowitego oddzielenia logiki od prezentacji? Jakieś przykłady robienia tego na wolności? Jednym z głównych problemów jest to, w jaki sposób wyszukiwarki zareagują na witrynę, której treść jest prawie w całości obsługiwana jako Json...


title: Procedury przechowywane w T-SQL o rzędy wielkości szybciej niż LINQ

text: Zgodnie z odpowiedziami, które widziałem na stackoverflow, procedury składowane (i w mniejszym stopniu funkcje db) wydają się działać lepiej w porównaniu z frameworkami LINQ + ORM (np. Entity Framework). Chcę ustalić, czy różnica wydajności jest wystarczająco duża, aby uzasadnić wydłużenie czasu opracowywania, zakładając, że napisanie równoważnych, dość złożonych operacji zapytań w T-SQL i LINQ zajmuje więcej czasu. W których scenariuszach istnieje różnica rzędu wielkości (lub co najmniej bardzo duży współczynnik stały) w czasie wykonywania między przechowywaną procedurą zoptymalizowaną pod kątem wydajności a jej równoważnym, zoptymalizowanym pod kątem wydajności odpowiednikiem LINQ? Lub w przypadku funkcji o wartościach skalarnych lub tabelarycznych w porównaniu z odpowiednikiem LINQ? Mamy nadzieję, że nie jest trudno zauważyć, że to pytanie jest zgodne z wytycznymi zawartymi w FAQ. Nie zadaje subiektywnego pytania typu „co jest lepsze, T-SQL czy LINQ?”. Prosi o kilka konkretnych scenariuszy (może podać abstrakcyjne lub konkretne przykłady), w których występuje znacząca różnica w wydajności. Jeśli to nadal nie ma dla Ciebie sensu i nadal uważasz, że to pytanie nie jest konstruktywne i powinno zostać zamknięte, zostaw wyjaśnienie, jeśli możesz.


title: Czy sprzedaż oprogramowania na licencji GPL jest skuteczna?

text: Powiedzmy, że ktoś pisze oprogramowanie i licencjonuje je na GPL. Potem idą go sprzedać. Czy to będzie skuteczne? Czy ktoś nie kupi go po prostu i nie rozprowadzi po niższej cenie? Czy ktoś z was zna sprzedawane oprogramowanie na licencji GPL? Również jeśli znasz przypadki, w których ktoś kupił takie oprogramowanie i rozprowadził je po niższej cenie/bezpłatnie, udostępnij je tutaj.


title: Czy Flash znika?

text: http://w3techs.com/technologies/details/cp-flash/all/all Ludzie nie używają już Flasha? Czemu?


title: Czy istnieją podobieństwa między jądrem systemu operacyjnego a jądrem języka programowania?

text: Niewiele wiem o Smalltalku, ale zauważyłem, że często pojawia się wzmianka o "jądrze". Dan Ingalls, główny opiekun kilku implementacji Smalltalka, również pracował nad środowiskiem Javascript o nazwie „Lively Kernel”, aw książce Petera Siebela ciągle wspominał o „jądro”. Nie mogę oprzeć się wrażeniu, że to nie przypadek, że twórcy Smalltalka użyli nazwy (centralnej) części systemów operacyjnych w odniesieniu do konkretnego komponentu ich języka. Czy to dlatego, że Smalltalk miał działać jako system operacyjny? Czy to dlatego, że teoria języków programowania i systemów operacyjnych ma ze sobą wiele wspólnego? Jaki jest powód wspólnego określenia tych dwóch składników?


title: Strategie obsługi błędów w środowiskach wielowątkowych

text: **TL;DR** Jakich strategii generowania i obsługi błędów używasz w kodzie wielowątkowym przeznaczonym dla innych i dlaczego ich używasz? Jeśli dotyczy, określ, do jakiego paradygmatu programowania jest przydatny. Bardziej interesują mnie imperatywne, współbieżne środowiska, ale ogólnie każdy będzie przydatny. Piszę małą bibliotekę współbieżności, która jest obecnie projektem edukacyjnym pet/C++11, ale może być później używana wewnętrznie w mojej pracy. Jeśli chodzi o domenę, jest to bardziej w sferze DSP i strumieniowania multimediów, ale ponieważ będzie to używane w silniku gry, potrzebuję dość silnej obsługi błędów. Moją wielką przeszkodą w tej chwili nie jest zrozumienie kodu równoległego i struktur danych, ale sposób obsługi błędów i raportowania. Moje główne doświadczenie z dużymi systemami to gry, ale zazwyczaj korzystam z bibliotek, a nie je projektuję. Po prostu szukam różnych strategii i tego, jak można je wykorzystać w różnych sytuacjach, ponieważ jest to dość duża luka w mojej wiedzy. Moim największym problemem jest zastosowanie strategii, aby jeśli program mógł się poprawić, to powinien. Jeśli to się naprawi, powinien istnieć sposób powiadomienia użytkownika o tym, co się stało, za pomocą jakiegoś mechanizmu. Mam już kilka struktur danych, które chociaż mogą zostać odzyskane, mogą wyciekać pamięć, jeśli na przykład destruktor zawiedzie. Niektóre podejścia: * Obsługa wyjątków, dla których można bezpiecznie odzyskać dane z wnętrza biblioteki, ale zezwalaj na propagację wyjątków krytycznych do użytkowników biblioteki, aby wskazać, że obiekt jest teraz w niezdefiniowanym stanie. Jest to moje preferowane podejście w środowiskach jednowątkowych, ale to podejście nie będzie komunikować złego stanu innym wątkom. * Gdy wystąpi wyjątek, który spowodowałby nieodwracalny stan struktury danych, zniszcz strukturę danych i ustaw flagę, aby zablokować dalsze operacje na tej strukturze danych, a następnie zgłoś ogólny wyjątek do użytkownika końcowego. Jest to trudne dla algorytmów bez blokad. * Przekaż stan błędu poprzez obliczenia równoległe. Działa dobrze w sieciach procesów Kahna i innych modelach współbieżności wysokiego poziomu. Nie jest to zbyt pomocne, jeśli prymitywny element wspierający model wysokiego poziomu zawiódł. * Zakończ wątek/zadanie, które spowodowało wyjątek. Działa dobrze w przypadku lokalnych danych/obliczeń wątku, ale nie jest dobrym rozwiązaniem dla danych udostępnionych. Tak na marginesie, wiem, że dobra biblioteka prawdopodobnie użyje kombinacji czegoś więcej niż tylko tego, co jest wymienione powyżej. Po prostu nie mam doświadczenia, aby wiedzieć, jaka strategia jest dobra dla każdego wystarczająco dużego systemu.


title: Gdzie umieścić reguły biznesowe przed usunięciem podmiotu

text: Mam aplikację Windows Forms, która ma dwie klasy: Konto klasy publicznej Numer własności publicznej jako ciąg Faktury własności publicznej jako lista (faktury) End Class Public Class AccountRepository Public Sub Delete (konto jako konto) ... kod dostępu db tutaj .. .End Sub End Class Logika biznesowa polega na tym, że `Konto` nie może zostać usunięte, gdy nadal ma skojarzone z nim `Faktury`. Jak i gdzie mam przeprowadzić walidację? _Uwaga, mogę to również zrobić poprzez ograniczenia tabeli dotyczące kluczy obcych db._


title: Jak udowodnić, że aplikacja jest zbudowana na złym kodzie?

text: Obecnie przeglądam system zbudowany przez kilku programistów, którzy wcześniej pracowali w mojej pracy. System działa całkiem dobrze z punktu widzenia użytkownika, ale kiedy zagłębiamy się w przegląd kodu, jest to kompletny bałagan. Jestem bardziej niż przekonany, że sposób, w jaki zbudowana jest aplikacja, nie wytrzyma przyszłych aktualizacji, nie mówiąc już o wysokich wzrostach użytkowania. Problem w tym, że ja wiem, jak jest źle, ale moi przełożeni nie. Jak mogę to udowodnić mojemu przełożonemu, żeby rzeczywiście dostrzegł problem i dał się przekonać do minimalnego triage na obecnym kodzie, a w niedalekiej przyszłości rozpocząć nową linię rozwoju dla kolejnej wersji aplikacji?


title: Najlepsze podejście do biblioteki klas narzędziowych przy użyciu programu Visual Studio

text: Mam zbiór klas, których często (ale nie zawsze) używam podczas tworzenia aplikacji WPF. Kłopot polega na tym, że jeśli chcę używać tylko podzbioru klas, mam trzy możliwości: 1. **Dystrybuuj całą bibliotekę DLL.** Chociaż takie podejście ułatwia utrzymanie kodu, wymaga dystrybucji dużej biblioteki DLL dla minimalna funkcjonalność kodu. 2. **Skopiuj potrzebne mi klasy do bieżącej aplikacji.** Takie podejście rozwiązuje problem nierozpowszechniania niewykorzystanego kodu, ale całkowicie eliminuje jego konserwację. 3. **Utrzymuj każdą klasę/funkcję w osobnym projekcie.** To rozwiązuje oba powyższe problemy, ale z drugiej strony znacznie zwiększyłem liczbę plików, które muszą być dystrybuowane, co nadyma moje rozwiązanie VS małymi projektami. Idealnie chciałbym kombinację 1 i 3: Pojedynczy projekt, który zawiera wszystkie moje klasy narzędziowe, ale kompiluje do biblioteki DLL zawierającej tylko klasy, które są używane w bieżącej aplikacji. Czy są jakieś inne popularne podejścia, których nie brałem pod uwagę? Czy jest jakiś sposób na zrobienie tego, czego chcę? Dziękuję Ci.


title: Naruszenie definicji C?

text: Standard C stwierdza, że żaden znak w standardowym zestawie drukowania maszyny nigdy nie będzie ujemny. Ale następujący kod: char c=1234; printf("%d\t%c",c,c); daje wynik ujemny i drukuje dziwny znak, co oznacza, że znak jest w zestawie znaków drukowania maszyny. Czy naruszony jest tutaj standard C?


title: Czy dobrym pomysłem jest pisanie specyfikacji wymagań według wątków?

text: Obecnie w moim obecnym projekcie używamy zwinnych metod i mamy mnóstwo takich historii: * Jako asystent chcę zapłacić klientowi zwrot pieniędzy, aby mógł otrzymać trochę pieniędzy, gdy o to poprosi * Jako klienta, chcę zapłacić za zakup, aby otrzymać przedmiot. Do tej pory robiliśmy to, wybierając najważniejsze historie w każdym sprincie i dopracowując je do szeregu specyfikacji wymagań formalnych (niektóre historie, które są podobne, grupujemy w tej samej specyfikacji). W zależności od historii może to być po prostu przycisk na ekranie lub cały przepływ pracy. Problem polega na tym, że ponieważ jest tak wiele historii, nie jest od razu jasne, z jaką częścią systemu się one wiążą. Działa w czasach programistów, każdy sprint dostają po prostu specyfikację określającą, co muszą zrobić i zmiany, które muszą wprowadzić. Ale jeśli chodzi o utrzymanie tej listy historii i do testów, zaczyna się pojawiać naprawdę trudne śledzenie błędów i ogólnie tylko utrzymywanie specyfikacji, ponieważ jedna część funkcji na ekranie mogła zostać udokumentowana w wielu różnych miejscach ze względu na to, że jest podzielone według historii. Czy pisanie specyfikacji na podstawie historii to dobry pomysł? Czy napisaliśmy historie w niewłaściwy sposób?


title: Jak radzisz sobie z brakiem konsensusu co do metodologii i praktyk, bez wskazówek ze strony kierownictwa?

text: Do niedawna byłem jedynym deweloperem w kilku projektach wewnętrznych. Kilka miesięcy temu do naszego zespołu programistów dodaliśmy 0,4 FTE. Fajnie jest nie być samemu przy naszych projektach, ale nie było to łatwe. Trochę tła: kiedy zaczynałem na swoim stanowisku, nie używałem kontroli źródła, śledzenia problemów, a nawet testowania. Sam wdrożyłem wszystkie te praktyki, a poprawa wydajności została zauważona przez wielu interesariuszy. Nasze nowe 0,4FTE to w zasadzie 40% czasu pracy pracownika w innym dziale. Jest kompetentnym programistą, ale współpraca była trudna. Po kilku miesiącach nadal doświadczam: * Wysyłanych e-mailem plików źródłowych, a nie ewidencjonowania repozytoriów w Git. * Korzystanie z poczty e-mail i komunikatorów internetowych zamiast narzędzia do śledzenia problemów w celu omówienia projektu. * Odporność na przeglądy kodu. * Ego przeszkadza w programowaniu w parach lub wczesnej współpracy nad komponentami (tj. nie chcę jeszcze pokazywać źródła tego, to jest brzydkie). Nasz dział jest dziwny. Lider naszego zespołu musi dzielić swój czas między zarządzanie projektami, administrację systemem i instalację/wsparcie sprzętu. Wdaliśmy się w prawdopodobnie najgorszy spór, jaki kiedykolwiek mieliśmy, dotyczący tego, jak spodziewałem się interakcji z innym programistą, a „Tak po prostu jest, oprócz zgłaszania problemu musisz wysłać e-maila itp.”. Moje pytanie brzmi, jak sobie z tym radzisz? Próbowałem różnych podejść; odmowa uznania problemów bez biletu, odmowa spojrzenia na kod, który nie został zarejestrowany w naszym repozytorium Git, ale ostatecznie jestem de facto głównym programistą w tym projekcie i podoba mi się to, czy nie, strzelam sobie w stopę, będąc pedant do procesu. Jednocześnie doprowadzam się do szaleństwa (do tego stopnia, że szukam nowej pracy), próbując poradzić sobie z brakiem spójnych (lub przynajmniej możliwych do wyegzekwowania) wytycznych. Wspomniałem kolegom spoza naszego działu, że może to po prostu źle pasuje, ale niestety nie mamy na razie zbyt dużego wyboru. Wszelkie pomysły na poprawę tej sytuacji byłyby bardzo mile widziane.


title: Czym jest symbol w Ruby?

text: Jestem zupełnie nowy w świecie Rubinów i trochę pomyliłem się z koncepcją symboli. Jaka jest różnica między symbolami a zmiennymi? Dlaczego nie używać tylko zmiennych? Dziękuję.


title: Dlaczego większość języków programowania obsługuje tylko zwracanie pojedynczej wartości z funkcji?

text: Czy istnieje powód, dla którego funkcje w większości (?) języków programowania są zaprojektowane do obsługi dowolnej liczby parametrów wejściowych, ale tylko jednej wartości zwracanej? W większości języków możliwe jest „obejście” tego ograniczenia, m.in. za pomocą out-parameters, zwracania wskaźników lub definiowania/zwracania struktur/klas. Wydaje się jednak dziwne, że języki programowania nie zostały zaprojektowane do obsługi wielu zwracanych wartości w bardziej „naturalny” sposób. Czy jest na to wytłumaczenie?


title: W jaki sposób można prosić/obsługiwać się danymi osobowymi lub finansowymi?

text: Chciałbym stworzyć budżetową aplikację na Androida. Oczywiście, aby być konkurencyjnym, musiałbym umożliwić użytkownikom pobieranie danych z ich banku. Z [ogromnych] względów bezpieczeństwa te rzeczy nie są po prostu dobrowolnie przekazywane każdemu, kto byłby deweloperem, ale wiem, że można to zrobić. Istnieją aplikacje budżetowe, które łączą się z bankami użytkowników. Moje pytanie brzmi, co muszę zrobić, aby odpytywać użytkowników o dane bankowe? Czy muszę kontaktować się z każdym bankiem, z którym moja aplikacja ma się kontaktować? Czy muszę napisać aplikację i przedstawić ją bankom? A może jestem zbyt ignorantem, by podjąć wyzwanie tej wielkości? Pytam, ponieważ oczywiście nie znam standardów, które są tutaj potrzebne i chciałbym się o nich dowiedzieć, nawet jeśli okaże się, że nie mogę napisać sekcji interfejsu bankowego w mojej aplikacji.


title: Badania językowe dynamicznie a statycznie typowane

text: Czy istnieją badania przeprowadzone na temat skuteczności języków statycznie i dynamicznie typowanych? W szczególności: * Pomiary produktywności programistów * Wskaźnik defektów Uwzględniając również wpływ testów jednostkowych. Widziałem wiele dyskusji na temat zalet obu stron, ale zastanawiam się, czy ktoś przeprowadził na ten temat badania. **Edytuj** Niestety, tylko jeden z pokazanych artykułów jest w rzeczywistości studium i nie daje nic poza stwierdzeniem, że język ma znaczenie. To skłania mnie do zastanowienia się: co jeśli zaproponowałbym przeprowadzenie takiego badania z ochotnikami z tej strony?


title: Czy wymagane parametry funkcji to zależności?

text: Studiuję wstrzykiwanie zależności i chcę wiedzieć, czy wymagane parametry funkcji można uznać za zależności. Chciałbym się tylko upewnić, zanim odniosę się do tych zależności, a to okaże się nie do końca dokładne. function doSomething(required){ if(required !== null){ // do stuff } } **Czy wymagane parametry funkcji nazywają się zależnościami?**


title: Aplikacja mobilna: Jakie powinny być strategie uwierzytelniania serwera?

text: Tworzę aplikację mobilną po raz pierwszy i mam pewne zamieszanie wokół niej **Co zamierzam zrobić?** Aplikacja `iPhone` będzie miała opcję `Zaloguj się przez Google`, gdzie użytkownik będzie uwierzytelniał się po stronie klienta (ja nie' t planuje mieć dostęp do serwera, o ile nie jest to konieczne), a dane użytkownika (na przykład identyfikator, adres e-mail) zostaną wysłane do serwera zaplecza (planujemy napisać RESTful API w Javie). **Skąd w takim razie zamieszanie?** 1. Skoro wiele urządzeń mobilnych będzie miało dostęp do interfejsów API, jakie byłyby ustawienia CORS na serwerze? Czy pozwoliłoby to na **WSZYSTKIE** początki? 2. Jeśli aplikacja uwierzytelnia się po stronie klienta, w jaki sposób backend może upewnić się, że jest to tylko uwierzytelniony użytkownik i nikt nie bawi się systemem (bawiąc się REST API) 3. Problem przechodzi na wyższy poziom, gdy jest wielu dostawców zaangażowanych, np. Facebook, Twitter Jakie są rekomendacje, jak należy zaprojektować system w tym przypadku? Dzięki PS Przepraszamy, że nie zadałem pytania „zautomatyzowanego”.


title: Dlaczego wbudowana funkcja max w Haskell działa szybciej niż moja?

text: Zauważyłem, że z jakiegoś powodu wbudowana funkcja max Haskella (która zwraca największą z dwóch liczb) działa znacznie szybciej niż ta, którą napisałem, mimo że są one zasadniczo identyczne. Z tej strony: http://www.haskell.org/onlinereport/standard-prelude.html odkryłem, że standardowa funkcja max jest zdefiniowana jako: max x y | x <= y = y | w przeciwnym razie = x, który jest w stanie wykonać foldr max 0 [0..10000000] w 7,6 sekundy (mój laptop jest w trybie super oszczędzania energii) Napisałem jednak dokładnie tę samą funkcję, uruchomiłem ją i foldr myMax 0 [0.. 10000000] zajęło średnio 23,74 sekundy Obie funkcje wyglądają identycznie, z wyjątkiem tego, że wbudowany max nie ma sygnatury typu (chyba że jest gdzieś ukryty). Czy ktoś wie, co może się tu dziać? Poważnie wątpię, czy wbudowana funkcja będzie działać ponad trzy razy szybciej niż identyczna, zdefiniowana przez użytkownika. Dla mnie byłoby to bardzo dziwne. (Kiedy mówię, że są identyczne, mam na myśli dosłownie klony siebie nawzajem. Żeby to przetestować, odebrałem to prosto z Preludium i nadal jest znacznie wolniejsze.) Edytuj: Myślałem o tym więcej i ja myślę, że może to mieć coś wspólnego z dołączonymi funkcjami, które są wstępnie kompilowane, podczas gdy moje funkcje są interpretowane przez GHCI (co wtedy miałoby sens). Zostawię to na wypadek, gdyby ktoś miał lepszą odpowiedź, ale podejrzewam, że to jest przyczyną. (Jedną rzeczą, z której zdałem sobie sprawę, że nie rozumiem, jest to, dlaczego GHCI mówi, że skompilował mój kod po edycji, ale potem mówi, że to interpretuje. Nie interpretujesz skompilowanego kodu, prawda?)


title: Kiedy jest właściwy czas, aby zacząć ubiegać się o pracę?

text: Jestem studentem studiów podyplomowych w CIS, miałem BS w EE. Wiosną przyszłego roku skończę szkołę. Oznacza to, że do ukończenia studiów mam jeszcze jeden semestr. Naprawdę nie chcę szukać pracy po ukończeniu studiów. Problem w tym, że w przyszłym semestrze będę robił kilka ciężkich kursów wraz z projektem. Naprawdę chcę coś wyrwać w tym semestrze, ale czy myślisz, że pracodawcy rekrutowaliby kandydatów tak wcześnie?


title: Definicja „systemów typu silnego”

text: Widziałem prezentację Martina Odersky'ego „Kłopoty z typami”. W tabeli „Type Systems Landscape” podzielił języki programowania na dwa wymiary; Wymiar „statyczny/dynamiczny” i wymiar „silny/słaby”. Szukałem definicji „silnych/słabych systemów typów” i ich różnicy od „statycznych/dynamicznych” systemów typów, które mogą wyjaśnić, dlaczego Python/Ruby mają „silny system typów”? Znalazłem coś na Wikipedii, ale mnie to nie zadowoliło. Teraz chcę wiedzieć, co to jest „silny/słaby”? i Jak Python ma silny system typów (jak scala)? Czy chodzi o dziedziczenie / komponowanie / typy pierwotne w języku, czy nie? Jeśli „nie”, jaka jest koncepcja i jednostka miary dla tych cech (dziedziczenie / komponowanie / prymityw / kontener / ...) w systemach typów?


title: Jaki jest dobry wzorzec projektowy do generowania pliku Excel (xlsx) w kodzie?

text: Czasami mam projekty, w których muszę wyprowadzić niektóre dane jako plik Excel (format xlsx). Proces ten wygląda zwykle: 1. Użytkownik klika kilka przycisków w mojej aplikacji 2. Mój kod uruchamia zapytanie bazy danych i w jakiś sposób przetwarza wyniki 3. Mój kod generuje plik *.xlsx przy użyciu bibliotek interop programu Excel com lub jakiejś biblioteki innej firmy (np. Aspose.Cells) Mogę łatwo znaleźć przykłady kodu, jak to zrobić online, ale szukam bardziej niezawodnego sposobu na zrobienie tego. Chciałbym, aby mój kod był zgodny z pewnymi zasadami projektowania, aby zapewnić, że mój kod jest łatwy w utrzymaniu i zrozumiały. * * * Oto jak wyglądała moja pierwsza próba wygenerowania pliku xlsx: var wb = new Workbook(); var ws = wb.Arkusze[0]; ws.Cells[0, 0].Value = "Nagłówek"; ws.Cells[1, 0].Value = "Wiersz 1"; ws.Cells[2, 0].Value = "Wiersz 2"; ws.Cells[3, 0].Value = "Wiersz 3"; wb.Zapisz(ścieżka); Plusy: Niewiele. To działa, więc to dobrze. Minusy: * Odwołania do komórek są zakodowane na sztywno, więc mam magiczne liczby zaśmiecone w całym kodzie. * Trudno jest dodawać lub usuwać kolumny i wiersze bez aktualizowania wielu odwołań do komórek. * Muszę się nauczyć jakiejś biblioteki innej firmy. Niektóre biblioteki są używane tak jak inne biblioteki, ale nadal mogą wystąpić problemy. Miałem problem, gdy biblioteki com interop używają odwołań do komórek opartych na 1, podczas gdy Aspose.Cells używa odwołań do komórek opartych na 0. * * * Oto jedno rozwiązanie, które rozwiązuje niektóre z wad, które wymieniłem powyżej. Chciałem traktować tabelę danych jako własny obiekt, który można przesuwać i zmieniać bez zagłębiania się w manipulacje komórkami i zakłócania innych odwołań do komórek. Oto kilka pseudokodów: var headers = new Block(new string[] { "Col 1", "Col 2", "Col 3" }); var body = new Block(new string[,] { { "Row 1", "Row 1", "Row 1" }, { "Row 2", "Row 2", "Row 2" }, { "Row 3 ", "Wiersz 3", "Wiersz 3" } }); body.PutBelow(nagłówki); W ramach tego rozwiązania będę miał jakiś obiekt BlockEngine, który pobiera kontener bloków i wykonuje manipulacje komórkami wymagane do wyprowadzenia danych jako pliku *.xlsx. Obiekt Blok może mieć dołączone formatowanie. Plusy: * To usuwa większość magicznych liczb, które miał mój początkowy kod. * To ukrywa wiele kodu manipulacji komórkami, chociaż manipulacja komórkami jest nadal wymagana w obiekcie BlockEngine, o którym wspomniałem. * Znacznie łatwiej jest dodawać i usuwać wiersze bez wpływu na inne części arkusza kalkulacyjnego. Minusy: * Nadal trudno jest dodawać lub usuwać kolumny. Gdybym chciał zamienić pozycję kolumn drugiej i trzeciej, musiałbym bezpośrednio zamienić zawartość komórki. W tym przypadku byłoby to osiem edycji, a tym samym osiem możliwości popełnienia błędu. * Jeśli mam jakieś formatowanie dla tych dwóch kolumn, muszę je również zaktualizować. * To rozwiązanie nie obsługuje poziomego umieszczania bloków; Mogę umieścić tylko jeden blok pod drugim. Jasne, że mógłbym mieć `tableRight.PutToRightOf(tableLeft)`, ale to powodowałoby problemy, gdyby tableRight i tableLeft miały różne liczby wierszy. Aby umieścić tabele, silnik musiałby być świadomy każdego innego stołu. Wydaje mi się to niepotrzebnie skomplikowane. * Nadal muszę uczyć się kodu innej firmy, chociaż poprzez warstwę abstrakcji za pomocą obiektów Block i BlockEngine kod będzie mniej ściśle powiązany z biblioteką innej firmy niż moja początkowa próba. Gdybym chciał obsługiwać wiele różnych opcji formatowania w luźno powiązany sposób, prawdopodobnie musiałbym napisać dużo kodu; mój BlockEngine byłby ogromnym bałaganem. * * * Oto rozwiązanie, które obiera inną drogę. Oto proces: 1. Biorę dane z raportu i generuję plik xml w wybranym przeze mnie formacie. 2. Następnie używam transformacji xsl, aby przekonwertować plik xml na plik arkusza kalkulacyjnego XML programu Excel 2003. 3. Stamtąd po prostu konwertuję arkusz kalkulacyjny xml na plik xlsx przy użyciu biblioteki innej firmy. Zalety: * To rozwiązanie prawie nie wymaga manipulacji komórkami. Zamiast tego używasz xsl/xpath do manipulacji. Aby zamienić dwie kolumny w tabeli, przenosisz całe kolumny w pliku xsl, w przeciwieństwie do moich innych rozwiązań, które wymagałyby zamiany komórek. * Chociaż nadal potrzebujesz biblioteki innej firmy, która może przekonwertować arkusz kalkulacyjny XML programu Excel 2003 na plik xlsx, to prawie wszystko, do czego będziesz potrzebować tej biblioteki. Ilość kodu, który musisz napisać, aby wywołać bibliotekę innej firmy, jest niewielka. * Myślę, że to rozwiązanie jest najłatwiejsze do zrozumienia i wymaga najmniejszej ilości kodu. * Kod tworzący dane w moim własnym formacie xml będzie prosty. * Plik xsl będzie skomplikowany tylko dlatego, że arkusz kalkulacyjny XML programu Excel 2003 jest skomplikowany. Jednak łatwo jest sprawdzić dane wyjściowe pliku xsl: wystarczy otworzyć dane wyjściowe w programie Excel i sprawdzić komunikaty o błędach. * Możesz łatwo wygenerować przykładowe pliki arkusza kalkulacyjnego XML programu Excel 2003: po prostu utwórz arkusz kalkulacyjny, który wygląda jak żądany plik xlsx, a następnie zapisz go jako arkusz kalkulacyjny XML programu Excel 2003. Wady: * Arkusze kalkulacyjne XML programu Excel 2003 nie obsługują niektórych funkcji. Nie możesz na przykład automatycznie dopasowywać szerokości kolumn. Nie możesz umieszczać obrazów w nagłówkach ani stopkach. Jeśli zamierzasz wyeksportować wynikowy plik xlsx do formatu pdf, nie możesz ustawić zakładek pdf. (Zhakowałem razem poprawkę za pomocą komentarzy komórek.). Musisz to zrobić, korzystając z biblioteki innej firmy. * Wymaga biblioteki obsługującej arkusze kalkulacyjne XML programu Excel 2003. * Używa 11-letniego formatu plików MS Office. Uwaga: Zdaję sobie sprawę, że pliki xlsx są w rzeczywistości plikami zip zawierającymi pliki xml, ale formatowanie xml wydaje się zbyt skomplikowane dla moich celów. * * * Na koniec przyjrzałem się rozwiązaniom wykorzystującym SSRS, ale wydaje się to zbyt rozbudowane dla moich celów. * * * Wracając do mojego początkowego pytania, jaki jest dobry wzorzec projektowy do generowania plików Excela w kodzie?. Przychodzi mi do głowy kilka rozwiązań, ale żadne nie wydaje się być idealne. Każdy ma wady.


title: Strategia generowania unikalnych i bezpiecznych identyfikatorów do użytku w aplikacji internetowej „czasami offline”

text: Mam projekt internetowy, który pozwala użytkownikom pracować zarówno online, jak i offline i szukam sposobu na generowanie unikalnych identyfikatorów dla rekordów po stronie klienta. Chciałbym, aby podejście, które działa, gdy użytkownik jest offline (tj. Nie może rozmawiać z serwerem), jest unikatowe i bezpieczne. Mówiąc „bezpieczne”, szczególnie martwię się, że klienci przesyłają zduplikowane identyfikatory (złośliwie lub w inny sposób), a tym samym sieją spustoszenie w integralności danych. Robiłem trochę googlowania, mając nadzieję, że to już rozwiązany problem. Nie znalazłem niczego, co byłoby bardzo ostateczne, zwłaszcza jeśli chodzi o podejścia stosowane w systemach produkcyjnych. Znalazłem kilka przykładów systemów, w których użytkownicy będą mieli dostęp tylko do danych, które utworzyli (np. Lista rzeczy do zrobienia, która jest dostępna na wielu urządzeniach, ale tylko przez użytkownika, który ją utworzył). Niestety potrzebuję czegoś bardziej wyrafinowanego. Znalazłem tutaj kilka naprawdę dobrych pomysłów, które są zgodne z tym, jak myślałem, że wszystko może działać. Poniżej moje proponowane rozwiązanie. ## Niektóre wymagania 1. Identyfikatory powinny być globalnie unikalne (lub przynajmniej unikalne w ramach systemu) 2. Generowane na kliencie (np. za pomocą javascript w przeglądarce) 3. Bezpieczne (jak opisano powyżej i w inny sposób) 4. Dane mogą być przeglądane /edytowane przez wielu użytkowników, w tym użytkowników, którzy go nie stworzyli 5. Nie powoduje znaczących problemów z wydajnością baz danych zaplecza (takich jak MongoDB lub CouchDB) ## Proponowane rozwiązanie Gdy użytkownicy tworzą konto, otrzymają identyfikator uuid, który został wygenerowany przez serwer i jest znany jako unikalny w systemie. Ten identyfikator NIE może być taki sam jak token uwierzytelniania użytkowników. Nazwijmy ten id użytkownika „tokenem id”. Kiedy użytkownik tworzy nowy rekord, generuje nowy uuid w javascript (generowany przy użyciu window.crypto, jeśli jest dostępny. Zobacz przykłady tutaj). Ten identyfikator jest połączony z „tokenem identyfikatora”, który użytkownik otrzymał podczas tworzenia konta. Ten nowy złożony identyfikator (token identyfikatora po stronie serwera + identyfikator uuid po stronie klienta) jest teraz unikalnym identyfikatorem rekordu. Gdy użytkownik jest w trybie online i przesyła ten nowy rekord do serwera zaplecza, serwer: 1. Zidentyfikuje to jako akcję „wstaw” (tj. nie aktualizuje ani nie usuwa) 2. Sprawdź, czy obie części klucza złożonego są prawidłowymi identyfikatorami UUID 3. Sprawdź, czy podana część „id token” złożonego identyfikatora jest poprawna dla bieżącego użytkownika (tzn. pasuje do tokena id przypisanego do serwera podczas tworzenia konta) 4. Jeśli wszystko jest zgodne, wstaw dane do bazy danych (należy uważać, aby wykonać wstawianie, a nie „upsert”, aby jeśli identyfikator _nie_ już istnieje, nie aktualizuje istniejącego rekordu przez pomyłkę) Zapytania, aktualizacje i usunięcia nie wymagają żadnej specjalnej logiki. Po prostu używaliby identyfikatora do zapisu w taki sam sposób, jak tradycyjne aplikacje. ## Jakie są zalety takiego podejścia? 1. Kod klienta może tworzyć nowe dane w trybie offline i natychmiast znać identyfikator tego rekordu. Rozważałem alternatywne podejścia, w których tymczasowy identyfikator byłby generowany na kliencie, który później zostałby zamieniony na „ostateczny” identyfikator, gdy system był online. Było to jednak bardzo kruche. Zwłaszcza, gdy zaczynasz myśleć o tworzeniu danych podrzędnych z kluczami obcymi, które również wymagałyby aktualizacji. Nie wspominając o radzeniu sobie z adresami URL, które zmienią się po zmianie identyfikatora. 2. Tworząc identyfikatory złożone z wartości generowanej przez klienta ORAZ wartości generowanej przez serwer, każdy użytkownik efektywnie tworzy identyfikatory w piaskownicy. Ma to na celu ograniczenie szkód, które może wyrządzić złośliwy/nieuczciwy klient. Ponadto wszelkie kolizje identyfikatorów dotyczą każdego użytkownika, a nie globalnego dla całego systemu. 3. Ponieważ token id użytkownika jest powiązany z ich kontem, identyfikatory mogą być generowane w piaskownicy użytkowników tylko przez klientów, którzy są uwierzytelnieni (tj. w przypadku pomyślnego zalogowania użytkownika). Ma to na celu powstrzymanie złośliwych klientów przed tworzeniem złych identyfikatorów dla użytkownika. Oczywiście, jeśli token uwierzytelniania użytkownika zostanie skradziony przez złośliwego klienta, może on zrobić złe rzeczy. Jednak po kradzieży tokena uwierzytelniania konto i tak jest zagrożone. Gdyby tak się stało, wyrządzone szkody byłyby ograniczone do zaatakowanego konta (nie do całego systemu). ## Obawy Oto niektóre z moich obaw związanych z tym podejściem 1. Czy wygeneruje to wystarczająco unikalne identyfikatory dla aplikacji na dużą skalę? Czy jest jakiś powód, by sądzić, że spowoduje to kolizje id? Czy javascript może wygenerować wystarczająco losowy identyfikator uuid, aby to zadziałało? Wygląda na to, że window.crypto jest dość powszechnie dostępny, a ten projekt wymaga już dość nowoczesnych przeglądarek. (to pytanie ma teraz osobne pytanie SO) 2. Czy są jakieś luki, których mi brakuje, które mogą pozwolić złośliwemu użytkownikowi na złamanie zabezpieczeń systemu? 3. Czy jest powód, aby martwić się o wydajność bazy danych podczas zapytania o klucz złożony składający się z 2 identyfikatorów UUID. Jak powinien być przechowywany ten identyfikator, aby uzyskać najlepszą wydajność? Dwa oddzielne pola czy jedno pole obiektu? Czy byłoby inne „najlepsze” podejście do gry Mongo vs Couch? Wiem, że posiadanie niesekwencyjnego klucza podstawowego może powodować znaczne problemy z wydajnością podczas wstawiania. Czy mądrzej byłoby mieć automatycznie generowaną wartość klucza podstawowego i przechowywać ten identyfikator jako osobne pole? (to pytanie ma teraz osobne pytanie SO) 4. Dzięki tej strategii łatwo byłoby ustalić, że określony zestaw rekordów został utworzony przez tego samego użytkownika (ponieważ wszyscy będą współdzielić ten sam publicznie widoczny token id ). Chociaż nie widzę z tym żadnych bezpośrednich problemów, zawsze lepiej nie ujawniać więcej informacji o wewnętrznych szczegółach, niż jest to potrzebne. Inną możliwością byłoby zahaszowanie klucza złożonego, ale wydaje się, że może to być więcej kłopotów niż jest to warte. 5. W przypadku kolizji id dla użytkownika nie ma prostego sposobu na odzyskanie. Przypuszczam, że klient mógłby wygenerować nowy identyfikator, ale wydaje się, że jest to dużo pracy w przypadku skrajnego przypadku, który tak naprawdę nigdy nie powinien się zdarzyć. Zamierzam pozostawić to bez zaadresowania. 6. Tylko uwierzytelnieni użytkownicy mogą przeglądać i/lub edytować dane. To jest dopuszczalne ograniczenie dla mojego systemu. ## Wniosek Czy powyżej rozsądnego planu? Zdaję sobie sprawę, że część z tego sprowadza się do wezwania do osądu opartego na pełniejszym zrozumieniu danej aplikacji.


title: Wydajność aplikacji internetowych po stronie serwera a po stronie klienta

text: Jestem programistą na poziomie podstawowym z zaledwie kilkumiesięcznym doświadczeniem. Wczoraj rozmawiałem z kolegą, jak możemy poprawić wydajność projektu, nad którym wspólnie pracujemy. Projekt jest zbudowany w C# + Ext.NET + JS Plan zakładał przeniesienie jak największej ilości rzeczy do JavaScript po stronie klienta zamiast ciągłej interakcji z serwerem. Pomyślałem, że to dobry pomysł, ale nie mogłem powstrzymać się od zastanawiania się, czy jest moment, w którym przeniesienie wszystkiego po stronie klienta zaczyna spowalniać aplikację internetową. Rozumiem, że interakcja z serwerem i ciągłe przeładowanie niepotrzebnych danych to w większości przypadków strata czasu, ale widziałem też strony załadowane tak dużą ilością JS, że przeglądarka faktycznie laguje, a przeglądanie aplikacji webowej jest po prostu uciążliwe . Czy istnieje złoty punkt? Czy istnieją pewne „zasady”? Jak osiągasz maksymalną wydajność? Weźmy na przykład aplikacje Google Cloud, takie jak Dokumenty, są one dość szybkie w tym, co robią i są aplikacjami internetowymi. To bardzo dobry występ.


title: W którym momencie należy rozważyć użycie baz danych sql?

text: Ponieważ rozmiar moich danych i struktury, których używam do ich przechowywania, stają się większe i bardziej złożone, zaczynam się zastanawiać, czy powinienem nauczyć się korzystać z baz danych sql. Dawniej zamiast unikalnych tabel zrobiłbym coś takiego: 'class Dog String name Toy[] toys long numberOfHairs short numberOfFlees itd. Wtedy mógłbym mieć posortowaną tablicę na podstawie numberOfFlees, hash imion, zestaw zabawek itp. według moich potrzeb. To działało dobrze w przypadku mniejszych projektów, ale w którym momencie powinienem rozważyć SQL. Co stracę i zyskam?


title: Pytania dotyczące kodowania arytmetycznego

text: Czytałem o kodowaniu arytmetycznym i chociaż rozumiem, jak to działa, wszystkie przewodniki i instrukcje, które przeczytałem, zaczynają się od czegoś takiego: > Ustaw interwały w oparciu o częstotliwość symboli w danych; > tj. bardziej prawdopodobne symbole mają proporcjonalnie większe odstępy. Moje główne zapytanie jest takie, że po zakodowaniu danych prawdopodobnie muszę również dołączyć ten model statystyczny do kodowania, w przeciwnym razie skompresowane dane nie mogą zostać zdekodowane. Czy to jest poprawne? Nigdzie o tym nie widzę - najczęściej widziałem, że musisz uwzględnić liczbę iteracji (tj. zakodowanych symboli) - ale o ile czegoś nie brakuje, wydaje mi się to również konieczne. Jeśli to prawda, to oczywiście doda narzut do końcowego wyniku. W którym momencie to przeważa nad korzyściami z kompresji (np. powiedzmy, czy próbuję skompresować tylko kilka tysięcy bitów)? Czy wybór rozmiaru symbolu również będzie miał znaczenie (np. jeśli patrzę na 2-bitowe słowa, a nie na pełne oktety/cokolwiek)?


title: Zbuduj warunki filtrowania dla podmiotów po stronie klienta

text: Mam wymóg, aby użytkownicy mogli określić warunki filtrowania dla jednego rodzaju jednostki za pośrednictwem GUI na cienkim kliencie. Warunki te muszą być * wygodne do wygenerowania, co oznacza, że GUI powinien prowadzić użytkowników tak bardzo, jak to możliwe. Nie powinni pisać SQL ani nic takiego. * przechowywane z sygnaturą czasową, identyfikatorem użytkownika, opisem i czymkolwiek... * załadowane i edytowane * wielokrotnego użytku przez innych użytkowników * używane do ładowania pasujących jednostek z bazy danych za pośrednictwem struktury ORM. Idealnie mógłbym z nich wygenerować predykat - SQL lub może Expression, który ORM może przetłumaczyć na SQL. W moim przypadku użytkownicy określają dla klientów warunek, dla kogo mają być generowane faktury. Będzie wiele różnych takich „wyborów klientów”. Myślę, że wzorzec specyfikacji może być dobrym dopasowaniem, ale nie mogłem znaleźć żadnych przykładów, w których specyfikacje są budowane za pomocą GUI, serializowane i przechowywane/przeładowywane/edytowane przez serwer aplikacji i używane do pobierania pasujących jednostek. Czy może przeoczam standardowy sposób robienia czegoś takiego? Koledzy zasugerowali, aby po prostu zbudować predykat SQL WHERE po stronie klienta, ale mi się to nie podoba. Klient nie powinien wiedzieć zbyt wiele o trwałości (nazwy kolumn...) i powinien mieć możliwość używania tylko niektórych predykatów, ale nie innych. Musiałbym również przetworzyć te ciągi na oddzielne predykaty, gdy przeładuję warunek, aby wyświetlić je w sposób przyjazny dla użytkownika.


title: Czy funkcja pomocnicza w klasie powinna być zdefiniowana przed użyciem czy po?

text: Muszę zrobić przegląd kodu kolegów. Jeden z członków zawsze definiował funkcje pomocnicze na dole i używał ich na górze np. class Sample { public function SendFile(){ file = $this-convertFile($file); } public function convertFile(){ //bla bla } } Czasami nie wiem, czy ma on własną definicję, ta funkcja jest dziedziczona z klasy bazowej lub jakiejś wbudowanej funkcji php. kiedy dochodzę do dna, stwierdzam, że było to zdefiniowane na zamówienie


title: Zrozumienie kultury indyjskiej

text: Byłem odpowiedzialny za zarządzanie i kierowanie zespołem programistów z Indii. Mam wrażenie, że są pewne problemy kulturowe do przezwyciężenia, poza oczywistymi kwestiami drugiego języka angielskiego. Na przykład z moich wcześniejszych doświadczeń w pracy z Indianami wyczuwam pewną niechęć do zadawania pytań lub rad, nawet jeśli wymagania nie są jasne. Nieraz widziałem indyjskich programistów mówiących, że rozumieją wymagania, podczas gdy tak naprawdę ich nie rozumieją, a następnie po prostu przyjmują własne jednostronne założenia dotyczące tego, jak powinno być, i kierują się naprzód na tej podstawie bez konsultacji z nikim innym, abyśmy tylko zdali sobie sprawę tydzień lub dwa później rozwijali coś zupełnie innego niż to, czego chcieliśmy. Czy to ogólna sprawa kulturowa, czy po prostu widziałem złą próbkę? Zarządzałeś lub pracowałeś z indyjskimi zespołami? Jakie inne rady możesz zaoferować, jak najlepiej nimi zarządzać i w inny sposób się do nich odnosić?


title: Architektura MVC JSon Request

text: W całej aplikacji buduję całą masę wywołań JSON, które są w zasadzie akcjami rozłożonymi na różne kontrolery. Rozważam utworzenie kontrolera JSON, aby zachować wszystkie akcje JSON w jednym kontrolerze, więc zamiast; Products/GetListJSON Nazwałbym JSON/Products Czy może to mieć konsekwencje, których nie brałem pod uwagę? Czy ktoś może wymyślić przekonujące powody, aby tego nie robić?


title: Stwórz własny system baz danych

text: Muszę nauczyć się, jak działają bazy danych, aby efektywniej z nich korzystać, a moim sposobem uczenia się jest działanie. Chcę stworzyć własny system baz danych. Nie mam na myśli tworzenia pseudobazy danych, która używałaby zapytania do analizowania plików; byłby to po prostu interfejs systemu plików z językiem zapytań. Mówię o rzeczywistej strukturze silnika bazy danych. A ponieważ to, co mam na myśli, nie jest ani relacyjne, ani zorientowane na dokument (jest „zorientowane na węzły”, jeśli w ogóle istnieje), potrzebowałbym, aby jakikolwiek zasób był jak najbardziej abstrakcyjny i na wysokim poziomie. Więc jak mam to zrobić? Jakie zasoby/poradniki/książki mogę przeczytać, aby zrozumieć? Język nie ma najmniejszego znaczenia. Idealnie, kod byłby pseudo-kodem ilustrującym koncepcję, nie związanym z konkretnym językiem, ale wszystko by wystarczyło. Nie udało mi się znaleźć niczego w tej sprawie w google (skoro jestem tak niepiśmienny na ten temat, może po prostu nie wpisuję właściwego wyszukiwania). Jeśli takie zasoby nie są dostępne, to myślę, że coś o tym, jak stworzyć klienta, byłoby przynajmniej krokiem we właściwym kierunku.


title: Czy mogę używać wtyczki JQuery na licencji CC BY-SA 3.0 w komercyjnej aplikacji internetowej?

text: jeśli wtyczka JQuery jest wydana na licencji CC BY-SA 3.0, czy może być używana jako część komercyjnej aplikacji internetowej o zamkniętym kodzie źródłowym, która nie jest redystrybuowana, tylko dostępna w sieci?


title: Jak proaktywnie chronić się przed błędami przeoczenia?

text: Poprzem to, że nie wiem, czy ktoś inny, kto programuje tak długo, jak ja, ma ten problem, ale przynajmniej odpowiedź może pomóc komuś, kto ma mniej PD. Właśnie wpatrywałem się w ten kod przez 5 minut, myśląc, że tracę rozum, że nie działa: var usedNames = new HashSet<string>(); Func<string, string> l = (s) => { for (int i = 0; ; i++) { var next = (s + i).TrimEnd('0'); if (!usedNames.Contains(next)) { return next; } } }; W końcu zauważyłem, że zapomniałem dodać używaną nazwę do zestawu skrótów. Podobnie spędziłem minuty na minuty nad pominięciem context.SaveChanges(). Myślę, że tak bardzo rozpraszają mnie szczegóły, że myślę o tym, że niektóre naprawdę drobne szczegóły stają się dla mnie niewidoczne - to prawie na poziomie blokady mentalnej. Czy istnieją taktyki, aby temu zapobiec? aktualizacja: efektem ubocznym pytania było naprawienie błędu, który miałby dla i > 9 (Dzięki!) var usedNames = new HashSet<string>(); Func<string, string> name = (s) => { string wynik = s; if(usedNames.Contains(s)) for (int i = 1; ; wynik = s + i++) if (!usedNames.Contains(result)) break; używaneNazwy.Dodaj(wynik); zwróć wynik; };


title: Wysyłanie e-maila z załącznikiem ze strony serwera

text: Muszę stworzyć dokument Word w określonym formacie i wysłać go jako załącznik na niektóre adresy e-mail. Mam ekran podglądu raportu, który po zatwierdzeniu musi zostać wysłany e-mailem. To jest aplikacja ASP.NET MVC 3. Pozostało mi kilka opcji. 1. Podgląd tworzę za pomocą html. Mogę przekonwertować ten html na dokument i wysłać go, co byłoby prostym rozwiązaniem. Ale przechwytywanie danych wyjściowych obiektu Response jest trudnym zadaniem. 2. Pomyślałem o użyciu funkcji korespondencji seryjnej MS Word, gdzie będę wypełniał symbole zastępcze szablonu dokumentu. Ale problem jest koncepcyjny, nie wydaje się, że jest to korespondencja seryjna. 3. Znalazłem kogoś, kto sugeruje użycie formatu RTF i zastąpienie symboli zastępczych wartościami z bazy danych. Co należy zrobić? Jakie jest tutaj najlepsze rozwiązanie? Czy jest jakaś inna opcja niż trzy wymienione powyżej?


title: Mam dyplom MIS. Jak sprzedać się jako programista?

text: Tak więc prawie 2 lata temu ukończyłem z wyróżnieniem BSBA w Management Information Systems z wyróżnieniem, co jest bardziej stopniem biznesowym. W tej chwili mam tytuł "Programista", ale jest to bardziej stanowisko pisania raportów w dowolnym, zastrzeżonym języku o nazwie PowerOn, z okazjonalnymi interesującymi projektami wykorzystującymi bardziej popularne technologie, takie jak .Net i Java. Jestem też nieco osamotniony jako jedyny programista w miejscu pracy, co moim zdaniem szkodzi mojej ścieżce kariery. Jedyne osoby, przeciwko którym muszę odrzucać pomysły, to osoby z różnych witryn SE. Nie żałuję, że chodzę na MIS, ale w ciągu ostatnich kilku lat odkryłem swoją pasję do kodowania, mimo że od lat zajmuję się jakąś formą kodowania zawodowo i jako entuzjasta. Chcę namawiać moich magistrów w CS (w późniejszym czasie), ale nie jestem pewien, czy koniecznie _potrzebuję_ dyplomu CS, aby dostać się do zespołu programistów. Ponadto po drodze mam kilka klas, które wybrałem dla różnych laguage (C++, Java, SQL i VB.Net) Wierzę, że moja siła polega na rozwiązywaniu problemów, gdzie kod jest tylko narzędziem do rozwiązywania problemów w razie potrzeby . Moje pytanie: **Jak najlepiej sprzedać się jako programista? Czy powinienem dalej walić raporty i czekać, aż moje mastery będą w CS? Czy mogę być programistą tak, jak stoję?**


title: Dlaczego nie zastosować zasady segregacji interfejsów do „ekstremalnych”

text: Zakładając, że klienci zazwyczaj korzystają tylko z jednej metody, chociaż metody byłyby powiązane koncepcyjnie, dlaczego nie zawsze stosować zasadę segregacji interfejsów do skrajności i mieć [wiele] interfejsów jednometodowych? Czy istnieje obiektywna reguła przeciwko temu? Nie coś w stylu „och, to źle się czuje” lub „ale będziesz miał tak wiele typów, trudno to odczytać i zarządzać”, ale raczej coś logicznego i jasnego. (Nadal chcesz wyraźnie nazwać kontrakty, więc funkcje nie pasują?). Przykład: IGeometryManager { Shape CreateTriangle(); Kształt UtwórzOkrąg(); Kształt UtwórzKwadrat(); Kształt UtwórzElipsę(); Kształt UtwórzKrzywą(); Kształt UtwórzLinię(); nieważne UsuńWszystko(); } Wynik: ITriangleCreator { Shape CreateTriangle(); } ICircleCreator { Kształt UtwórzOkrąg(); } ISquareCreator { Kształt UtwórzKwadrat(); } IELlipseCreator { Kształt CreateEllipse(); } ICurveCreator { Kształt UtwórzKurwę(); } ILineCreator { Kształt CreateLine(); } IShapeRemover { void RemoveAll(); } To jest trafny wpis na blogu, ale logika autorów nie przekonuje mnie w 100%: http://blog.ploeh.dk/2014/03/10/solid-the-next-step-is-functional


title: Gdzie korzystasz z kanałów Java?

text: Użyłem tylko kanałów Java i BufferedOutputStream oraz części licznika wejściowego do odczytywania i zapisywania prostych liczb całkowitych oraz kilku ciągów tu i tam do pliku. Jednak nie rozumiem użycia wszystkich tych klas, gdy istnieje klasa `java.util.Scanner`, która zapewnia łatwe sposoby odczytu i zapisu do plików. Weterani języka Java, proszę, powiedzcie mi, jak korzystać z kanałów i strumieni w skanerze.


title: Jaki jest postęp w sprawie płyt Haskella?

text: Ostatnio ponownie natknąłem się na kwestie związane z rekordami Haskella, w szczególności unikalność nazw pól (to utrapienie...) Czytałem już Propozycję rekordów w Haskell od SPJ i Grega Morrisetta, ale ostatnia aktualizacja miała miejsce w 2003 roku. Kolejny artykuł Lightweight Extensible Records dla Haskella od SPJ i Marka Jonesa jest jeszcze starsze: pochodzi z warsztatu Haskella w 1999 roku. **Teraz zastanawiam się, czy proces wydawania nowych płyt Haskella posunął się naprzód. Czy ktoś coś o tym wie lub może wskazać mi dalszą lekturę ?**


title: Co jest lepsze: a <= b czy a < b+1

text: Pętle For są zazwyczaj inclusice, ekskluzywne, co oznacza, że zaczynasz od dołu i zatrzymujesz się, gdy dotrzesz, ale nie do góry. W Pythonie: for i in range(0,a): print(i) wypisze od 0 do a-1. To samo dotyczy Javy: for(int i = 0; i < a; i++){ System.out.println(i); } wypisałby również od 0 do a-1, chociaż składnia jest nieco jaśniejsza. Co z tego, że chcesz wydrukować każdy numer do a włącznie? Czy napisałbyś for(int i = 0; i <= a; i++){ System.out.println(i); } lub for(int i = 0; i < a + 1; i++){ System.out.println(i); } Myślę, że pierwszy ma największy sens, wykonujesz pętlę, gdy i jest mniejsze lub równe a, ale znak mniej niż można łatwo przeoczyć. Moim zdaniem „a + 1” nie jest tak łatwe do przeoczenia. Więc moje pytanie brzmi: czy istnieje lepsza alternatywa z tych dwóch i czy istnieje konwencja na to? EDIT: Chcę tylko zaznaczyć, że mówię tutaj o liczbach całkowitych.


title: Sesja interaktywna z programem wiersza poleceń przy użyciu języka Java?

text: Planuję napisać frontend strony internetowej dla darmowego systemu algebry komputerowej (Reduce, http://reduce-algebra.com/). Na serwerze WWW mam uruchomioną wirtualną maszynę Java i zainstalowany jest również Reduce. Mogę uruchomić aplikację poprzez exec() w pliku Java. Ale moje pytanie jest następujące: jak mogę emulować dane wejściowe użytkownika i jak mogę pobrać dane wyjściowe programu? Głównym problemem jest to, że chcę rejestrować całą sesję, a nie tylko raz wywołać program, uzyskać dane wyjściowe, zamknąć go i ponownie uruchomić. Potrzebuję sposobu, który pozwoli na interaktywną komunikację, tj. sposobu „wklejenia” polecenia w wierszu poleceń i sposobu „skopiowania” odpowiedzi z powrotem do programu Java.


title: Kodowanie w 'core php' i oddzielanie logiki od prezentacji

text: Jakie są różne sposoby osiągnięcia tego? Czy ktoś może mnie poprowadzić? Muszę zakodować stronę internetową dla znajomego (projektanta). Przyjaciel chce, abym używał rdzenia php, a nie jakiegokolwiek frameworka, takiego jak codeigniter (coś, co naprawdę lubię i z czym czuję się komfortowo!) . Spojrzałem na kilka przewodników po własnych frameworkach MVC, ale nie jestem pewien, czy jest to idealne podejście. Ponieważ każde rozwiązanie, które wymyślę, może zawierać różne błędy/problemy z bezpieczeństwem. Moim celem jest użycie zwykłego php , bez pomocy zewnętrznych frameworków , do zakodowania witryny , gdzie logika jest oddzielona od widoku . Dziękuję


title: Kiedy mogę być pewien, że skierowany wykres jest acykliczny?

text: Definicja skierowanego grafu acyklicznego jest następująca: „nie ma sposobu, aby zacząć od jakiegoś wierzchołka v i podążać za sekwencją krawędzi, która ostatecznie zapętla się z powrotem do v”. Jak dotąd tak dobrze, ale staram się znaleźć przesłanki, które będą prostsze do przetestowania i które zagwarantują również acykliczność wykresu. Wymyśliłem te założenia, ale są one dość podstawowe, więc jestem pewien, że inni ludzie zrozumieli to w przeszłości (lub są niepoprawne). Problem w tym, że nie mogłem znaleźć niczego związanego z książkami/online, dlatego zdecydowałem się opublikować to pytanie. **Przesłanka 1** : Jeśli wszystkie wierzchołki wykresu mają przychodzącą krawędź, wykres nie może być acykliczny. Czy to jest poprawne? **Przesłanka 2** : Załóżmy, że dany wykres ma jeden wierzchołek bez krawędzi. W tym przypadku, aby mieć cykl, co najmniej jeden z pozostałych wierzchołków musiałby mieć co najmniej dwa przychodzące krawędzie. Czy to jest poprawne?


title: Czy powinienem / mogę łączyć node.js i mongod z moją aplikacją?

text: Pracuję nad aplikacją sieci web, która działa na node.js i używa MongoDB. Należy wspomnieć, że planuję wydać aplikację jako oprogramowanie komercyjne. Sposób, w jaki napisałem instalator, prosi użytkownika o potwierdzenie lokalizacji plików binarnych węzła i mongod (po uprzednim automatycznym wykryciu). Pomyślałem, że mogę całkowicie pominąć ten krok, dołączając pliki binarne razem z moją aplikacją lub zmuszając instalatora do ich pobrania, ale muszę rozwiązać kilka problemów: 1. Przede wszystkim kwestia licencji. Przyjaźni ludzie z 10gen (firma, która rozwija MongoDB) odpowiedzieli na e-mail, który im wysłałem, i powiedzieli mi, że ich licencja na to pozwala, i z tego, co mogę zrozumieć, tak samo jest w przypadku node.js. Czy są jakieś problemy, na które powinienem zwracać uwagę? 2. Czy warto (z punktu widzenia użytkownika) pobierać ~20MB dodatkowych danych podczas instalacji tylko po to, by nie trzeba było ręcznie instalować node.js i mongod (plik binarny serwera MongoDB)? 3. Czy powinienem spodziewać się problemów, jeśli spakuję 32-bitowe pliki binarne, a użytkownik zainstaluje aplikację na 64-bitowej maszynie?


title: Jakie są najbardziej przesycone kategorie/rynki aplikacji na iPhone'a?

text: Rozważam naukę programowania iPhone'a i Celu C, ale nie chcę unikać tworzenia czegoś dla najbardziej nasyconych rynków i kategorii aplikacji. Jakich kategorii powinienem unikać? Czy jest zbyt wiele aplikacji randkowych, czy powinienem po prostu wymyślić kreatywną grę lub dwie?


title: Jak ci programiści hotshot zmieniają swoją bazę technologiczną?

text: Wczoraj oglądałem wideo lynda.com dotyczące rozwoju iPhone'a i ten programista zaczął opowiadać o tym, jak pracował nad 17 różnymi językami, od czasów mainframe'ów w montażu/Cobol do teraz na iPhone Objective-C. Moje pytanie brzmi, w jaki sposób ci programiści przestawiają się na nową technologię, nie obawiając się utraty doświadczenia, jakie już mają na temat konkretnej technologii. Próbuję przejść z PHP na Javę i rynek uważa to za nieistotne doświadczenie. Jak ci faceci to robią, nie tracąc pensji i nie uważając się za nowicjusza w danej technologii.


title: Jak sobie radzisz, gdy błąd wystąpi na 1 instancji Twojej witryny/programu/aplikacji?

text: Miałem kilka razy w czasie pracy, chwile, kiedy otrzymuję błąd występujący tylko na 1 komputerze i często zajmuje mi to godzinami lub dniami, ponieważ jest to (lub przynajmniej wydaje się) odosobniony incydent ponieważ nie jest prezentowany w żadnym innym przypadku tego, co sprawdzam. Jak sobie z tym radzicie? Często musiałem po prostu zmienić komputer jako taki (jak formatowanie itp.), ponieważ po prostu nie mogę odtworzyć problemu.


title: Obsługa wielu frameworków w bibliotece JavaScript

text: Mam małą bibliotekę JavaScript, którą napisałem, która zależy od prototype.js. Rozważam utworzenie nowej wersji, która zamiast tego używałaby jQuery. Celem jest ułatwienie użytkownikom instalacji ( _wybierz jakiego frameworka używasz!_ ), a jednocześnie nie utrudniaj mi utrzymania. Głównym problemem, który widzę, jest to, że musiałbym obsługiwać dwie oddzielne wersje z nakładającą się funkcjonalnością. Jeśli jest błąd, musiałbym go naprawić w dwóch osobnych miejscach. Jak mogę obsługiwać wiele różnych frameworków w bibliotece JavaScript bez koszmaru konserwacji?


title: Czy powinienem zawsze używać „is” jako prefiksu dla zmiennych binarnych?

text: Czy powinienem zawsze używać `is` jako prefiksu dla zmiennych binarnych? A co z wartościami boolowskimi, które wskazują coś w przeszłości? Czy powinienem napisać „isInitialized” czy „wasInitialized”? Czy powinienem pisać dla właściwości `IsManyMembers` czy `HasManyMembers`? Czy są jakieś najlepsze praktyki? Czy powinienem po prostu pisać zgodnie z angielskimi zasadami?


title: Obiekty OOP, obiekty zagnieżdżone i DAO

text: Oto coś, na co staram się znaleźć najlepsze rozwiązanie. Miałem ten problem podczas pracy z PHP i Javą, więc jest to fundamentalne zrozumienie problemu OOP. Przykłady są w PHP. Powiedzmy, że mam tu kilka przedmiotów. Piosenka, Artysta, ArtistProfile, Użytkownik. W niektórych przypadkach chcę mieć profil artysty i tablicę obiektów użytkownika (subskrybentów), gdy dzwonię do artysty (np. strona profilu artysty), w innych przypadkach chcę tylko informacji o wykonawcy, na przykład podczas przeglądania strony utworu. Czy powinienem zagnieżdżać jeden obiekt jako część innego, czy powinienem tworzyć bardziej szczegółowe obiekty do różnych zastosowań. Opcja 1: Utwór klasy zagnieżdżonej { private $songId; prywatna $songName; prywatny $rok; prywatny $Artysta; //obiekt artysty } Class Artist { private $artistId; prywatne $nazwa; prywatny $wiek; prywatny $subscriberArr; //Tablica obiektów użytkownika, które następnie mają więcej zagnieżdżonych obiektów, takich jak obiekt roli, obiekt profilu prywatny $profile; //Obiekt profilu, który może również zawierać więcej obiektów zagnieżdżonych } Class User { private $userId; prywatne $nazwa; prywatny $wiek; prywatna $rola; //Rola obiekt prywatny $profile; //UserProfile obiekt } Opcja 2: Zbuduj więcej obiektów Class Song { private $songId; prywatna $songName; prywatny $rok; prywatny $artistId; } Class Artist { private $artistId; prywatny $wiek; prywatne $nazwa; } Klasa Użytkownik { private $userId; prywatne $nazwa; prywatny $wiek; prywatne $roleId; } Klasa SongWithArtist { private $song; //Utwór podstawowy obiekt prywatny $artist; //Podstawowy obiekt artysty } Class ArtistWithProfile { private $artist; //Podstawowy obiekt artysty prywatny $profile; //Prywatny obiekt profilu $subscriberArr; //Obiekt UserDisplay zawierający podstawowy obiekt User } Klasa UserWithProfile {} Opcja 1 oznacza marnowanie dużej ilości czasu/zasobów na zdobywanie informacji, których mogę nie potrzebować dla tej strony, ale łatwiej zarządzać. Opcja 2 jest nieuporządkowana i wymaga śledzenia, który obiekt jest czym, ale szybszych i znacznie mniej wywołań bazy danych. Która opcja jest „właściwa” i/lub czy istnieje trzecia właściwa opcja?


title: Program możliwości dla ilości sztuk

text: Chciałbym zebrać program do obliczania potrzebnych 60-centymetrowych elementów z listy krótszych elementów. Na przykład sprzedaję pręty zbrojeniowe cięte na długość z naszej standardowej długości 60'-0". Teraz długość wymagana przez klienta jest następująca: 343 szt. @ 12,5' 35 szt. @ 13' 10 szt. @ 15' 63 szt. @ 15,5' ....... Istnieje 56 całkowitych długości w zakresie od 12,5' do 30,58' Chodzi o to, aby ograniczyć ilość odpadów z kawałka 60'. Dane wejściowe od użytkownika będą następujące: * liczba różnych długości * Długość kawałek do wycięcia * liczba różnych długości Wynikiem będzie liczba pierwszych sztuk potrzebnych do realizacji zamówienia Jakie znane algorytmy mogą mi pomóc rozwiązać ten problem?


title: Czy ChromiumOS można napisać od podstaw w Go?

text: Ponieważ Go wydaje się być w stanie dorównać wydajnością C, a Google wyraźnie skłania się ku Go, uważam, że byłby to świetny sposób, aby Go zyskał większą przyczepność. Sposób, w jaki ChromiumOS/Chrome przeskoczył z bazy Ubuntu do bazy Gentoo, podczas gdy mają zdolność unikania obu i tworzenia dokładnie tego, czego potrzebują od zera, prowadzi mnie do przekonania, że może być coś w pracy. Czas byłby oczywiście czynnikiem, podobnie jak brak istniejących bibliotek w porównaniu z C i Linuxem, ale wykonywane równolegle, podczas gdy obecne maszyny oparte na Linuksie zyskują na popularności, złagodziłoby dla nich wszelkie problemy rynkowe. Jestem amatorem, jeśli chodzi o programowanie niskopoziomowe, czy są jakieś techniczne ograniczenia w języku, aby temu zapobiec?


title: Jak współbieżny garbage collector radzi sobie ze zmiennymi?

text: Załóżmy, że jest to jednoczesny zbieracz śmieci. Kiedy taki GC obsługuje stałe wskaźniki, po prostu przechodzi przez nie (zaczynając od korzeni) i zaznacza każdy napotkany blok danych. Następnie zamiata wszystko nieoznaczone. Kod klienta powinien oznaczyć bloki danych, których używa jako korzenie. Ale co zrobić ze zmiennymi? Oto sytuacja: 1. `V` jest zmienną, która przechowuje wskaźnik do obiektu `A`. 2. `Wątek 1` brzmi `V` i zawiesza się. 3. `Wątek 2` modyfikuje `V` i wskazuje na obiekt `B`. 4. Odśmiecacz uruchamia swoją fazę „oznaczania” i napotyka, że „A” nie jest już przywoływane, a następnie zwalnia go podczas fazy „zamiatania”. 5. „Wątek 1” budzi się i próbuje użyć „A” (odczytany już z „V” w kroku 2), oznaczając go jako root. **I kończy się niepowodzeniem** , ponieważ `A` już nie istnieje. Jak więc sobie z tym poradzić? „Wątek 2” może oznaczyć zastąpiony obiekt „A” specjalną flagą „nie usuwaj” (podobna flaga jest używana dla nowo przydzielonych obiektów). Ale kiedy ta flaga powinna zostać usunięta? Oczywiście `Wątek 1` mógłby to zrobić. Ale „Wątek 2” nic nie wie o „Wątku 1”, a zatem nie można być pewnym, że kiedykolwiek zostanie to zrobione. Może to prowadzić do tego, że „A” nigdy nie zostanie uwolniony. A jeśli GC usunie tę flagę, to nic nie stoi na przeszkodzie, aby "A" zostało usunięte, gdy GC zostanie uruchomiony po raz drugi... Opisy odśmiecacza pamięci w locie, które czytałem, tylko wspominają, że zastąpiony obiekt powinien być „szary”. Ale bez konkretów. Bardzo mile widziany byłby link do bardziej szczegółowego opisu rozwiązania.


title: Czy OAuth (2,0) to właściwy wybór, aby zapewnić bezpieczeństwo usługi sieci Web WCF?

text: Posiadam webservice WCF, który obsługuje różne aplikacje mobilne. Zostało to zaimplementowane za pomocą typowego protokołu HTTPS/SSL. Ale są pewne przypadki, takie jak Replay Attack, które należy wziąć pod uwagę w aspekcie bezpieczeństwa. OAuth 2.0 wygląda na realne rozwiązanie tego problemu (przy użyciu nonce). Widzę kilka przykładów w sieci, wykorzystujących bibliotekę DotnetOpenOAuth do implementacji serwera. Czy OAuth to właściwy wybór do użycia z usługami WCF? Czy istnieją alternatywy dla technologii .NET Framework/Microsoft w celu zaimplementowania bezpiecznego serwera WCF?