title: Czy program obsługi onError jest lepszy niż wyjątki?

text: Rozumiem, że wyjątek w programie oznacza, że wydarzyło się coś nieprzewidywalnego (ale nie tak źle, że nieunikniona awaria aplikacji!). Sekwencja try-catch-finally smuci mnie, ponieważ program jest trudniejszy do odczytania (jeden poziom nawiasów klamrowych więcej) i trudniejszy do zrozumienia (skok z dowolnego miejsca, aby złapać w przypadku wystąpienia wyjątku, jest to przestarzałe GOTO). Ponieważ mamy OOP, sugeruję stworzyć klasę proxy, która w przypadku wyjątku po cichu ją zużyje, zwróci wartość domyślną i wywoła zdarzenie onError. Więc jeśli propagujemy wyjątek, zamiast tego mamy wywołanie onError, a dwie wady wymienione powyżej zostaną rozwiązane. Zobacz przykład w C#: **Standardowa postawa wyjątków** class Computer { // powiedzmy, że musimy propagować wyjątek i zdecydować, co ostatnio zrobić public int divide(int a, int b) { int result = a / b; zwróć wynik; } } class Program { public static void Main() { Computer c = new Computer(); spróbuj { Console.WriteLine(c.divide(1, 0)); } catch(ArithmeticException e) { // jesteśmy tu teleportowani ze środka metody Computer.divide! // zrób coś } } } // trzy poziomy nawiasów (bez przestrzeni nazw) w tak trywialnym przykładzie?? **onError handler nastawienie** class ProxyComputer { private Computer c = new Computer(); // nie jest wirtualny, nie można go przesłonić public int divide(int a, int b) { // niestety wyjątki są standardowe, ale możemy je zatrzymać w tej klasie try { return c.divide(a, b); } catch(ArithmeticException e) { this.onError(e); } } protect virtual void onError(Exception e) { // nic nie rób } } class MoreStrictComputer : ProxyComputer { protected override void onError(Exception e) { // wyślij do działu IT, cofnij wszystkie transakcje itp. Console.WriteLine("Mogę „wydaje się to robić”); } } class Program { public static void Main() { ProxyComputer pc = new ProxyComputer(); MoreStrictComputer msc = nowy MoreStrictComputer(); // uruchamia onError zamiast wyjątku Console.WriteLine(pc.divide(1, 0)); // nie ma problemu Console.WriteLine(msc.divide(1, 0)); // tym razem nie będzie to takie proste } } // tylko dwa poziomy nawiasów Często widzę puste (lub trywialne) bloki catch. Oznacza to, że programiści często uważają wyjątek za sytuację bezproblemową, ale przy standardowym nastawieniu do wyjątków nadal muszą zawracać sobie głowę próbami złapania. Druga postawa sprawia, że jest to opcjonalne. **Pytanie brzmi:** Które rozwiązanie wolisz? Czy to jakiś wzór, czy czegoś mi brakuje? **Edytuj** Jak sugeruje Paul Equis, „rzut e;” powinien być domyślnym zachowaniem błędu, a nie połykaniem milczenia „nic nie robienie”.


title: Czym jest Bootstrapper w programowaniu?

text: Czasami widzę termin „Bootstrapper”. Widziałem to ostatnio podczas tworzenia ćwiczeń edukacyjnych dla Prism. Natknąłem się na klasę `UnityBootstrapper`. Moje pytanie brzmi: kiedy nazwałbyś zajęcia „Bootstrapperem”? Czemu? Co to mówi o klasie?


title: Inspirowanie współpracownika do przyjęcia lepszych praktyk kodowania?

text: W pytaniu dotyczącym obsługi mojego przestarzałego współpracownika różne osoby omawiały strategie postępowania ze współpracownikami, którzy _nie chcą_ integrować swojego przepływu pracy z pracą zespołu. Chciałabym, jeśli to możliwe, nauczyć się kilku strategii „nauczania” współpracownika, który jest jedynie „ignorantem” nowoczesnych technik i narzędzi, a być może jest trochę apatyczny. Zacząłem pracować z programistą, który do niedawna pracował we względnej izolacji, w innej części firmy. Posiada rozległą wiedzę dziedzinową, a co najważniejsze wykazał się dobrymi _umiejętnościami rozwiązywania problemów_, czego wielu kandydatom wydaje się brakować. Jednak rzeczywisty kod (C#), który widziałem, jest powrotem do dni VB6. Struktura proceduralna, notacja węgierska, zmienne globalne (nadużywanie `static`), brak interfejsów, brak testów, nieużywanie Generics, rzucanie `System.Exception`... masz pomysł. Ten programista jest trochę starszy ode mnie i, przynajmniej na pierwszy rzut oka, nie aktywnie _szuka_ pozytywnych zmian. Nie powiem _odporny_ na zmianę, bo **myślę, że jest to w dużej mierze kwestia tego, jak poruszany jest temat** i chcę być przygotowany. Programiści to zazwyczaj uparci ludzie, a wchodzenie z bronią palną i wprowadzanie przeglądów kodu typu „zgrywaj na strzępy” i ściśle egzekwowanych zasad najprawdopodobniej _nie_ przyniesie oczekiwanego przeze mnie wyniku końcowego. Gdyby to był nowy pracownik, młodszy programista, nie zastanawiałbym się dwa razy nad przyjęciem postawy „mentora”, ale jestem bardzo ostrożny, aby traktować doświadczonego pracownika jako nieświadomego nowicjusza (którym nie jest – po prostu nie ma nadążać za pewnymi postępami w tej dziedzinie). Jak mogę podnieść standard jakości kodu tego programisty w sposób Dale Carnegie, poprzez delikatną perswazję i niematerialne zachęty? Jaka byłaby najlepsza strategia wprowadzania subtelnych, stopniowych zmian, **bez tworzenia sytuacji kontradyktoryjnej?** Czy inni ludzie - zwłaszcza główni programiści - byli już w tego typu sytuacjach? Które strategie skutecznie wzbudziły zainteresowanie i stworzyły pozytywną dynamikę grupy? Które strategie _nie_ się nie udały i lepiej byłoby ich unikać? * * * ## Wyjaśnienia: Naprawdę czuję, że kilka osób odpowiada na podstawie osobistych odczuć, nie czytając właściwie wszystkich szczegółów pytania. Proszę zwrócić uwagę na następujące rzeczy, które powinny być sugerowane, ale teraz wyjaśniam to wyraźnie: * Ten współpracownik jest tylko moim „seniorem” z racji wieku. Nigdy nie powiedziałem, że jego tytuł, sfera wpływów, czy lata w organizacji przewyższają mój i tak naprawdę żadna z tych rzeczy nie jest prawdziwa. Jest programistą LOB, który został wchłonięty przez główny sklep deweloperski. Otóż to. * Nie jestem nowo zatrudnionym, młodszym programistą ani innym naiwnym idiotą z wielkimi planami przekształcenia firmy z dnia na dzień. Zasadniczo odpowiadam za proces tworzenia oprogramowania, ale jak wielu z tych, którzy pracowali jako „liderzy”, wie, że obowiązki nie zawsze są ściśle skorelowane ze schematem organizacyjnym. * **Nie** pytam ludzi, jak _dostać swoją drogę, przyjdź do piekła lub na wodę_. Mógłbym to zrobić, gdybym chciał, w wyniku czego ta osoba poczułaby urazę i/lub zrezygnowałaby. Proszę spróbuj zrozumieć, że szukam **społecznej**, **spółdzielczej** metody wprowadzania zmian. * Wzmianka o _"...zmiennych globalnych... bez testów... rzucanie `System.Exception`"_ miało na celu zademonstrowanie, że _problemy nie są tylko powierzchowne czy estetyczne_. Praktyki, które mogą działać w przypadku stosunkowo małych aplikacji CRUD, niekoniecznie działają w przypadku dużych aplikacji korporacyjnych. W rzeczywistości żaden z dotychczasowych kodów nie przeszedł testów integracji. Proszę, postaraj się potraktować to pytanie w dobrej wierze, zaakceptuj, że właściwie wiem, o czym mówię, i albo **odpowiedz na pytanie, które zadałem**, albo przejdź dalej. _PS Moja najszczersza wdzięczność dla tych, którzy -udzielili- konstruktywnych rad, zamiast dyskutować z przesłanką. Zostawię to otwarte przez chwilę dłużej, ponieważ mam nadzieję, że usłyszę więcej na temat doświadczeń w świecie rzeczywistym._


title: Argumenty za przechowywaniem asocjacji binarnych w pojedynczym polu czy w tabeli mapowania?

text: Kiedy rysujesz granicę między tabelami relacyjnymi a polami zawierającymi wiele wartości określonego typu. Pozwolę sobie zilustrować na poniższym przykładzie, gdzie PokeMaster może być powiązany z wieloma pokemonami o nieznanej liczbie. TablePokeMasters PokeMasterId PokeMasterName TablePokeMastersToPokemon <- Pytanie poboczne, jaka jest dobra konwencja nazewnictwa dla tabeli łączącej? PokeMasterId PokemonId TablePokemon LinkId PokemonId PokemonName Vs Table PokeMasters PokeMasterId PokeMasterName PokeMasterPokemon (np.: Picachu, Charizard, Blastoise) <- przeanalizuj to w kodzie Jest to druga metoda preferowana w stosunku do pierwszej, w której istnieje nieznana liczba relacji między tabelami ? Jedyną wartością, jaką widzę w drugiej metodzie, jest mniejsza liczba tabel i łatwiej jest zobaczyć relacje bezpośrednio w jednej tabeli, zamiast budować zapytania, aby zobaczyć relacje.


title: Używanie Bit Torrent do wewnętrznego zarządzania wydaniami

text: Obecnie nadużywamy naszego systemu kontroli wersji i używamy go... w zasadzie jako FTP do przechowywania binariów o dużych wydaniach (4+ GB). Staramy się odejść od tej straszliwej praktyki, która powoduje i nadal przenosi i zabiera coraz więcej zasobów IT, jednocześnie utrudniając procesy integracji i wydawania. Rozwiązaniem byłoby wykorzystanie udostępniania plików P2P do dystrybucji tych obrazów/plików binarnych wydań, mieszanie serwerów plików i niektórych maszyn użytkowników kluczowych jako nasion. Więc moje pytanie składa się z dwóch części: 1. Czy ktoś z was uciekł się do skonfigurowania BitTorrenta w swoim intranecie, aby dystrybuować obrazy/pliki binarne? Jeśli nie, co sądzicie o tym pomyśle (który nie był właściwie mój, ale ja myślę, że to jest świetne) 2. Czy istnieje oprogramowanie internetowe typu open source do obsługi publikowania trackerów BitTorrenta?, aby można było przeszukiwać nowe wydanie i wyświetlać jego dostępność w odniesieniu do nasion i pijawek? (...wiesz o czym mówię) Edytuj: Intranet jest globalny (np. USA, Chiny, Niemcy, Meksyk). Zwykły FTP może działać, ale nie jest tak opłacalny.


title: Niejednoznaczne użycie „Kontrolera” w MVC

text: Słyszałem dwa oddzielne zastosowania terminu _kontroler_, kiedy mówię o metodologii _Model View Controller_. 1. Pośrednia sekcja kodu, która komunikuje się między Modelem i Widokiem, wiążąc je ze sobą. 2. Moduł zajmujący się wejściem, podobnie jak widok zajmuje się wyjściem. Na początek, **która definicja jest poprawna?** Czytałem więcej, że używa się pierwszej definicji niż drugiej, przy czym druga jest pierwszą, której się nauczyłem. Ponadto wydaje mi się, że obie te rzeczy są przydatne - rzeczywiście, kiedy używałem projektów typu MVC, używałem obu tych rzeczy w jakiś sposób (nawet jeśli kiedykolwiek nazywałem tylko jedną z nich kontrolerem ). **Czy MVC naprawdę powinien być zdefiniowany w sposób, który obejmuje obie te rzeczy?** Oznaczałoby to, że architektura zawiera model, moduł wejściowy, moduł wyjściowy i moduł pośredni, który łączy je wszystkie, a to po prostu sprawia, że sens do mnie.


title: Jak zapewnić publiczny interfejs API z możliwością zapisu i uniknąć spamowania?

text: Powiedzmy, że masz witrynę taką jak StackExchange. Teraz wyobraź sobie, że stworzyłeś API z możliwością zapisu maszynowego, które może publikować pytania i komentarze oraz robić wszystko, co potrafi Twoja przeglądarka. Oczywiście po około 5 minutach od uruchomienia miałbyś tyle spamu, że prawdopodobnie zabrakło Ci miejsca na serwerach baz danych i znalazłbyś się na stałe na czarnej liście w każdej wyszukiwarce (z wyjątkiem może Ask :) ) Więc jak czy możesz uniknąć tego spamu, jednocześnie pozwalając maszynie na faktyczne korzystanie z twojego API (i/lub zaangażowanie w automatyzację? Czy jest to możliwe w dzisiejszych czasach? Spodziewam się, że na końcu jest ludzki moderator, ale jak to zrobić ograniczyłeś większość spamu do środków, które mogą być obsługiwane przez ludzkich moderatorów?


title: Narzędzia dla niezależnych programistów internetowych

text: W wolnym czasie myślę o freelancerze i budowaniu stron internetowych. Mam doświadczenie w C#/ASP.NET, JavaScript/jQuery oraz HTML/CSS i SQL. Dlatego czuję, że mam wystarczającą wiedzę o technologiach internetowych, aby iść tą ścieżką. Nie jestem pewien, czy istnieją narzędzia, które można wykorzystać do uproszczenia życia niezależnego web-deva. Jako przykład, kiedyś zaprojektowałem stronę e-commerce od podstaw jako projekt uniwersytecki, co zajęło mi około 3 miesięcy ciężkiej pracy. Gotowy produkt nie był nawet hostowany, a ja nie zagłębiałem się w żadne aspekty bezpieczeństwa. Nigdy wcześniej nie prowadziłem nawet strony internetowej ani bazy danych! Martwi mnie to, że istnieją miliony witryn, które można wykorzystać na przykład do stworzenia witryny e-commerce w kilka minut. Bez zawracania sobie głowy bazami danych, bezpieczeństwem i innymi kwestiami. Nie musisz nawet wiedzieć, jak kodować w technologiach po stronie serwera, aby uruchomić te witryny. Czy profesjonalni twórcy stron internetowych faktycznie korzystają z tych narzędzi? Jeśli klient musiałby poprosić o witrynę e-commerce (na przykład), jak profesjonalista poradziłby sobie z jej opracowaniem? Dużo słyszę o systemach CMS, takich jak Joomla i Wordpress, ale myślę, że moim głównym problemem jest to, że niewiele wiem o dostępnych narzędziach (poza Visual Studio) i nie wiedziałbym od czego zacząć. Czy ktoś może mnie poprowadzić we właściwym kierunku?


title: Jak ustalacie cenę swojego kodu źródłowego?

text: Poproszono mnie o sprzedaż kodu źródłowego (wraz z dotychczasowymi użytkownikami) małej aplikacji użytkowej, którą stworzyłem lata temu. Badałem, jak wycenić kod źródłowy, ale jak dotąd nie znalazłem dobrego rozwiązania. Przeszukałem sieć, ale nie znalazłem niczego użytecznego. Potem natknąłem się na kilku innych, którzy również sprzedawali swój kod źródłowy użytkownikom, ale ich ceny wydają się nierealistycznie wysokie. Na przykład jedna osoba obliczyła cenę za użytkownika na około 200 USD. Miał 80 użytkowników i ostatecznie sprzedał źródło z użytkownikami za 30 tys. Jak wymyślił tę cenę? Czy mogę znaleźć dobrą cenę za pomocą tego wzoru: > (liczba użytkowników x cena aplikacji) + (cena aplikacji x liczba nowych użytkowników w ciągu jednego roku) ? Jeśli to dobra formuła, jak wycenić źródło, które nie ma jeszcze użytkowników?


title: Czy to, co ktoś publikuje w Internecie, jest uczciwą grą, gdy rozważa zatrudnienie jako programista?

text: (Pierwotnie opublikowane na Stack Overflow, ale tam zamknięte i bardziej istotne tutaj) Więc najpierw przeprowadziliśmy wywiad z facetem do roli technicznej i był całkiem dobry. Przed drugim wywiadem wygooglowaliśmy go i znaleźliśmy jego stronę MySpace, która, delikatnie mówiąc, mogła zostać uznana za nieodpowiednią. Żeby było jasne, nie było wątpliwości, że to jego strona (nazwisko, zdjęcia, pasujące informacje biograficzne itd.). Treść była całkowicie osobista i nie miała żadnego związku z jego umiejętnościami zawodowymi lub postawą. Czy uczciwe jest rozważenie tego, gdy zastanawiasz się, czy zaoferować im pracę? W większości sytuacji moja odpowiedź brzmiałaby, że to, co dzieje się w czyimś prywatnym życiu, jest jego własnym dziełem. Czy jednak dla każdego technicznego, który deklaruje (w sposób dorozumiany lub wyraźny), że rozumie Internet i oferowane przez niego możliwości, publikowanie rzeczy w sposób, który można tak oczywiście wykryć, jest poważnym błędem w ocenie? EDIT: Wyjaśnienie - zasadniczo był to dość graficzny komentarz do pornografii (ale, powiedzmy, nieakademicki charakter). Właściwie bardziej interesuje mnie ogólna koncepcja niż konkretny incydent, ponieważ jest to coś, co prawdopodobnie zobaczymy w przyszłości, gdy ludzie będą coraz więcej umieszczać siebie w Internecie. Moje obawy nie dotyczą przede wszystkim niego i tego, jak myśli o takich rzeczach (jest biały, hetero, mężczyzną i ostatnią możliwą ofiarą dyskryminacji na planecie w tym sensie), bardziej jak to odbija się na firmie, że bardzo proste wyszukiwanie ( w zasadzie jego imię) zwraca te rzeczy i klienci również mogą to zrobić. Pracujemy w stosunkowo konserwatywnej branży.


title: Dlaczego programista z doktoratem jest złym kandydatem na pracodawcę?

text: Znalazłem ten komiks na blogu Steve'a Hanova: ![tu wpisz opis obrazu](http://stevehanov.ca/blog/resume_comic.png) Większość punktów jest oczywiście prawdziwa. Nie mogę pojąć, dlaczego _doktorat jest uważany za „złą rzecz”_? ![tutaj podaj opis obrazu](http://i.stack.imgur.com/k5jlX.jpg) Masz jakieś przemyślenia?


title: Jak radzisz sobie z nudnymi, powtarzalnymi zadaniami i czynnościami?

text: Kiedy napotykasz w swojej pracy jakieś nudne, powtarzalne (być może nieprogramistyczne) zadanie, jak sobie z tym radzisz? Czy od razu próbujesz to zautomatyzować? Czy odkładasz automatyzację, aż dwukrotnie napotkasz zadanie? Czy próbujesz to delegować? Czy starasz się znaleźć w nim coś interesującego? Co robisz, aby praca była bardziej radosna? Dowiedz się głębiej, aby uczynić go bardziej interesującym? Ucz się głębiej od razu lub kiedy potrzebujesz tego regularnie?


title: Czy Oberon naprawdę jest „lepszym Pascalem”?

text: Czytając Niklausa Wirtha, można zauważyć, że mimo pewnej popularności Pascala, nie cieszy się, że Oberon (jako „wypolerowany” następca Pascala i Moduli) nie zdobył dużej popularności. Nigdy nic nie robiłem w Oberonie, ale czytając stronę Oberon Dla programistów Pascala naprawdę nie podobało mi się wiele zmian jako programista Delphi/pascal, na przykład * zmuszanie zarezerwowanych słów do zapisywania zawsze wielkimi literami * rozróżnianie wielkości liter w języku * pozbycie się typów wyliczeń Co sądzisz o Oberonie, czy z twojego punktu widzenia jest to naprawdę "lepszy Pascal"?


title: Certyfikacja Oracle Java SE

text: * Które egzaminy należy zdać w celu uzyskania certyfikacji Java firmy Oracle. * czy egzamin Oracle 1Z0-851 jest starym SCJP? * Polecić książkę, która obejmuje egzamin Oracle 1Z0-851?


title: Co oznacza propagowanie wartości?

text: To może być głupie pytanie, ale pracuję nad algorytmem, który oblicza przedziały dla zmiennych w określonych ograniczeniach. Na przykład istnieje funkcja o nazwie propagateValues, a jej opis to `Propaguj zakresy wartości dla podanych ograniczeń` Co dokładnie oznacza propagacja wartości? Algorytm, nad którym pracuję, zasadniczo próbuje uprościć zestawy ograniczeń, wykonując analizę zakresu/przedziału przed zapytaniem solvera o możliwe rozwiązanie (aby rozwiązywanie zestawów ograniczeń było bardziej wydajne)


title: najprostszy sposób na powiadomienia push

text: Chciałem zaimplementować powiadomienia push w czasie rzeczywistym do jednej z aplikacji napisanych w RoR. Nie mam żadnego doświadczenia z nodejs, nowjs, express ani socketio. Jaki byłby najłatwiejszy sposób na wdrożenie systemu powiadomień push w czasie rzeczywistym?


title: gdzie jest dobry opis użycia słowa „zakres” w informatyce?

text: Gdzie jest dobry opis użycia słowa „zakres” w informatyce? W tym poście z pytaniem o ostatnie słowo zastrzeżone Java jeden z odpowiadających sugeruje, że zakres jest tekstowy, więc każda iteracja pętli „for” powoduje wznowienie zakresu jako bieżącego. Inny respondent sugeruje, że zakres jest zależny od czasu, więc każda iteracja jest nowym zakresem. W tych kontekstach można było zrozumieć, co oznacza zakres, nawet jeśli różni ludzie używają tego słowa w różny sposób, ale czasami, gdy czytam książkę o programowaniu, nie jestem pewien, co oznacza zakres. Jakie są dobre kwalifikatory słowa „zakres”? Sugeruję, że jednym z nich jest „tekstowy”. Czy myślisz o innych? Czy kwalifikator powinien być prawie zawsze używany, czy też istnieje ogólne zrozumienie kontekstów, które pomagają doskonale wywnioskować zamierzone znaczenie? W jaki sposób używa się słowa „zakres”, gdy mówimy o obiektach (i programowaniu obiektowym) i jakie kwalifikatory mogą być konieczne?


title: Wstrzyknij określone klasy lub nie

text: Mam interfejs TableSqlBuilder, który ma metodę getCreateTableSql. Ten interfejs jest używany w kilku innych klasach w następujący sposób: function createTable( $tableDefinition ) { $sql = $this->tableSqlBuilder->getCreateTableSql( $tableDefinition ); $this->db->execute( $sql ); } Interfejs TableSqlBuilder ma wiele implementacji, takich jak SQLiteTableSqlBuilder i MySQLTableSqlBuilder. SQLiteTableSqlBuilder pierwotnie stworzył cały SQL i miał metody tworzenia SQL dla indeksu lub pola. Okazało się, że funkcjonalność tych metod była potrzebna w innych miejscach, więc została podzielona na SQLiteFieldSqlBuilder i SQLiteIndexSqlBuilder. Te klasy są tworzone przez SQLiteTableSqlBuilder — w związku z tym nie są wstrzykiwane, a SQLiteTableSqlBuilder zależy od tych konkretnych klas. Nie jestem pewien, czy należy to zmienić, aby wstrzyknąć te konstruktory pól i indeksów sql. Z jednej strony daje to większą elastyczność. Pozwala także na wyśmiewanie tego zachowania w testach. Z drugiej strony wiązanie i elastyczność są obecnie takie same, jak przed podzieleniem kodu na nowe klasy. W przypadku podejścia wstrzykiwania akceptowanymi typami mogą być FieldSqlBuilder i IndexSqlBuilder, oba interfejsy zaimplementowane przez obecne klasy betonu. Oznacza to jednak, że można szczęśliwie skończyć z MySqlIndexBuilder w SQLiteTableBuilder, czego wyraźnie należy unikać. Można również wpisać wskazówkę dotyczącą konkretnej klasy, udając, że jest to interfejs, który pozbywa się zależności, o ile konstrukcja odbywa się poza konstruktorem sql tabel. Czy uważasz, że ci współpracownicy powinni zostać wstrzyknięci, czy jest to ważny wyjątek, w którym lepiej nie iść do końca?


title: Chcę programować!

text: Jestem bardzo zainteresowany nauką programowania, ale nie jestem pewien, czy chcę skłaniać się w kierunku tworzenia stron internetowych, czy programowania. A może programowanie komputerowe obejmuje jedno i drugie? Gdzie powinienem lub jak powinienem zacząć?


title: Adresy URL ze zmiennymi ciągami zapytań i pamięcią podręczną

text: Zajmuję się tworzeniem serwera mediów, podstawową funkcjonalnością jest obsługa obrazu, co odbywa się w następujący sposób /media/:id gdzie :id to identyfikator obrazu. Możesz poprosić o konkretny rozmiar, z kilkoma zasadami, które podam. Np.: /media/:id/50x50 /media/:id?witdh=50&height=50 Pytanie: Która opcja jest Twoim zdaniem lepsza? Uważam, że ten drugi będzie bardziej RESTful i piękny, ale będziemy używać CDN i lakieru do pamięci podręcznej, więc jeśli otrzymamy /media/:id?width=50&height=50 lub /media/:id?height=50&width= 50 będziemy mieli 2 trafienia, kiedy powinniśmy mieć 1 Jakieś rady?


title: Czy jako firma z siedzibą w Europie można napisać własną aplikację na iPada dla klienta?

text: Nasz klient chce, abyśmy napisali dla niego niestandardową aplikację, z której będzie mógł korzystać na kilku iPadach w swojej firmie. Ta aplikacja jest prawdopodobnie przydatna tylko dla tego jednego klienta (może dla dwóch lub trzech kolejnych w przyszłości, ale dopiero po dodatkowej personalizacji). Czytałem, że jeśli klient zapisze się do programu zakupów grupowych Apple, jesteśmy w stanie dostarczyć mu niestandardową aplikację B2B. Wydaje się jednak, że ogranicza się to do programistów z USA (lub klientów? czy obu?). Jakie są alternatywy dla europejskich (lub ogólniej, spoza USA) programistów i ich lokalnych klientów?


title: HTML – alternatywa dla identyfikatora, gdy identyfikator jest unikalny tylko w określonym zakresie?

text: Więc uważam, że to powinno być częste pytanie, ale nie mogę znaleźć odpowiedzi. Może używam niewłaściwej terminologii. Założenia: * Identyfikatory powinny być unikalne w całym dokumencie. * Atrybuty klas są przeznaczone dla CSS i nie powinny być używane w selektorach JS. * Atrybuty nazw nie są odpowiednimi zamiennikami identyfikatorów, ponieważ nie działają tak samo na wszystkich elementach, a specyfikacja html 5 je zmieniła (chyba usunięto z niektórych elementów). Dajmy więc coś takiego: Strona ma wielokrotność tego samego widżetu. Każdy widżet ma unikalny identyfikator. Muszę mieć możliwość odwoływania się do podelementów widżetów, takich jak `$("#widgetID relativeID")`. Tak więc identyfikatory względne są unikalne w ramach widżetów, ale mogą być duplikowane poza tym zakresem. Używałem nazwy do tego, ale wygląda na to, że to nie jest właściwy sposób Co to jest?


title: Czy ktoś uczy zastosowania etyki w programowaniu?

text: Pytania etyczne pojawiają się coraz częściej w wiadomościach i mogą być podstawą życia programistów. Kilka razy w tym roku poproszono mnie o radę, która sprowadza się do odpowiedzi na pytania etyczne w kontekście programowania komputerowego, i byłem zaskoczony, widząc, jak wiele niepokojących i kłopotliwych pytań, które uważam za trywialne, mogą prowadzić. Czy istnieją kursy lub programy specjalizujące się w nauczaniu tego, czego oczekuje się od etycznego programisty? Czy ktoś gdzieś ułożył formalny program nauczania?


title: czy właściciel produktu powinien być w zespole zarządzania produktem?

text: Czy właściciel produktu powinien być idealnie częścią zespołu zarządzającego produktem? Jak radzić sobie z wewnętrznymi udziałowcami, jeśli właściciel produktu jest poza zespołem zarządzającym produktem? Mieliśmy problemy, ponieważ właściciel produktu nie był częścią zespołu zarządzającego produktem i było wiele konfliktów.


title: Czy ma sens generowanie klas Java z diagramu klas?

text: Skoro projektujemy i analizujemy przed rozwojem, czy nie byłoby wygodnie generować klasy Java z diagramu klas? To promowałoby bardziej wyczerpujący projekt i lepsze kody, prawda? To dziwne, że Google zwraca masę narzędzi do generowania diagramu klas z klas Javy, a nie na odwrót.


title: Wzorzec do „atomowej” aktualizacji pary obiektów

text: Czy istnieje standardowy wzorzec w OOP do pewnego rodzaju „atomowej” aktualizacji pary obiektów, takich jak para kont bankowych w transakcji? Chciałbym mieć jakoś ujawnioną pojedynczą metodę publiczną, która robi to wszystko na raz, ale może wymyślić tylko sposoby na zrobienie tego poprzez wykonanie _dwóch_ wywołań metod publicznych do oddzielnej aktualizacji obiektów. Obecnie eksperymentuję z _Racket_ , ale doceniłbym przykłady w dowolnym języku lub opis standardowego wzorca. * * * Oto przykład tego, co eksperymentowałem w _Ruby_ (z czym czuję się bardziej komfortowo niż z _Racket_ ). Nie chodzi mi tutaj o blokowanie, tylko o interfejs klasy. class Account def initialize(total) @total = total end def total @total end def transfer_to(inny, sum:) change_total_by(-sum) another.change_total_by(sum) end protected def change_total_by(sum) @total += sum end end a = Account.new(10) b = Account.new(20) a.transfer_to(b, sum: 5) print "Nowe a.total = #{ a.total },\nnew b.total = #{ b. total }" Działa to przy użyciu `protected` zamiast `private`.


title: Wada korzystania z metody statycznej

text: W przypadku metod, które **nigdy nie uzyskują dostępu do zmiennej instancji lub zmiennej statycznej** i działają jak funkcja (oddzielona od nazw) i są deterministyczną bazą tylko na argumentach wejściowych , chcę zapytać, czy należy rozważyć, czy zmienię wszystkie z nich do metody statycznej? Ciągle słyszę, jak ludzie mówią, że metoda statyczna jest słaba, ale szukam prawdziwego przykładu kodu w moim powyższym przypadku.


title: Teoria systemów operacyjnych - przy użyciu minimalnej liczby semaforów

text: Ta sytuacja jest podatna na zakleszczenie procesów w systemie operacyjnym i chciałbym ją rozwiązać przy minimum semaforów. Zasadniczo istnieją trzy współpracujące procesy, które odczytują dane z tego samego urządzenia wejściowego. Każdy proces, po otrzymaniu urządzenia wejściowego, musi odczytać dwie kolejne dane. W tym celu chcę użyć wzajemnego wykluczenia. Semafory powinny być używane do synchronizacji: P1: P2: P3: input(a1,a2) input (b1,b2) input(c1,c2) Y=a1+c1 W=b2+c2 Z=a2+b1 Drukuj (X) X=Z-Y+W Deklaracja i inicjalizacja, które moim zdaniem zadziałałyby tutaj to: `semafor s=1` `sa1 = 0, sa2 = 0, sb1 = 0, sb2 = 0, sc1 = 0, sc2 = 0` Jestem pewien, że każdy programista jądra, który się z tym zdarzy, może to wyeliminować za minutę lub 2. Schemat współpracujących procesów i jednego urządzenia wejściowego: ![tutaj wpisz opis obrazu](http://i.stack.imgur.com /zQyu7.png) Wygląda na to, że `P1` i `P2` uruchomiłyby coś w stylu: `wait(s)` `input (a1/b1, a2/b2)` `signal(s)`


title: Dlaczego precyzja liczbowa SQL jest określona jako liczba cyfr?

text: Rozumiem, że to może być trudne pytanie. Na przykład w Sql Server 2008 wykonanie `DECLARE @someNum NUMERIC(10);` oznacza, że zakres zmiennej będzie ograniczony do 10 cyfr. W innych językach, takich jak C, Java itp. standardy przedstawiania liczb całkowitych i ułamkowych są różne. Zakres wartości jest podzielony na wielokrotności bajtów, co jest zrozumiałe ze względu na sposób działania sprzętu. Język może zapewnić coś, czego większość sprzętu jeszcze nie obsługuje, na przykład 256-bitowy typ liczby całkowitej, który będzie działał szybko na komputerze 64-bitowym, jeśli zostanie poprawnie zaimplementowany. Wydaje się, że typy liczbowe w bazach danych nie są związane z podstawowym sprzętem. Rozumiem, że wartości mogą wymagać wartości zerowej, co może kosztować trochę lub dwa, ale dlaczego taka arbitralna precyzja, która wydaje się nie optymalizować szybkości przechowywania lub obliczeń? Być może bazy danych nie muszą często wykonywać obliczeń numerycznych. Być może szerokość cyfr w kolumnie jest naturalnym rozszerzeniem szerokości znaków. Może SQL miał być językiem nieprogramistycznym (bo brzmi jak angielski :) )? Być może historia przybrała dziwny obrót, na przykład taki, który pozwolił na prosperowanie gorszego formatu VHS. Proszę, pomóż mi to zrozumieć.


title: Wzorzec projektowania transakcji dla MVC i lokalizacja odpowiedzialności?

text: Projektuję dość standardową aplikację Spring MVC i próbuję ustalić, gdzie powinna spoczywać odpowiedzialność za zarządzanie transakcjami. Czytałem Java Transaction Design Strategies, a ta, która moim zdaniem najlepiej pasuje, to Server Delegate, gdzie kontroler jest tym, co zarządza transakcjami, a usługi i DAO są nieświadome transakcji. Jakoś to nie jest w porządku. Moje przeczucie jest takie, że usługi są tymi, które powinny kontrolować transakcje, ale mam przypadki, w których kontroler może wywołać kilka usług w celu wykonania akcji. Jak wcześniej obsługiwałeś Transakcje w aplikacjach MVC i gdzie Twoim zdaniem jest najlepsze miejsce do obsługi transakcji?


title: przesyłanie baz danych MS Access do sieci

text: Znalazłem łatwy system do przesyłania przeszukiwalnych baz danych MS Access do sieci - nazywa się Caspio Online (http://www.caspio.com/). Jednak wolałbym nie płacić miesięcznej opłaty tylko za wgrywanie baz danych na naszą stronę internetową. Czy ktoś zna alternatywę open source, która pozwoliłaby mi przesłać bazę danych MS Access 2007 na stronę internetową, a następnie zbudować formularz internetowy, który ją przeszuka? Im łatwiejsza realizacja, tym lepiej :)


title: Co stanowi dobre pytanie na rozmowę kwalifikacyjną dla młodszego kandydata?

text: Kilka dni temu w pracy dyskutowaliśmy na temat pytania, które zadajemy podczas wywiadów. Jesteśmy w trakcie zatrudniania „młodszych” programistów C++, co jest nowością w firmie (kiedyś zatrudnialiśmy tylko doświadczonych programistów, ale takich trudno znaleźć w naszym obszarze geograficznym). Bardziej doświadczonym aplikantom zwykle zadajemy pytania C++, kilka ćwiczeń z czytania kodu oraz dziedziczenie, rzutowanie, poprawność const, pytania statyczne. Celem jest sprawdzenie, czy kandydat ma wystarczające doświadczenie z językiem (jeśli ktoś twierdzi, że ma 6 lat doświadczenia z C++, ale nie potrafi napisać „stałego” gettera, to na przykład coś jest nie tak). Ale dla „młodszych” kandydatów tego rodzaju pytania nie wydają się istotne: oczywiście młodzi ludzie nie mogą wiedzieć o wszystkich cechach języka i oczekuje się od nich, że będą potrzebować trochę czasu na naukę. Pomyślałem o zadaniu pytania typu: „Powiedz, że masz podaną listę milionów liczb całkowitych. Napisz jakąś funkcję, która oblicza średnią liczb”. Oczywiście głównym celem tego pytania nie jest uzyskanie idealnego rozwiązania, ale sprawdzenie, jak myśli wnioskodawca. Najpierw powinien zapytać o listę: * Jak zorganizowane są liczby? * Czy są posortowane? * Skąd pochodzą liczby? Plik ? Jakieś gniazdo sieciowe ? * Czy wcześniej znamy liczbę przedmiotów? Wtedy spodziewam się, że poruszy kilka problemów: * Suma liczb całkowitych prawdopodobnie się przepełni. * Czy potrzebujemy dokładnej średniej, czy zrobi to coś wystarczająco bliskiego? * Co jeśli lista jest pusta? * ...i tak dalej. Oczywiście, jeśli wnioskodawca nie wie, jakich klas, funkcji użyć, mówię mu: i tak mógłby uzyskać te informacje w Internecie w rzeczywistej sytuacji. Teraz niektórzy z moich współpracowników uważają, że to okropne pytanie, ponieważ jest niejasne i otwarte, twierdząc, że „młodsi” kandydaci są zestresowani podczas rozmów kwalifikacyjnych i nie potrafią prawidłowo myśleć, co sprawia, że test jest dyskusyjny. Widzę ich punkt widzenia, ale nadal się nie zgadzam. Więc moje pytania brzmią: czy tego rodzaju pytanie jest dopuszczalne do testowania „młodszych” kandydatów? Co składa się na dobre „juniorowe” pytanie do rozmowy kwalifikacyjnej?


title: Kto jako pierwszy ukuł termin Funkcja Wyższego Porządku i/lub Obywatel Pierwszej Klasy?

text: Zrozumiałem, że na długo przed Haskellem, O'Camlem czy LISP-em funkcje wyższego rzędu były przedmiotem badań akademickich, a w matematyce Schönfinkel (w 1967) i Haskell Curry (w 1968) stosowali już techniki takie jak curry, ale to był zanim był dostępny w dowolnym języku programowania. Schemat, według Wikipedii, był pierwszym językiem, który wprowadził odpowiednie funkcje wyższego rzędu jako obywatele pierwszej klasy, ale czy jest ktoś, komu możemy przypisać oryginalny pomysł? Może Alonzo Church, który wynalazł rachunek lambda w latach 30-tych? Dokładniej, kto ukuł następującą definicję, którą widziałem w różnych parafrazach w kilku książkach i zasobach internetowych? > Funkcja jest uważana za funkcję wyższego rzędu, gdy przyjmuje inną funkcję > jako argument lub gdy zwraca funkcję. Każda funkcja, która nie przyjmuje > funkcji jako argumentów lub typów zwracanych, nazywana jest funkcją > pierwszego rzędu.


title: Porównanie mojego własnego sortowania przez wstawianie ze standardowym algorytmem

text: Pochodzę z doświadczenia w tworzeniu stron internetowych MVC i aplikacji HTML5, a ostatnio zdecydowałem się zagłębić w rzeczy, których nie uczyłem się na uniwersytecie, a mianowicie rzeczy, których większość ludzi nauczyłaby się na kursach informatyki. Czytałem książkę o algorytmach, a pierwszą, o której wspomina, było sortowanie przez wstawianie. Tak naprawdę nie zrozumiałem tego za pierwszym razem, ale zrozumiałem cel, więc miałem okazję wymyślić własne rozwiązanie, zanim przeczytałem więcej o właściwym rozwiązaniu, aby zobaczyć, jak blisko się zbliżyłem. Mam dość blisko, a oto moja funkcja w C#: int[] SortNumbersTomsVersion(int[] numbersIn) { int[] output = new int[numbersIn.Count()]; for (var i = 0; i < liczbyIn.Count(); i++) { int cardsLowerThan = 0; for (var n = 0; n < LiczbW.Liczba(); n++) { if (LiczbyW[n] < LiczbW[i]) { KartyDolneThan++; } } output[cardsLowerThan] = liczbyIn[i]; } zwracać dane wyjściowe; } Koncepcja jest taka, że zaczynam od grupy liczb. Następnie dla każdej liczby porównuję ją ze wszystkimi innymi liczbami w tablicy, aby zobaczyć, ile innych ma niższą wartość. Następnie pobiera wynikową liczbę i umieszcza bieżącą liczbę w tablicy wyjściowej pod tym indeksem. Algorytm sprawdza wszystkie liczby, aż wszystkie znajdują się w tym samym miejscu. Moje pytanie brzmi: _co sprawia, że oryginał jest lepszy od mojego rozwiązania_? dla odniesienia, oto akceptowany algorytm poza funkcją: int temp, k; for (int i = 1; i < rozmiar_tablicy; i++) { temp = tablica[i]; k = i-1; while (k >= 0 && array[k] > temp) { array[k + 1] = array[k]; k--; } tablica[k + 1] = temp; }


title: Walka z długiem technicznym jako „najniższy deweloper”?

text: Załóżmy, że pracujesz dla firmy i tworzysz dla niej oprogramowanie. Nie masz pojęcia o dużym obrazie, a może o niewielkim. Masz zadania przydzielone przez system śledzenia problemów. Dostajesz zadania, sprawiasz, że działają tak, jak je opisuje zadanie, odsyłasz je z powrotem. Jak dodawanie 2 liczb całkowitych: function add(a,b){return a + b;} Ale później, w miarę postępu projektu, zauważasz, że gdy `add` staje się bardziej złożony, zdajesz sobie sprawę, że powinien był potrzebować jakiejś formy architektury , coś więcej niż tylko funkcja, która dodaje parametry i zwraca wartość. Jednak tego nie wiedziałeś. Po pierwsze, wszystko, czego potrzebowali, to proste „dodaj”. Nie spodziewałeś się, że add stanie się tak złożony. Projekt rozwija się z większą liczbą funkcji, których nie spodziewałeś się w pierwszej kolejności. I na koniec, ciągle gromadzisz hacki i warstwy funkcji, aby uniknąć łamania/przepisywania istniejącego kodu. Jak radzisz sobie w takich sytuacjach? Jak walczysz z długiem technicznym jako „najniższy deweloper”? **Wyjaśnienie:** * Jesteś „realizatorem”, najniższym w hierarchii. * Widzisz problem, ale nie masz nic do powiedzenia w tej sprawie. * Nie obliczam długu technicznego ani nie szukam narzędzi. * Odnośnie trzeciego "duplikatu" * Refactoring & Rewrite - Jesteś zablokowany do swoich zadań. Nie płacisz za dodatkowe. * Przegląd architektury — znasz cały system, ale nie masz pojęcia o architekturze. * Zamrożenie kodu - Nie Twój telefon. Nie jesteś zarządem. * Modularyzacja - brak pojęcia o architekturze. Moduły zmieniają się wraz ze zmianą wymagań. * Testy automatyczne — brak.


title: Jak radzić sobie z kadrą zarządzającą (właścicielem firmy), która bagatelizuje wpływ zmian specyfikacji?

text: Przez jakiś czas pracuję w małej firmie zajmującej się tworzeniem stron internetowych (3 programistów). W ciągu ostatniego roku firma przeżywała ciężkie czasy (mniej projektów) i kilku współpracowników zostało zwolnionych, w tym nasz kierownik produkcji. Posiadanie tej osoby poza naszym zespołem oznacza dla nas, że coraz częściej mamy do czynienia z szefami (właścicielami) firmy. To oni spotykają się z klientami i rozmawiają o nadchodzących projektach (np. niestandardowa aplikacja webowa) W tym tygodniu mieliśmy spotkanie z szefem na temat konkretnego projektu, dla którego chce zmienić specyfikację (dodać kilka funkcji). Rozumiem, że w realnym świecie specyfikacje **zawsze** zmieniają się w trakcie projektu (jestem w tym biznesie od prawie 10 lat, już to wymyśliłem). To, z czym mam trudności, to sytuacja, w której szef stara się **zminimalizować złożoność, wpływ nowych specyfikacji**, ponieważ w jego mniemaniu te zmiany nie są takie trudne i nie powinny zająć dużo więcej czasu (szczególnie dlatego, że podpisałeś już umowę z naszym klientem na ustaloną kwotę). Z jednym współpracownikiem programistą żartowaliśmy, że to nie przez dodanie dwóch skrzydeł do samochodu zrobi się samolot, ma to duży wpływ na cały projekt pojazdu, wymagany czas nie jest taki sam, podobnie jak to samo z oprogramowaniem. Masz pomysł, jak powinniśmy poradzić sobie z taką postawą szefa? Czy jest możliwe, aby w takiej sytuacji zmienił zdanie?


title: Jak konstruktywnie i profesjonalnie radzić sobie z gniewem w pracy?

text: Co robisz, gdy coś cię denerwuje podczas programowania? Zwykle uderzam myszką mocno w biurko i idę na kawę lub cokolwiek, żeby się uspokoić


title: Jak mogę oszacować entropię hasła?

text: Po przeczytaniu różnych zasobów na temat siły hasła próbuję stworzyć algorytm, który zapewni przybliżone oszacowanie, jak dużą entropię ma hasło. Staram się stworzyć algorytm, który jest jak najbardziej wszechstronny. W tym momencie mam tylko pseudokod, ale algorytm obejmuje następujące elementy: * długość hasła * powtarzające się znaki * wzorce (logiczne) * różne spacje znaków (LC, UC, Numeric, Special, Extended) * ataki słownikowe NIE obejmuje następujących , i POWINIEN to dobrze omówić (choć nie idealnie): * porządkowanie (hasła mogą być ściśle uporządkowane według danych wyjściowych tego algorytmu) * wzorce (przestrzenne) Czy ktoś może dać jakiś wgląd w to, do czego ten algorytm może być słaby? Konkretnie, czy ktoś może pomyśleć o sytuacjach, w których podanie hasła do algorytmu mogłoby **PRZESZACOWAĆ** jego siłę? Niedoszacowania są mniejszym problemem. # Algorytm: // hasło testowe hasło = ? length = length(password) // liczba unikalnych znaków z hasła (duplikaty odrzucone) uqlca = liczba unikalnych małych liter alfabetu w haśle uquca = liczba wielkich znaków alfabetu uqd = liczba unikalnych cyfr uqsp = liczba unikalnych znaków specjalnych (wszystko z klawisz na klawiaturze) uqxc = liczba unikalnych znaków specjalnych (kody altowe, elementy rozszerzonego ascii) // parametry algorytmu, całkowite rozmiary spacji alfabetu Nlca = całkowita możliwa liczba małych liter (26) Nuca = całkowita liczba wielkich liter ( 26) Nd = całkowita liczba cyfr (10) Nsp = całkowita liczba znaków specjalnych (32 lub coś takiego) Nxc = całkowita liczba rozszerzonych znaków ascii, które nie pasują do innych kategorii (idk, 50?) // parametry algorytmu, współczynniki wzrostu siły pw wyrażone w procentach (na znak) flca = współczynnik wzrostu entropii dla małych liter (.25 to prawdopodobnie dobra wartość) fuca = EGF dla wielkich liter (.4 to prawdopodobieństwo ly dobry) fd = EGF dla cyfr (.4 jest prawdopodobnie dobre) fsp = EGF dla specjalnych znaków (.5 jest prawdopodobnie dobre) fxc = EGF dla rozszerzonych znaków ascii (.75 jest prawdopodobnie dobre) // współczynniki powtórzeń. kilka unikalnych liter == niski współczynnik, wiele unikalnych == wysoki rflca = (1 - (1 - flca) ^ uqlca) rfuca = (1 - (1 - fuca) ^ uquca) rfd = (1 - (1 - fd ) ^ uqd ) rfsp = (1 - (1 - fsp ) ^ uqsp ) rfxc = (1 - (1 - fxc ) ^ uqxc ) // siła cyfr siła = ( rflca * Nlca + rfuca * Nuca + rfd * Nd + rfsp * Nsp + rfxc * Nxc ) ^ długość entropibitów = log_base_2(moc) Kilka danych wejściowych i ich pożądane i rzeczywiste dane wyjściowe entropii_bitów: WEJŚCIE POŻĄDANE RZECZYWISTE aaa bardzo żałosne 8.1 aaaaaaaaa żałosne 24.7 abcdefghi słabe 31.2 H0ley$Mol3ys_silne 72.G2 wtf 88,9 [a^36]* żałosne 97,2 [a^20]A[a^15]* silne 146,8 xkcd1** średnie 79,3 xkcd2** wtf 160,5 * te 2 hasła używają skróconej notacji, gdzie [a^N] rozwija się do Nie ma. ** xkcd1 = "Tr0ub4dor&3", xkcd2 = "prawidłowa zszywka baterii konia" Algorytm zdaje sobie sprawę (poprawnie), że zwiększenie rozmiaru alfabetu (nawet o jedną cyfrę) znacznie wzmacnia długie hasła, co pokazuje różnica w bitach entropii dla szóstego i 7-te hasła, które składają się z 36 liter, ale drugie 21-te jest pisane wielkimi literami. Jednak nie biorą pod uwagę faktu, że posiadanie hasła 36 znaków nie jest dobrym pomysłem, można je łatwo złamać słabym łamaczem haseł (i każdy, kto ogląda, jak piszesz, zobaczy je), a algorytm tego nie odzwierciedla . Odzwierciedla to jednak fakt, że xkcd1 jest słabym hasłem w porównaniu do xkcd2, pomimo większej gęstości złożoności (czy to w ogóle?). Jak mogę ulepszyć ten algorytm? # Dodatek 1 Ataki słownikowe i ataki oparte na wzorcach wydają się być wielką rzeczą, więc zajmę się nimi. Mógłbym przeprowadzić kompleksowe wyszukiwanie w haśle słów z listy słów i zastąpić słowa tokenami unikalnymi dla słów, które reprezentują. Słowo-tokeny byłyby wtedy traktowane jako znaki i miałyby własny system wag i dodawałyby własne wagi do hasła. Potrzebowałbym kilku nowych parametrów algorytmu (nazwę je lw, Nw ~= 2^11, fw ~= .5 i rfw) i uwzględniłbym wagę w haśle tak, jak każdy inny wagi. To wyszukiwanie słów mogłoby zostać specjalnie zmodyfikowane, aby dopasować zarówno małe, jak i duże litery, a także popularne podstawienia znaków, takie jak E z 3. Gdybym nie dodał dodatkowej wagi do tak dopasowanych słów, algorytm nieco zaniżyłby ich siłę lub dwa na słowo, co jest w porządku. W przeciwnym razie ogólną zasadą byłoby przyznanie słowu dodatkowego bitu za każde niedoskonałe dopasowanie znaku. Mogłem wtedy wykonać proste sprawdzanie wzorców, takie jak wyszukiwanie ciągów powtarzających się znaków i testy pochodne (weź różnicę między każdym znakiem), które identyfikowałyby wzorce, takie jak „aaaaa” i „12345”, i zastępowały każdy wykryty wzorzec wzorcem token, unikalny dla wzoru i długości. Parametry algorytmiczne (w szczególności entropia na wzór) mogą być generowane w locie na podstawie wzoru. W tym momencie wziąłbym długość hasła. Każdy żeton słowa i żeton wzoru liczy się jako jeden znak; każdy żeton zastępowałby postacie, które symbolicznie reprezentowały. Stworzyłem jakiś rodzaj notacji wzoru, ale zawiera on długość wzoru l, kolejność wzoru o i element bazowy b. Informacje te można wykorzystać do obliczenia dowolnej wagi dla każdego wzoru. Zrobiłbym coś lepszego w rzeczywistym kodzie. # Zmodyfikowany Przykład: Hasło: 1234kitty$$$$$herpderp Tokenizowane: 1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p Filtrowane słowa: 1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002 Filtrowane wzorce: @P[ l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002 Podział: 3 małe, unikalne słowa i 2 wzory Entropia: około 45 bitów, zgodnie ze zmodyfikowanym algorytmem Hasło: correcthorsebatterystaple Tokenizowane: c o r e k t h o r s e b a t t e r y s t a p l e Filtrowane słowa: @W6783 @W7923 @W1535 @W2285 Podział: 4 małe, unikalne słowa i bez wzorów Entropia według zmodyfikowanego algorytmu 43 bitów obliczany z wzorców jest do dyskusji. Myślałem o czymś takim: entropia(b) * l * (o + 1) // o będzie albo zero albo jeden Zmodyfikowany algorytm znalazłby wady i zmniejszyłby siłę każdego hasła w oryginalnej tabeli, z wyjątkiem `s^fU¬5ü;y34G<`, który nie zawiera słów ani wzorców.


title: Co programista php powinien wiedzieć?

text: Sprawdziłem tutaj bazę danych i nie znalazłem odpowiedzi na moje pytanie. Jaki standard powinien wiedzieć programista php? Mam na myśli dosłownie, jaką grupę funkcji językowych, mechanizmów, zmiennych powinien znać człowiek, aby uważać się za (dobrego) programistę php? (Wiem, że 'bycie dobrym' wykracza poza składnię języka, wciąż rozważam składnię tylko zwykłego php) Aby podać przykład, o co mi chodzi: * funkcje do kontroli sesji http, cookies * funkcje do kontroli połączenia z bazami danych * funkcje do kontroli obsługa plików * funkcje do sterowania xml itp. Celowo pomijam frazy typu 'bezpieczeństwo', 'wzorce' czy 'framework', ponieważ dotyczy to każdego języka programowania. Mam nadzieję, że wyraziłem się jasno, wszelkie dane wejściowe są mile widziane :) **EDYTUJ 1:** > **Uwaga:** > > Michael J.V. ma rację twierdząc, że bazy danych są niezależne od języka, > więc żeby sprecyzować moje pytanie i podkreślić różnice : > > Praktyki czy bezpieczeństwo, to kilka pomysłów do wdrożenia (nie ma obiektu 'Wzór' > z metodą 'Decorator()', prawda?) podczas korzystania z baz danych oznacza > znajomość mysqli i zestawu jego metod. **EDYCJA 2:** Wszystko przyszło mi do głowy po jakimś zadaniu wywiadu: > Policz sekundy, dni, miesiące, lata, które upłynęły od wprowadzenia daty do teraz. Więc otworzyłem dokumentację php, aby sprawdzić funkcje daty. Po wykonaniu zadań ankieter powiedział mi, że nie jest zadowolony z moich działań, ponieważ datetime() jest czymś, co każdy powinien wiedzieć. Dlatego proszę o to wszystko. Co każdy powinien wiedzieć...


title: Nowy w programowaniu, od czego zacząć?

text: Więc... jestem administratorem. Istnieje wiele przypadków, w których przydałoby się skryptowanie (głównie zarządzanie użytkownikami ... tworzenie grup, przypisywanie uprawnień, usuwanie wygasłych kont itp.) i chciałbym stworzyć pełnowymiarowy program. Ale nawet nie wiem od czego zacząć. **Edytuj** Wiele komentarzy miało sens w stylu „dowiedz się, czego chcesz się nauczyć”. Więc... muszę wymyślić, czego chcę się nauczyć. O: Czy nie ma czegoś takiego jak język „początkujący” lub „element konstrukcyjny”? Nie byłoby łatwiej nauczyć się C# i przejść do C++ niż po prostu przejść bezpośrednio do C++? B: Jak wybrać, czego się nauczyć? Chciałbym napisać grę do mojego pierwszego prawdziwego projektu, jeśli to pomoże go zawęzić. (oprócz "Witaj świecie" ;) ) Jest tak wiele języków, że nie wiem od czego zacząć. Nie znam nawet prawdziwej różnicy między C#/C/C++. C: Kiedy już _wybrałam_ język, jaki jest najlepszy sposób na rozpoczęcie nauki?


title: Bycie dobrym mentorem

text: Gdybyś miał studenta lub młodszego programistę, który był kompetentny, ale po prostu nie miał doświadczenia w prawdziwym świecie, jak Twoim zdaniem najlepiej byłoby go mentorować lub jakie informacje mógłbyś mu przekazać, aby ułatwić mu przejście od nowicjusza do bycia lekkomyślnym?


title: W TDD, jeśli napiszę przypadek testowy, który przejdzie bez modyfikowania kodu produkcyjnego, co to oznacza?

text: Oto zasady Roberta C. Martina dotyczące TDD: * Nie wolno pisać żadnego kodu produkcyjnego, chyba że ma to na celu wykonanie nieudanego testu jednostkowego. * Nie możesz napisać więcej testów jednostkowych, niż jest to wystarczające do niepowodzenia; a niepowodzenia kompilacji to niepowodzenia. * Nie możesz napisać więcej kodu produkcyjnego, niż wystarczy, aby przejść jeden nieudany test jednostkowy. Kiedy piszę test, który wydaje się wart zachodu, ale przechodzi bez zmiany kodu produkcyjnego: 1. Czy to oznacza, że zrobiłem coś złego? 2. Czy powinienem unikać pisania takich testów w przyszłości, jeśli można w tym pomóc? 3. Czy powinienem zostawić tam ten test, czy go usunąć? * * * **Uwaga:** _Próbowałem_ zadać to pytanie tutaj: Czy mogę zacząć od zdania testu jednostkowego? Ale do tej pory nie byłem w stanie wystarczająco dobrze wyartykułować pytania.


title: Znaczenie używania narzędzi do zarządzania konfiguracją w projekcie oprogramowania do kontrolowania zmian

text: Czy możemy kontrolować zmiany w specjalnym artefakcie, gdy nasze narzędzie do zarządzania konfiguracją nie działa poprawnie? Czy możemy to zrobić sami?


title: Jak wykorzystać MVC w praktyce

text: Jestem bardzo zmieszany. Nie mogę nawet zacząć rozumieć, w jaki sposób MVC zostanie zaimplementowany poza tworzeniem stron internetowych. To może wydawać się zbyt ogólnym pytaniem, ale jak zastosować MVC. Mam następujące ogólne pytania: 1. Czy wszystkie klasy M, V i C mają być jedną klasą, czy wieloma. Jeśli wielu, jak by to działało. 2. Większość klas, które stworzyłem wcześniej, zawierała swoje dane w sobie, a nie w osobnej klasie. Jak to działa z MVC? 1) Załóżmy na przykład, że masz zajęcia, w których opiekujesz się wirtualnym psem. Pomyślałbym, że stworzysz klasę Pies za pomocą, na przykład, polecenia „szczekanie”, które odtwarza dźwięk wraz ze zmienną name i zmienną coat_color. Wiem, że to bardzo proste, ale jak to zmieściłoby się w MVC? Wygląda na to, że skończysz z MC i V, gdzie informacje (model) ORAZ kontrolki znajdują się w klasie Dog, która może uzyskać dostęp do swingu lub innej biblioteki, aby zaktualizować widok. 2) A co z programem takim jak sims (wersja uproszczona), w którym każda osoba miałaby własne informacje… czy umieściłbyś wszystkie te informacje w innej klasie? Przepraszam, jeśli to wszystko jest oparte na gigantycznych nieporozumieniach, ale jestem dość zdezorientowany. W tej chwili używam Javy, jeśli ma to znaczenie dla MVC...


title: Moment wydania aplikacji w App Store

text: Czy jest dobry moment na wydanie aplikacji? Czy jest zły moment na wydanie aplikacji? Na przykład, może wiosna/lato nie przyniesie tak dużej sprzedaży jak jesień/zima. W tym sensie, że dzieci wychodząc ze szkoły będą spędzać mniej czasu przed ekranem, więcej na zewnątrz itp. Jakieś opinie w tej sprawie?


title: Układ dużego projektu: dodanie nowej funkcji do wielu podprojektów

text: Chcę wiedzieć, jak zarządzać dużym projektem z wieloma komponentami za pomocą systemu zarządzania kontrolą wersji. W moim obecnym projekcie są 4 główne części. 1. Sieć 2. Serwer 3. Konsola administracyjna 4. Platforma. Część webowa i serwerowa korzysta z 2 bibliotek, które napisałem. W sumie istnieje 5 repozytoriów git i 1 repozytorium mercurial. Skrypt kompilacji projektu znajduje się w repozytorium platformy. Automatyzuje cały proces budowy. Problem polega na tym, że kiedy dodaję nową funkcję, która wpływa na wiele komponentów, muszę utworzyć gałąź dla każdego z dotkniętych repo. Zaimplementuj funkcję. Scal to z powrotem. Moje przeczucie jest takie, że „coś jest nie tak”. Czy powinienem więc stworzyć jedno repozytorium i umieścić tam wszystkie komponenty? Myślę, że w takim przypadku rozgałęzienie będzie łatwiejsze. Albo po prostu robię to, co robię teraz. Jak w takim razie rozwiązać problem tworzenia brancha na każdym repozytorium?


title: Czy powinienem oczekiwać, że niedawni absolwenci będą zaznajomieni z podstawowymi koncepcjami programowania?

text: Wygląda na to, że istnieje OGROMNA rozbieżność między tym, czego oczekuję od kogoś, kto przez kilka lat studiował programowanie na uniwersytecie, a tym, co faktycznie wie. Nie mam ochoty zadawać zbyt skomplikowanych pytań podczas wywiadów. Niektóre z moich zwykłych pytań to: * Jaka jest różnica między typem referencyjnym a typem wartości? Jeśli wydaje się, że rozmówca tak naprawdę nie rozumie swojej odpowiedzi lub jeśli nie zna używanej przeze mnie terminologii, wchodzę w szczegóły, prosząc go o wyjaśnienie, co się dzieje, gdy piszę int i=0; w metodzie, co z obiektem o=0, obiektem o = new MyClass(), itd... Zasadniczo robię wszystko, co w mojej mocy, aby oszukać rozmówcę, aby powiedział mi o stosie wywołań, stercie itp. I staram się pozostać w koncepcje językowo-agnostyczne. Jeśli rozmówca powie mi, że zrobił dużo C, C++ lub C#, zagłębiam się głębiej w konkretny język i być może w szczegóły implementacji. W razie potrzeby pytam rozmówcę, czym jest stos wywołań lub gdzie przechowywane są argumenty przekazywane do funkcji w wybranym przez niego języku imperatywnym. większość respondentów po prostu nie ma pojęcia, czym jest stos wywołań, nie mówiąc już o względach bokserskich itp. * Jaka jest różnica między klasą abstrakcyjną a interfejsem. W jakich przypadkach należy używać jednego z drugim? Zwykle proszę ich również, aby wyobrazili sobie projekt małej biblioteki z przypadkiem użycia, którego celem jest wykorzystanie pewnego dziedziczenia i niektórych abstrakcyjnych fabryk. Większość ankietowanych nie ma pojęcia, jaki może być prawdziwy cel dziedziczenia. Zwykle znają niektóre słowa kluczowe (wirtualne, zastępujące itp.), ale tak naprawdę nie wiedzą, kiedy ich użyć, nie mówiąc już o wyjaśnieniu, czym jest wirtualna tabela. Mimo że wcześniej przeglądam CV, nawet dla osób z 5-letnim doświadczeniem w realnych projektach obejmujących złożone architektury, powiedziałbym, że mniej niż 25% wszystkich moich rozmówców potrafi poprawnie odpowiedzieć na te dwa pytania. A kiedy mówię właściwie, nie mam na myśli „dogłębnie”… tylko po to, by mieć przybliżone pojęcie o tym, czym jest koncepcja. Jeśli chodzi o juniorów, nie mam nic przeciwko zatrudnieniu kogoś, kto nie umie dobrze zorganizować swojego czasu, lub kogoś, kto nie jest przyzwyczajony na przykład do procesów budowy przemysłowej, ale mam wrażenie, że jeśli nie słyszałeś tego słowa " stos rozmów” po kilku latach studiowania informatyki jest albo głupi, albo pozbawiony motywacji, albo wybrał bardzo nierozsądnie swoją uczelnię. Myślisz, że jestem tutaj zbyt ekstremistą? Czy powszechne jest poznawanie tych podstawowych pojęć po ukończeniu studiów? Czy znasz ludzi, którzy nie byli z nimi zaznajomieni, a po kilku latach stali się bardzo dobrymi inżynierami oprogramowania? Czy uważasz, że moja firma może mieć problem z przyciąganiem utalentowanych ludzi, czy też doświadczasz tego samego rodzaju problemów w procesie rekrutacji? * * * Edytować. jeśli chodzi o „typ natychmiastowy”, było to tylko dosłowne tłumaczenie z francuskiego na angielski, jak zwykle przeprowadzamy nasze wywiady po francusku. Naprawiłem to w moim pytaniu. Ale nadal myślę, że wszyscy doskonale rozumiecie, o co mi chodziło, co stanowi mój punkt widzenia, nieprawdaż?


title: różnica między przekazaniem wartości a przekazaniem funkcji jako parametru w scala

text: Często słyszę, że scala ma możliwość przekazywania funkcji jako parametru do innej funkcji. Chciałbym poznać różnicę między przekazywaniem wartości jako parametru a przekazywaniem samej funkcji jako parametru. Jak to drugie podejście przynosi korzyści programowaniu. Jeśli funkcje są przekazywane jako parametr, w jaki sposób tworzone są odwołania do obiektów, ponieważ funkcje nie są powiązane z żadnymi obiektami.


title: Programista Aspergera i trudności w nauce. Najlepszy sposób na ich pokonanie?

text: Mam zespół Aspergera, a skutkiem zespołu Aspergera jest dla mnie to, że mogę mieć trudności ze zrozumieniem pojęć z czytanego materiału, chyba że mam jakiś pomysł lub mentalną wizualizację na temat tego, co czytam – co często nie jest możliwe, ponieważ większość kiedy coś czytamy, bo w ogóle o tym nie wiemy. Ale muszę być w stanie uchwycić coś wizualnie w mojej głowie, aby to zrozumieć. Programowaniem zajmuję się od dłuższego czasu (choć programowanie przestałem programować na 12 miesięcy, bo zostałem oskarżony o przestępstwo komputerowe). Wiele się nauczyłem po drodze, ale też zapomniałem wielu pojęć, których nie używam często. Jeśli chodzi o ponowne nauczenie się materiału, muszę zacząć od zera i zmierzyć się z tym samym wyzwaniem związanym z nauką. Wydaje mi się, że szkolenia wideo są dla mnie łatwiejsze do zrozumienia. Chociaż wiele szkoleń wideo na temat języków programowania nie zawiera szczegółowych informacji na temat niektórych pojęć, łatwiej jest zrozumieć koncepcję, gdy wybieram podręcznik referencyjny lub zaawansowany podręcznik tematyczny. Jedną z rzeczy, które sprawia mi trudność w uczeniu się z artykułów online, a nawet z odnośników MSDN, jest to, że podczas czytania w artykule będzie wiele tematów, których nie rozumiem, więc muszę przerwać czytanie, przejść do Google, nauczyć się rzeczy, których nie rozumiem z poprzedniego artykułu, a następnie wróć do poprzedniego artykułu. Rzecz w tym podejściu polega jednak na tym, że masz tendencję do utykania w czymś w rodzaju piekła zależności, w którym ciągle odwiedzasz Google i inne artykuły, zanim zaczniesz wracać do oryginału. Mam nieprzyjemny problem z dumą. To tak, jakby wszystkiego, czego się uczę, chcę się uczyć w absolutnie prawidłowy sposób, a jeśli nie, to w ogóle nie chcę wiedzieć, jak to zrobić - znowu problem polega na tym, że nie ma sposobu, aby wiedzieć, czy coś jest poprawne, jeśli ty w ogóle o tym nie wiem, ale ogranicza mnie to do uczenia się tylko z wiarygodnych źródeł. Obawiam się, że nauczę się czegoś w niewłaściwy sposób lub nauczę się złych praktyk, które sprawią, że będę wyśmiewany jako programista. Znowu to wszystko jest częścią moich Aspergerów i nie jest czymś, nad czym mogę całkowicie kontrolować. Często zaczynam projekt, a jeśli jest coś, czego muszę się nauczyć, przerywam go, aby nauczyć się czegoś i wracać. Problem w tym, że rzadko wracam do projektu, bo utknąłem w cyklu uczenia się. Znowu to znowu cała sprawa dumy. Nienawidzę kopiowania i wklejania prac innych programistów bez pełnego zrozumienia, co to jest ich praca i jeśli jest jakiś sposób, mogę to poprawić. Ponieważ nigdy nie pracowałem w branży komercyjnej, nie mam pojęcia, jak to działa w miejscu pracy. Nie czuję się pewnie w pracy w środowisku komercyjnym, chociaż liczni przyjaciele, którzy są programistami, mówili, że jestem więcej niż zdolny. W rzeczywistości ci przyjaciele stale konsultują się ze mną, aby uzyskać pomoc w kwestiach programistycznych - ale pracują w środowisku komercyjnym. Ale znowu czuję, że to Aspergery. Staram się znaleźć metodę pracy i nauki, która zwiększy produktywność i wydostanie się z tego cyklu. Jakieś rady od innych programistów lub programistów z zespołem Aspergera?


title: Najlepszy projekt do tworzenia dynamicznego zestawu pytań (kontrolek) w aplikacji internetowej Silverlight?

text: Mam około 15 szablonów (to będzie rosło), a każdy szablon będzie zawierał około 10-15 pytań. Każde pytanie może mieć odpowiedzi w innym formacie, takim jak pole tekstowe, pole listy, menu rozwijane, przycisk opcji itp. Muszę pokazywać jeden szablon na stronie, na podstawie danych wejściowych, które otrzymuję. Jakie byłoby najlepsze podejście projektowe do tego? 1. Umieść dane pytań w bazie danych i Utwórz dynamiczną kontrolę? 2. Wstawianie xml i wyświetlanie za pomocą xslt? 3. Tworzysz statyczny zestaw szablonów? Lub jakiekolwiek inne podejście? Nie mam na to zbyt wiele czasu. W tym celu użyję Silverlight.


title: Gerrit, git i recenzowanie całej gałęzi

text: Teraz uczę się Gerrita (jest to pierwsze narzędzie do przeglądu kodu, którego używam). Gerrit wymaga, aby sprawdzona zmiana składała się z jednego zatwierdzenia. Moja gałąź funkcji ma około 10 zatwierdzeń. Preferowanym przez Gerrita sposobem jest zgniecenie tych 10 commitów w jeden. Jednak w ten sposób, jeśli zatwierdzenie zostanie scalone z gałęzią docelową, wewnętrzna historia tej gałęzi funkcji zostanie utracona. Na przykład nie będę mógł użyć `git-bisect` do przecięcia tych zatwierdzeń. Czy mam rację? Trochę się martwię o ten stan rzeczy. Jakie jest uzasadnienie tego wyboru? Czy można to zrobić w Gerrit bez utraty historii?


title: „Nie krzyżuj się ze strumieniami” Obiekty dostępu do bazy danych niezależne od warstwy danych w architekturze n-warstwowej?

text: Dodaję funkcjonalność do naszego serwisu, który wykonuje długotrwałe procesy asynchronicznie z wykorzystaniem MSMQ. Ta synchronizacja oznacza jednak, że musimy powiadomić użytkowników, gdy ich żądania zostaną zrealizowane. Używając wzorca poleceń, stworzyłem interfejs* o nazwie INotify i wkomponowałem go w klasę wiadomości, aby klasa przetwarzania wiadomości mogła po prostu wywołać GiveNotice() w obiekcie INotify wiadomości. Pierwsza implementacja, EmailNotify, była trudniejsza niż oczekiwano, ponieważ byłem zaskoczony odkryciem, że MailMessage nie jest możliwy do serializacji, ale działa. Teraz pracuję nad nowym konkretnym powiadomieniem, DBNotify, który wywoła pewnego rodzaju SP i zaktualizuje status w głównej transakcyjnej bazie danych. Potykam się o to, że chciałbym ponownie wykorzystać architekturę DAL, którą już stworzyliśmy, ale INotify jest członkiem projektu Model, który jest bardziej fundamentalny niż DAL. Nasza hierarchia wygląda tak: Wspólne > Model > DAL > BAL Oto więcej szczegółów na temat naszych poszczególnych n-warstw. Pamiętaj, że odziedziczyłem to, więc nie szukam sugestii, jak to ulepszyć; Zastanawiam się, jak „łamać zasady”. Common odpowiada za wszystkie funkcje "użyteczne", które są używane w wielu miejscach w aplikacji, takie jak dostęp do ustawień konfiguracyjnych, parsowanie ciągów, funkcjonalność niezwiązana z biznesem. Model to repozytorium obiektów biznesowych, które niektórzy nazywają obiektami transferu danych, kolekcjami pobierających i ustawiających. Dodałem kilka „sprytnych” w tej warstwie, ale tylko wewnętrzne reguły biznesowe dla tego obiektu, takie jak „Nazwa elementu musi zaczynać się od znaku alfanumerycznego”. DAL jest warstwą dostępu do danych, teoretycznie wszystko, co się tutaj dzieje, to przenoszenie obiektów modelu do iz bazy danych. BAL to warstwa biznesowa; zawiera reguły biznesowe, które rządzą interakcją obiektów (tj. „Formularz musi zawierać co najmniej dwa elementy”). Tak więc interfejs INotify jest zdefiniowany jako abstrakcja, aby umożliwić metodzie powiadamiania niezależnie od przetwarzania wiadomości (tj. e-mail, TXT, twitter itp.). Utworzyłem go w warstwie Model, która jest niezależna od warstwy DAL, więc nie mogę ponownie użyć tego kodu bez tworzenia zależności cyklicznej. Czy ktoś inny zajmował się obiektem biznesowym, którego celem jest interakcja z bazą danych, i jak to umiejscowić w architekturze N-warstwowej? Zanim powiesz mi, żebym używał Linq to Sql, wielkie dzięki. To nie jest pytanie techniczne (jak mam to zrobić), to pytanie projektowe (jak mam to zrobić). Myślę, że odpowiedzią jest zastrzyk zależności, ale nigdy z niego nie korzystałem.


title: `trigger_error` vs `throw Exception` w kontekście magicznych metod PHP

text: Prowadzę debatę z kolegą na temat prawidłowego użycia (jeśli w ogóle) „trigger_error” w kontekście metod magicznych. Po pierwsze, uważam, że należy unikać `trigger_error` _z wyjątkiem_ tego jednego przypadku. Powiedzmy, że mamy klasę z jedną metodą `foo()` class A { public function foo() { echo 'bar'; } } Teraz powiedzmy, że chcemy zapewnić dokładnie ten sam interfejs, ale użyj magicznej metody, aby przechwycić wszystkie wywołania metod class B { public function __call($method, $args) { switch (strtolower($method)) { case 'foo': echo 'bar'; przerwanie; } } } $a = nowy A; $b = nowy B; $a->foo(); //bar $b->foo(); //bar Obie klasy są takie same pod względem sposobu, w jaki odpowiadają na `foo()`, ale różnią się wywołaniem nieprawidłowej metody. $a->nieistnieje(); //Błąd $b->nieistnieje(); //Nic nie robi Moim argumentem jest to, że magiczne metody powinny wywoływać `trigger_error`, gdy zostanie złapana nieznana metoda class B { public function __call($method, $args) { switch (strtolower($method)) { case 'foo': echo 'bar'; przerwanie; domyślnie: $class = get_class($this); $trace = debug_backtrace(); $plik = $trace[0]['plik']; $linia = $trace[0]['linia']; trigger_error("Wywołaj niezdefiniowaną metodę $class::$method() w $pliku w linii $line", E_USER_ERROR); przerwanie; } } } Aby obie klasy zachowywały się (prawie) identycznie $a->badMethod(); //Wywołaj niezdefiniowaną metodę A::badMethod() w [..] w linii 28 $b->badMethod(); //Wywołaj niezdefiniowaną metodę B::badMethod() w [..] w wierszu 32. Mój przypadek użycia to implementacja ActiveRecord. Używam `__call` do przechwytywania i obsługi metod, które zasadniczo robią to samo, ale mają modyfikatory, takie jak `Distinct` lub `Ignore`, np. selectDistinct() selectDistinctColumn($column, ..) selectAll() selectOne() select() lub insert() replace() insertIgnore() replaceIgnore() Metody takie jak `where()`, `from()`, `groupBy( )` itp. są zakodowane na stałe. Mój argument jest podświetlony, gdy przypadkowo wywołasz `insret()`. Jeśli moja implementacja aktywnego rekordu zakodowałaby na stałe wszystkie metody, byłby to błąd. Jak w przypadku każdej dobrej abstrakcji, użytkownik powinien być nieświadomy szczegółów implementacji i polegać wyłącznie na interfejsie. Dlaczego implementacja wykorzystująca magiczne metody miałaby zachowywać się inaczej? Oba powinny być błędem.


title: Jaka lektura jest zalecana dla doświadczonego programisty Java/SQL przechodzącego na Apache/Tomcat, Postgres, Hibernate?

text: Przejmuję zarządzanie i rozwój strony internetowej stworzonej w Javie z wykorzystaniem Hibernate i Postgres, działającej na Apache/Tomcat. Jestem doświadczonym programistą Java, mam doświadczenie w Ruby on Rails i jestem ekspertem w Oracle SQL. Jaka dokumentacja jest dla mnie najlepsza do przeczytania?


title: Która oferta pracy jest lepsza? Ten z największym potencjałem uczenia się czy największym potencjałem dydaktycznym?

text: Mam nieco ponad 10-letnie doświadczenie programistyczne. Od kilku lat pracuję głównie solo i chociaż ma to swoje zalety, czuję, że ogranicza mój rozwój. Chcę podjąć pracę kontraktową, aby wrócić do środowiska zespołowego. Rozważyłem kilka możliwości: Firma A używa najnowszych narzędzi (.NET 4, VS 2010, ASP.NET MVC). Wywiad był dość techniczny i zdecydowanie czułem się zardzewiały i nie poszło mi tak dobrze, jak się spodziewałem. Ale dostałem ofertę. Proces ich rozwoju wydaje się dość dojrzały. Czułem, że mógłbym być "najgłupszą osobą w pokoju" w tej pracy, co moim zdaniem może być dobrą rzeczą z punktu widzenia osobistego rozwoju. Firma B jest o krok za platformą (VS 2008, .NET 3.5, ASP.NET WebForms). Po pracy z MVC uważam, że WebForms jest dość bolesne. Mam też wrażenie, że mają spore zadłużenie techniczne i wciąż pracują nad opracowaniem dobrego procesu rozwoju. Ale przynajmniej są tego świadomi i pracują nad tym. To jest mój obszar zainteresowań i czuję, że mógłbym przyjść i przedstawić kilka dobrych pomysłów zarówno w zakresie procesu rozwoju, jak i spłaty długu technicznego. Tak więc wydaje się, że są to dwa przeciwstawne rodzaje pracy: jedna, w której mam więcej okazji do nauki technicznej, a druga, w której mogę mieć lepszą okazję do wejścia i wprowadzenia zmian. TL;DR - Która sytuacja zawodowa jest lepsza: ta z największą szansą na bycie studentem, czy ta z największą szansą na bycie agentem zmian?


title: Pola a argumenty metody

text: Właśnie zacząłem pisać nową klasę i przyszło mi do głowy, że dodaję wiele argumentów metody, które nie są ściśle potrzebne. Jest to zgodne z nawykiem, aby uniknąć posiadania stanu w klasach, który jest specyficzny dla jakiegoś wywołania metody, a nie jest ogólną konfiguracją lub zależnościami klasy. Oznacza to, że wiele metod, które nie mogą mieć argumentów, kończy się jednym, dwoma lub trzema. Chciałbym usłyszeć wasze opinie na temat tego, co myślicie o tym kompromisie i jak podejmujecie decyzję, które podejście przyjąć w jakiej sytuacji? Ponieważ kod jest często łatwiejszy do zrozumienia niż angielski podczas opisywania kodu, stworzyłem mały opis, który zawiera oba warianty: https://gist.github.com/JeroenDeDauw/6525656


title: Dystrybucja autorskiej aplikacji wraz z oprogramowaniem GPL

text: Po pierwsze, jest tu wiele podobnych pytań, ale nie znalazłem żadnego z bezpośrednią odpowiedzią na temat tego _konkretnego_ scenariusza. Jeśli znajdziesz duplikat, prosimy o umieszczenie linku do konkretnej odpowiedzi. Ponadto, aby pytanie nie było zbyt szerokie, rozważ tylko ten konkretny scenariusz. Załóżmy, że jest to prawnie zastrzeżona aplikacja Linux, która łączy się dynamicznie z bibliotekami LGPL i nie łączy się z bibliotekami GPL. Wykonuje również pliki binarne na licencji GPL z systemu plików za pośrednictwem standardowych interfejsów API systemu operacyjnego, aby wykonać pewne czynności. Następnie załóżmy dostosowaną główną dystrybucję Linuksa, z usuniętymi widocznymi znakami towarowymi itp. Następnie załóżmy samodzielny produkt, który zawiera sprzęt, powiedzmy Raspberry Pi z bootowalną kartą SD z tym dostosowanym systemem operacyjnym. Następnie ma zastrzeżone oprogramowanie, które ostatecznie musi się uruchomić po włączeniu urządzenia. **Jak legalnie dystrybuować tę kombinację?** Dokładniej, widzę (co najmniej) trzy oddzielne problemy: 1. _Ogólnie, jak legalnie dystrybuować tylko dostosowaną dystrybucję Linuksa?_ Na przykład, czy istnieją narzędzia lub które dystrybucje posiadasz narzędzia do pobrania wszystkich używanych domyślnych pakietów źródłowych, gotowych do dołączenia do dystrybucji lub zarchiwizowanych lokalnie? Myślę, że czasami myśli się, że jeśli dystrybuujesz pochodną głównej dystrybucji Linuksa, nie musisz sam rozpowszechniać źródeł domyślnych pakietów, lub że możesz po prostu wskazać repozytoria źródeł dystrybucji, jeśli ktoś o nie poprosi, ale ja Nie jestem pewien, czy jest to prawnie uzasadniony sposób wypełniania zobowiązań GPL. 2. _Jak legalnie dołączyć oprogramowanie własnościowe do dystrybucji?_ Na przykład, czy jest w porządku, aby oprogramowanie własnościowe było już zainstalowane w wyżej wymienionym SD? Czy można go odinstalować na tym samym nośniku i poprosić użytkownika o jego instalację przy pierwszym uruchomieniu? Czy trzeba mieć go na osobnym nośniku, czy pobrać z sieci i z niego zainstalować? Jakie są granice „na pewno OK” i „Na pewno nie OK”, czy istnieje jakikolwiek konsensus, a nawet precedens prawny? 3. _Czy wykonywanie programów na licencji GPL z zakodowanymi na stałe ciągami poleceń z zastrzeżonej aplikacji jest w porządku?_ Rozumiem, że jest to w porządku i nie tworzy pracy pochodnej. Ale jeśli to jest problem, czy obejście tego byłoby tak proste, jak stworzenie opakowania na licencji LGPL? A może po prostu posiadanie komend w modyfikowalnym pliku konfiguracyjnym (w każdym razie dobry pomysł, niezależnie od kwestii licencyjnych)? **Uwaga** : Z wyjątkiem technicznych aspektów pierwszego podpunktu, rozumiem, że odpowiedzi tutaj nie są żadnym rodzajem porady prawnej, ale odpowiedzi muszą być jakoś potwierdzone, ta strona nie jest przeznaczona do sondaży opinii.


title: Jak mogę poprawić umiejętność pisania kodu od samego początku?

text: Programuję od około 3-4 lat (ukończyłem studia z CS, gdzie uczyliśmy się języka programowania Java). Teraz moje pytanie brzmi: > Czy wielu ludzi ma trudności z pisaniem kodu z offu? Mam na myśli to, że kiedy podchodzę do zadania, zwykle szukam w google przykładów wcześniej istniejących programów, do których wycinam i wybieram sekcje, które byłyby przydatne do tworzenia moich programów, a raczej myślą całkowicie logicznie, wiedząc czego potrzebowałbym użyć z bibliotek klas do układania puzzli, aby osiągnąć mój cel końcowy. Przykładem tego jest powiedzmy, że tworzyłem animowany GUI. Teraz, aby ten GUI działał, zwykle patrzę na inne przykłady w google i składam kod, aby osiągnąć pożądany efekt, zamiast iść do bibliotek klas i pracować dokładnie, czego potrzebuję, aby złożyć działający program, tak jak mogą być biblioteki dość zniechęcający, wiedząc, od czego zacząć, aby znaleźć sekcje, które byłyby dla Ciebie przydatne! Zastanawiasz się tylko, czy wielu innych robi to samo co ja, czy też jestem mniejszością? Nie wiem, czy innym jest to trudne, ale czasami po prostu jestem zdezorientowany wiedząc, jakich zajęć potrzebuję lub jaki byłby najlepszy sposób podejścia do zadania.


title: Jak rozkłada się Twój czas pracy między kodowanie a myślenie?

text: ...w procentach. Na przykład 60/40 lub 90/10 lub 100/0. Moja hipoteza jest taka, że im większa część czasu spędzasz na myśleniu, tym mniejszy może być Twój kod (i mniej czasu będzie potrzebne na jego zapisanie). Myśl więcej, pisz mniej, innymi słowy. Czy uważasz, że to prawda? Na marginesie, myślę, że w typowych firmach programistycznych myślenie i tak nie jest częścią kultury: zwykle powinieneś siedzieć przy komputerze i _pisać_ coś. Prawie na pewno zostaniesz zauważony przez swoich menedżerów, jeśli będziesz wędrował z pustym spojrzeniem i zastanawiał się nad kolejnymi krokami z kodem. Szkoda.


title: Rozpoczęcie programowania w C++ (dla programisty C#)

text: Jestem programistą C#. Planuję nauczyć się C++. (Mam nadzieję, że będę w stanie wykorzystać koncepcje OOP z C#] Mam komputer z systemem Windows 7. 1. Jakie narzędzia muszę zainstalować do programowania w C++? 2. Czy są jakieś dobre tutoriale do przejścia na C++ dla programistą C#?


title: Czym jest bardziej standardowe skrócenie „wyrażenia regularnego”, „regex” lub „regexp”?

text: Chcę wiedzieć, jaki jest bardziej standardowy sposób wywoływania wyrażenia regularnego w skrócie. Widziałem zarówno regex, jak i regexp. Google twierdzi, że wyrażenie regularne ma prawie 2 trafienia więcej niż wyrażenie regularne, ale zależy to od sposobu wyszukiwania (kiedy dodam „wyrażenie regularne” po słowie, „wyrażenie regularne” staje się „wyrażeniem regularnym”, wynik jest inny). A na stackexchange jest tag regex. :) Jaki jest bardziej właściwy sposób na jego skrócenie? Może to nie ma znaczenia. :) Ale dzięki za odpowiedź.


title: Kiedy należy preferować korzystanie z bazy danych niż analizowanie danych z pliku tekstowego?

text: Tworzyłem program w Pythonie do pomiaru wzrostu codereview.SE. Moje podejście polegało na tym, aby wyświetlić „Statystyki witryny” na pierwszej stronie i przechowywać je na dysku twardym. Planuję to robić raz dziennie. Do tej pory zarobiłem wystarczająco dużo, aby pobrać statystyki i dołączyć je do pliku tekstowego. Skrypt Pythona można obejrzeć na github. Używam następującego formatu 22-08-2013 pytania 9073 odpowiedzi 15326 odpowiedzi 88 użytkowników 26102 odwiedzających/dzień 7407 22-08-2013 pytania 9073 odpowiedzi 15326 odpowiedzi 88 użytkowników 26102 odwiedzających/dzień 7407 Właśnie uruchomiłem skrypt dwa razy, aby uzyskać format, którego używałbym w pliku. Początkowo wydawało mi się to dobre, ponieważ sam bym go przechowywał, a format byłby taki sam, więc można by go łatwo przeanalizować, ale nie jestem pewien. Wydaje się, że korzystanie z bazy danych powinno być tutaj lepsze, ponieważ w ten sposób odzyskiwanie danych powinno być łatwiejsze. Tylko uwaga, nigdy nie korzystałem z żadnej bazy danych i nie mam wiedzy na temat SQL, MySQL ani żadnych innych wariantów RDBMS. Więc to prowadzi mnie do pytania. Kiedy baza danych powinna być preferowana do przechowywania danych w stosunku do przechowywania danych w pliku tekstowym? Czy są jakieś wskazówki, na które mogę zwrócić uwagę przy podejmowaniu decyzji, czy potrzebuję bazy danych, czy prostych plików tekstowych? PS: Jeśli można dodać lepsze tagi, zrób to. Miałem pewne wątpliwości co do tagów, które można dodać.


title: Konwencje dotyczące folderów

text: czy istnieje zasób, który definiuje konwencje dotyczące folderów programowania (np. folder „bin”)? Wyszukałem kilka, ale niewiele znalazłem. Zachęca się do wszelkich istotnych dyskusji na ten temat. **EDYTUJ** : Interesuję się przede wszystkim zarządzaniem źródłami i nie skupiam się na konkretnym języku (miałem nadzieję, że uzyskam referencję, która może zawierać to, co jest powszechne w dużych językach [C, C++, C#, PHP , Python itp.]). Przepraszam, nie chciałem, żeby było to zbyt niejasne.


title: PBI a historia użytkownika

text: Ostatnio do Backlogu Produktu został dodany element przez właściciela produktu, który mówi „Kiedy przechodzę do strony logowania ze strony x, widzę błąd. Chcę, aby ten błąd został usunięty”. Wydaje mi się, że nie jest to przypadek użycia i nie powinien być elementem PBI (ang. Product Backlog Item). Jednak kiedy o tym rozmawiałem, scrum master powiedział mi, że historyjki użytkownika to nie PBI i że PBI może być zgłoszeniem błędu, zadaniem, historyjką użytkownika, czymkolwiek i dosłownie każdym elementem, którym należy się najpierw zająć. Nie jestem pewien co do tego. Również nie mogę znaleźć dobrej definicji PBI w sieci. Tak więc moje pytanie brzmi, jakie rodzaje **rzeczy** mogą znaleźć się w Backlogu produktu jako elementy? Czy element zaległości produktu jest mapowany na historyjkę użytkownika? Czy oni są tacy sami?


title: Czy istnieje konwencja używania Yeoman w kontekście większego frameworka internetowego?

text: Uważam, że Yeoman jest niezwykle przydatny do lokalnego budowania prototypów i statycznych makiet, którymi mogę się dzielić z zespołem. Wydaje się jednak, że uwzględnienie jego struktury katalogów w kontekście większego frameworka, takiego jak Rails, Django, .NET, byłoby niezwykle kłopotliwe i nie wyobrażam sobie, jak wydajny może być przepływ pracy. Istnieje wiele samouczków, które odnoszą się do Yeoman i Front End Workflow, ale w przypadku wspólnego rozwoju w większym środowisku zespołu wydaje się, że niewiele tam jest. Jak korzystać z Yeoman w frameworku, który nie zapewnia jedynie spokojnego interfejsu API? Jak zintegrować Yeoman z przepływem pracy zespołu?


title: Jak obsługiwać duplikaty plików w kontroli wersji

text: Obecnie używamy bardzo prostego systemu kontroli wersji. Mamy całkowicie płaskie repozytorium główne dla całej naszej linii produktów. Wraz ze wzrostem naszej bazy kodu i dodawaniem kolejnych produktów do linii produktów, zaczyna to mieć poważne wady. Chcielibyśmy odejść od tego, zwłaszcza bez płaskiego stylu, ale istnieją pozornie fundamentalne problemy z ustrukturyzowanym podejściem, więc byłoby wspaniale usłyszeć, jak inni radzą sobie z tymi typowymi sytuacjami: 1. Twój kod ma wiele duplikatów pliki w oddzielnych lokalizacjach. Na przykład masz: ./somedir/source1.c ./someotherdir/source1.c Wszystkie instancje `source1.c` są takie same, więc gdy ktoś zmieni `source1.c`, nie powinien ta sama zmiana w każdym pliku `source1.c` w każdej lokalizacji, w której istnieje. W ten sposób działa płaski system, ale oznacza to strukturę (z `somedir` i `someotherdir` należy utworzyć poprawną strukturę plików. 1. Z drugiej strony, jeśli masz coś takiego: . /somedir/config ./someotherdir/config gdzie obie instancje config są unikalne i dzielą tylko nazwę pliku.To stanowi duży problem w płaskim systemie, kończysz na tym, że trzymasz je w płaskim repozytorium z unikalnymi nazwami, a następnie zmienianie ich nazw podczas odtwarzania struktury produktu.Wygląda na to, że ustrukturyzowany system plików ułatwiłby sprawę, ponieważ nie byłoby nieodłącznej relacji między `./somedir/config` i `./someotherdir/config`. Może podchodzę do tego z zasadniczo złym pomysłem na standardowe idiomy, ale jestem pewien, że wszyscy jesteście świadomi, kiedy wprowadzacie duże zmiany w istniejącej bazie kodu, musi to być bardziej przejście niż rzucanie-wszystko- sytuacja wyjazdowa i startowa.


title: Czy istnieją inne zalety zwinnych praktyk niż posiadanie działającej kompilacji między sprintami?

text: Ostatnio zainteresowałem się zwinnymi praktykami w tworzeniu oprogramowania i od tego czasu widziałem wiele artykułów, w których podkreśla się, że te praktyki pozwalają obniżyć ogólne koszty. Logika tego zwykle wygląda tak: jeśli zmienią się Twoje wymagania, możesz odzwierciedlić tę zmianę w kolejnym backlogu sprintu, a to doprowadzi do zmniejszenia kosztów, ponieważ projektowanie nowej funkcji i jej wdrażanie są blisko siebie pod względem czasu, więc koszty spadają, zgodnie ze słynną zasadą, że im później musisz dokonać zmiany w swoich wymaganiach, tym droższe będzie spełnienie tego wymagania. Ale średnie i duże projekty oprogramowania są złożone. Nagła zmiana wymagań nie oznacza, że nie będziesz musiał dotykać innych części systemu, aby spełnić to wymaganie. W wielu przypadkach architektura będzie musiała zostać bardzo znacząco zmodyfikowana, co oznacza również konieczność ponownego zaimplementowania wszystkich funkcji, które opierały się na starszej architekturze. Tak więc cały sens obniżonych kosztów w pewnym sensie odchodzi. Oczywiście, jeśli nowe wymaganie wymaga nowej niezależnej części systemu, to nie jest problem, stara architektura po prostu się rozrasta, nie trzeba jej na nowo przemyśleć i ponownie zaimplementować. I odwrotnie. Jeśli korzystasz z wodospadu i nagle zdajesz sobie sprawę, że trzeba wprowadzić nowe wymaganie, możesz zmienić swój projekt. Jeśli wymaga to zmiany istniejącej architektury, przeprojektuj ją. Jeśli tak naprawdę nie zadziera z tym, a tylko wprowadza nową część systemu, to idziesz i wykonujesz całą pracę, tutaj nie ma problemu. Mając to na uwadze, wydaje mi się, że jedyną zaletą zwinnego rozwoju jest działanie kompletnych kompilacji między sprintami, a dla wielu osób i projektów nie jest to krytyczne. Ponadto wydaje się, że zwinne powoduje ogólnie złą architekturę oprogramowania, ponieważ funkcje są w pewnym sensie nakładane na siebie, zespoły zwinne dbają tylko o to, czy funkcja działa, a nie jak działa. Wygląda na to, że gdy z czasem systemy stają się coraz bardziej złożone, praktyki zwinne w rzeczywistości zwiększają chaos w całej architekturze produktu, co ostatecznie skutkuje wyższymi kosztami, ponieważ wprowadzanie zmian będzie coraz trudniejsze, podczas gdy wodospad pozwala na doskonalenie architektury zanim cokolwiek wypuścisz. Czy ktoś może wskazać mi, gdzie się mylę, ponieważ oczywiście wiele osób używa agile w środowiskach produkcyjnych, więc gdzieś muszę się mylić.


title: Czy GC.SuppressFinalize może powodować problemy z wydajnością?

text: Jestem proszony o zaimplementowanie IDisposable na obiektach, które są w 100% zarządzanymi zasobami, które nie zawierają strumieni ani dużych zasobów. Rozumiem, jak ważna jest odpowiednia utylizacja dużych i niezarządzanych zasobów, ale co z drugą stroną równania? W przypadku obiektu, który nie korzysta z implementacji IDisposable (małe w pełni zarządzane obiekty), jaki negatywny wpływ może mieć GC.SuppressFinalize, jeśli w ogóle?


title: Co powinienem zrobić i wiedzieć, zanim zacznę pisać C?

text: Mam dyplom z CS i nauczyłem się o Javie i OCaml. Java była używana jako wprowadzenie i w większości klas CS, z wyjątkiem teoretycznych. OCaml był częścią uczenia się innego paradygmatu programowania. Ponieważ OCaml nie był udanym wpisem w moim CV, stałem się lepszym programistą Java. Ponadto większość zadań jest przeznaczona dla programistów Java. Później nauczyłem się Golanga. Wiem o uproszczeniach jakie daje Java, czyli garbage collection. Wiem też, że C nie zajmuje się odśmiecaniem i musisz wiedzieć, kiedy przydzielić, a kiedy zwolnić pamięć. Ale podczas mojej edukacji nigdy nie nauczono mnie myśleć w ten sposób. Nigdy nie uczyliśmy się algorytmów w aspekcie pamięci. Czuję, że coś przegapiłem. Więc moje pytanie brzmi, jak głęboko muszę kopać, zanim będę mógł zacząć pisać zadowalający kod w C, nie stawiając sobie przeszkód z powodu mojego własnego podstępnego kodu i głębokiego niezrozumienia istotnych kwestii?


title: Jak ludziom udaje się pisać i utrzymywać niezwykle złożony i trudny do odczytania kod?

text: Odczytanie kodu źródłowego SQLite jest misją IMO niemożliwą. Jest to jednak użyteczny kawałek dość złożonego oprogramowania (w końcu jest to w pełni wbudowana, wbudowana baza danych), który można pobrać, skompilować i wykorzystać z innego kodu i jest stale aktualizowany. Jak ludziom udaje się pisać i utrzymywać tak niezwykle złożony i trudny do odczytania kod?


title: Obsługa (wielu) wielu projektów w Git w środowisku korporacyjnym

text: Jedną z zalet starszych systemów kontroli wersji, takich jak CVS i SVN w rozwoju przedsiębiorstw, jest to, że każdy może połączyć się z kontrolą źródła i zobaczyć wszystkie projekty, które firma ma. Może to ułatwić uzyskanie ogólnego wglądu w rozwój dziecka poza sprintem, a także utrzymać wszystko w jednym miejscu i łatwo je znaleźć. Jednak rozproszone systemy kontroli wersji (w szczególności Git) używają repozytorium jako jednostki podstawowej. Działają najlepiej z jednym projektem (lub kilkoma ściśle powiązanymi projektami) na repozytorium. To sprawia, że zarządzanie repozytoriami jest trudniejsze w większości środowisk korporacyjnych, w których obsługa ponad 25-50 projektów nie jest niczym niezwykłym. O ile udało mi się ustalić, musisz przechowywać listę w innym miejscu wszystkich posiadanych repozytoriów. Dostępne jest oprogramowanie, takie jak GitHub, które pomaga, ale nadal jest to dodatkowy krok poza pojedynczym ciągiem połączenia i listą zawartości repozytorium. Jaki jest najlepszy sposób radzenia sobie ze złożonością wielu repozytoriów?


title: Podczas pracy z wykonawcami/stażystami, jak chronić swoją bazę kodu?

text: Rozważamy zatrudnienie wykonawcy lub stażysty do pracy z nami przy naszym projekcie iOS, ale to powoduje, że popadam w paranoję, że dajemy dostęp do naszej cennej bazy kodu komuś, kto nie pracuje dla firmy. To znaczy, mógłbym po prostu dać im dostęp do zajęć, nad którymi chciałbym, żeby popracowali, ale to wydaje się niegrzeczne i utrudniłoby im rozwijanie tego, do czego ich potrzebujemy. Jak bardzo należy być paranoicznym, gdy ludzie uciekają z całą swoją aplikacją?


title: Testowanie pliku, który w dużej mierze opiera się na tablicy statycznej

text: Mam plik .c, który zasadniczo zarządza własną małą bazą danych osób. Istnieją między innymi funkcje dodawania, usuwania, edycji i wyszukiwania. Ma statyczną tablicę, której używa do przechowywania danych. Jaki jest dobry sposób na testowanie jednostkowe takiego pliku? Ponieważ tablica jest statyczna, nie mogę wstawić własnych danych. Czy powinienem zastosować jakiś podstęp i utworzyć funkcję, która przekaże wskaźnik do tablicy, która zostanie skompilowana w wersji produkcyjnej? Czy powinienem po prostu przetestować funkcje tak, jak są i ustawić dane tak, jak chcę, poprzez serię dodawania i usuwania? Jaki jest najlepszy sposób przetestowania takiego pliku?


title: Intensywne stosowanie metod statycznych w aplikacji internetowej Java EE?

text: Generalnie pytam czy to norma. Architektura aplikacji obejmuje spring oraz framework zk. Osobiście nie mogę się oprzeć, ale myślę, że wprowadza to szereg problemów. Mam na myśli... to dużo niezsynchronizowanych funkcji. Ponadto używamy projektu Apache, który podczas przeglądania źródeł używa singletona, który ma metody, które nie są bezpieczne dla wątków. Zmieniono w nowszej wersji, jednak obecnie nie możemy przeprowadzić migracji biblioteki. Moje prawdziwe pytanie brzmi, czy istnieje uzasadniony powód używania dużej ilości metod statycznych w aplikacji JavaEE? Byłem wcześniej deweloperem ASP.NET i nigdy tego nie spotkałem. Instynkt podpowiada, że jest to zła architektura, ale nie znam stosu. Istnieją inne znaki ostrzegawcze, takie jak brak konwencjonalnej konwencji generycznej. Czy to norma? To, co obce na jednej platformie, może nie być na innej.


title: Jak przechowywać klucz klienta i klucz tajny OAuth v1 dla klienta Twitter na komputery typu open source bez ujawniania go użytkownikowi?

text: Chcę stworzyć grubego klienta, desktopowego klienta Twittera o otwartym kodzie źródłowym. Tak się składa, że używam .NET jako mojego języka i Twitterizera jako opakowania OAuth/Twitter, a moja aplikacja prawdopodobnie zostanie wydana jako open source. Aby uzyskać token OAuth, wymagane są cztery informacje: 1. Token dostępu (nazwa użytkownika na Twitterze) 2. Sekret dostępu (hasło na Twitterze) 3. Klucz klienta 4. Sekret klienta Drugie dwie informacje nie są udostępniane, jak klucz prywatny PGP. Jednak ze względu na sposób, w jaki zaprojektowano przepływ autoryzacji OAuth, muszą one znajdować się w aplikacji natywnej. Nawet jeśli aplikacja nie była oprogramowaniem typu open source, a klucz/sekret klienta były zaszyfrowane, odpowiednio wykwalifikowany użytkownik mógłby uzyskać dostęp do pary klucz/sekret klienta. Więc moje pytanie brzmi, jak obejść ten problem? Jaka jest właściwa strategia dla klienta Twittera na komputer, aby chronić swój klucz i tajny klucz klienta?


title: Jaka jest różnica między wdrożeniem a realizacją w Miesiącu Mitycznego Człowieka?

text: W rozdziale 4 (Arystokracja, Demokracja i Projektowanie Systemów) Freda Brooka, Miesiąc Mitycznego Człowieka, na stronie 49, mówi: > Jak wskazuje Blaauw, całkowity wysiłek twórczy obejmuje trzy odrębne > fazy: architekturę, wdrożenie i realizację... > > Realizator ma wiele do zrobienia... projektowanie granic modułów, tabel > struktur, podziałów przejść lub faz, algorytmów i wszelkiego rodzaju narzędzi > > ...Tymczasem na poziomie realizacji też jest wiele do zrobienia. > Programowanie też ma swoją technologię. Jeśli maszyna jest nowa, dużo pracy > należy wykonać nad konwencją podprogramów, technikami nadzoru, > algorytmem wyszukiwania i sortowania. Jaka jest różnica między wdrożeniem a realizacją? Dla mnie architektura jest bardziej związana z opisami specyfikacji lub diagramami, natomiast implementacja to programowanie/kodowanie, które wygląda tak samo jak realizacja.


title: Co to jest „domena problemu”

text: Muszę udokumentować mój program dla projektu szkolnego i mamy sekcję o nazwie „domena problemowa”, ale nie mam pojęcia, co omówić w tej sekcji. Więc pytanie brzmi: Co powinno być omówione w domenie problemowej?


title: Mapowanie zmiennych wejść do elementów interfejsu użytkownika

text: # Tło Opracowanie systemu do tworzenia e-booków. Dane są w wysokim stopniu znormalizowane. Projekty e-booków są pakowane jako „motywy”. Motywy mogą być konfigurowane z opcjami dotyczącymi: czcionek, kolorów, niektórych układów i elementów tematycznych (takich jak kwadraty dla list punktowanych mogą stać się okręgami, sześciokątami lub strzałkami). Opcje są ściśle powiązane z tematem. Na przykład jeden motyw może umożliwiać użytkownikowi wybór tylko niektórych czcionek, podczas gdy inny motyw może w ogóle nie zawierać żadnych elementów tematycznych, podczas gdy wszystkie motywy mogą udostępniać opcje zmiany układu numeru strony, kolorów motywu i zawartości nagłówka/stopki . Tworzenie eBooków jest jednym z przykładów ogólnej klasy problemu: > Wynik zależy od konfigurowalnych opcji; dostępne opcje zależą od > określonego zestawu ograniczeń. # Problem Kiedy nowy zestaw ograniczeń (np. motyw eBooka) jest tworzony przez programistę, konfigurowalne opcje muszą być widoczne jako elementy interfejsu użytkownika. Elementy interfejsu użytkownika mogą być odwzorowane na opcje przy użyciu języka opisowego lub XML. Na przykład: <group id=”numer-strony”> <group id=”text-attribute”> <string name=”UserInputPage” default=”# / ##” id=”ui-page” /> <nazwa koloru =”UserColourPrimary” id=”ui-colour-primary” /> <select name=”UserSelectBullet” id=”ui-bullet”> <option id=”ui-select-square” /> <option id=”ui- select-circle” /> </select> <integer name="UserRandomSeed" min="1" max="50" id="ui-random-seed" /> </group> </group> <text language= "en"> <!-- Nazwa karty --> <ref id=”page-number”>Numer strony</text> <!-- Nazwa grupy --> <ref id=”text-attribute”>Atrybuty tekstowe </text> <!-- Wyświetlana nazwa dla wybranych opcji --> <ref id=”ui-select-square”>Kwadrat</text> <ref id=”ui-select-circle”>Kółko</text> </text> Podstawowa implementacja motywu (czy PHP, Lua, Java, czy C++) będzie definiować, eksponować i używać zmiennych takich jak: UserInputPage UserColourPrimary User SelectBullet Używając XSLT, byłoby dość trywialne przekonwertować powyższą mapę na sensowne widżety UI, które odpowiadają definicji zmiennej w XML. Tworząc tę mapę, programiści nie muszą jawnie tworzyć interfejsu użytkownika ani martwić się o jego układ lub strukturę menu. Deweloper tworzy mapę zmiennych wejściowych oprogramowania, a komputer automatycznie generuje interfejs użytkownika. Interfejs użytkownika, w tym przypadku, będzie to XHTML, ale może to być XUL lub jakakolwiek inna reprezentacja. # Frameworki porównawcze, takie jak JavaServer Faces, są podobne do tego pomysłu; Kwestie JSF i ADF obejmują: * Zbyt złożone ze zbyt dużym obciążeniem. * Często powiązane z określonymi językami implementacji. * Dane wejściowe są zbyt ściśle związane z ich ostateczną reprezentacją. Na przykład: <h:inputText value="#{helloBean.name}" ... /> <af:selectOneRadio value="#{bindings.x.hints.inputValue} layout="vertical" /> Pionowy "selectOneRadio" dane wejściowe przycisków opcji nie powinny być zakodowane na stałe w całej aplikacji.Zamiast tego ostateczna reprezentacja interfejsu użytkownika powinna opierać się na inteligentnych wartościach domyślnych.W przykładzie XML z sekcji problem interfejs użytkownika powinien generować dwa przyciski opcji, ponieważ w ` select`. Trzy elementy wygenerują listę rozwijaną. Jeden element utworzy pole wyboru. Podobnie, `<string>` może wygenerować: * dane wejściowe w HTML; * JTextField w Javie; lub * QLineEdit przy użyciu QT4. Również podobnie, `<integer>` może generować suwak lub proste pole wejściowe. Walidacja byłaby przeprowadzana gdzie indziej. W HTML ostateczny wygląd i zachowanie elementu byłby określany przez CSS, tak jak w przypadku JSF. # Powiązane Trochę powiązane : * Podejście programistyczne: wejście interfejsu użytkownika czy wyjście modelu domeny? * http://en.wikipedia.org/ wiki/User_interface_markup_language # Pytanie Jakie podejście byś podjął, aby stworzyć taką definicję mapy zmiennych, która może następnie wygenerować kod interfejsu użytkownika?


title: Skonfiguruj Jenkinsa i Tomcata za pomocą Puppet na Vagrant

text: Bawię się konfiguracją mojego pierwszego `Spring` \+ `jenkins` \+ `Tomcat` CI środowiska deweloperskiego. Na razie to tylko faza testów/zabawy, ale w niedalekiej przyszłości zacznę nowy projekt z moimi współpracownikami. Z tego powodu chcę, aby środowisko programistyczne było zwirtualizowane i dokładnie takie samo na każdej maszynie programistycznej, a także na serwerze produkcyjnym. Zdecydowałem się użyć `Vagrant` i spróbować pisać skrypty `puppet`, które nie tylko instalują wszystko, ale także konfigurują wszystko tak, aby każdy z nas miał te same wtyczki `jenkins`, ten sam login i hasło `jenkins` i `tomcat` i dosłownie po wezwaniu „włóczęga w górę” jesteśmy gotowi do pracy. Do tej pory udało mi się zainstalować potrzebne rzeczy i przekierowanie portów. Mój `vagrantfile` wygląda tak (komentarze pozbawione): VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" config.vm.network :forwarded_port, gość: 80, host: 8090 config.vm.network :forwarded_port, guest: 8080, host: 8091 config.vm.network :private_network, ip: "192.168.33.10" config.vm.provision :puppet do |puppet| puppet.manifests_path = "puppet/" puppet.manifest_file = "default.pp" puppet.options = ['--verbose'] end end A to jest mój plik `puppet`: Exec { path => [ "/bin/" , "/sbin/" , "/usr/bin/", "/usr/sbin/" ] } class system-update { exec { 'apt-get update': polecenie => 'apt-get update', } $ sysPackages = [ "build-essential" ] pakiet { $sysPackages: upewnij => "zainstalowany", wymagaj => Exec['apt-get update'], } } class tomcat { pakiet { "tomcat": upewnij się => obecny, require => Class["system-update"], } service { "tomcat": upewnij => "działa", wymagaj => Pakiet["tomcat"], } } class jenkins { pakiet { "jenkins": upewnij => obecny, wymaga => Class["aktualizacja systemu"], } usługa { "jenkins": upewnij się => "działa", wymagaj => Pakiet ["jenkins"], } } include system-update include tomcat include jenkins Teraz, kiedy klikam `vagrant provision` i wchodzę na `http://localhost:8091/` widzę, że `jenkins` działa, więc powyższy skrypt działa Dobry. Następnym krokiem jest konfiguracja `jenkins` i `tomcat` poprzez rozszerzenie powyższych skryptów `puppet`. Jestem całkiem zielony, jeśli chodzi o CI. Po wędrówce po sieci znalazłem kilka samouczków o konfiguracji `jenkins` (oto jeden z nich). Bardzo chciałbym przenieść konfigurację prezentowaną w tym tutorialu do pliku `puppet`, więc kiedy rozłożę plik `vagrantfile` i `puppet` między moimi współpracownikami, będę pewien, że każdy ma dokładnie taką samą konfigurację. Niestety jestem też zielony jeśli chodzi o używanie `puppet`, nie wiem jak to zrobić. Każda pomoc będzie doceniona.


title: Tekst tokenizacji przechowywany w strukturze danych liny

text: Buduję edytor tekstu, który wykorzystuje tokenizer oparty na Ragel do obsługi podświetlania składni. Rozważam użycie struktury danych liny do obsługi wydajnych modyfikacji i operacji cofania/ponawiania. Czy istnieje standardowe podejście do tokenizacji lub wyszukiwania tekstu zawartego w tego typu strukturze danych? Niektóre postacie mogą spowodować, że tokenizer zużyje resztę strumienia.


title: Metody statyczne w kontekście sieciowym

text: Co się dzieje, gdy współbieżne żądania wywołują tę samą statyczną metodę Java działającą na serwerze aplikacji? Załóżmy, że uruchomienie metody trwa 2 sekundy i otrzymuje 100 wywołań w ciągu sekundy. Sama metoda nie odczytałaby/zapisała stanu zewnętrznego. Czy nie byłoby lepiej, gdyby zamiast tego była to metoda instancji?