title: Jak zrefaktoryzować „klasę boga” Pythona?

text: # Problem Pracuję nad projektem Pythona, którego główną klasą jest trochę „God Object”. Jest _tak_ cholernie wiele atrybutów i metod! Chcę dokonać refaktoryzacji klasy. ## Jak dotąd… W pierwszym kroku chcę zrobić coś stosunkowo prostego; ale kiedy spróbowałem najprostszego podejścia, zepsuło to niektóre testy i istniejące przykłady. Zasadniczo klasa ma długą listę atrybutów — ale mogę je wyraźnie przejrzeć i pomyśleć: _„Te 5 atrybutów jest ze sobą powiązanych… Te 8 też jest ze sobą powiązanych… a potem jest reszta.”_ ### **getattr* * Chciałem po prostu pogrupować powiązane atrybuty w klasę pomocniczą podobną do dykt. Miałem wrażenie, że `__getattr__` byłby idealny do tej pracy. Przeniosłem więc atrybuty do osobnej klasy i rzeczywiście, `__getattr__` zadziałał doskonale… Na _first_. Ale potem spróbowałem uruchomić jeden z przykładów. Przykładowa podklasa próbuje ustawić jeden z tych atrybutów bezpośrednio (na _poziomie_klasy_). Ale ponieważ atrybut nie był już „fizycznie zlokalizowany” w klasie nadrzędnej, pojawił się błąd mówiący, że atrybut nie istnieje. ### @property Następnie przeczytałem o dekoratorze `@property`. Ale potem przeczytałem również, że stwarza to problemy dla podklas, które chcą zrobić `self.x = blah`, gdy `x` jest właściwością klasy nadrzędnej. # Pożądane * Niech cały kod klienta nadal działa przy użyciu `self.whatever`, nawet jeśli właściwość `Whatever` rodzica nie jest „fizycznie zlokalizowana” w samej klasie (lub instancji). * Grupuj powiązane atrybuty w kontenery podobne do dykt. * Zmniejsz ekstremalny hałas kodu w klasie głównej. Na przykład **nie** po prostu chcę to zmienić: larry = 2 curly = 'abcd' moe = self.doh() Na to: larry = coś_else('larry') curly = coś_else('curly' ) moe = yet_inother_thing.moe() …ponieważ wciąż jest głośno. Chociaż z powodzeniem przekształca to po prostu atrybut w coś, co może zarządzać danymi, oryginał miał 3 zmienne, a ulepszona wersja nadal ma 3 zmienne. Jednak byłbym w porządku z czymś takim: stooges = Stooges() A jeśli wyszukiwanie `self.larry` nie powiedzie się, coś sprawdzi `stooges` i sprawdzi, czy `larry` tam jest. (Ale musi to również działać, jeśli podklasa próbuje wykonać `larry = 'blah'` na poziomie klasy.) # Podsumowanie * Chcesz zastąpić powiązane grupy atrybutów w klasie nadrzędnej pojedynczym atrybutem, który przechowuje wszystkie dane w innym miejscu * Chcesz pracować z istniejącym kodem klienta, który używa (np.) `larry = 'blah'` na poziomie klasy * Chcesz nadal zezwalać podklasom na rozszerzanie, zastępowanie i modyfikowanie tych zrefaktoryzowanych atrybutów, nie wiedząc, że coś się zmieniło Czy to możliwe? A może szczekam na niewłaściwe drzewo?


title: Dlaczego C dominuje na rynku oprogramowania wbudowanego?

text: Prawie każdy powie teraz błogosławieństwo: **występ**! OK, **C** pozwala na pisanie kodu sportowego. Ale w końcu są inne języki, które to potrafią! A optymalizacyjna moc nowoczesnych kompilatorów jest niesamowita. Czy język **C** ma zalety, których nie ma żaden inny język? A może po prostu nie ma potrzeby stosowania bardziej elastycznych instrumentów w tej domenie?


title: Czy ta „bezprzewodowa” składnia dla mojego frameworka zapewni dobrą strukturę/projekt kodu?

text: Jestem w punkcie, w którym zabieram się do samodzielnego tworzenia złożonych aplikacji internetowych i chciałbym opracować lekki framework do użytku osobistego, ale najpierw chciałbym uzyskać porady od bardziej doświadczonych programistów o jednym aspekcie mojego dużego projektu dla frameworka. Jest w dużym stopniu oparty na prototypie / OOP. Framework jest skonfigurowany tak, aby wiedzieć, jak obsłużyć każdy prototyp i wiedzieć, że pewne obiekty, na przykład konstrukcja `socketIO`, mogą wykorzystywać inne specyficzne obiekty, na przykład `IP` `serwera`, a także ` socketPort` tego `serwera`. Ułatwia tę praktykę również dzięki własnej funkcjonalności programisty, pomagając utrzymać cały kod oddzielony, zorientowany obiektowo i „bezprzewodowo”. Wynikiem tego jest kod, który wygląda na „bezprzewodowy” – rozumiem przez to, że zamiast przekazywać dane jako parametry funkcji, obiekty frameworka wiedzą, których obiektów szukać i z których czytać. Deweloper może przekazać obiekt jako parametr, ale jeśli tego nie zrobi, framework poszuka go i znajdzie, jeśli istnieje w odpowiednim zakresie. **Czy to, co opisałem, to dobra praktyka programistyczna/projektowanie?** Podoba mi się struktura kodu, która pomaga mi szybciej osiągnąć, ale ważne jest dla mnie, aby nie poświęcać czasu na coś, co jest zepsute (złe Model). _Chcę wiedzieć, czy ta praktyka, w której dane nie są przekazywane/przesyłane wizualnie, jest akceptowalnym podejściem do rozwoju._ Obawiam się, że komunikacja między powiązanymi obiektami „za kulisami” może zmylić programistów, którzy nie są wtajemniczeni w projekt ramy. * * * Oto trochę "mock" kodu silnika po stronie klienta, który będzie działał po ukończeniu tego frameworka, który obecnie nazywam Air JS. Jest skomentowany, aby się wyjaśnić, ponieważ jest to mój projekt, więc możesz go przejrzeć bez zawracania sobie głowy każdym szczegółem. App.Engine = new engine({ /* Model silnika Air JS --------------------- Podczas tworzenia aplikacji internetowych silnik szybko się komplikuje, zarówno po stronie klienta i po stronie serwera.Bez frameworka promującego korzystanie z dobrych wzorców kodowania JS OOP, kod może bardzo szybko stać się poplątanym bałaganem! Wykorzystując prototypy obiektów, Air JS uzyskuje dostęp do odpowiednich obiektów i znajduje takie rzeczy, jak adresy IP, porty, rozszerzenia i inne informacje istotne dla konkretnego zadania, bez konieczności ręcznego łączenia przez programistę. Na przykład podczas tworzenia połączenia socket.IO, jeśli istnieje obiekt serwera, który jest właścicielem obiektu socketPort, Air znajdzie port! Brak dołączonych ciągów znaków. */ Serwer : nowy serwer({ /* Konstruktor serwera zezwala na wszystkie istotne informacje o serwerze zebrać w jednym miejscu. Obiekty Sky JS, takie jak: obiekt socketIO Obiekt AJAX, który wykorzystuje informacje o serwerze, dynamicznie lokalizuje i wykorzystuje informacje "bezprzewodowo", bez konieczności ich przekazywania. */ location : nowa lokalizacja({ url : nowy adres URL("www.website .com")), IP : nowy IP("1.2.3.4.5"), porty : nowy portList({ default : nowy defaultPort("8080"), socket : nowy socketPort("4545") }), ścieżki : nowy pathList({ app : "App", login : "Login", register : "Register", getData : "Get" }); }), auth : new authentication({ username : new username(App.Client.Username),password : nowe hasło(App.Client.Password) }), }), "Socket" : new socketIO({ open : new socketListener("open", function(){ // handle event }), }), /* Obiekt socketIO oczekuje na pierwszy parametr obiektu zawierającego socketListeners. Obiekt SocketIO akceptuje obiekt serwera, portList, socketPort lub ciąg portu / int jako drugi parametr: App Server App.Engine App.Engine.Server App.Engine.Server.ports App.Engine.Server.ports.socket "4545 4545 To jest przykład, jak Air.JS działa „bezprzewodowo” -- Jeśli odpowiedni obiekt istnieje w tym samym silniku, zostanie znaleziony, a programista nie przekaże obiektu ani informacji jako parametru. Nazywa się to skojarzeniem bezprzewodowym w Air JS. Powiązanie bezprzewodowe zostanie omówione w dalszej części tego programu i jest głównym zwolennikiem czystego, oddzielonego kodu promowanego przez Air JS. W tej sytuacji odpowiednim obiektem jest socketPort. Jeśli istnieje obiekt serwera, który posiada portList zawierający socketPort, przechwyci ten port. Jeśli istnieje wiele obiektów serwera, framework wybierze pierwszy, który posiada portList i/lub socketPort. Jeśli w obiekcie serwera nie zostanie znaleziony żaden obiekt socketList, struktura przeszuka główny zakres obiektu serwera. Jeśli nie zostanie znaleziony żaden obiekt socketPort w obiekcie serwera lub żaden obiekt serwera nie zostanie znaleziony w obiekcie silnika, struktura sprawdzi obiekt gniazda w głównym zakresie obiektu silnika. Ostatecznie, jeśli nie istnieje socketObject, a programista nie dostarczy portu za pomocą parametrów, zostanie zgłoszony błąd, wskazujący na brakujące dane. */ }); App.init(); Przedstawiona tutaj funkcjonalność to prototypy obiektów przypisane w ramach frameworka jako skróty. W przypadku modeli programistycznych nowych części/komponentów silnika, framework ułatwiłby użycie obiektów, które „znają” pewne prototypy. Na przykład użytkownik tworzy prototyp `Car` i wyświetla `carDoor` jako jeden z powiązanych obiektów, więc instancja `Car` będzie szukać dowolnych `carDoor`, bez wprowadzania przez programistę `carDoor` przez parametry.


title: Kod stanu „Nieprawidłowa operacja” w interfejsie API HATEOAS REST

text: W interfejsie API HATEOAS zwracane są łącza, które reprezentują możliwe zmiany stanów. Klient zgodny powinien po prostu pobierać i podążać za tymi linkami, ale jeśli klient niezgodny konstruuje identyfikatory URI zamiast podążać za dostarczonymi linkami, jaki byłby najbardziej odpowiedni kod statusu/odpowiedź do zwrócenia? * 400 by zadziałało, razem z pewnymi informacjami w treści odpowiedzi - oto co obecnie robimy * 403 chyba byłoby błędne, ponieważ sugeruje, że żądanie nigdy nie zadziała - ale potencjalnie link może być dostępny w przyszłości * 404 brzmi wiarygodnie - w tym momencie zasób nie istnieje Co ludzie myślą? Wiem, że żądania warunkowe mogą obsługiwać żądania oparte na nieaktualnych odpowiedziach (co daje np. 412s), ale to jest nieco inna sytuacja. Aktualizacja: OK, teraz widzę, że poprawną odpowiedzią dla tego typu nieprawidłowych operacji byłoby 404. Co powiesz na to, gdzie składnia żądania jest poprawna, idzie do prawidłowego zasobu, ale w jakiś sposób narusza regułę biznesową. Oto kilka wymyślonych przykładów: 1. Załóżmy, że klient może podać dwie liczby, które muszą znajdować się w zakresie 20% od siebie, ale poza tym może to być dowolna liczba. 2. Załóżmy, że klient może podać liczbę, która przechodzi przez obliczenia, których wynik wskazuje, że podana oryginalna liczba była nieprawidłowa. Czy 400 to prawidłowa odpowiedź na to?


title: Czy powinienem oddzielić web API od serwera WWW?

text: Powiedzmy, że tworzę witrynę podobną do tej lub Quora (lub dowolną witrynę podobną do bloga). Potrzebuję komponentu działającego w czasie rzeczywistym, który będzie używał gniazd sieciowych/długiego odpytywania do powiadamiania użytkownika o nowych postach, pytaniach itp. w zależności od tego, jaką stronę użytkownik przegląda. Tym komponentem czasu rzeczywistego będzie zasadniczo API witryny zaimplementowane w czymś takim jak Twisted lub Java NIO, a serwer sieciowy witryny będzie siedział przed, powiedzmy, Flask lub Pyramid. Czy interfejs API i strony internetowe powinny być obsługiwane przez ten sam komponent, czy najlepiej jest je rozdzielić? (Pytam _zarówno_ logicznie, jak i fizycznie)


title: Jaka jest wada zwracania ciągu znaków zamiast funkcji void lub zgłaszania wyjątku?

text: Powiedz, że mam metodę, która wstawia rekord do bazy danych. Nie muszę znać nowo wstawionego identyfikatora ani niczego innego. Mam dwie opcje: 1. `public void Insert()` 2. `public string Insert()` W pierwszej: jeśli wstawka się powiedzie, wywołanie kodu będzie kontynuowane. Jeśli się nie powiedzie, zostanie zwrócony wyjątek ze szczegółami, a kod wywołujący obsłuży go w catch. Po drugie: kod wywołujący będzie sprawdzał zwracany ciąg znaków o określone słowa, aby sprawdzić, czy zakończyło się powodzeniem. Która opcja jest lepsza i dlaczego?


title: Czy istnieje powód do definiowania aliasów typów w dowolnym programie?

text: Od jakiegoś czasu zacząłem się uczyć C++. To duży temat i jeszcze nie jestem do tego przyzwyczajony. Dlatego to pytanie zadaje się bardziej z ciekawości niż z czegoś innego. W książce, którą przeczytałem, aby się teraz dowiedzieć, znajduje się dyskusja na temat przenoszenia. Zgadzam się, że dyskusja jest dość poważna dla kogoś na początku okresu nauki, ale podczas czytania przyszedłem do Pomyśl o czymś. Zastanawiam się, czy istnieje powód, aby definiować niestandardowe typy, które mają być używane zamiast podstawowych typów wbudowanych? Na przykład, czy przydałoby się zdefiniowanie typu „int_c” jako „int custom”? Powodem, dla którego o tym myślę, jest to, że niektóre kody mogą być skompilowane, na przykład zarówno kompilator 32-bitowy, jak i kompilator 64-bitowy. Wydaje się, że byłoby to łatwiejsze, ponieważ jeśli zmienisz platformę i wszystkie liczby całkowite zostaną zdefiniowane jako `int_c` zamiast `int`, ponieważ to drugie wymagałoby zmiany typu w każdym miejscu, w którym używany jest int? Wiem jednak również, że `<cstdint>` zawiera definicje różnych liczb całkowitych jako `int64_t`. Jednak nie słyszałem o nagłówku z typami zmiennoprzecinkowymi. Podsumowując: czy istnieje powód do definiowania niestandardowych liczb całkowitych lub zmiennoprzecinkowych, takich jak „int_c” lub „double_c” Lub w innym przypadku, jakie jest najlepsze podejście?


title: Co powinno być w moim modelu, a co w moim kontrolerze?

text: Piszemy system o strukturze quasi-MVC (nigdy tak nie było powiedziane, ale tak właśnie jest). Buduję pełną wiedzę o systemie i kontroler będzie musiał dzwonić do mnie, aby go zaktualizować; sam system jest czymś podobnym do wykresu. Musimy mieć poczucie ścieżki między wieloma węzłami i sposób na zidentyfikowanie oryginalnego węzła. Otrzymuję połączenia między dwoma węzłami w moim oryginalnym budowaniu grafu, więc wiedza o pełnej ścieżce i węźle początkowym nie jest odczytywana bezpośrednio, ale oczywiście można ją wywnioskować po zakończeniu budowania grafu. Moim instynktem było napisanie podstawowej ścieżki śledzenia logiki w moim modelu. Przy każdej nowej krawędzi wywnioskujemy istniejącą ścieżkę i wszelkie pierwotne węzły wejściowe, śledząc odpowiednio ścieżkę do przodu i do tyłu. Śledzenie ścieżki do przodu lub do tyłu wymaga nieco więcej wiedzy o systemie połączenie między krawędziami i węzłami jest trochę bardziej skomplikowane niż tylko krawędź 1 łączy węzeł A z B. Moje pytanie brzmi, czy robienie tego nadal mieści się w sferze Model? Jeśli wykonam to wszystko śledzenie ścieżki, określanie węzłów wejściowych, identyfikowanie ścieżek itp., Czy wykonuję zbyt dużo pracy, którą naprawdę powinienem przechowywać w kontrolerze, aby później ułatwić modyfikację? Muszę mieć pewne możliwości śledzenia, aby zbudować oryginalny wykres, zanim kontroler zostanie nawet zainicjowany, ale oczywiście mógłbym mieć kontroler dostarczający metody, które wywołuję do śledzenia ścieżki i tym podobne, aby użyć implementacji kontrolera podczas budowania wykresu. Nie _myślę_, że logika samego wykresu ulegnie zmianie, tylko sposób, w jaki używamy go do wykonywania zadań, a robienie rzeczy w modelu ułatwia to, ponieważ model może bezpośrednio modyfikować swoje quasi-niezmienne obiekty, podczas gdy ja nie zezwalam na kontrolera, aby zrobić to bez wywołań modelu (zmienne zakresu pakietu).


title: Porównanie produktywności FileNet i WebSphere Process Server

text: W jednym projekcie zastanawiamy się, gdzie wdrożyć przepływy pracy. Czy ktoś ma doświadczenie zarówno z FileNet, jak i WPS (lub zna jakieś badania), które mogłyby powiedzieć coś o nakładzie pracy wymaganym do stworzenia przepływu pracy w tych 2 produktach?


title: Jak rozpocząć naukę J2EE, zwłaszcza JPA

text: Próbuję rozpocząć naukę części `J2EE` w `Java`. Ale nie wiem od czego zacząć. Jestem zaznajomiony z `Core Java` i głównie chcę poznać `JPA` oraz podstawy `Hibernate` i `Spring Framework`. Głównym tego powodem jest to, że pracuję nad projektem, który wykorzystuje te wszystkie rzeczy. A większość kodu jest opracowywana przez starszych ludzi i muszę wprowadzić w tym pewne modyfikacje. Więc w zasadzie muszę zrozumieć ich kod. Czy ktoś może mi dać jakiś plan, na przykład, jakie rzeczy muszę wiedzieć wcześniej i w jakiej kolejności powinienem iść? Jakieś materiały referencyjne, takie jak linki, książki?


title: Jakie są korzyści z poprzedzania nazw parametrów funkcji za pomocą p*?

text: Często widzę projekty (w projektach Java i zespołach korzystających z Eclipse), które poprzedzają parametry funkcji przedrostkiem `p`. Na przykład publiczny filtr pustki (Result pResult) ... Osobiście nie widzę w tym żadnej korzyści, ale chciałbym wiedzieć, jakie jest to rozumowanie. Najlepszym wyjaśnieniem, jakie do tej pory słyszałem, jest rozróżnianie nazw identycznych nazwanych pól. Mam problem z tym wyjaśnieniem, ale rozumiem o co chodzi.


title: Jak można zmierzyć stopień uporządkowania na liście?

text: Następujące pytania dały mi do myślenia: * Wydajny sposób na tasowanie obiektów * Chciałbym napisać "ostateczny algorytm losowania" do sortowania mojej kolekcji mp3 Kiedy sortujesz listę - zawsze masz linię bazową (liczby, alfabet , ...), które podpowiadają, jak uporządkować listę. **Pytanie** : Kiedy tasujesz zestaw – jak zmierzysz „stopień porządku”? Na przykład: 9 8 7 6 5 4 3 2 1 jest uporządkowane, nawet jeśli zupełnie inaczej niż 1 2 3 4 5 6 7 8 9. A 9 8 7 6 1 2 3 4 5 też ma jakiś porządek (jeśli na to spojrzysz w kawałkach: 9 8 7 6 i 1 2 3 4 5). Innym przykładem może być 9 2 3 4 5 6 7 8 1. Jak określić, czy jeden wpis jest zamówiony **_mniej_** czy **_więcej_** niż inny. **Uwaga** : ponieważ zaszło trochę zamieszania co do celu tego pytania - chciałbym sprecyzować, że _nie_ szukam metody pomiaru losowości. 1234 to po prostu losowy zestaw 4 cyfr jako 4213, ale wydaje mi się, że 1234 jest _więcej_ uporządkowane niż 4213. Komentarz użytkownika 61852 dotyczący „złożoności Kolmogorowa” lub odpowiedź Mathew Foscarini, która wspomina o mierzeniu odchylenia między sąsiednimi liczbami w sekwencja, to rodzaje odpowiedzi, których szukam. Nie jestem pewien, czy podejście do pomiaru entropii w komentarzu Michaela pomaga zidentyfikować porządek na liście - czy komentarze mogłyby zostać rozwinięte w odpowiedzi, które byłyby świetne.


title: Jak mogę utrzymać aktualizację schematu SQL, która jest regularnie wysyłana do naszych użytkowników?

text: Pracuję nad projektem, który wykorzystuje bazę danych SQL jako zaplecze i aplikację komputerową jako interfejs. Wydania wykonujemy regularnie, a w ramach wydania nasz klient musi zaktualizować swój serwer SQL. Nasza firma wymaga, abyśmy mogli aktualizować wersję 1.x do 1.y, a sposób, w jaki robiliśmy to do tej pory, to podążanie za prostym wzorcem dla dziesiątek/set tabel: * JEŚLI NIE ISTNIEJE (XXX) UTWÓRZ TABELĘ /VIEW YYY ... * ALTER TABLE (XXX) ADD COLUMN (WWW) ... * CREATE INDEX (ZZZ) w tabeli XXX (w razie potrzeby) * I tak dalej... Problem, który widzę z tym, polega na tym, że ułożone kroki powyżej są ułożone w relacji jeden do jednego z tworzona tabelą. Jest to dobre dla prostszych baz danych, które nie mają ograniczeń, ale stają się uciążliwe, gdy w grę wchodzą klucze obce/wyzwalacze/cokolwiek złożonego. Zastanawiałem się, czy istnieje wzorzec, który mógłby pomóc mi to wyczyścić i ułatwić modyfikacje mojego skryptu. Myślałem o tym, jak wykonać następujące kroki dla każdej tabeli w bazie danych: * wykonaj czyszczenie z dowolnej "starej" wersji * utwórz/zaktualizuj wszystkie tabele/kolumny (bez ograniczeń) * utwórz/zaktualizuj wszystkie widoki na podstawie tabel * utwórz / zaktualizuj wszystkie klucze obce / ograniczenia * utwórz/zaktualizuj wszystkie indeksy * utwórz/zaktualizuj wszystkie wyzwalacze * ... Używam narzędzia do scalania wszystkich plików SQL w moim repozytorium w jedno, ale rym/powód, dla którego plik jest scalany w którym momencie staje się niejasne - często po prostu poddaję się i włamuję się w coś, co mówi "dołącz plik X bezpośrednio przed/po pliku Y". Staje się nie do utrzymania (nadal mogę naprawiać problemy, ale chcę móc zrzucić tę odpowiedzialność). To jest ta ostatnia irytacja, której chcę uniknąć. Chcę móc utworzyć nową tabelę, po prostu upuszczając skrypt z zawartością „CREATE TABLE X...” w katalogu „Tables” i wywołać to gotowe. Czy istnieją jakieś wzory, które mogą mi pomóc? Naprawdę szukam jakiejś amunicji, której mógłbym użyć, gdy proponuję to moim kolegom, mówiąc „patrz – jest rozwiązanie tego klastra* i tak traktują to inne firmy”.


title: Czy powinienem pomagać i wyjaśniać?

text: Przypuszczam, że to pytanie bardziej filozoficzne, ale wydaje mi się, że całkiem dobrze pasuje tutaj. Jestem 20-letnim studentem drugiego roku inżynierii oprogramowania, z dobrą historią rozwoju, pracuję dla rozwoju oprogramowania / doradztwa, kiedy nie uczę się itp. itd. Przez cały pierwszy rok pomagałem i wyjaśniałem rzeczy dla moich rówieśników, jeśli chodzi o programowanie i ogólne tworzenie oprogramowania - struktury danych, wspólne/ważne algorytmy i tym podobne. Myślę o jednym lub dwóch plusach w tym, co robię, ale czuję, że nie powinienem był pomagać, na wypadek, gdybym zdezorientował ludzi lub przekazał złe praktyki. Wtedy mnie to denerwowało, ale nigdy nie pomyślałem, żeby zapytać. Więc: **czy powinienem pomagać?** Dzięki


title: Styl programowania w Perl

text: Pracuję w Javie, więc w zasadzie używam paradygmatu OOP podczas kodowania. Zaraz zaczynam pracę w Perlu i zastanawiałem się, jaki jest paradygmat, którym kierują się programiści Perla. Na wiki wspomina, że obsługuje wiele paradygmatów, ale nie jestem pewien, czy to rozumiem, ponieważ jest to język skryptowy. Więc moje pytanie brzmi: Czy wzorce zorientowane obiektowo, które znam w języku Java idiomatic w Perlu, czy też będę potrzebować znaczących zmian w moim stylu projektowania, aby napisać skuteczny Perl? Uwaga: To nie jest pytanie do krytyki Perla. Właściwie muszę pracować w Perlu i chciałbym zrozumieć, jak zmieni się obecny sposób programowania.


title: Jakie są powody przebudowy i ponownego wdrożenia bibliotek?

text: Trudno zrozumieć znaczenie pytania z nazwy tematu. Oto co mam na myśli. Oglądam odcinki czystego kodu wujka Boba. W wielu odcinkach, w których mówi o zasadach SOLID, wspomina o problemie przebudowy i ponownego wdrożenia spowodowanego zmianą kodu. Mówi, że zła architektura powoduje częste przebudowy i ponowne wdrożenia. Ale mam kilka pytań: 1. Dlaczego częste przebudowy i ponowne wdrożenia są złe? 2. Czy potrafisz wymienić przyczyny przebudowy i ponownego wdrożenia bibliotek dll? 3. Czy jest jakaś różnica między różnymi językami zgodnie z drugim pytaniem? 4. Co powoduje przebudowanie i ponowne wdrożenie bibliotek dll w C#? Drugie pytanie (i najczęstsze) opiera się na sprzęganiu bibliotek dll. Co powinienem zmienić w jednej z dwóch połączonych bibliotek dll, aby następnie przebudować i ponownie wdrożyć drugą?


title: Architektura mikro i monolityczna serwera

text: Obecnie pracujemy nad naszym nowym produktem/projektem, jest to aplikacja klient-serwer skierowana do konkretnych przedsiębiorstw przemysłowych/usługowych. Budujemy serwer (tylko język C i Linux) z niestandardowym protokołem opartym na TCP z interfejsem Java. Zajmujemy się kodowaniem w około 20% i stajemy w obliczu sytuacji, w której musimy wybierać między architekturą mikro lub monolityczną jądra. Zdaję sobie sprawę, że Micro vs. Monolithic jest zwykle związany z architekturą jądra, ale mówimy konkretnie o serwerach. **Dlaczego serwer niestandardowy, a nie coś istniejącego?** * Nasze potrzeby w zakresie interfejsu użytkownika są znaczne i bardzo dynamiczne, dlatego rozwiązania oparte na sieci WWW/przeglądarce internetowej nie były odpowiednie. * Przetwarzanie statystyczne jest istotne po stronie klienta i dlatego ponownie przeglądarki były mało pomocne. (Oczywiście moglibyśmy wykonać przetwarzanie po stronie serwera i przekazać przetworzone dane do klienta, ale oznaczałoby to duże obciążenie serwera i marnotrawstwo zasobów klienta). * Co więcej, dzięki co najmniej trzem technologiom (JS/HTML/CSS) do zarządzania nawet jednym wydarzeniem sprawia, że całe doświadczenie przypomina zamiatanie domu w środku pustynnej burzy - zamiatasz go n-krotnie, kurz gromadzi się n+1 razy . **A co z serwerem mikro i monolitycznym? O czym ty mówisz?** Rozważ następujące (hipotetyczne) żądanie klienta: identyfikator żądania: 123 usługa żądania: HistoricDataSets wiadomość żądania: Pobiera wszystkie rekordy do roku 2010. Po otrzymaniu takiego żądania serwer zazwyczaj (my ignorują techniki współbieżności, takie jak wątki i forki dla uproszczenia: * Przetwarzaj ciąg żądania * Identyfikuj akcję (w naszym przypadku Pobierz `HistoricDataSets LIMIT Year (2010)`) * Interakcję z warstwą trwałości (w naszym przykładzie Oracle ) i pobierz dane. * Sformatuj dane zgodnie z protokołem. Np.: id-odpowiedzi: 123 powodzenie: prawda tekst-odpowiedzi: Zestawy danych * Odpowiedz klientowi za pomocą tak sformatowanych danych. To właśnie nazywamy **Serwerem monolitycznym** (podobnym do jądra monolitycznego, w którym wszystkie działania systemu operacyjnego są wykonywane w przestrzeni jądra). Rozważ to samo żądanie ponownie, po otrzymaniu, tym razem serwer (przyjęliśmy tylko pamięć współdzieloną jako IPC, znowu dla uproszczenia): * Umieszcza żądanie w pamięci współdzielonej dla procesu `Parser` * `Parser` analizuje łańcuch , identyfikuje zadanie i kieruje proces `Wykonawca` do wykonania zadań. * Następnie `Executioner` przekazuje dane do procesu `Fomatter`, który po sformatowaniu danych do ciągu protokołu wraca na serwer. * Serwer wysyła go do klienta (odpowiedź). Oczywiście zamiast `Parsera`, `Executioner` i `Formatter` mógłby to być pojedynczy, ale oddzielny proces. To właśnie nazywamy **Mikroserwerem** (podobnym do mikrojądra, które robi zaledwie minimum, które jest wymagane). Serwer skutecznie tylko nasłuchuje i odpowiada, podczas gdy wszystkie kroki są obsługiwane przez różne procesy. * * * Który wybrać? Jesteśmy zmieszani! Chociaż serwery monolityczne są wypróbowane i przetestowane (większość serwerów HTTP-Web?) i są łatwiejsze do zaprogramowania i całkiem dobrze radzą sobie ze współbieżnością. Mikroserwery, prima facie, wydają się szybkie i zgodne z uniksową zasadą jednego programu do wykonania jednego zadania, ale są też skomplikowane w rozwoju, zwł. pamiętając o współbieżności. **Pytania** \- Jakie są (prawdopodobnie) zalety i wady każdego podejścia? \- Kiedy używać którego? (Można to również interpretować jako ogólne pytanie: Kiedy używać IPC?) \- Jeśli wybrane jest jądro mikro, to jakie funkcje muszą być częścią serwera podstawowego, a jakie nie? **Pytania podobne/pokrewne** * Niebezpieczeństwa związane z ogromną aplikacją monolityczną * Przeglądarka zewnętrzna Vs Embedded (Tangential) * Porady dotyczące konwersji aplikacji Monolithic do aplikacji wielowątkowej (Tangential) * * * **Kilka informacji, które mogą być pomocne:** * Nasz potencjał klientów można podzielić na dwie kategorie: * Duzi: około 1700 - 2000 żądań na minutę * Mali: około 650 - 700 żądań na minutę * Można założyć, że ilość danych na cykl żądania (żądanie i następująca odpowiedź) ma rozkład normalny ze średnią ~1,20 MB i co gorsza około 250-300 MB. * Koncepcja produktu jest stosunkowo nowa, ale może wpływać na podstawowe operacje, dlatego oczekujemy, że budżety klientów będą elastyczne tylko po pewnym opóźnieniu (9-12 miesięcy) po wdrożeniu, co ogranicza ilość sprzętu, jaką będzie dysponował klient chętnych do popełnienia zwł. małe. * Każdy klient będzie miał swój własny stos klient-serwer. Serwer będzie działał na sprzęcie klienta zarządzanym przez zespół klienta, podczas gdy klienci będą wdrażani na komputerach pracowników funkcjonalnych * Zdalna aktualizacja aplikacji klienckiej i serwerowej jest koniecznością * Usługi `PUSH` w czasie rzeczywistym przez serwer mogą być „bardzo” pożądanym, jeśli produkt kliknie!


title: Jak utrzymać wersję demonstracyjną aplikacji?

text: Muszę mieć możliwość zaprezentowania naszej aplikacji produkcyjnej potencjalnym klientom. Sposób, w jaki mam to dzisiaj, jest prosty. Aplikacja demonstracyjna jest dokładnym duplikatem systemu produkcyjnego, z tą różnicą, że dane w bazie danych są zaciemniane w celu ochrony danych naszych obecnych klientów. Działa to świetnie, ponieważ nie wymaga żadnych zmian aplikacji. Szef upuścił dzisiaj potencjalną BOMBSHELL i powiedział, że system demonstracyjny musi zawierać specjalny link i że **TYLKO** pojawia się na demo. Następnie wyjaśnił, że w przyszłości mogą wystąpić znacznie większe różnice między aplikacjami demonstracyjnymi a produkcyjnymi (np. cały obszar funkcjonalności). Co mam teraz zrobić? Kilka rzeczy, które pomyślałem o zrobieniu: * Utrzymanie innej gałęzi w subversion specyficznej dla systemu demo * Utwórz pakiet instalacyjny, który zawiera zmiany dla wersji demo, a następnie przywróć i zbuduj produkcyjny pakiet instalacyjny * Modularyzuj aplikację (nie mam pojęcia jak) * Powiedz: „Pieprz się! Nie zrobię tego!” (LOL) * Użyj pewnego rodzaju logiki warunkowej w aplikacji, aby określić, czy jest to aplikacja demonstracyjna, czy produkcyjna. Np. (jeśli adres URL zawiera „demo”, pokaż inne ukryj). Jeśli do tej pory nie zgadłeś, jest to aplikacja internetowa Tak czy inaczej, nie mam doświadczenia w tym scenariuszu, która z nich jest lepsza lub czy żadna z nich nie jest dobra. Ktoś ma odpowiedź, strategię, coś!?


title: Nauczanie programowania: wady używania testów jednostkowych w opisie problemu dla zadań?

text: Eksperymentuję z zaznaczaniem zadań na kurs programowania za pomocą testów jednostkowych. Czy może zaszkodzić procesowi uczenia się, jeśli opublikuję niektóre testy, których używam jako część opisu problemu? Uważam, że czytanie kodu będzie dobrą praktyką i dostarczy dokładniejszego opisu problemu, niż jestem w stanie przedstawić słowami... ale chciałbym usłyszeć o wszelkich wadach. Zmieniłbym dokładne liczby, które spodziewam się wstawić i wyprowadzić z testów, a przypisania dotyczą bardziej testowania wstępnych pojęć OO niż tego, czy poprawnie przybliżają Pi, tj. Nie martwię się, że pokazanie niektórych możliwych odpowiedzi dałoby zbyt wiele.


title: Frontend aplikacji webowej w Pythonie do diagnostyki sprzętu i interakcji

text: Moim celem jest posiadanie aplikacji Pythona, która uruchamia serwer sieciowy, który obsługuje interfejs użytkownika, i w oparciu o interakcje użytkownika w jego przeglądarce, uruchamiane są długotrwałe zadania i poprzez pewien proces przesyłają informacje o stanie z powrotem do serwera sieciowego i następnie z powrotem do przeglądarki. Aplikacja nie będzie musiała być używana przez więcej niż jedną osobę naraz, a jeśli 2 lub więcej użytkowników uzyskuje dostęp do adresu URL, stan powinien być współdzielony we wszystkich instancjach. Oznacza to, że każdy użytkownik _nie_ ma unikalnej sesji logowania. Głównym celem aplikacji będzie utrzymywanie listy urządzeń wykrywanych automatycznie w sieci oraz odpytywanie tych urządzeń co 30-60 sekund i aktualizowanie interfejsu użytkownika, jeśli jest używany. Ponadto użytkownik może wybrać jedno lub więcej z tych urządzeń i wydawać polecenia lub aktualizować oprogramowanie. W przypadku aktualizacji oprogramowania chciałbym, aby było wystarczająco responsywne, aby móc wyświetlać paski postępu w czasie rzeczywistym dla każdego urządzenia, pokazując, jaki procent oprogramowania układowego zostało przesłane. Moja początkowa myśl to coś w rodzaju web.py lub Cherrypy dla GUI, teraz po prostu utknąłem na najlepszej metodzie, aby uruchomić te procesy z serwera internetowego i jak przesłać informacje z powrotem. Myślałem o tym, aby jakiś demon nasłuchiwał poleceń w gnieździe, które wysyłałaby aplikacja internetowa, i używałby gniazd do przekazywania stanu między demonem a siecią. Potem nadal muszę płynnie przesyłać te informacje z sieci do klienta, więc pomyślałem o gniazdach sieciowych. Szukam tylko zaleceń dotyczących dobrych praktyk dotyczących komunikacji interfejsu internetowego między rzeczywistymi pracownikami, a następnie sposobu przesyłania danych z pracownika na serwer sieciowy do przeglądarki klienta. Siłą napędową zastosowania podejścia opartego na przeglądarce jest to, że sam system musi działać na tanim sprzęcie z systemem Linux na x86 (nie na ramieniu) z małą ilością pamięci. Może to być aplikacja GUI, którą zamieniamy w maszynę VNC, ale metoda bezgłowa wydawała mi się lepsza. Nie jestem w 100% związany z tą ideą, jeśli ktoś może zaproponować lepsze alternatywy.


title: Niewykorzystane zależności i wstrzyknięcie konstruktora

text: Mam klasę, która ma 3 zależności. WritabbleDBConnection, ReadOnlyDBConnection i obiekt narzędziowy QueryFilter. Chcę zrobić konstruktor Injection, żeby moja klasa wyglądała mniej więcej tak. class PersonDataAccessObject { public function __construct($dbWrite, $dbRead, $queryFilter) { // ustawia na lokalne zmienne } public function A() {} // używa publicznej funkcji $dbRead B() {} // używa $dbWrite } obiekt najprawdopodobniej zostałby utworzony w statycznej fabryce, która wie, jak pobrać połączenia DB. Problem, który widzę, polega na tym, że za każdym razem, gdy buduję ten obiekt, muszę przekazać wszystkie 3 zależności, chociaż prawdopodobnie tylko jedna z nich zostanie użyta do operacji, które będę musiał wykonać. Nie lubię ukrywać moich zależności wewnątrz klasy lokalizatora usług, ponieważ chcę, aby moje zależności były jawne. Czy są na to jakieś rozwiązania? Czy muszę żyć z nieużywanymi instancjami?


title: Jakie technologie wdrażania mają sens w przypadku ciągłego wdrażania?

text: W moim rozumieniu głównym punktem w Continuous Deployment jest (no cóż, oczywiście tak myślę), że wdrożenie jest automatycznie wykonywane jako część procesu budowania. Koncepcyjnie łatwo jest zrozumieć, jak można przeprowadzić wdrożenie, gdy celem jest witryna internetowa. Jednak wydaje się trudne/niemożliwe do ciągłego wdrażania, gdy jest to aplikacja komputerowa wdrożona za pomocą instalatora msi (przepraszam, że moje zaplecze techniczne to głównie Microsoft)? Czy istnieją technologie wdrażania, których nie można używać podczas ciągłego wdrażania? A raczej: Jakie technologie wdrażania mają sens w ciągłym wdrażaniu?


title: Dlaczego interfejsy wymagają metod nad członkami?

text: ...Ponieważ zmusza nas to do tworzenia getterów i seterów, które w praktyce często są zupełnie obce? Czy jest jakiś dobry powód do projektowania języka, dla którego interfejsy w większości (wszystkich?) języków nie pozwalają na stosowanie pól członkowskich w celu spełnienia specyfikacji interfejsu? W większości istniejących języków członkowie są traktowani zasadniczo inaczej niż metody, ale czy MUSI tak być? Czy w języku teoretycznym nie moglibyśmy mieć interfejsu, który (a) określa metodę z zerowymi argumentami jako metodę pobierającą, ale akceptuje czytelny element jako jego implementator, oraz (b) określa metodę jednoargumentową jako metodę ustawiającą, ale akceptuje zapisywalne pole członkowskie jako jego implementator, biorąc pod uwagę język, który obsługuje określanie kontroli bezpośredniego dostępu do zmiennych podczas ich deklarowania? Prototypowy język umożliwiający wielokrotne dziedziczenie (odnosząc się do bardzo ważnego punktu, który podali niektórzy respondenci), byłby idealny do czegoś takiego. Proszę o informację, jeśli coś takiego już istnieje.


title: Jednorodna vs. niejednorodna reprezentacja AST

text: **Jakie są powody, aby wybrać jednorodną lub heterogeniczną reprezentację AST do implementacji złożonego języka programowania specyficznego dla domeny?** Żeby było jasne, o co pytam, oto dodatkowe tło: oznacza drzewo zbudowane z węzłów, które są jednym _typem ogólnym_. Na przykład, myślę, że to pytanie jest naprawdę niezależne od języka, ale używając struktury podobnej do C++ do ilustracji, uważam to za minimalny jednorodny węzeł drzewa składni abstrakcyjnej: struct Node { int tag; nieważne *dane; Węzeł *first_child; Węzeł *next_sibling; }; Przez heterogeniczne rozumiem drzewo zbudowane z węzłów, które są wieloma _pojedynczymi typami_ (np. jeden dla każdej produkcji gramatycznej). Na przykład nie chcę zakładać konkretnego języka, ale ponownie używając do ilustracji struktur podobnych do C++, uważam te typy za część hierarchii używanej do budowania heterogenicznego abstrakcyjnego drzewa składni: struct Node {}; struct Integer_Node : Węzeł { int wartość; }; struct Plus_Node : Węzeł { Węzeł *w prawo; Węzeł *po lewej; }; struct If_Statement : Node { Węzeł *Warunek; Węzeł *Wtedy_Wyrażenie; Węzeł *Else_Expression; }; // ... więcej typów, w zależności od języka ... Przez lata zaimplementowałem kilka małych, specjalnych kompilatorów, zwykle w sposób bardzo doraźny. Nigdy nie używałem dużo prawdziwego "AST", ponieważ zwykle tłumaczenie składni było wystarczająco dobre. Teraz jestem w trakcie projektowania i implementacji nowego, znacznie bardziej złożonego języka, w którym będę budował AST, a następnie przechodzę po nim z wieloma przejściami do weryfikacji, analizy semantycznej i tak dalej. Na przykład wydaje się, że użycie jednorodnego schematu zmniejsza ilość kodu z góry, ale zastanawiam się, czy schemat heterogeniczny będzie bardziej opłacalny na dłuższą metę z powodów, których nie rozważam. Z drugiej strony wydaje się, że schemat heterogeniczny umożliwia korzystanie ze statycznego sprawdzania typu kompilatora, wysyłania metod wirtualnych itp., ale zastanawiam się, czy cokolwiek z nich jest naprawdę przydatne przy opracowywaniu przejść semantycznych i tak dalej. _Zasadniczo mam nadzieję, że uzyskam wgląd od tych, którzy mogą mieć tutaj prawdziwe doświadczenie. Przeczytałem wiele książek o kompilatorach i mam umiarkowaną ilość podstawowego doświadczenia w pisaniu kompilatorów, ale nie widziałem tej szczególnej dychotomii w żadnej literaturze, którą mogę dostać w swoje ręce._


title: Zapisywanie profili użytkowników w bazie danych SQL

text: Tak więc mam tabelę _UserProfiles_ w mojej bazie danych, która, podobnie jak plik ustawień C#, przechowuje właściwość z odpowiednim typem danych i określonym ustawieniem w profilu. Teraz za każdym razem, gdy dodaję nowe ustawienie, muszę zaktualizować bazę danych, model i przepisać zapytania. Następnie pomyślałem o zmianie tabeli, aby zawierała tylko dwie kolumny: _Key_ i _Value_ z typem danych varchar do przechowywania ustawień użytkowników... Ale co uważa się za najlepszą praktykę w takich pytaniach projektowych? Czy takie podejście jest zalecane (na przykład dlatego, że wymaga niestandardowego analizowania od ciągu do wymaganego typu danych)?


title: Algorytm dopasowywania sekwencji cyklicznych

text: Załóżmy, że mamy 3 sekwencje cykliczne, każdy o długości n i zawierający jednorazowo każdą liczbę z przedziału 1..n. Celem jest dopasowanie sekwencji w celu zmaksymalizowania liczby dopasowań między sekwencjami. Przez dopasowanie rozumiem kolumnę, która zawiera 3 identyczne wartości. Ponieważ sekwencje są cykliczne, możemy przesuwać każdą sekwencję cyklicznie o dowolną liczbę pozycji (więc 1->2->3 może stać się 2->3->1 i 3->1->2 ale nie 1->3- >2). Przykład: 1 5 4 3 2 1 3 2 4 5 2 1 5 4 3 Odpowiedzią powinno być 3, a odpowiedni układ jest pokazany poniżej (dobierane są piątki, trójki i dwójki). 1 5 4 3 2 4 5 1 3 2 1 5 4 3 2 Prosty algorytm kwadratowy, który wymyśliłem to: for i in 1..n: wyrównaj ciągi tak, aby powstała kolumna (i, i, i) policz liczba dopasowań jeśli jest większa niż obecne maksimum, ustaw nowe maksimum Niestety sekwencje mogą mieć długość 1000000 i dlatego moje podejście nie jest wystarczająco szybkie. Byłbym wdzięczny, że ktoś mógłby zasugerować algorytm podkwadratowy (liniowy, loglinearny?) dla tego problemu.


title: Zaczynam myśleć funkcjonalnie

text: Niedawno zacząłem uczyć się programowania funkcjonalnego. Przez większość zeszłego roku kodowałem w Scali i dopiero teraz zaczynam w pełni rozumieć moc języka funkcjonalnego. Chcę zbudować od podstaw witrynę opartą na danych z wykorzystaniem technik funkcjonalnych. Mam problem z myśleniem o tym, jak zacząć o tym myśleć. Robiłem to wielokrotnie, używając standardowych technik Java OO. Zwykle myślę o produkcie końcowym, buduję z niego mój model obiektowy, następnie buduję warstwę DB CRUD, potem warstwę usług (logika biznesowa), a następnie warstwę web/ui. Moje pytanie brzmi: jak mogę uzasadnić/zaprojektować dużą, opartą na danych aplikację internetową w funkcjonalny sposób? EDIT: Do tej pory dobre punkty. Co powiesz na to: W aplikacji internetowej opartej na danych (baza danych, MVC, formularze HTML itp.) Gdzie ma sens używanie FP? Nadal pracuję nad dobrym zrozumieniem tego, czym jest FP, więc proszę o wyrozumiałość w moich pytaniach.


title: Używasz maszyny skończonej do zarządzania dostępem?

text: Moja witryna intranetowa używa LDAP i Active Directory do uwierzytelniania użytkowników. Istnieją 2 rodzaje Użytkowników: Menedżerowie i Pracownicy. Różnią się one członkostwem w określonej grupie AD. W celu ulepszenia mojego kodu staram się używać (mam nadzieję, że odpowiednio) formalnych wzorców projektowych. Myślę, że może tu zadziałać maszyna skończona. Ale nie jestem pewien, który z poniższych modeli (lub inny całkowicie) byłby najlepszy: 1. 2 przejścia z prostymi warunkami `Unlogged --- auth==TRUE---> Employee ---group==TRUE- --> Menedżer` 2.1 Przejście z warunkiem złożonym `Niezalogowany --- auth==PRAWDA && group==FAŁSZ---> Pracownik` `Niezalogowany --- auth==PRAWDA && group==PRAWDA--- > Manager` Pierwszy czuje się czystszy. Drugi jest bliższy temu, co powinno się dziać. Czy jestem na dobrej drodze? Czy zupełnie inny wzorzec projektowy byłby lepszy?


title: co oznacza termin przepustowość?

text: Jestem czystym produktem internetowym, więc nie mam żadnego stopnia naukowego ani szkolenia, więc jestem zdezorientowany co do przepustowości. czy jest to zasób pamięci, czy zasób procesora lub obciążenie serwera bazy danych? Jeśli użyję bazy danych sqlite zamiast serwera mysql do małych projektów, czy przyspieszy to działanie mojej strony (ponieważ plik sqlite będzie używany tylko przeze mnie)


title: Dlaczego komentarz XML nie może zawierać dwóch myślników?

text: Stosowałem komentarze markdown w komentarzach xml pliku konfiguracyjnego, gdy XmlParser zgłosił, że dwa łączniki (`--`) nie są dozwolone w komentarzach xml. Sprawdzając specyfikację XML, okazuje się, że komentarz xml nie zawiera dwóch myślników ze względu na kompatybilność z parserami SGML. Dlaczego parsery SGML nie zezwalają na podwójne myślniki w komentarzach?


title: Czego powinienem oczekiwać od oceny technicznej dla C++?

text: Zostałem poproszony o wykonanie testu technicznego/oceny do pracy jako młodszy programista, głównie przy użyciu C++. To jest mój pierwszy test/ocena i trwa 2 godziny. Mój C++ jest trochę zardzewiały, ponieważ ostatnio robiłem projekty w PHP. Jest to firma brytyjska, ale przypuszczam, że testy techniczne kandydatów będą wszędzie takie same. Czego powinienem się spodziewać w jednym z tych testów?


title: Ramy systemu zarządzania dokumentami?

text: Pracuję nad oprogramowaniem LOB dla przedsiębiorstw. Kolejnym elementem, który zostanie dodany do systemu, jest zarządzanie dokumentami. Większość podmiotów w całym systemie będzie miała do nich dołączone dokumenty. Wyraźnie widzę potrzebę organizowania, wyszukiwania, udostępniania, przesyłania i skanowania dokumentów. Zastanawiałem się, czy istnieje system zarządzania dokumentami z następującymi wymaganiami: 1. Nie jest potworem (nie Sharepoint, itp.) 2. Łatwo osadzony, moje środowisko to .NET Silverlight 3. Brak opłat licencyjnych. Najlepiej tylko raz za to zapłacić i użyć jako niestandardowych kontrolek itp. Założę się, że takie zwierzę istnieje, ponieważ nie chcę wymyślać koła na nowo.. Dzięki!


title: Czy wymagana jest minimalna wielkość zespołu, aby uzyskać korzyści z Agile?

text: Pracuję w firmie, która wielokrotnie zmniejszała rozmiary swojego zespołu programistów, do tego stopnia, że poprzednie 10-osobowe zespoły ograniczały się teraz do jednego programisty na produkt (i kilku testerów dzielonych na 5 produktów). Kiedyś mieliśmy do czynienia z dość dużym obciążeniem procesowym, ponieważ byliśmy wydzieleni z większej firmy i odziedziczyliśmy jej wieloetapowy proces kaskadowy. Zespół wykonawczy stwierdził, że nie wydajemy oprogramowania wystarczająco szybko i prawdopodobnie jest to wina procesu (który może być współautorem, chociaż 90% utrata siły roboczej prawdopodobnie nie pomogła). Naciskano na nas, abyśmy przeszli na proces Agile, aby uniknąć spędzania czasu na pisaniu dokumentów projektowych itp. Myślę, że jestem po prostu ciekawy, czy przejście na Agile pomoże w zespołach jednoosobowych. Zrozumiałem, że wiele korzyści wynika z większej widoczności i lepszej komunikacji między członkami zespołu, ale wiem, co robię, podobnie jak mój menedżer. Robię już TDD, ponieważ i tak nie mamy nikogo, kto by testował produkt. **Wersja TL;DR:** Myślę, że tak naprawdę pytam, czy możesz wdrożyć Agile z jednoosobowymi „zespołami” i czy widzisz z tego jakieś korzyści, czy jest to zwykle coś, co jest bardziej efektywne dla większych zespoły?


title: Proszę powiedz mi, że nie jestem sam (nie mogę programować na papierze)

text: Więc poszedłem dzisiaj na rozmowę o pracę. Krótko mówiąc, ankieterzy byli zachwyceni moją wiedzą i doświadczeniem, praktycznie prowadzili mnie do mojego nowego biurka. Nie trzeba dodawać, że zachwycił ich rzeczowy i nie przesadzony opis rzeczy, nad którymi faktycznie pracowałem. Ale nagle, gdy szykowałam się do wyjazdu, jeden z ankieterów mówi do mnie: „Cóż, wiem, że to chyba za łatwe dla kogoś z twoim doświadczeniem, ale ze względu na protokół musimy wypełnić prosty test ”. Nie ma problemu, pomyślałem… Po tym dostaję kartkę papieru, ołówek (poważnie wtf? kto już używa tych prymitywnych urządzeń?) i instrukcje nakazujące mi zakodowanie funkcji zwracającej liczbę Fibonacciego i innej wykonującej to z rekurencją. Boże, nienawidzę matematyki. Wyraźnie pamiętam to dokładne ćwiczenie na 3 semestrze studiów. Pewnie wtedy to przybiłem, ale dzisiaj nie tak bardzo. Zajęło mi to około 40 minut i byłem blisko, ale funkcje nie działały. Jak na ironię, dokładnie wiedziałem, dlaczego się mylili i jaki błędny wynik został zwrócony, ale po prostu nie mogłem wymyślić, jak je naprawić. Coś w tym, że trzeba zdrapywać grafitowe znaki z papieru, po prostu bardzo mnie zdenerwowało. A może chodzi o to, że jestem skrępowany, jeśli chodzi o ocenę moich umiejętności matematycznych. Nie mogę obliczyć napiwku, gdy patrzy kelner, ponieważ jestem wolny w liczbach i czuję się zakłopotany. Wszystko to skłoniło mnie do myślenia o tym artykule Coding Horror. Najwyraźniej 199 na 200 kandydatów udaje, że umie kodować, ale w rzeczywistości nie potrafi. Myślę, że dzieje się tu coś jeszcze. To znaczy nikt z was mnie nie zatrudni, nie mam powodu, żeby was okłamywać, kiedy mówię, że zakodowałem dużo bardziej skomplikowane rzeczy. A jednak nie mogłem zakodować prostej funkcji, nie w takich warunkach. Czy ktoś jeszcze tego doświadczył?


title: Nazewnictwo metod klas pochodnych

text: Trudno mi wymyślić dobrą konwencję nazewnictwa dla metod w klasach pochodnych, które służą temu samemu celowi, co metody w klasie bazowej. Na przykład, jeśli zarówno klasa podstawowa, jak i pochodna wymagają inicjalizacji: public class Foo() { public void Initialize() { // kod inicjujący klasy bazowej InitializeDerived(); } // wymusza na klasach pochodnych implementację własnej metody inicjalizacji protected abstract void InitializeDerived(); } public class Bar() : Foo { protected override void InitializeDerived() { // kod inicjujący tutaj } } InitializeDerived() wydaje się niezgrabna. Jedyną inną opcją, o której mogę pomyśleć, jest uczynienie metody klasy bazowej Initialize() wirtualną. Następnie klasa pochodna może ją zastąpić, używając tej samej nazwy, i najpierw wywołać metodę Initialize() klasy bazowej. Czy jest lepszy sposób? Lepsza konwencja nazewnictwa? ** EDIT ** To może być lepszy przykład, ponieważ konstruktorzy nie rozwiążą tutaj problemu. W tym przykładzie mamy silnik reguł, w którym kod klienta polimorficznie wywołuje Process() na każdej regule: public class RuleBase() { public void Process() { // kod przetwarzania klasy bazowej ProcessDerived(); } // wymusza na klasach pochodnych implementację własnej metody procesu protected abstract void ProcessDerived(); } public class RuleValidateHeight() : RuleBase { protected override void ProcessDerived() { // kod przetwarzania klasy pochodnej } } Kod zużywający: foreach (Reguła reguły w regułach) { rule.Process() }


title: Dlaczego miałbym używać Angulara?

text: Z podstawowego samouczka Angulara wydaje się, że wszystko, co robi, to pobranie pliku JSON z interfejsu API i wyświetlenie go. Jest też jego podwójna magia wiążąca. Ale dlaczego miałbym go używać zamiast rozwiązania zaplecza (takiego jak Rails), które buduje widok w zapleczu i udostępnia go użytkownikowi, mając już wszystko na swoim miejscu? Jakie są przypadki użycia?


title: W C++, ile czasu programista poświęca na zarządzanie pamięcią?

text: Ludzie przyzwyczajeni do usuwania śmieci z języków często boją się zarządzania pamięcią w C++. Istnieją narzędzia, takie jak `auto_ptr` i `shared_ptr`, które obsłużą za Ciebie wiele zadań związanych z zarządzaniem pamięcią. Wiele bibliotek C++ poprzedza te narzędzia i ma swój własny sposób obsługi zadań związanych z zarządzaniem pamięcią. **Ile czasu poświęcasz na zadania związane z zarządzaniem pamięcią?** Podejrzewam, że zależy to w dużym stopniu od zestawu bibliotek, których używasz, więc proszę powiedz, do których z nich odnosi się Twoja odpowiedź i czy są one lepsze czy gorsze.


title: Podpowiedź do stworzenia schematu db

text: Potrzebuję zrealizować bazę danych w tym trybie: restauracja TABELA z "klasycznymi" polami miejsca: adres, numer ulicy, telefon, strona www itp. itd. Muszę również wskazać dni otwarcia // zamknięcia. Np. Od poniedziałku do środy nieczynne, w sobotę tylko wieczorem iw niedzielę obiad + wieczór. Pomyślałem więc przy innym stole z 14 rzędami: ID_RESTAURANT MONDAY_LUNCH MONDAY_EVENING [...] SUNDAY_EVENING 12 0 0 1 I „w końcu” każda restauracja ma swoją kuchnię („międzynarodowa”, „chińska”, „japonia”) Kolejny stolik z kolumną do każdego gotowania? Wreszcie kilka usług. „Klimatyzacja”, „Karta kredytowa”, „Zwierzęta dozwolone”, „Uzależnione dzieci” itp. Kolejna tabela z kolumną dla każdej „usługi”? ID_RESTAURANT CONDITIONED CREDIT_CARD ZWIERZĘTA 12 1 1 0 13 0 1 1 Mam nadzieję, że wyrażam się jasno. Dziękuję Ci bardzo!


title: Najlepszy sposób na automatyczne logowanie w aplikacji internetowej

text: To pytanie może mieć tytuł „Umieść hash hasła i sól w ciągu zapytania?” również, aby być mniej subiektywnym, ale kwestia pozostaje taka sama: chcę stworzyć rodzaj aplikacji uruchamiającej dla mojej aplikacji internetowej, która powinna umożliwiać użytkownikowi określenie swoich danych uwierzytelniających do automatycznego logowania do mojej aplikacji internetowej. Teraz, ponieważ zwykły tekst jest prawie zawsze okropny, pomyślałem o przekazaniu skrótu hasła i soli jako ciągu zapytania do mojej aplikacji, aby wykonać automatyczne logowanie. Coś w stylu: http://myapp.com/login/?autologin=true&passwordhash=foo&salt=bar Ale zastanawiam się, czy istnieje lepszy lub bezpieczniejszy sposób zamiast tego?


title: podklasa niezmiennego obiektu nie jest niezmienna, czy to zadziała?

text: Kończę więc refaktoryzację kodu, aby usunąć pewną liczbę wcześniej zmieniających się obiektów i dodać lepsze ogólne przetwarzanie dla wszystkich klas w domenie. Tak jak myślałem, że kończę, uświadomiłem sobie, że istnieje jedna podklasa, która ma jakiś dodatkowy stan. Dodatkowy stan to łącze do innych klas, które są używane jako część logiki informującej, kiedy zostaną utworzone, usunięte lub zmodyfikowane nowe obiekty domeny. Jednak ta podklasa jest tworzona tylko podczas uruchamiania lub gdy ktoś uruchamia polecenie ponownego odczytu i aktualizacji do nowych plików konfiguracyjnych. Wiem, że ten obiekt będzie _zawsze_ tworzony przed innymi obiektami w mojej domenie, które są od niego zależne, tak że każdy, kto wskazuje ten obiekt, ma gwarancję wskazania tego samego wystąpienia. Skutecznie mam wzór zapamiętywania przez przypadek, w jaki sposób jest tworzona struktura. Mogę refaktoryzować zmienność; ale wymagałoby to trochę pracy z modyfikacją logiki rozruchu, której wolałbym uniknąć. Lub mógłbym zmienić metody has i equals, aby zignorować ten jeden zestaw zmiennych wartości, aby mój model traktował ten obiekt dokładnie tak, jak jego niezmienny rodzic i ufał, że moja wiedza na temat metody, którą jest skonstruowany, uniemożliwia mi tworzenie aliasów, gdy próbuję używaj jego zmiennych cech. Więc jak „niewłaściwe” jest naginanie w ten sposób mojego kontraktu na tę klasę?


title: Enkapsulacja warstw bez przeciążenia modelu?

text: Zaczynam nowy projekt, więc nadszedł czas, aby ponownie ocenić, jak robię rzeczy. W niedalekiej przeszłości stworzyłem projekt 3 warstwowy/warstwowy (UI, Domena, Dane) z każdą warstwą z osobnym modelem. DAL ma swoje jednostki danych używane przez warstwę domeny, które mapują je do modeli domeny, które były używane przez interfejs użytkownika, który mapował je do ViewModels. Pozwoliło to na pewne zróżnicowanie na każdym poziomie (zwłaszcza w interfejsie użytkownika), ale mapowanie było niezwykle żmudne (Automapper trochę pomógł), a warstwy domeny i danych były w zasadzie 1:1, przy czym modele widoku interfejsu użytkownika były najbardziej przydatne. Staram się wymyślić, jak uprościć mój następny projekt i przydałoby mi się kilka sugestii.


title: Ilu programistów tworzy firmę małą / średnią / dużą?

text: Jestem freelancerem, więc naprawdę nie wiem, co chowacie za słowami, kiedy mówicie „praca w **małej** firmie to X inaczej niż w **średniej****, a Y to * *duża firma** ". Czy mógłbyś mi powiedzieć (w przybliżeniu), jakie są granice między tymi kategoriami? Pytam konkretnie o liczbę programistów ( _pracowników związanych z IT_ *) w firmie zamiast o liczbę pracowników, ponieważ: 1. Aby uniknąć spamu typu „to nie jest pytanie związane z programowaniem”; oraz 2. Ponieważ (logicznie) zależy mi na różnicach związanych z programowaniem, firma zatrudniająca 100 pracowników, z których tylko 2 związanych z IT dziedziczy środowisko pracy kilku programistów i jest oczywiście mniejsze w porównaniu do firmy 10 pracowników, z których wszyscy są programistami. Mniejsze według klasyfikacji podanej na tej stronie, w różnych sytuacjach związanych z wielkością zespołu (zespołów). * _Przypuszczam, że kierownicy projektów, QA, liderzy zespołów itp. również należą do policzalnych osób._ **Dzięki**.


title: Dlaczego Mono nie implementuje WPF?

text: Nie udało mi się znaleźć sensownego uzasadnienia, że zespół Mono nie pracuje nad WPF. Jaki może być możliwy powód? Zwłaszcza, gdy wdrożyli już Silverlight.


title: Legalność modyfikowania i rozpowszechniania JRE

text: Widzę, że aplikacje Google App Engine działają na tak zwanej bezpiecznej piaskownicy JRE; czyli środowisko JRE zmodyfikowane przez Google, które wprowadza zmiany w niektórych typach środowiska JRE. W ten sposób GAE uniemożliwia programistom pisanie aplikacji, które mogą wykonywać takie rzeczy jak: * Dostęp do lokalnego systemu plików poprzez `Plik` * Wykonywanie zdalnych wywołań JDBC * Używanie JNDI * Mnóstwo innych ograniczeń Mamy podobną potrzebę, gdy mamy aplikację, którą programiści będzie mógł pisać wtyczki. Wtyczki te będą musiały korzystać z interfejsu API (JAR), który dystrybuujemy wraz z naszą aplikacją. Nie możemy sobie pozwolić na wtyczki robiące pewne rzeczy, szczególnie w systemie plików użytkownika końcowego i musimy modyfikować klasę `File` w podobny sposób, jak robi to GAE. **Długa historia w skrócie, oznacza to, że będziemy musieli wysłać naszą aplikację z niestandardowym, zmodyfikowanym środowiskiem JRE.** Moje pytanie: **czy jest to zgodne z prawem**, czy Google prawdopodobnie zapłacił firmie Oracle pewną opłatę za modyfikację /dystrybuować własne środowisko JRE dla silnika aplikacji?


title: Czy sporządzając wycenę, spotykam się z klientem osobiście, czy wysyłam go e-mailem?

text: Klient musi coś zrobić, muszę napisać wycenę, jak do tego podejść? Jeśli masz jakąś ogólną strategię w tej kwestii, również będzie mile widziany. Ma to na celu zbudowanie strony internetowej/bazy danych za kilka tysięcy.


title: System *Właściciel kodu*: czy jest to skuteczny sposób?

text: W naszym zespole jest nowy programista. W naszej firmie stosujemy metodykę zwinną. Ale programista ma inne doświadczenie: uważa, że poszczególne części kodu muszą być przypisane konkretnym programistom. Jeśli więc jeden programista stworzył procedurę lub moduł programu, byłoby uważane za normalne, że wszystkie zmiany procedury/modułu byłyby dokonywane tylko przez niego. Na plus, podobno dzięki proponowanemu podejściu oszczędzamy wspólny czas programowania, ponieważ każdy programista dobrze zna swoją część kodu i szybko wprowadza poprawki. Minusem jest to, że programiści nie znają całkowicie systemu. Czy uważasz, że to podejście sprawdzi się w przypadku systemu średniej wielkości (rozwój serwisu społecznościowego)?


title: Gdzie przechowywać klucz prywatny?

text: Powiedzmy, że chcę, aby niektóre części mojego oprogramowania były zaszyfrowane. Na przykład poświadczenia bazy danych itp. Muszę gdzieś przechowywać te wartości, ale zrobienie tego w postaci zwykłego tekstu ułatwiłoby atakującemu uzyskanie nieautoryzowanego dostępu. Jeśli jednak zaszyfruję jakiś zwykły tekst, to gdzie mam przechowywać klucz? Zdeterminowany atakujący miałby dostęp do wszystkiego, do czego oprogramowanie ma dostęp, bez względu na poziom zaciemnienia: * Powiedzmy, że klucz jest chroniony przez model bezpieczeństwa systemu plików; ale co z (złośliwymi) superużytkownikami lub platformami, które nie zapewniają takiej wierności? * Lub klucz jest zakodowany na sztywno w programowych plikach binarnych, ale zawsze można go zdekompilować, a co z oprogramowaniem open source lub kodem interpretowanym? * Jeśli klucz jest generowany, taki algorytm musiałby być deterministyczny (przypuszczalnie), a wtedy ten sam problem dotyczy ziarna. * itd. Kryptografia jest tak silna, jak najsłabsze ogniwo w swoim łańcuchu i wydaje się, że jest to dość luźne! Zakładając, że jest to właściwe narzędzie do pracy (humor me), to jak można solidnie zabezpieczyć takie informacje? * * * Jeśli chodzi o właściwe narzędzie do pracy: Prawdopodobnie, na przykład, w przypadku dostępu do usług (bazy danych, serwery uwierzytelniające itp.) ograniczyłbyś dostęp na tym poziomie za pomocą konta usługi, być może za pomocą niektórych audyt na poziomie usług itp., a więc posiadanie poświadczeń w postaci zwykłego tekstu nie jest takim problemem. Dla mnie jednak to wciąż wydaje się niewystarczające: nie chcę, żeby ktokolwiek grzebał tam, gdzie nie powinien!


title: Licencja BSD/MIT zmienia się podczas kopiowania/wklejania funkcji z innego pakietu licencjonowanego BSD/MIT

text: Często stwierdzam, że chcę użyć jakiejś małej funkcji z innej biblioteki, ale w końcu tego nie robię, ponieważ nie warto ciągnąć innej zależności. Biorąc pod uwagę licencje BSD/MIT, jeśli po prostu skopiuję/wkleję funkcję z innego pakietu, jaki byłby wymóg prawny przy licencjonowaniu mojego kodu? Ponadto, jeśli chodzi o _netykietę_ , jaki byłby lepszy sposób przyznania autorytetu oryginalnemu autorowi? Rozumiem, że zależy to od konkretnych okoliczności każdej sytuacji. Bezpiecznym sposobem byłoby zawsze zapytać autora, czego chce, ale czasami zdarza się to tak często, że posiadanie domyślnej propozycji dla autora wyższego szczebla może ułatwić interakcję.


title: Rozszerzenie kodu GPL sprawi, że nowy kod również stanie się GPL?

text: Obecnie dodaję kilka funkcji do popularnego projektu open source. Jest napisany w C, aw każdym pliku tekst licencji GPL jest osadzony. Funkcjonalność, którą dodaję nie jest obsługiwana przez projekt. Więc możesz powiedzieć, że to coś w rodzaju rozszerzenia. Mój kod zostaje skompilowany podczas kompilacji głównego projektu. Mój kod znajduje się w głównym projekcie i jest mocno zintegrowany. Pozwólcie, że wyjaśnię dokładniej. Zasadniczo znam dwa rodzaje linkowania. 1. Mój _program_ używa mysql c api. więc łączę mój kod c z `libmysqlclient`. Tutaj **używam** `libmysqlclient` 2. Mój _code_ dodaje funkcjonalność tablicy haszowej do `libmysqlclient`, dzięki czemu użytkownik może uzyskać dostęp do pól według nazwy kolumny. Mój projekt jest drugiego typu. Czy powinna to być GPL? A co z pierwszym scenariuszem (jestem ciekawy)?


title: Jak wypełnić listę modeli pochodzących z baz danych?

text: Mam model, który czerpie swoje dane z bazy danych MySQL przy użyciu metody publicznej `load()`. Jeśli mam kolekcję modeli, muszę przejść przez każdy model i wywołać jego metodę `load()` indywidualnie; oznacza to, że wykonywanych jest wiele zapytań, co jest powolne i nieefektywne. Czy powinienem mieć w moim modelu metodę typu `populate()`, która jest wywoływana z kontrolera (MVC) i wypełnia model danymi, tak aby zapytania MySQL były jak najmniejsze i jak najbardziej wydajne? A może jest na to lepszy sposób? Martwię się, że jeśli ładuję dane modelu spoza modelu, zostawiam za sobą odpowiednią enkapsulację i nadęcie kodu za pomocą prawie tego samego, ale nie całkiem copypasta.


title: Łączenie getterów i seterów

text: Biblioteki JavaScript, takie jak jQuery, łączą 'gettery' i 'settery' w interfejsie programistycznym, na przykład: $('element').css({'color','blue'}); ustawi kolor lub $('element').css(); dostanie CSS dla elementu. Czy istnieje nazwa takiego wzorca i czy jest to dobra praktyka do wykorzystania w aplikacjach?


title: Najlepsze praktyki generowania nowych identyfikatorów dla obiektów trwałych?

text: W typowym scenariuszu obiekt, który wymaga utrwalenia w bazie danych, zostanie utworzony w kodzie aplikacji bez identyfikatora, a następnie zapisany do tabeli w bazie danych. Niektóre konstrukcje bazy danych, takie jak kolumna tożsamości, wygenerują nowy identyfikator, zwykle liczbę całkowitą, która jest unikatowa dla wszystkich wierszy tej tabeli. Identyfikator ten może być następnie zwrócony do kodu aplikacji, a następnie traktowany jako klucz. CREATE TABLE Użytkownicy ( UserId int IDENTITY(1,1) NOT NULL, DisplayName nvarchar(max), UserName nvarchar(50), [Hasło] nvarchar(50)) PRZEJDŹ INSERT INTO Users (DisplayName, UserName, [Password]) VALUES ( 'Joe Shmo', 'jshmo', 'pw1') SELECT @@IDENTITY Innym typowym scenariuszem jest identyfikator GUID: CREATE TABLE Users (Unikatowy identyfikator użytkownika NOT NULL, DisplayName nvarchar(max), UserName nvarchar(50), [ Hasło] nvarchar (50)) GO DECLARE @id uniqueidentifier = NEWID() INSERT INTO Users (identyfikator użytkownika, nazwa wyświetlana, nazwa użytkownika, [hasło]) WARTOŚCI (@id, 'Joe Shmo', 'jshmo', 'pw1') SELECT @ id Ten drugi sposób zapewnia następującą zaletę: identyfikator GUID można wygenerować w kodzie aplikacji, który może być następnie użyty jako klucz do celów buforowania/odwoływania się do aplikacji, zanim obiekt zostanie kiedykolwiek zapisany. Istnieje jednak koszt związany z używaniem identyfikatorów GUID w rozmiarze, a zwłaszcza kosztów wyszukiwania. Mogą być trywialne, gdy stół jest mały, ale mogą stać się głównym czynnikiem, gdy stół jest ogromny. Czy istnieją jakieś najlepsze praktyki lub techniki dla przypadków, w których identyfikator unikalny dla typu obiektu musi być generowany w kodzie aplikacji, ale nie może być identyfikatorem GUID z jakiegokolwiek powodu? Jedną z myśli było posiadanie kolejnej tabeli generującej identyfikator opakowanej przez usługę identyfikatora, którą kod aplikacji mógłby wywołać.


title: Czy znasz jakieś techniki szyfrowania używane do walidacji przekierowania adresu URL?

text: Dodaję funkcję śledzenia kliknięć do mojej witryny, aby śledzić kliknięcia dla moich reklamodawców. Tak więc w mojej witrynie zamiast _bezpośredniego linku_ , umieszczam link do mojej _przekierowanej strony_ podając docelowy adres URL jako argument. Ta przekierowująca strona śledzi następnie klikanie, a następnie 301 przekierowuje użytkownika do prawidłowego zewnętrznego adresu URL. Chcę uniemożliwić innym firmom wykorzystanie tego systemu do przekierowywania go do dowolnych adresów URL. Chciałbym, aby kod tworzący linki: Utworzył `specjalny token` używając ( `docelowy adres URL` \+ `secret` ) Następnie przekazać argumenty `docelowy adres URL` \+ `specjalny token` jako parametry ciągu zapytania do mojego _przekieruj stronę_ w miejscach publicznych. Po otrzymaniu argumentów strona przekierowująca dokona sprawdzenia: Biorąc pod uwagę ( `docelowy adres URL` \+ `specjalny token` \+ `sekret` ), `docelowy adres URL` jest albo: * dobry - przekieruj go do miejsca docelowego * złe - nie przekierowuj go do miejsca docelowego i _nie powinno_ być możliwe, aby Doctor Evil: Utworzył `sekret` używając ( `znanego prawidłowego docelowego adresu URL` \+ `jego specjalnego tokena` ) * * * Idealnie `re-direct ` strona nie musiałaby wykonywać żadnych specyficznych dla adresu URL wyszukiwań danych, aby sprawdzić poprawność parametrów - powinna po prostu być w stanie odróżnić od 'dwóch podanych parametrów + sekretu + znanego algorytmu'. Nie znam się zbyt dobrze na szyfrowaniu, więc zastanawiałem się, jakiej metody można użyć do utworzenia i sprawdzenia parametrów podanych we wspólnym sekretie. Jestem pewien, że jest to powszechna technika, ale nie mam pojęcia, jak się nazywa - dlatego trudno jest dowiedzieć się o niej więcej. Każda pomoc jest mile widziana.


title: W jaki sposób można połączyć C++ z siecią (na przykład w Google)?

text: Google jest dobrze znane z absurdalnej ilości C++, które zakodowali przez lata. Popraw mnie, jeśli się mylę, ale duża część podstawowej wyszukiwarki Google jest napisana w C++, prawda? Jak wziąć program napisany w C++ i połączyć go ze stroną internetową? Uwaga: nie szukam sposobu, w jaki Google to robi, tylko ogólnie, jak można to zrobić.


title: Dlaczego moje programy Java działają szybciej w Eclipse niż w BlueJ?

text: Programuję od około 2 lat i na razie Java to wszystko, co znam. Kiedy przeszedłem z BlueJ na Eclipse, zauważyłem, że moje stare projekty działają znacznie szybciej. Jaki byłby tego powód, o ile wiedziałem, że wykonywanie kodu bajtowego java jest obsługiwane przez JVM i nadal miałem tę samą JVM po przełączeniu. Poza tym, czy Eclipse ma inny kompilator? To jedyna rzecz, o której mogłem pomyśleć. **Edytuj:** Zmierzyłem czas, średni czas działania, nazwijmy to A(100), na niebieskoJ wynosił 1 minutę; 8 sekund; 846 milisekund. W zaćmieniu A (100) zajęło to tylko 8 sekund; 459 milisekund. Zauważyłem również wzrost dla wszystkich moich innych programów. Nie mierzyłem ich jeszcze, ale różnica jest na pewno zauważalna. A() to funkcja, która wykonuje dużo obliczeń niż drukuje wykres informacji na podstawie tego, co znalazła, fyi.


title: Jakie projekty open source C# są przykładem oddzielenia obaw i dobrej struktury rozwiązania?

text: Szukam czegoś pokazującego najlepsze praktyki w N-warstwowym projektowaniu aplikacji korporacyjnych z naciskiem na ponowne wykorzystanie kodu i skalowalność. Ewentualnie z wykorzystaniem metodologii DDD lub CQRS. Nie przejmuj się interfejsem użytkownika, ponieważ jest to już dobrze zrozumiane.


title: Czy kopiowanie pomysłów z innych języków jest złe?

text: Czy przy tworzeniu języka programowania kopiowanie funkcji i pomysłów z innych języków programowania jest złe? Jeśli to nie problem, dlaczego nie? Czy można udzielać licencji i praw autorskich do tych rzeczy?


title: Samouczek do rozpoczęcia pracy z szynami z gołą kością

text: Próbuję podnieść Railsy, ale jest mnóstwo rzeczy, które robi, że nie jest pod moją kontrolą i to jest przerażające (http://blog.zawodny.com/2011/06/13/i-właściwie-sprawdzony- tory-naukowe/). Czy istnieje samouczek, w którym wyjaśnia tylko dokładnie, co musisz zrobić, aby wybrać framework? (specyfikacje, kontrolery i widoki)


title: Jak sobie radzić z menedżerem, który zawsze ingeruje w to, co robię, ale tak naprawdę tego nie rozumie?

text: Wszyscy je mieliśmy, menedżerów, którzy albo byli ze sprzedaży, albo ostatnio oglądali kod 10 lub więcej lat temu, ale uważają, że wiedzą, jak pisać kod. Co mogę zrobić, aby sprawić wrażenie, że jestem wdzięczna za jego interwencję, ale staraj się, aby była jak najkrótsza, abym mogła kontynuować pracę? A może powinienem bardziej angażować menedżera, aby edukować go w zakresie nowoczesnych technik i praktyk kodowania? W końcu menedżer, który je rozumie, będzie mógł rozsądnie rozmawiać z klientami i wyższą kadrą kierowniczą podczas omawiania projektu i jego ram czasowych.


title: Czy JavaScript może być używany jako ogólny język skryptowy?

text: Używałem JavaScript i niektórych frameworków (jQuery, Prototype, niektóre node.js) do programowania stron internetowych po stronie klienta, ale nigdy na pulpicie, gdzie większość moich prac skryptowych wykonuję w Pythonie lub Bash. Ale IMHO, JavaScript byłby świetnym językiem skryptowym, gdyby był używany poza przeglądarką. Czy ktoś tego próbował? Czy JavaScript może być odpowiednim zamiennikiem dla Python/Perl/Bash do szybkich i brudnych zadań skryptowych?


title: Team Foundation Server — wdrożenia

text: Obecnie mamy 5 programistów pracujących nad dość dużą aplikacją Silverlight. Mamy 3 serwery: * Test * Serwer akceptacji użytkowników * Produkcja Każda osoba pracuje na czymś zupełnie innym i rzadko wpada na swój kod. Kiedy to robią, po prostu scalają je podczas wpisywania swoich zmian. Największym problemem z jakim mamy obecnie do czynienia jest następujący scenariusz: 1. Jedna osoba pracuje nad jakimś modułem i jest już skończony, ale nie chcemy, żeby był jeszcze wydany. 2. Druga osoba pracuje nad poprawkami niektórych błędów itp., które muszą zostać wydane. Obie osoby sprawdziły swój kod. Teraz jak wybieramy/wybieramy zmiany, które chcielibyśmy zachować w konkretnej kompilacji. **Czy istnieje sposób na tworzenie kompilacji niestandardowej na podstawie konkretnych meldunków? Czy możemy cofnąć niektóre zmiany?** Mam wcześniejsze doświadczenie w git/hg i dopiero zacząłem używać TFS w tym projekcie. To, co robiłem w Git, polegało na tworzeniu nowej gałęzi dla każdej funkcji, a każda osoba pracowała na swojej gałęzi. Jeśli ktoś pracował nad ogólnym błędem, zgłaszałby go do gałęzi master, a inni po prostu wyciągaliby go, aby upewnić się, że jest na bieżąco. Po zakończeniu funkcji połączylibyśmy gałąź z gałęzią główną. TFS wydaje się być bardzo delikatny i za każdym razem, gdy próbowałem coś z nim zrobić, albo traciłem niektóre zmiany, które wprowadziłem, albo spędzałem wiele godzin próbując naprawić niektóre przypadkowe problemy, które stworzyłem, wykonując proste zadania, takie jak sprawdzanie lub pobieranie najnowszych. **Czy są dostępne jakieś samouczki (więcej ćwiczeń)?**


title: Jak powstrzymać zmianę specyfikacji deweloperskiej w połowie rozwoju?

text: **Problem** : Wygląda na to, że przy prawie każdym wysiłku programistycznym, w który jestem zaangażowany, bez względu na to, ile czasu poświęcasz na planowanie przed rozpoczęciem tworzenia, zawsze wymagana jest duża liczba zmian w połowie lub pod koniec projektu . Są to czasem duże zmiany, które wymagają wielu przeróbek. Nie pracuję dla klientów, którzy płacą pieniądze, to jest wewnętrzny zespół programistów na wewnętrznych stronach programistycznych. Więc nie mogę za to zapłacić ani nic. A pod koniec dnia musimy starać się dotrzymywać terminów. **Pytania** : Jakie są najlepsze sposoby minimalizowania i zapobiegania pojawianiu się zmian specyfikacji w trakcie lub po zakończeniu tworzenia?


title: Stosowanie DRY do hierarchii dziedziczenia

text: Pracuję nad refaktoryzacją starszej aplikacji, w której pomyślnie zaimplementowałem wzorzec stanu, jak pokazano na poniższym diagramie: ![Wzorzec stanu UML](http://i.stack.imgur.com/ceQNx.png) Jak widać jest powszechnym zachowaniem pomiędzy 3 stanami, więc zdecydowałem się wyodrębnić wspólną metodę `Refund()` do nadrzędnej klasy abstrakcyjnej `RefundableState`, gdzie ją zaimplementowałem: ![Refaktoryzacja dla typowych operacji](http://i.stack .imgur.com/j4SAX.png) Refaktoryzacja dalej Zauważyłem, że metoda `Ship()` jest wspólna dla dwóch stanów `Cancelled` i `NewOrder`, więc idę na kolejną rundę wyodrębniania typowego zachowania do innej klasy nadrzędnej `ShippableState`: ![Problem z refaktoryzacją!!](http://i.stack.imgur.com/QHbLO.png) Teraz potrzebuję mojego stanu `Cancelled`, aby rozszerzyć 2 klasy i jednocześnie nie mogę grupować funkcje `Refund()` i `Ship()` razem, ponieważ nie wszystkie stany zezwalają na 2 akcje. Jak mogę to naprawić? **Uwagi:** * To pytanie dotyczy głównie zastosowania **DRY** i refaktoryzacji, a nie implementacji wzorca stanu. * Używam PHP 5.3, ale jestem otwarty na odpowiedzi w innych językach.


title: Jak radzimy sobie z kategoriami w schemacie bazy danych i klasach modelu?

text: Próbuję opracować rozwiązanie e-commerce, ale utknąłem w kwestii zarządzania kategoriami i nie wiem, jak dalej postępować. Widzisz, kategoria będzie miała kategorię nadrzędną, która w zwrocie może również wskazywać na innego rodzica i tak dalej, aż do osiągnięcia kategorii głównej. Próbowałem zaprojektować następujący schemat bazy danych, **Proszę powiedzieć, czy to prawda?** ![tutaj wpisz opis obrazu](http://i.stack.imgur.com/kew7U.jpg) LUB **Czy jest jakiś samouczek na temat kategorii i kategorii nadrzędnych, które pomogą mi lepiej zrozumieć ten scenariusz ?**


title: Pytanie dotyczące aplikacji na iPhone'a opartej na DB

text: Pomysł na aplikację na iPhone'a zajmuje się przetwarzaniem danych przechowywanych w ramach bazy danych Oracle w pracy. Będzie to interfejs do dynamicznego zestawu danych, który jest aktualizowany dziesiątki tysięcy razy dziennie. Za każdym razem, gdy spojrzysz, wyniki będą prawdopodobnie inne. Biorąc to pod uwagę, firma, w której pracuję, nie ma sklepu z aplikacjami dla przedsiębiorstw, co (jak rozumiem) oznacza, że musiałbym opublikować swoją aplikację w zwykłym sklepie z aplikacjami z jakimś kluczem dostępu. > Q1. Czy jest to powszechna praktyka, biorąc pod uwagę, że nie istnieje sklep z aplikacjami przeznaczony dla konkretnej firmy? Zastanawiam się, czy któryś z API kakao pozwala na wschodni dostęp i synchronizację z bazami danych Oracle. > Q2. Jeśli znasz jeden i możesz wskazać mi właściwy kierunek, byłbym bardzo > wdzięczny. Czy jest coś jeszcze, co powinienem wiedzieć, gdy mam do czynienia z takim problemem? Bezpieczeństwo jest oczywiście problemem, dane prawdopodobnie nie będą interesować osoby z zewnątrz, ale z drugiej strony chcemy być tak ostrożni, jak tylko możemy. Proszę daj mi znać


title: Czy podstawową zasadą, czy wysoce pożądaną, jest posiadanie metod klas, które zwracają „$this” zamiast wartości?

text: Naprawdę dopiero zacząłem uczyć się OOP. Zacząłem około rok temu i napisałem prawdopodobnie 15 000 linijek tego. Ale napisałem to wszystko bez żadnego doświadczenia patrząc na OOP innych ludzi. Większość moich funkcji klasowych zwraca wartość lub dokonuje zmiany we właściwościach klasy i zwraca wartość true/false. Niektóre z tych, które zwracają wartość, również zapisują tę wartość we właściwości klasy (po uprzednim sprawdzeniu, czy właściwość klasy jest już ustawiona, co pozwala uniknąć wywołania bazy danych). Teraz dużo grzebię w Magento/Zend i zauważyłem, że wiele ich metod klas zwraca "$this". Jak rozumiem, w przeciwieństwie do zwykłych funkcji, metody klasy, które zwracają $this, działają przez referencję, a nie przez wartość, dzięki czemu otrzymujesz ten sam obiekt, z którym zacząłeś, a nie kopię. Czy zwracanie `$this` jest czymś, co powinienem robić o wiele więcej? Czy ułatwia to utrzymanie i używanie kodu? Czy zwrócenie `$this` jest konieczne, aby połączyć metody klasowe?


title: Znajdowanie wystąpień przydatnych słów i fraz w ciągach

text: Tworzę aplikację, która analizuje posty ludzi, ściągając ich tweety i posty na Facebooku. Muszę przetworzyć wszystkie posty i znaleźć _przydatne_ frazy. Przez użyteczność rozumiem to, że każde słowo lub wyrażenie, które jest rzeczownikiem/przymiotnikiem/czasownikiem, które reprezentuje odrębny przedmiot lub ideę, lub innymi słowy, szukam słów kluczowych. Na przykład, jeśli ktoś zamieścił te trzy posty (w bardzo prostym sensie): „Jestem wielkim fanem progresywnego metalu! to fantastyczne!` `Patrzcie, co znalazłem: nowy zespół progresywnometalowy!` `dobry gatunek w muzyce to progresywny metal` Analizując te proste przykłady, muszę wydobyć `progresywny metal` i `muzykę` z najwyższą ranga występowania. Ale jeśli po prostu przekażę wystąpienia słów, otrzymam "a", "jest", "ja" jako najczęstsze słowa. Jeśli propozycje ujdą mi na sucho, dostanę pojedyncze słowa, takie jak „progresywny”, „metal”, „muzyka”. To, czego naprawdę potrzebuję, to znaleźć frazy takie jak „progresywny metal” czy „progresywna muzyka metalowa”, które razem mają sens. Jako słowo „progresywny” i „metal” mają inne znaczenia, ale wyrażenie „progresywny metal” określa gatunek muzyczny, który nie ma nic wspólnego z samymi pojedynczymi słowami. Iteracyjne wyszukiwanie wystąpienia każdej możliwej frazy we wszystkich postach (np. najpierw wyszukaj „i” we wszystkich postach, potem „jestem”, potem „jestem” itd.) jest niezwykle kosztowne obliczeniowo i nie jest opcją. Przyjrzałem się podobnym pytaniom: Dostępne opcje klasyfikacji słów w tekście? Parsowanie języka w celu znalezienia ważnych słów Ale obie te rzeczy są przesadą, rozwiązując (lub próbując rozwiązać) bardziej ogólne problemy. Mój problem jest bardziej konkretny i myślę o prostszym rozwiązaniu, które nie obejmuje NLP. Można wpaść na pomysł, aby porównać posty z poprawną listą słów/fraz, ale ludzie mogą mówić o nazwie związanej z marką lub konkretnym wydarzeniu, które nie są dostępne w słowniku, takim jak `Twitter API` lub „śmierć Michaela Jacksona”. Obecnie oceniam posty pod kątem polubień użytkownika na Facebooku, co jest dobrym słownikiem poprawnych wyrażeń o użytkowniku, ale zawodzi, gdy jesteśmy na Twitterze, bez pojęcia „polubienia”, stąd brak poprawnego słownika. Czy istnieje prosty sposób sprawdzenia występowania prawidłowych terminów w dużej liczbie zdań? (niekoniecznie poprawne gramatycznie) AKTUALIZACJA: Jest to aplikacja na iOS, więc jestem w Objective-C, aby pamiętać o rekomendacjach bibliotek.


title: Jak sprawić, by moja aplikacja internetowa działała odprężająco

text: Mam aplikację internetową, którą chcę zrobić z RESTful. Oto struktura aplikacji: 1. Najwyższy poziom ma kilka ekranów wyszukiwania, są to w zasadzie zakładki, które przeszukują różne części bazy danych z różnymi parametrami. 2. Po zakończeniu wyszukiwania wyświetlamy wyniki wyszukiwania w nowej zakładce, wewnątrz tej zakładki znajduje się tabela z listą wyników. 3. Z listy wyników możemy przejść do poszczególnych szczegółów dla każdego wiersza (otwierają się one również w nowej zakładce) 4. Wewnątrz szczegółów znajdują się dalsze dodatkowe szczegóły (oraz kilka pod-wyszukiwania związanych z elementem). Te dodatkowe szczegóły są również otwarte w nowej karcie. Więc teraz chcę, aby ta aplikacja była RESTful - celem jest, aby ludzie mogli łatwo udostępniać swoje wyszukiwania i ekrany, mieć prostsze adresy URL, pozbyć się niektórych informacji przechowywanych w sesji. * Czy jest to wykonalne dla projektu, który musimy zrobić, aby był RESTful? * Główną trudnością, jaką widzę, jest to, że mamy wiele kart z różnymi wyszukiwaniami i szczegółami. Jak to odzwierciedlić w adresie URL? * Ponadto wyszukiwanie może być dość złożone – użytkownicy mogą wprowadzić 50 różnych filtrów i wiele identyfikatorów – do tysiąca jednocześnie. Jakie byłoby preferowane rozwiązanie w tym przypadku? Jeśli to nie do końca działa, czy istnieje sposób na umieszczenie kilku kart odpowiadających różnym adresom URL w jednym adresie URL?


title: Jakiego rodzaju abstrakcji/SoC powinienem tutaj użyć?

text: Zaczynam nowy projekt i chcę podążać za wzorcem separacji obaw, a czytałem na ten temat, a teraz mam wątpliwości, jak mam się do tego zabrać. * * * **Oto jak pomyślałem, że powinienem się do tego zabrać:** * Warstwa aplikacji/prezentacji korzysta z warstwy biznesowej. Współpracuje z jednostką _interfejsy_. * Warstwa biznesowa wykorzystuje warstwę dostępu do danych (repozytoria, modele/podmioty). Współpracuje z jednostką _interfejsy_. * Warstwa dostępu do danych współpracuje z bazą danych i korzysta z rozwiązania OR/M - samo rozwiązanie może ulec zmianie. Współpracuje z implementacjami encji, ale zwraca _interfejsy_ do warstwy biznesowej. Warstwa biznesowa otrzymałaby wstrzykniętą konkretną implementację repozytorium. Repozytorium zwracałoby encje w postaci interfejsów, więc warstwa biznesowa nie dbałaby o to, jakiego rodzaju OR/M używamy. Gdybyśmy zdecydowali się przejść z używania np. LLBLGen do NHibernate, zrobilibyśmy co następuje: 1. Zakoduj nowy zestaw klas encji do użycia z NHibernate, ponieważ encje, które mamy zostały wygenerowane przez LLBLGen. 2. Utwórz nową implementację repozytorium, która współpracowała z nowymi encjami + framework. 3. Zamień implementację repozytorium wstrzykiwaną do warstwy biznesowej na nową - repozytorium współpracuje z interfejsami, więc warstwa biznesowa może pozostać niezmieniona. Głównym punktem zainteresowania _(ból)_ tutaj, oprócz konieczności modyfikacji wygenerowanych encji w celu zaimplementowania naszych interfejsów modelu, jest to, że musimy stworzyć **całkowicie nowe encje** tylko dlatego, że zmieniamy frameworki. To samo byłoby konieczne, gdybyśmy zmienili źródło danych na coś, czego nie obsługuje OR/M. Robię to w ten sposób (ponieważ hej, _automatyczne generowanie twoich jednostek to sposób, w jaki zdobywasz wszystkie panie, prawda?)_ , ale potem natknąłem się na ten doskonały artykuł! * * * **Oto jak powinienem się teraz zająć** * Encje są przechowywane w oddzielnej przestrzeni nazw/projekcie - `MyProject.Model` * Warstwa aplikacji/prezentacji używa encji w `MyProject.Model` do wyświetlania rzeczy. Używa warstwy biznesowej do ich pobierania/zapisywania. * Warstwa biznesowa używa również encji w `MyProject.Model`. Używa repozytorium z warstwy dostępu do danych, które jest wstrzykiwane, w zależności od tego, jakiego OR/M używamy * Warstwa dostępu do danych używa frameworków OR/M z **code-first** , więc możemy pracować z `MyProject.Model` niezależnie jakiego OR/M, a nawet źródła danych używamy. * * * Za i przeciw rozwiązania 1: * Zaleta: Może używać Database-First do automatycznego generowania jednostek. Oszczędzacz czasu! * Za: Działa z interfejsami dla encji * Wada: Działa z interfejsami dla encji (może to być zbyt duża abstrakcja?) * Wada: Musisz użyć zupełnie nowego zestawu encji, aby zaimplementować nowy OR/M lub źródło danych. Muszą zostać zmodyfikowane, aby dostosować się do moich interfejsów, prawdopodobnie nie mogą z powodu tego, jak zarządzają relacjami. Wady i zalety rozwiązania 2: * Zaleta: Jednokrotne napisanie encji/modeli, użycie do dowolnej implementacji DAL * Za: Nie ma potrzeby używania interfejsów dla encji * Wady/Zaleta: Utknięcie z kodem najpierw dla każdego OR/M. Z drugiej strony daje Ci pełną elastyczność w tym, jak chcesz, aby wyglądały. * Wada: Niektóre frameworki (np. EF) są po prostu łatwiejsze w użyciu podczas korzystania z DB First. Miałem wcześniej więcej zalet i wad, ale znowu je straciłem. * * * Wniosek: Jakie rozwiązanie byś wybrał i dlaczego? A może masz jeszcze lepsze rozwiązanie? Proszę nie zamykać jako „nie pytanie”, ponieważ naprawdę potrzebuję odpowiedzi. Dziękuję Ci.


title: Biblioteka klienta usługi Storage 2.0 — dlaczego interfejs API nie jest tak intuicyjny w użyciu jak wersja 1.7?

text: Migruję do nowej biblioteki klienta magazynu dla mojego magazynu tabel Azure. **Zapytania z poprzednią przestrzenią nazw _Storage Client Library 1.7_:** var orders = serviceContext .CreateQuery<Order>(tableName) .AsTableServiceQuery<Order>() .Where(e => e.PartitionKey == partitionKey && e.RowKey == rowKey) **Kwerendy przy użyciu nowych klas _Storage Client Library 2.0_:** string partitionKeyFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey); string rowKeyFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, rowKey); string connectedFilter = TableQuery.CombineFilters(partitionKeyFilter, TableOperators.And, rowKeyFilter); var query = new TableQuery<Order>().Where(combinedFilter); var zamówienia = table.ExecuteQuery<Zamówienie>(zapytanie); Proszę mnie poprawić, jeśli się mylę, ale wersja 1.7 jest czystsza, używa jednostek o silnych typach, implementuje interfejs IQueryable i wykorzystuje pełną moc LINQ. Wersja 2.0 sprawia, że czuję się, jakbym ponownie pracował z zestawami danych ADO.NET. Czy kompletnie mi tu brakuje fabuły? Rozumiem, że nastąpiły znaczne ulepszenia wydajności, ale wersja 2.0 wydaje się być obniżoną wersją interfejsu API. Dlaczego nie ma interfejsu `IQueryable<T>` dla 2.0?


title: Makieta obiektu klasy

text: Na przykład mam klasę `ItemDownloader`, która ma metodę `downloadItem`. Ta metoda tworzy instancję innej klasy - `Download`, aby wykonać faktyczne pobieranie. Pytanie brzmi: Chcę przetestować `ItemDownloader` w izolacji, więc prawdopodobnie wyśmieję `Download`. Jak mam to zrobić? PS: Pytanie dotyczy bardziej projektowania niż implementacji, z pewnością mogę zakpić obiekt klasy w językach takich jak Smalltalk lub Objective-C, lub użyć wzorca Prototype w C++. Ale jak rozumiem jest lepsze rozwiązanie.


title: Czym dokładnie jest inżynieria DevOps?

text: Gdyby ktoś pracował jako inżynier DevOps, jakie rzeczy robiłby na co dzień i jakie byłyby jego obowiązki?


title: różnica między Visual Studio i RAD?

text: Jaka jest główna różnica między narzędziem do szybkiego tworzenia aplikacji, takim jak MonoDev i Visual Studio, czy RAD jest bardziej skoncentrowany na jednej rzeczy? Chcę stworzyć aplikację internetową, czy istnieją zalety korzystania z narzędzia do szybkiego tworzenia aplikacji opartego na sieci Web w przeciwieństwie do programu Visual Studio z obsługą platformy .NET Framework 3.5?


title: Informatyka -> Specjalizacja Informatyka?

text: Znajomy powiedział mi "IT to specjalizacja informatyka". Powiedziałem, że nie. Czy on ma rację? Czy ktoś może wyjaśnić różnicę między IT a CS? Wiem, że są ze sobą powiązane, ale według mnie nazywanie IT specjalizacją CS nie ma sensu.


title: Zaczynając od dużego projektu, czy powinienem podzielić go na bardziej zwięzłe części?

text: Tło: Obecnie stażysta w firmie i pracuje nad zmianą przeznaczenia starszych programów (wciąż używanych, ale dla innych działów) do wykorzystania w testowaniu nowego sprzętu. Nowy sprzęt różni się układem rejestrów i interfejsem oprogramowania układowego od starszych wersji sprzętu. Dostałem wolną rękę w konfigurowaniu tego projektu, ponieważ ma on być używany wyłącznie z nowym sprzętem. Obecnie program składa się z jednego pliku .c i 5 różnych plików nagłówkowych. Plik .c ma obecnie ponad 10000 linii i zawiera KAŻDĄ pojedynczą funkcję używaną przez main(). Moje pytanie brzmi, czy powinienem podzielić kod na bardziej rozpoznawalne fragmenty plików .c? Obecnie jest to tylko niewielka irytacja, aby przejść i znaleźć potrzebne mi metody, ale jest to czasochłonne i mam terminy. Jakie są korzyści i kompromisy z takiego postępowania teraz, a nie później? Zamierzam zakończyć przerabianie programu do przyszłego tygodnia (jest to duży optymizm, najprawdopodobniej zajmie to dwa tygodnie), więc czy bardziej efektywne jest rozpoczęcie usuwania i poruszania się po kodzie już teraz, czy też bardziej skorzystam na próbie przebić się przez to, jak jest?


title: styl metra na Windows i Android

text: Chcę stworzyć dość prostą aplikację przy użyciu stylu Windows 8 Metro dla GUI. Ale potrzebuję, aby ta aplikacja miała ten sam wygląd, GUI, dla obu platform, aby użytkownicy końcowi, którzy używają jej zarówno na komputerze, jak i na urządzeniu mobilnym, mieli takie same wrażenia wizualne i bezbłędną nawigację. Czy ktoś ma wiedzę na temat frameworka lub biblioteki Java, aby zaspokoić te potrzeby? A może metoda na stworzenie aplikacji internetowej z wykorzystaniem HTML, PHP, JScript itp. (może coś na lokalnym serwerze, na tej samej maszynie, bo przynajmniej na razie nie dyskutuje się o serwerze WWW)? Pomocny jest również każdy pomysł, metoda, technologia związana z tematem. A jeśli to, o czym myślisz, może być również wykorzystane w IOS, tym lepiej.


title: Jakie są odpowiednie metafory dla kawałków edytora tekstu?

text: Edytor tekstu to skomplikowany twór złożony z wielu warstw i kawałków, ale reprezentuje stosunkowo prostą koncepcję: kartkę papieru z napisem. Prowadzi to do problemu posiadania wielu abstrakcji bez wystarczającej liczby intuicyjnych nazw, aby opisać te abstrakcje. Nie wszystko może być dokumentem. Rozwiązaniem tego rodzaju problemu jest zwykle znalezienie potężnych metafor, które ułatwiają życie. Oto niektóre abstrakcje dla dokumentu, który wymaga intuicyjnych nazw: 1. Struktura danych, która dzieli zwykły tekst na znaczące części, takie jak rozdziały, sekcje, nagłówki i różne rodzaje akcentów. Jest to najbardziej abstrakcyjny dokument, ponieważ unika wszystkich informacji o renderowaniu, takich jak czcionki, kolory, podkreślenia lub wyrównania. 2. Struktura danych dostarczająca tekstowi informacje o renderowaniu, takie jak czcionki, kolory, rozmiary, wyrównania. Reprezentuje to również dokument, ale na poziomie bliższym wydrukowanej stronie. Prawdopodobnie używa instancji pierwszego rodzaju dokumentu, aby pomóc w generowaniu treści. 3. Struktura danych, która układa glify w wiersze tekstu. Ten dokument może mieć numer żądanego akapitu, pozycję w tym akapicie i maksymalną szerokość w pikselach, a tworzy strukturę danych reprezentującą wiersz tekstu gotowego do narysowania. Rozsądne jest oparcie tej abstrakcji dokumentu na instancji poprzedniej abstrakcji dokumentu, ponieważ obie reprezentują dokumenty na różnych etapach procesu renderowania. 4. Ostateczna struktura danych przechowuje wiersze tekstu we względnych pozycjach na ekranie lub stronie. Jest w stanie rysować cały ekran tekstu, wstawiać cyfry i tworzyć kolumny. Wie, która część dokumentu jest aktualnie widoczna, obsługuje przewijanie lub dzielenie dokumentu na strony do wydrukowania. Ta abstrakcja dokumentu jest najbliższa papierowi, ale czy to czyni go najbardziej godnym nazwania go dokumentem, czy też najbardziej abstrakcyjna warstwa jest prawdziwym dokumentem, ponieważ jest to, co naprawdę edytuje użytkownik? Wszystkie cztery koncepcje są na swój sposób dokumentami, ale nie mogę nazwać ich wszystkimi dokumentami; to byłoby mylące. Jaka jest właściwa metafora do użycia tutaj? Coś, co intuicyjnie oddaje złożoność zadania lepiej niż dokument? Ponadto istnieją trzy różne sposoby przedstawiania pozycji w akapicie. 1. Mierzony w znakach od początku akapitu 2. Mierzony jako numer linii rozpoczynający się od pierwszego wiersza akapitu, a następnie mierzony w znakach od początku wiersza 3. Mierzony w pikselach podczas renderowania akapitu na ekranie Wszystkie te trzy reprezentacje są pozycjami, ale wszystko staje się mylące, jeśli nazywam je wszystkimi pozycjami. Potrzebuję prostego sposobu na ich rozróżnienie, czegoś, co dobrze pasuje do ulepszonej metafory, której użyję do rozróżnienia czterech rodzajów dokumentów. Zajrzałem do typografii w poszukiwaniu dobrych metafor, ale nic mi nie wychodzi. Rozważałem również metaforę konstruowania budynku. Pierwszym rodzajem dokumentu może być Plan, drugim może być Fundacja. Niestety #3 i #4 nie są jasne i wydaje się, że nie pomaga to w kwestii pozycji akapitów.


title: Jakieś dobre, łatwe do nauczenia się z książek lub samouczków do nauki montażu?

text: Jestem programistą od 2009 roku i od tego czasu nauczyłem się wielu języków, ale zawsze chciałem zrozumieć i móc kodować w języku najniższego poziomu, aby móc bezpośrednio (lub przynajmniej bardzo blisko bezpośrednio) rozmawiać z maszynami za pomocą mojego kodu. Był taki moment, kiedy ktoś pokazał mi, jak zrobić instrukcję if w asemblerze, ale ze wszystkich książek, które dostałem, nigdy nie mogłem zrozumieć, gdzie/jak zacząć uczyć się kodowania w asemblerze. wszelką pomoc proszę? Mam obsesję na punkcie uczenia się tego! PS: jeśli masz jakieś sugestie dotyczące oprogramowania, używam ubuntu i wkrótce zamierzam przekonwertować na wstecz, więc byłoby lepiej, gdybyś dał mi coś, co będzie łatwe do zainstalowania na debian linux, w przeciwnym razie nie przejmuj się, daj mi nazwę oprogramowania windows i sam znajdę odpowiednik


title: Jak przełamać paradygmat „php to zły język”?

text: PHP nie jest złym językiem (a przynajmniej nie tak złym, jak niektórzy mogą sugerować). Miałem nauczycieli, którzy nawet nie wiedzieli, że PHP jest zorientowane obiektowo, dopóki im nie powiedziałem. Miałem klientów, którzy natychmiast nie ufali nam, gdy mówiliśmy, że jesteśmy programistami PHP i pytają nas o nieużywanie eleganckich języków i frameworków, takich jak Django lub RoR, lub języków „korporacyjnych i solidnych”, takich jak Java i ASP.NET. Facebook jest zbudowany na PHP. Istnieje wiele solidnych projektów, które napędzają sieć, takich jak Joomla i Drupal, które są wykorzystywane w przedsiębiorstwach i rządach. Istnieją frameworki i biblioteki, które mają jedne z najlepszych architektur, jakie widziałem we wszystkich językach (Symfony 2, Doctrine). PHP ma najlepszą dokumentację, jaką widziałem i dużą społeczność profesjonalistów. PHP ma zaawansowane funkcje OO, takie jak odbicie, interfejsy, nie mówiąc już o tym, że PHP obsługuje teraz ponowne użycie poziome natywnie i czysto poprzez cechy. Są źli programiści i dzieciaki skryptowe, które sprawiają, że PHP ma złą reputację, ale jednocześnie wspierają społeczność PHP, a ponieważ tak łatwo jest zrobić rzeczy w PHP, często możesz robić rzeczy w niewłaściwy sposób, oczywiście, ale dlaczego winić język?. Teraz, sprowadzając to do pytania, na które można odpowiedzieć: **co byłoby dobrym, solidnym, krótkim i słodkim argumentem, aby uniknąć krzywizny i uprzedzeń za jednym zamachem i bronić swojego honoru, gdy mówisz, że jesteś programistą PHP ?**. (darmowe ciastko z bitą śmietaną dla tych z empirycznymi dowodami na przekonanie kogoś — klienta lub innego — na miejscu) P.S.: Używamy Symfony, a kod kończy się pięknym i łatwym w utrzymaniu P.P.S.: Facebook **jest** napisany w PHP, skompilowany do C++ przez HipHop i wdrożony na Hadoop. Tutaj: http://arstechnica.com/business/2012/04/exclusive-a-back-the-scenes-look-at-facebook-release-engineering/1/


title: Najlepsza konfiguracja/przepływ pracy dla rozproszonego zespołu do zintegrowanego DSVC z pofragmentowaną ogromną witryną .NET?

text: Mamy więc zespół z 2 programistami i jednym menedżerem. Serwer deweloperski znajduje się w domowym biurze, a serwer na żywo znajduje się w szafie gdzieś obsługiwanej przez większą część mojej firmy. Mamy swobodę robienia, co nam się podoba, ale chcę włączyć dla nas Kiln DSVC i FogBugz z pewnymi standardowymi procedurami, aby nadać sens naszym decyzjom / projektom / celom. Naszym głównym produktem są szkolenia internetowe za pośrednictwem naszej witryny .NET z wieloma filmami itp., a także tworzymy aplikacje mobilne na wiele platform. Nasz kod bazowy to pofragmentowany bałagan sprzed 15 lat. Podejście to polegało na nieuczciwych stronach .asp/.aspx z pewnym zarządzaniem klasami wdrożonymi w ciągu ostatnich 6 lat. Nadal mieszamy nasze html/vb/js w tym samym pliku, gdy dodajemy funkcję/stronę do naszej witryny. Nie oddzielamy logiki biznesowej od reszty kodu. Podłączanie czegokolwiek w VS do Intelli-sense lub testowania lub jakiejkolwiek innej korzyści jest bardziej frustrujące niż jest to warte, ponieważ trzeba ręcznie przestawiać wszystko z powrotem do jednego pliku. Jak podchodzą do tego inne zespoły? Zauważyłem, że kiedy podłączyłem wszystko do VS, chce utworzyć klasę dla wszystkich funkcji. Czy ludzie zwykle kompilują biblioteki DLL dla funkcji specyficznych dla strony, których nie można ponownie wykorzystać? Jakie podejścia mają sens, aby kontrolować nasze praktyki, a jednocześnie nadal być w stanie naprawić stare antywzorce i przestarzały kod, a jednocześnie nadal zmierzać w kierunku logicznej struktury, na której będą mogli budować przyszli deweloperzy?


title: Czy dane wyjściowe przyrostowego kompilatora Java Eclipse są używane w środowisku produkcyjnym? A może to po prostu obsługa funkcji Eclipse?

text: Jestem nowy w Javie i Eclipse. Jednym z moich ostatnich odkryć było to, że Eclipse jest dostarczane z własnym kompilatorem Java (ejc) do tworzenia przyrostowych kompilacji. Eclipse wydaje się domyślnie wyprowadzać przyrostowo skompilowane pliki klas do folderu projRoot/bin. Zauważyłem też, że wiele projektów zawiera pliki ant do budowania projektu, który używa wbudowanego w system kompilatora java do tworzenia kompilacji produkcyjnych. Pochodząc ze świata Windows/Visual Studio, w którym Visual Studio wywołuje kompilator zarówno do produkcji, jak i debugowania, jestem przyzwyczajony do tego, że IDE ma bardziej intymny związek z kompilatorem wiersza poleceń. Jestem przyzwyczajony do projektu _będącego_ plikiem make. Więc mój model mentalny trochę się nie zgadza. Czy to, co jest produkowane przez Eclipse, jest kiedykolwiek używane w produkcji? A może jest zwykle używany tylko do obsługi funkcji Eclipse (tj. jego inteligentnego/przyrostowego budowania/itd.)? Czy to typowe, że w przypadku ostatecznej wersji „wydania” projektu, że ant, maven lub inne narzędzie jest używane do wykonania pełnej kompilacji z wiersza poleceń? Głównie szukam generalnego konwentu w społeczności Eclipse/Java. Zdaję sobie sprawę, że mogą istnieć osoby odstające, które używają ecj w produkcji, ale czy generalnie jest to niemile widziane? Czy jest to normalna/akceptowana praktyka?


title: Dlaczego narzędzia takie jak git-svn, które umożliwiają integrację git z svn, są przydatne?

text: Przeczytałem te powiązane pytania: * Jestem maniakiem Subversion, dlaczego powinienem brać pod uwagę Mercurial, Git lub jakikolwiek inny DVCS? * git dla projektów osobistych (jednoosobowych). Przesada? ...i rozumiem, dlaczego git jest przydatny. Nie rozumiem, dlaczego narzędzia takie jak git-svn, które pozwalają git na integrację z svn, są przydatne. Kiedy na przykład zespół pracuje z svn lub jakimkolwiek innym scentralizowanym SCM, dlaczego członek zespołu miałby zdecydować się na użycie git-svn? Czy istnieją jakieś praktyczne korzyści dla programisty, który musi synchronizować się ze scentralizowanym repozytorium?


title: Automatyzacja tworzenia testów jednostkowych

text: Jakie strategie można wykorzystać do zautomatyzowania tworzenia przypadków testów jednostkowych? Na jakie aspekty należałoby zwrócić uwagę w każdej klasie, aby móc wygenerować przynajmniej przyzwoity szkielet przypadków testowych? Zdaję sobie sprawę, że kompleksowe automatyczne rozwiązanie nie jest praktyczne, ale chciałbym przynajmniej trochę przyspieszyć tworzenie testów, tworząc szkielet. Nie szukam przykładów kodu, może tylko sugestii, od czego zacząć lub przykładów, gdzie coś takiego zostało zrobione, abym mógł zobaczyć, jak podeszli do tego i co może być możliwe. Szczególnie interesują mnie metody tworzenia szkieletów testów jednostkowych w PHP, które nie udostępniają wszystkich narzędzi dostępnych w innych językach, takich jak na przykład kompletne podpowiedzi typu.