Discussion:
rzadki bład w programie w C++
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Robert Magdziarz
2021-08-23 12:59:03 UTC
Permalink
Napisałem program w C++. Zawiera błąd którego szczegółów nie znam. Błąd (niepoprawne wartości zapisywane do pliku) występuje rzadko, nie wiem w jakich okolicznościach. Wstawiłem asercje i testuję, niestety nie udało mi się odtworzyć problemu.
Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami? Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.
Maciek Godek
2021-08-23 13:44:34 UTC
Permalink
Post by Robert Magdziarz
Napisałem program w C++. Zawiera błąd którego szczegółów nie znam. Błąd (niepoprawne wartości zapisywane do pliku) występuje rzadko, nie wiem w jakich okolicznościach. Wstawiłem asercje i testuję, niestety nie udało mi się odtworzyć problemu.
Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami? Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.
Strategia, która pozwoli w najprostszy sposób wyeliminować ten "błąd", to uznać go za ficzer.

A tak serio, jeżeli Twoja wiedza o tym błędzie jest tak duża, jak wiedza, którą się tu podzieliłeś, odnośnie programu, który napisałeś, to nie widzę wielkich nadziei na uporanie się z nim.

Możesz chociaż napisać:
- w jaki sposób błąd się objawia
- jak duży jest program
- na jakim etapie rozwoju programu pojawił się błąd
- czy możesz łatwo przepisać program np. na C# albo Javę

Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie przejrzeć kod.

Rzecz w tym, że jak piszesz w C++ albo C, to możesz łatwo popełnić błąd w rodzaju przypadkowego nadpisania obszaru w pamięci, i tego rodzaju błędy są raczej trudne do wykrycia.

Jeden z moich ulubionych to kod w rodzaju takiego czegoś:

printf("liczba wynosi: "+n);

Programista wychowany na C# będzie zaskoczony tym zachowaniem, a tymczasem to jest w pełni legalny kod w C: do adresu literału znakowego (który sam w sobie jest dość losowy) dodajemy jakąś liczbę, która w rezultacie daje nam jakiś inny adres, i spod tego adresu próbujemy teraz przekazać argument do funkcji printf.

Rezultatem jest "nieokreślone zachowanie", czyli może się tak naprawdę zdarzyć cokolwiek.

Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
Robert Magdziarz
2021-08-23 14:04:11 UTC
Permalink
Post by Maciek Godek
Strategia, która pozwoli w najprostszy sposób wyeliminować ten "błąd", to uznać go za ficzer.
mogę nie zapisywać do pliku cache.xml nic gdy strs="", tzn wtedy nie cache'ować
Post by Maciek Godek
- w jaki sposób błąd się objawia
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
Post by Maciek Godek
- jak duży jest program
ok. 7 tys wierszy
Post by Maciek Godek
- na jakim etapie rozwoju programu pojawił się błąd
w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy, poprawki mogły coś popsuć
Post by Maciek Godek
- czy możesz łatwo przepisać program np. na C# albo Javę
nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa
Post by Maciek Godek
Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie przejrzeć kod.
to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego nieznajomym wysyłać nie chcę
Post by Maciek Godek
Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w C++, na co dzień programuję w PHP).
Maciek Godek
2021-08-23 14:48:47 UTC
Permalink
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
No dobra, to już jest coś.
A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach tworzysz plik cache.xml?
W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania programu?
Czy ten atrybut ma w pliku xml tylko jedną instancję, czy może jest wiele obiektów posiadających taki atrybut?
Jakich operacji dokonujesz na obiekcie, który ma zostać zapisany do tego atrybutu?

I czy to jest jedyny problem, jaki udało Ci się zaobserwować, czy może jest ich więcej?
Post by Maciek Godek
- jak duży jest program
ok. 7 tys wierszy
Post by Maciek Godek
- na jakim etapie rozwoju programu pojawił się błąd
w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy, poprawki mogły coś popsuć
Używasz systemu kontroli wersji (np. git) do rozwijania programu?
Post by Maciek Godek
- czy możesz łatwo przepisać program np. na C# albo Javę
nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa
Tutaj akurat Java dałaby radę, ale 7 tysięcy linii kodu to już faktycznie trochę jest.
Post by Maciek Godek
Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie przejrzeć kod.
to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego nieznajomym wysyłać nie chcę
Post by Maciek Godek
Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w C++, na co dzień programuję w PHP).
Możesz spróbować skompilować dwoma kompilatorami (np. clang i gcc) i zobaczyć, czy któryś z nich da jakiś dodatkowy komunikat. Poza tym istnieją różne narzędzia do statycznej analizy, ale często są płatne i wcale nie ma pewności, czy pomogą.
Robert Magdziarz
2021-08-23 18:57:58 UTC
Permalink
Post by Maciek Godek
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
No dobra, to już jest coś.
A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach tworzysz plik cache.xml?
Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało mi.
Post by Maciek Godek
W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania programu?
vector<string>, robię strs = implode(magic_str, vector<string>)
moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>
Post by Maciek Godek
Czy ten atrybut ma w pliku xml tylko jedną instancję, czy może jest wiele obiektów posiadających taki atrybut?
wiele
Post by Maciek Godek
Jakich operacji dokonujesz na obiekcie, który ma zostać zapisany do tego atrybutu?
push_back(), find(), iteracja z begin() i end()
Post by Maciek Godek
I czy to jest jedyny problem, jaki udało Ci się zaobserwować, czy może jest ich więcej?
to chyba ostatni błąd, wcześniejsze naprawiłem, nowych nie dostrzegam
miałem problemy z regexami, używam skomplikowanych regexów dla długich tekstów, miewałem core dumped, poradziłem sobie wprowadzając ograniczenie na długość tekstu (linia w wejściowym pliku tekstowym)
w programie używam sterty na której allokuje obiekty STL i nie mam 100% pewności czy nie naknociłem, z new/delete
Post by Maciek Godek
Post by Maciek Godek
- jak duży jest program
ok. 7 tys wierszy
Post by Maciek Godek
- na jakim etapie rozwoju programu pojawił się błąd
w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy, poprawki mogły coś popsuć
Używasz systemu kontroli wersji (np. git) do rozwijania programu?
nie
Post by Maciek Godek
Post by Maciek Godek
- czy możesz łatwo przepisać program np. na C# albo Javę
nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa
Tutaj akurat Java dałaby radę, ale 7 tysięcy linii kodu to już faktycznie trochę jest.
Post by Maciek Godek
Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie przejrzeć kod.
to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego nieznajomym wysyłać nie chcę
Post by Maciek Godek
Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w C++, na co dzień programuję w PHP).
Możesz spróbować skompilować dwoma kompilatorami (np. clang i gcc) i zobaczyć, czy któryś z nich da jakiś dodatkowy komunikat. Poza tym istnieją różne narzędzia do statycznej analizy, ale często są płatne i wcale nie ma pewności, czy pomogą.
Maciek Godek
2021-08-24 08:12:12 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
No dobra, to już jest coś.
A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach tworzysz plik cache.xml?
Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało mi.
Post by Maciek Godek
W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania programu?
vector<string>, robię strs = implode(magic_str, vector<string>)
Skąd jest ta funkcja "implode"?
Post by Robert Magdziarz
moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>
Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również plik z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś pliku) i wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie te logi przeanalizował.
Post by Robert Magdziarz
Post by Maciek Godek
Używasz systemu kontroli wersji (np. git) do rozwijania programu?
nie
To zacznij. Najlepiej już dziś.
Robert Magdziarz
2021-08-24 08:57:41 UTC
Permalink
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
No dobra, to już jest coś.
A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach tworzysz plik cache.xml?
Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało mi.
Post by Maciek Godek
W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania programu?
vector<string>, robię strs = implode(magic_str, vector<string>)
Skąd jest ta funkcja "implode"?
to moja funkcja a la PHP - łączy stringi z kolekcji przedzielone pierwszym parametrem w jeden string
Post by Maciek Godek
Post by Robert Magdziarz
moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>
Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również plik z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś pliku) i wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie te logi przeanalizował.
Post by Robert Magdziarz
Post by Maciek Godek
Używasz systemu kontroli wersji (np. git) do rozwijania programu?
nie
To zacznij. Najlepiej już dziś.
na razie czytam książkę o git-cie
Mateusz Viste
2021-08-24 09:19:49 UTC
Permalink
Post by Robert Magdziarz
na razie czytam książkę o git-cie
Sztuka dla sztuki. Więcej czasu spędzisz na głowieniu się co
wklepać żeby zadowolić gita niż na pisaniu kodu. Proponuję
zainteresować się klasycznym svn-em, w codziennym użyciu ogarniesz go
czterema poleceniami:

svn up (zaciągnij najświeższy kod projektu)
svn diff (porównaj mój lokalny kod z ostatnim commitem)
svn st (zobacz które pliki lokalne są inne od tych w repo)
svn commit (zapisz moje zmiany)

Nie mówię przy tym, że git jest zły - jest po prostu bardziej
skomplikowany, zarówno w swojej koncepcji jak i użytkowaniu. Pozwala
też na więcej, ale w moim doświadczeniu to "więcej" jest zupełnie
nieprzydatne i tylko wprowadza zamieszanie, przynajmniej przy
kilkuosobowych projektach.

Mateusz
Maciek Godek
2021-08-24 14:39:21 UTC
Permalink
Post by Mateusz Viste
Post by Robert Magdziarz
na razie czytam książkę o git-cie
Sztuka dla sztuki. Więcej czasu spędzisz na głowieniu się co
wklepać żeby zadowolić gita niż na pisaniu kodu. Proponuję
zainteresować się klasycznym svn-em, w codziennym użyciu ogarniesz go
svn up (zaciągnij najświeższy kod projektu)
svn diff (porównaj mój lokalny kod z ostatnim commitem)
svn st (zobacz które pliki lokalne są inne od tych w repo)
svn commit (zapisz moje zmiany)
Nie mówię przy tym, że git jest zły - jest po prostu bardziej
skomplikowany, zarówno w swojej koncepcji jak i użytkowaniu. Pozwala
też na więcej, ale w moim doświadczeniu to "więcej" jest zupełnie
nieprzydatne i tylko wprowadza zamieszanie, przynajmniej przy
kilkuosobowych projektach.
svn już raczej odchodzi do lamusa.
podstawowy workflow gita nie jest bardziej skomplikowany.

w jednoosobowym projekcie to zupełnie bez znaczenia, natomiast jeżeli projekt się rozrasta, svn staje się długiem technicznym, bo operacje scalania ze sobą zmian od różnych osób stają się niebotycznie skomplikowane.

serio.

nawet humaniści korzystają z gita przy kolaboracyjnym pisaniu książek.
przy svnie taka współpraca byłaby mocno utrudniona.
Mateusz Viste
2021-08-24 15:27:13 UTC
Permalink
Post by Maciek Godek
svn już raczej odchodzi do lamusa.
Efekt mody.
Post by Maciek Godek
w jednoosobowym projekcie to zupełnie bez znaczenia, natomiast jeżeli
projekt się rozrasta, svn staje się długiem technicznym, bo operacje
scalania ze sobą zmian od różnych osób stają się niebotycznie
skomplikowane.
serio.
Uwierzyłbym, gdybym nie używał svn-a od ponad 15 lat - również
zespołowo. Tych niebotycznych komplikacji, o których piszesz, nie
doświadczyłem. Widziałem natomiast rozterki programistów dumających nad
tym, jak ugryźć gita żeby się nie obraził - i spędzających godziny na
doktoryzowaniu się i dyskutowaniu w nieskończoność o tym, jak coś
zrobić... zamiast zająć się pożyteczną pracą.

Niewątpliwie istnieją sytuacje, w których git wykazuje zalety względem
svn - jakiś intensywny branching, możliwość pracy offline przy
lokalnym commitowaniu, itp. Ja takich potrzeb w praktyce nie zaznałem.
Dlatego uważam, ze w wielu przypadkach git jest zwyczajnie
przekombinowany. Lubię proste i skuteczne narzędzia - a svn taki
właśnie jest.
Post by Maciek Godek
nawet humaniści korzystają z gita przy kolaboracyjnym pisaniu książek.
przy svnie taka współpraca byłaby mocno utrudniona.
W jaki sposób korzystają, i w jaki sposób utrudniona? W moich zespołach
zawsze trzymaliśmy wszelkie podręczniki i dokumentacje w svn, w postaci
plików tex lub html na podstawie których następnie coś budowało
wynikowego PDFa. I tutaj nie przypominam sobie by svn cokolwiek
utrudniał.

Mateusz
Maciek Godek
2021-08-24 15:50:21 UTC
Permalink
Post by Mateusz Viste
Post by Maciek Godek
svn już raczej odchodzi do lamusa.
Efekt mody.
W jakiejś mierze pewnie tak. Na pewno z mercurialem git "wygrał" ze względu na modę.
Post by Mateusz Viste
Post by Maciek Godek
w jednoosobowym projekcie to zupełnie bez znaczenia, natomiast jeżeli
projekt się rozrasta, svn staje się długiem technicznym, bo operacje
scalania ze sobą zmian od różnych osób stają się niebotycznie
skomplikowane.
serio.
Uwierzyłbym, gdybym nie używał svn-a od ponad 15 lat - również
zespołowo. Tych niebotycznych komplikacji, o których piszesz, nie
doświadczyłem. Widziałem natomiast rozterki programistów dumających nad
tym, jak ugryźć gita żeby się nie obraził - i spędzających godziny na
doktoryzowaniu się i dyskutowaniu w nieskończoność o tym, jak coś
zrobić... zamiast zająć się pożyteczną pracą.
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
Post by Mateusz Viste
Niewątpliwie istnieją sytuacje, w których git wykazuje zalety względem
svn - jakiś intensywny branching, możliwość pracy offline przy
lokalnym commitowaniu, itp.
Dokładnie. Sam pomysł, że musisz mieć centralne repozytorium, jest sporym utrudnieniem.
Dlatego np. github ma guzik, którym możesz łatwo zforkować repozytorium i później wysyłać pull-requesty do oryginalnego repozytorium; albo nie wysyłać.

Ja takich potrzeb w praktyce nie zaznałem.
Post by Mateusz Viste
Dlatego uważam, ze w wielu przypadkach git jest zwyczajnie
przekombinowany. Lubię proste i skuteczne narzędzia - a svn taki
właśnie jest.
Właściwie to jest na odwrót.
Git jest dużo prostszym narzędziem. Już sam fakt, że wystarczy wpisać "git init", żeby mieć u siebie repozytorium, o tym świadczy.
Dla SVNa musisz postawić serwer.
Post by Mateusz Viste
Post by Maciek Godek
nawet humaniści korzystają z gita przy kolaboracyjnym pisaniu książek.
przy svnie taka współpraca byłaby mocno utrudniona.
W jaki sposób korzystają, i w jaki sposób utrudniona?
Na przykład w taki:

https://github.com/OpenLogicProject/OpenLogic

A utrudniona, bo przy zbiorowej kolaboracji synchronizacja repozytoriów a'la SVN byłaby koszmarem.
Na przykład github jądra Linuxa wyświetla 5000 współautorów.
Post by Mateusz Viste
W moich zespołach
zawsze trzymaliśmy wszelkie podręczniki i dokumentacje w svn, w postaci
plików tex lub html na podstawie których następnie coś budowało
wynikowego PDFa. I tutaj nie przypominam sobie by svn cokolwiek
utrudniał.
A ile osób te zespoły liczyły?
Mateusz Viste
2021-08-24 17:41:40 UTC
Permalink
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
Branch to nic innego, jak kopiowania - trwa szybko. Powolny natomiast
bywa zaiste merge, dużo zależy od rozmiarów kodu i ilości różnic w
sklejanych wersjach, przy czym w ostatnich latach svn zrobił na tym
polu duże postępy.
Post by Maciek Godek
Dokładnie. Sam pomysł, że musisz mieć centralne repozytorium, jest sporym utrudnieniem.
Mi to się właśnie bardzo podoba i raczej postrzegam tę całą
"decentralizację" gita jako utrudnienie. Ktoś naćka milion zmian w git
przez noc, to rano muszę wszystko kolejno zaciągać (i nie daj losie by
były tam jakieś większe pliki binarne). Przy svn zaciągam tylko
najświeższą, ostatnią wersję.
Post by Maciek Godek
Dlatego np. github ma guzik, którym możesz łatwo
zforkować repozytorium i później wysyłać pull-requesty do
oryginalnego repozytorium; albo nie wysyłać.
Guzik w interfejsie webowym to dla mnie żaden argument. Taki sam guzik
mógłby przecież być przy svn - robiłby "svn import", a ew. pull
requesty byłyby niczym innym jak przesłaniem patcha wyciągniętego z svn
diff.
Post by Maciek Godek
Git jest dużo prostszym narzędziem. Już sam fakt, że wystarczy wpisać
"git init", żeby mieć u siebie repozytorium, o tym świadczy. Dla SVNa
musisz postawić serwer.
Z założenia chodziło o kolaborację, w tym kontekście serwer wydaje się
dość rozsądnym rozwiązaniem. Ale jeśli nie chcesz to nie musisz - svn
równie dobrze może przecież pracować na lokalnym katalogu.
Post by Maciek Godek
A utrudniona, bo przy zbiorowej kolaboracji synchronizacja
repozytoriów a'la SVN byłaby koszmarem. Na przykład github jądra
Linuxa wyświetla 5000 współautorów.
Tak, to jest jeden z racjonalnych use-casów gita. Zresztą git powstał
właśnie do tego by usprawnić prace nad kernelem. Projekt, który ma 5000
współautorów to jednak nie jest norma i może wymagać specjalistycznego
podejścia. Równie dobrze (uwaga, samochodowa analogia! proszę o
tolerancję) mógłbym stwierdzić, że zamiast Tico kupię sobie ciągnik
siodłowy, bo przecież kiedyś lodówka może mi się rozrosnąć i będę
potrzebował zwieźć z warzywniaka 8 ton marchwi.
Post by Maciek Godek
A ile osób te zespoły liczyły?
Podawałem (chyba) wcześniej - od kilku do maks kilkunastu. Jeśli mowa o
projektach z tysiącem programistów stukających 24/24, to spierać się
nie będę - bo nie znam, i moja wypowiedź ich nie dotyczy.

Mateusz
heby
2021-08-24 19:40:02 UTC
Permalink
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
U mnie trwa około 2 sekund. Repo takie sobie, około miliona plików
źródłowych i ponad 30GB gołego mięska na trunku/tagu z którego robie
brancha. Może faktycznie niewielkie to repo w porównaniu z typowym
helloworldem z githuba.

Ilośc danych jakie latają po sieci przy tej operacji jest mniejsza niż
przy szukaniu obrazków z kotami po googlu.
Post by Maciek Godek
Post by Mateusz Viste
Niewątpliwie istnieją sytuacje, w których git wykazuje zalety względem
svn - jakiś intensywny branching, możliwość pracy offline przy
lokalnym commitowaniu, itp.
Dokładnie. Sam pomysł, że musisz mieć centralne repozytorium, jest sporym utrudnieniem.
Jeśli masz zespół programistów na Antarktydzie na łaczach wdzwanianych
TePeSA to zaleta gita z offlinowym repo jest zdecydowanie wyróżniająca
go na tle tych normalnych potrzeb reszty ludzkości.
Post by Maciek Godek
Właściwie to jest na odwrót.
Git jest dużo prostszym narzędziem. Już sam fakt, że wystarczy wpisać "git init", żeby mieć u siebie repozytorium, o tym świadczy.
Nie, to tylko świadczy o tym, że jest nastawiony na inne zagadnienia niż
praca zespołowa. Niektórzy uważają GITa za narzędzie dla schizofreników
i spiskowców. Właśnie z tego powodu, jak nastawienie na pracę offline. W
pracy zespołowej to kuriozum, że chowasz swoje wypociny przed innymi. A
jak ktoś będzie musiał ją przejąć, bo umrzesz? A jak będziesz chciał
ciągłą integrację na swoim branchu na centralnej farmie kompilującej? A
jak kolega będzie chciał Ci pomóc? Zaleta? Serio? Gdzie?
Post by Maciek Godek
Dla SVNa musisz postawić serwer.
Brednia. Możesz stworzyć bazę danych SVN w *katalogu* na dysku lokalnym.
JEDNO kliknięcie, w TortoiseSVN. Tylko nikt tak nie robi podczas pracy.
To głupie.
Post by Maciek Godek
A utrudniona, bo przy zbiorowej kolaboracji synchronizacja repozytoriów a'la SVN byłaby koszmarem.
Dlatego każdy używający SVN nie jest do tego stopnia idiotą, aby mieć
osobne, prywatne repozytoria. Ludzie miewają szybki internet. Szybszy
niż w latach 90. Centralne repo nie jest niczym dziwnym. Ba, działa
absurdalnie szybko, przy tym moim, skromnym repo.
Post by Maciek Godek
Na przykład github jądra Linuxa wyświetla 5000 współautorów.
I to oznacza że masz 5000 lokalnych repozytoriów? Czyli, mówiąc
prościej, rozrzuciłeś problemy synchronizacji na 5000 osób i wszyscy
udają że już go nie ma?

Na svn by go *naprawdę* nie było. Tak najzwyczajniej, w SVN nie ma
problemu z synchronizacją. O ile potrafisz go używać.
Post by Maciek Godek
A ile osób te zespoły liczyły?
Ilość userów nijak nie zwiększa problemów pracy SVN. Rozmiar repo też.

Powtarzasz jakieś zasłyszane i niezweryfikowane brednie. Swoją droga
powtarzają je wszyscy gitowcy jacy przewineli się przez moje ręce, po
bliższej analizie okazuje się że nie mieli pojęcia jak sie obsługuje
SVN, robili to źle i marudzili, że nie działa lub wyczytali multum
podobnych bredni z internetach.

Nikt nie twierdzi, że git jest lepszy/gorszy, bo to narzedzie do innych
zastosowań niż centralne repo na szybkich łaczach internetowych. Czyli
90% potrzeb i możliwości przeciętnej firmy w PL.

Nie jestem zwolennikiem SVN, ale szlag mnie trafia kiedy słyszę takie
brednie. SVN to zaskakująco stabilny i zacny kawał softu. To że jest
chwilowa moda na gita o niczym nie świadczy. Na pewno nie o tym, że ma
jakieś znaczące zalety w typowym flow w typowej firmie z centralnym
repo. Jak narazie, typowi gitowiec pytany o prawdziwe zalety git vs svn
zazwyczaj nie ma ani jednej która by nie wynikała z błednego uzycia svn.
I mam wrażenie że nie bez powodu: nie ma tak naprawdę argumentów. To
tylko moda i propaganda.

Czekam na coś lepszego. Już ze 20 lat.
Mateusz Viste
2021-08-25 07:53:36 UTC
Permalink
Post by heby
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
U mnie trwa około 2 sekund.
Bo tu oczywiście nie chodziło o branch, tylko o merge. :)
Te bywają długawe - ale w żadnym wypadku nie określiłbym ich dziś jako
"koszmar". We wczesnych wersjach subversion ten proces faktycznie był
mało optymalny, ale mówię tu o pierwszej dekadzie wieku - od tego czasu
subversion znacząco się pod tym kątem poprawiło.
Post by heby
Repo takie sobie, około miliona plików źródłowych i ponad 30GB
gołego mięska na trunku/tagu z którego robie
Ładnie. Zerknąłem na swoje największe repo - ledwo 100 tys. plików w
trunk, niecałe 7 GiB danych, 30 tys. rewizji, ok 12 lat pracy. W tym
czasie liczba napotkanych problemów: zero. Dlatego rozbawiły mnie nieco
te historie o "długu technologicznym".
Post by heby
Jeśli masz zespół programistów na Antarktydzie na łaczach
wdzwanianych TePeSA to zaleta gita z offlinowym repo jest
zdecydowanie wyróżniająca go na tle tych normalnych potrzeb reszty
ludzkości.
Muszę tutaj zaoponować - w takiej sytuacji prędzej czy później
antarktyczni programiści będą musieli te swoje wszystkie commity i tak
przepchać tym swoim telegrafem, więc oszczędność w git jest żadna. A
nawet wręcz przeciwnie, bo każdy z eskimosów będzie musiał
synchronizować u siebie wszystkie możliwe wersje kolegów. svn jest tu
daleko oszczędniejszy.

Jakimś racjonalnym use casem dla git byłaby praca na Saturnie.
Saturnianie pracują sobie spokojnie u siebie, a kiedy raz na jakiś czas
otwiera się okienko komunikacji z ziemią, to przesyłają wszystko jednym
rzutem do centrali (licząc, że koledzy z ziemi nie narobili w
międzyczasie jakichś kolizji).
Post by heby
Dlatego każdy używający SVN nie jest do tego stopnia idiotą, aby mieć
osobne, prywatne repozytoria. Ludzie miewają szybki internet. Szybszy
niż w latach 90.
Tu nawet nie potrzeba szybkiego internetu. Przez kilka lat pracowałem
na łączu 64 Kbps, przesłanie kilku kilobajtów w ramach commita nie było
żadnym problemem. Dłużej trwało odebranie emaila.
Post by heby
Na svn by go *naprawdę* nie było. Tak najzwyczajniej, w SVN nie ma
problemu z synchronizacją. O ile potrafisz go używać.
"commit early, commit often". Niestety wielu ludzi ma z tym jakiś
problem psychologiczny. Wstydliwość, czy nie wiem co. Może do nich
właśnie przemawia to całe lokalne gitowanie...
Post by heby
Post by Maciek Godek
A ile osób te zespoły liczyły?
Ilość userów nijak nie zwiększa problemów pracy SVN. Rozmiar repo też.
Może zwiększać, przy patologicznej organizacji pracy (Janek i Zdziusiu
pracują jednocześnie nad refaktoryzacją tej samej funkcji trunkowej).
Ale fakt - to już temat poza gestią VCS-a. No i git tak czy inaczej
w żaden sposób tu niczego nie ułatwia, a raczej wręcz utrudnia.
Post by heby
Nie jestem zwolennikiem SVN
Z ciekawości - dlaczego? W sensie - jakie widzisz w nim mankamenty? Bo
mi naprawdę trudno się do czegokolwiek przyczepić.

Mateusz
heby
2021-08-25 08:02:25 UTC
Permalink
Post by Mateusz Viste
Post by heby
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
U mnie trwa około 2 sekund.
Bo tu oczywiście nie chodziło o branch, tylko o merge. :)
Super. Coś koło 4-5 sekund.
Post by Mateusz Viste
Te bywają długawe
Tak, czaami nie zdążę siorpnąc herbatki.
Post by Mateusz Viste
Post by heby
Repo takie sobie, około miliona plików źródłowych i ponad 30GB
gołego mięska na trunku/tagu z którego robie
Ładnie. Zerknąłem na swoje największe repo - ledwo 100 tys. plików w
trunk, niecałe 7 GiB danych, 30 tys. rewizji, ok 12 lat pracy. W tym
czasie liczba napotkanych problemów: zero. Dlatego rozbawiły mnie nieco
te historie o "długu technologicznym".
Ja wiem jakie problemy ma SVN, związane z realną pracą, ale w
bajkoopowieściach gitowców niegdy one nie padają. Padają różne brednie.
Post by Mateusz Viste
Post by heby
Jeśli masz zespół programistów na Antarktydzie na łaczach
wdzwanianych TePeSA to zaleta gita z offlinowym repo jest
zdecydowanie wyróżniająca go na tle tych normalnych potrzeb reszty
ludzkości.
Muszę tutaj zaoponować - w takiej sytuacji prędzej czy później
antarktyczni programiści będą musieli te swoje wszystkie commity i tak
przepchać tym swoim telegrafem, więc oszczędność w git jest żadna.
Oszczęsdnośc polega na tym, że pośrednich komitów nie pchasz w sieć.

Przykładowo: odradzam używanie SVN w przypadku pracy z plikami binarnymi.
Post by Mateusz Viste
Post by heby
Na svn by go *naprawdę* nie było. Tak najzwyczajniej, w SVN nie ma
problemu z synchronizacją. O ile potrafisz go używać.
"commit early, commit often". Niestety wielu ludzi ma z tym jakiś
problem psychologiczny. Wstydliwość, czy nie wiem co. Może do nich
właśnie przemawia to całe lokalne gitowanie...
Wypytuje zawsze dlaczego używaja gita. Odpowiedż w 80% wypadków taka
sama: bo ma lokalne repo. Ale nikt nie potrafi uzasadnić po co mu to
potrzebne. CHoć trafiają się argumenty antysocjalne i antyzespołowe
(nikt nie patrzy w to co robie).
Post by Mateusz Viste
Post by heby
Ilość userów nijak nie zwiększa problemów pracy SVN. Rozmiar repo też.
Może zwiększać, przy patologicznej organizacji pracy (Janek i Zdziusiu
pracują jednocześnie nad refaktoryzacją tej samej funkcji trunkowej).
Jeśli 100 osób na raz zmieniło tą tamą linijkę to i Święty Git nie pomoże.
Post by Mateusz Viste
Post by heby
Nie jestem zwolennikiem SVN
Z ciekawości - dlaczego?
Z powodu kłopotów z backportowaniem poprawek. Nie jest to poprawnie
ogarniane. Co prawda dzięki temu mam czysty styl pracy (brak merge do
niższych rewizji wychodzi tylko na dobre) ale mimo to ludzie robią takie
błędy i SVN nie ma nic co by tutaj pomagało.
Mateusz Viste
2021-08-25 08:34:12 UTC
Permalink
Post by heby
Post by Mateusz Viste
Post by heby
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
U mnie trwa około 2 sekund.
Bo tu oczywiście nie chodziło o branch, tylko o merge. :)
Super. Coś koło 4-5 sekund.
Dzisiaj, tak. Dlatego pisałem, że to żaden koszmar, choć jeśli kolega
Maciek eksperymentował z svn w latach 200x, to mógł zaobserwować
gorsze wyniki. Ale nie wiem czy faktycznie się na tym przejechał, czy
po prostu tak przeczytał na jakimś forum i pomyślał że to fajny
argument - wszak taki mechanizm jest mi również znany.
Post by heby
Post by Mateusz Viste
Te bywają długawe
Tak, czaami nie zdążę siorpnąc herbatki.
Do herbatki to służy przecież kompilacja a nie merge. Sądziłem, że w
naszej branży to oczywistość (ref: xkcd, "compiling!"). :-)
Post by heby
Post by Mateusz Viste
Muszę tutaj zaoponować - w takiej sytuacji prędzej czy później
antarktyczni programiści będą musieli te swoje wszystkie commity i
tak przepchać tym swoim telegrafem, więc oszczędność w git jest
żadna.
Oszczęsdnośc polega na tym, że pośrednich komitów nie pchasz w sieć.
Jak nie pcham, jak pcham. No chyba, że wcześniej skorzystam z zaklęć
rebase/squash/itd, ew. jakieś amendowanie... ale to należałoby uściślić.
I faktycznie - svn takich mechanizmów nie posiada. Bo i po co?
Repozytorium to nie konkurs artystyczny.
Post by heby
Przykładowo: odradzam używanie SVN w przypadku pracy z plikami binarnymi.
Zdarza mi się (rzadko, ale jednak) trzymać pliki binarne w svn - czasem
do kilku MiB. Działa. Jeśli ktoś zmieni ten plik 10 razy, to svn up
zaciągnie mi tę ostatnią (najświeższą) wersję. Git natomiast będzie
pchał 10x więcej danych. Nie widzę w czym git tutaj lepszy. Abstrahuję
tu od dodatków typu LFS, bo to proteza której po prostu nie potrzeba w
svn.
Post by heby
Z powodu kłopotów z backportowaniem poprawek. Nie jest to poprawnie
ogarniane. Co prawda dzięki temu mam czysty styl pracy (brak merge do
niższych rewizji wychodzi tylko na dobre) ale mimo to ludzie robią
takie błędy i SVN nie ma nic co by tutaj pomagało.
A git ma? Pytam szczerze, bo nie wiem. Backporty mi się czasem
zdarzają. Typowo: przeportowanie jakiejś istotnej poprawki z wersji
14.x do dawnej wersji 13.x sprzed roku. To, co proponuje w tym
zakresie svn jest, jak dla mnie, zupełnie wystarczające. Oczywiście
zdarzają się sytuacje, w których svn nie wie jak ogarnąć jakiś merge bo
kod w międzyczasie uległ zbyt dużym zmianom. Ale to już klasa
problemów, których wg. mnie nie powinna próbować rozwiązać maszyna.
Jeśli przeklejenie kodu nie jest oczywiste to sprawę tak czy inaczej
powinien rozpatrzyć człowiek i podpowiedzieć automatowi co z czym ma
posklejać aby wynik miał szansę zadziałać (i tak dzieje się w svn).

Mateusz
heby
2021-08-25 09:03:11 UTC
Permalink
Post by Mateusz Viste
zdarzają. Typowo: przeportowanie jakiejś istotnej poprawki z wersji
14.x do dawnej wersji 13.x sprzed roku.
Mówie o backportowaniu podczas flow na branchu.

Przykład:

1) robie brancha z trunka
2) na trunku ktoś usuwa plik A i dodaje krytyczny ficzer
3) zaciągam do branch zmianę z 2)
4) ktoś rewertuje omyłkowo usunięty plik na trunku
5) ja merguje się z moim branchem do trunka
6) plik A znika

To jest backport do brancha w celu ponownego zespawania brancha z
trunkiem i to powoduje problemy. Co ciekawe, taki styl pracy jest
*oficjalnie* sugerowany przez Stefana. Mimo, że powoduje rozjazdy i
fałszywe konflikty. U mnie jest to zabronione. Zamiast backportu robie
*nowy* branch z trunka i przenoszę zmiany ze starego, co usuwa
*wszystkie* problemy z mergowaniem backportów, bo ich nie ma. I branch
nie z trunka, tylko taga, ale to by było zbyt skomplikowane dla opisu...
tak tylko dla purystów uwaga ;)
Mateusz Viste
2021-08-25 09:21:27 UTC
Permalink
Post by heby
1) robie brancha z trunka
2) na trunku ktoś usuwa plik A i dodaje krytyczny ficzer
3) zaciągam do branch zmianę z 2)
4) ktoś rewertuje omyłkowo usunięty plik na trunku
5) ja merguje się z moim branchem do trunka
6) plik A znika
Ach takie jaja. No to tego po prostu nie robimy. Jeśli ktoś robi
branch, to pracuje na nim w izolacji aż do zespawania (lub porzucenia,
bo to często dla potrzeb jakiegoś prototypowania). A jak mu się nie
podoba, to niech branchuje na nowo. Czyli w efekcie wychodzi na to
samo, co opisujesz. Wydaje mi się, że tak jest zdrowiej, no i przede
wszystkim łatwiej się później człowiekowi (mi) połapać kto co dodał,
dlaczego i w którym momencie.

Mateusz
Maciek Godek
2021-08-25 09:20:30 UTC
Permalink
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Post by heby
Post by Maciek Godek
Pamiętam, że kiedyś robiłem brancha na SVNie i to był koszmar.
U mnie trwa około 2 sekund.
Bo tu oczywiście nie chodziło o branch, tylko o merge. :)
Super. Coś koło 4-5 sekund.
Dzisiaj, tak. Dlatego pisałem, że to żaden koszmar, choć jeśli kolega
Maciek eksperymentował z svn w latach 200x, to mógł zaobserwować
gorsze wyniki. Ale nie wiem czy faktycznie się na tym przejechał, czy
po prostu tak przeczytał na jakimś forum i pomyślał że to fajny
argument - wszak taki mechanizm jest mi również znany.
Ostatni raz korzystałem z SVN w okolicach 2012 roku, i wspominam robienie branchy i merge'ów jako koszmar.

W gicie sporo innych rzeczy wspominam jako koszmar, ale bym powiedział, że tak jak SVN jest porządniej zaimplementowany i ma lepsze interfejsy, git jest lepiej koncepcyjnie pomyślany i bardziej skalowalny, ale implementacja i projekt interfejsu są raczej do bani.

No i git rzeczywiście jest bardziej modny, co mimo wszystko ma jakieś tam znaczenie - np. jeżeli idzie o dostępność hostingu.

Tak czy siak - jak Sobczak słusznie zauważył - dywagowanie o wyższości jednego systemu kontroli wersji nad drugim w wątku dotyczącym problemów w programie C++owym nie ma za dużo sensu.

Śledzenie zmian w takim czy innym VCSie jest elementem higieny pracy programisty i może niekiedy pomóc wyłapać błędy, które się wprowadziło na jakimś etapie rozwoju projektu.

Ja bym każdemu kto jeszcze nie ma swojej preferencji raczej polecał gita, i to właśnie ze względu na ową "modność"

Swego czasu korzystałem z mercuriala z hostingiem na bitbuckecie, ale atlassian uznał, że nie będzie już wspierał mercurialowych repozytoriów, i zamiast je przekonwertować do gita (na co bez trudu można znaleźć gotowe skrypty), to mi je skasował (!)
heby
2021-08-25 09:31:42 UTC
Permalink
Post by Maciek Godek
Ostatni raz korzystałem z SVN w okolicach 2012 roku, i wspominam robienie branchy i merge'ów jako koszmar.
Korzystam z jednego i tego samego repo od ~2005 roku, od rewizji 0.
Nigdy nie nazwałbym tego koszmarem. Szczególnie od czasu pojawienia się
lokalnych dysków ssd, które problemy zredukowały do sekund.
Post by Maciek Godek
Tak czy siak - jak Sobczak słusznie zauważył - dywagowanie o wyższości jednego systemu kontroli wersji nad drugim w wątku dotyczącym problemów w programie C++owym nie ma za dużo sensu.
Sens ma w wyższej skali. Zachowania związane z VCS mają wpływ na flow pracy.

Chciałbym np., aby ciągła intergracja ciągle puszczała mi unit testy, po
każdym commicie w *branch*.

Gitowiec się oburzy, bo przeciez to jego przejaświętszy branch, gdzie
poza kodem trzyma też zdjecia kotów, liste zakupów w spożywczaku i kilka
*.mp4 z przyrodniczymi, a ponadto on ma 7 poprawek na tym "branchu", bo
co będzie tracił czas na 7 branchów.

Innymi słowy: C++ może i wsio rawno, ale w przypadku wyższej warstwy,
wpływ jest widoczny, na styl pracy.
Mateusz Viste
2021-08-25 09:55:25 UTC
Permalink
Post by Maciek Godek
Ostatni raz korzystałem z SVN w okolicach 2012 roku, i wspominam
robienie branchy i merge'ów jako koszmar.
Na świeżej (wówczas) wersji svn? Dziwne. Musiałbyś więcej szczegółów
podać, albo powtórzyć doświadczenie i opisać.
Post by Maciek Godek
git jest lepiej koncepcyjnie pomyślany
Do bani z taką koncepcją, że każdy musi mieć na pececie swój własny
"niby-serwer" i synchronizować wszystko w obie strony, przy tym
chowając swoja zmiany przed światem tak długo, jak się da. No i te
setki opcji, przełączników, trybów...
Post by Maciek Godek
i bardziej skalowalny
Nie będę się spierał, bo moje doświadczenie w adminowaniu svn-em jest
ograniczone do kilkuosobowych projektów, ale niemniej wypadałoby to
stwierdzenie jakoś uargumentować. Przez wiele lat z svn korzystały duże
i bardzo duże projekty. Wnioskuję więc, że jednak da się. Jednym z
ostatnich "dużych" projektów open-source, który wyemigrował z svn jest
FreeBSD. Jeden z core programistów podaje przesłanki za tą zmianą:
https://bsdimp.blogspot.com/2020/09/freebsd-subversion-to-git-migration.html

W żadnym punkcie nie pada "gorsza skalowalność". Podane argumenty
sprowadzają się do dwóch rzeczy: "bo wszyscy tak robią" i "git pozwala
ładnie formatować patche, ułatwiając ich przyjmowanie z zewnątrz".
Post by Maciek Godek
Tak czy siak - jak Sobczak słusznie zauważył - dywagowanie o
wyższości jednego systemu kontroli wersji nad drugim w wątku
dotyczącym problemów w programie C++owym nie ma za dużo sensu.
Dyskusja to taki proces, że z czasem może zupełnie zmienić kierunek, w
zależności od zainteresowań i woli jej uczestników.
Post by Maciek Godek
Ja bym każdemu kto jeszcze nie ma swojej preferencji raczej polecał
gita, i to właśnie ze względu na ową "modność"
Czyli już nie ze względu na "dług technologiczny", "niebotyczne
komplikacje" i rzekomą "prostotę gita"? No ok, moda to też jakiś
argument. Niekoniecznie zresztą zły.

Mateusz
Maciek Godek
2021-08-25 10:09:41 UTC
Permalink
Post by Mateusz Viste
Post by Maciek Godek
Ostatni raz korzystałem z SVN w okolicach 2012 roku, i wspominam
robienie branchy i merge'ów jako koszmar.
Na świeżej (wówczas) wersji svn?
Nie wiem. Pewne dość świeżej bo to stało na w miarę aktualnym Ubuntu.
Post by Mateusz Viste
Dziwne. Musiałbyś więcej szczegółów podać, albo powtórzyć doświadczenie i opisać.
Pewnie tak, ale na to raczej nie ma szans :D
Post by Mateusz Viste
Post by Maciek Godek
git jest lepiej koncepcyjnie pomyślany
Do bani z taką koncepcją, że każdy musi mieć na pececie swój własny
"niby-serwer" i synchronizować wszystko w obie strony, przy tym
chowając swoja zmiany przed światem tak długo, jak się da. No i te
setki opcji, przełączników, trybów...
Główna koncepcja to jest raczej "content-addressable storage".

Od strony doświadczenia użytkownika można z tego korzystać dokładnie tak samo, jak z SVNa, jeśli się chce.

Co do "chowania wszystkiego przed światem tak długo, jak się da", to nie rozumiem.
Post by Mateusz Viste
Post by Maciek Godek
i bardziej skalowalny
Nie będę się spierał, bo moje doświadczenie w adminowaniu svn-em jest
ograniczone do kilkuosobowych projektów, ale niemniej wypadałoby to
stwierdzenie jakoś uargumentować. Przez wiele lat z svn korzystały duże
i bardzo duże projekty. Wnioskuję więc, że jednak da się. Jednym z
ostatnich "dużych" projektów open-source, który wyemigrował z svn jest
https://bsdimp.blogspot.com/2020/09/freebsd-subversion-to-git-migration.html
W żadnym punkcie nie pada "gorsza skalowalność".
Tutaj jest:
"Git can easily and robustly be mirrored. Subversion can be mirrored, but that mirroring is far from robust."
Mateusz Viste
2021-08-25 12:44:01 UTC
Permalink
Post by Maciek Godek
Główna koncepcja to jest raczej "content-addressable storage".
Nie ma w tym niczego fajnego, to tylko pokłosie decentralizacji.
Post by Maciek Godek
Od strony doświadczenia użytkownika można z tego korzystać dokładnie
tak samo, jak z SVNa, jeśli się chce.
Znaczy patrząc na dwie rewizje mogę rzutem oka stwierdzić, która jest
wcześniejsza, i oszacować mniej więcej o ile? No to git. :)
Post by Maciek Godek
Co do "chowania wszystkiego przed światem tak długo, jak się da", to nie rozumiem.
O lokalne commity chodzi, i o kryjące się za nimi podejście "nie
pokażę co robię póki nie wycackam tego do końca".
Post by Maciek Godek
Post by Mateusz Viste
W żadnym punkcie nie pada "gorsza skalowalność".
"Git can easily and robustly be mirrored. Subversion can be mirrored,
but that mirroring is far from robust."
Klonowanie repozytoriów svn działa bardzo sprawnie (svnsync),
korzystałem z tego wielokrotnie w ramach przeprowadzania repozytoriów
svn między serwerami, a także w ramach duplikowania lokalnego repo
FreeBSD w domu, kiedy jeszcze miałem w piwnicy kilka instalacji BSD.
Ale fakt - nie jest to "wbudowane w protokół" i może wymagać nieco
rzeźby przy jakichś egzotyczniejszych wymaganiach.

Mateusz
Maciek Godek
2021-08-25 13:39:20 UTC
Permalink
Post by Mateusz Viste
Post by Maciek Godek
Od strony doświadczenia użytkownika można z tego korzystać dokładnie
tak samo, jak z SVNa, jeśli się chce.
Znaczy patrząc na dwie rewizje mogę rzutem oka stwierdzić, która jest
wcześniejsza, i oszacować mniej więcej o ile? No to git. :)
Oczywiście. Git loguje datę każdego commita. Nie wiem, dlaczego to by miało zaskakiwać.
Post by Mateusz Viste
Post by Maciek Godek
Co do "chowania wszystkiego przed światem tak długo, jak się da", to nie rozumiem.
O lokalne commity chodzi, i o kryjące się za nimi podejście "nie
pokażę co robię póki nie wycackam tego do końca".
Nie bardzo rozumiem jaką lepszą alternatywę daje SVN.
"Nie scommituję dopóki nie wycykam tego do końca"?
heby
2021-08-25 14:18:10 UTC
Permalink
Post by Maciek Godek
Nie bardzo rozumiem jaką lepszą alternatywę daje SVN.
"Nie scommituję dopóki nie wycykam tego do końca"?
Takie sytuacje to patlogia w grupach używających SVN. Codziennością są
natomiast dziesiętki commitów dzienie w *jawny* branch.
Mateusz Viste
2021-08-25 14:36:15 UTC
Permalink
Post by heby
Post by Maciek Godek
Nie bardzo rozumiem jaką lepszą alternatywę daje SVN.
"Nie scommituję dopóki nie wycykam tego do końca"?
Takie sytuacje to patlogia w grupach używających SVN. Codziennością
są natomiast dziesiętki commitów dzienie w *jawny* branch.
Całkiem inne podejście, tak.

Wpadłem właśnie na ciekawy (acz stary) post. Napisany starannie i z
humorem. Podaję linka do lektury przy kawie, gdyby ktoś nie znał. :)

https://www.bitquabit.com/post/unorthodocs-abandon-your-dvcs-and-return-to-sanity/

Mateusz
Maciej Sobczak
2021-08-24 18:58:34 UTC
Permalink
Post by Mateusz Viste
Lubię proste i skuteczne narzędzia
Przy pracy jednoosobowej takimi narzędziami są zip oraz unzip. Polecam.
Zwłaszcza, że oprócz historii zmian potrafią zupełnie naturalnie zrobić backup - a to jest *ważniejsze*, niż zabawa w commity.
Nie, lokalny git to nie jest backup.

Jednoosobowy lokalny git ma wartość co najwyżej hobbystyczną albo edukacyjną ("Czy ma Pan doświadczenie z gitem? Tak, od 5 lat."), ale jego użytkowa wartość dodana wynosi epsilon.
To jest bardzo wymowne, że zamiast poprawiać błędy w programie dyskusja jest o wyższości gita nad svnem. :-D
--
Maciej Sobczak * http://www.inspirel.com
Mateusz Viste
2021-08-25 07:22:18 UTC
Permalink
Post by Maciej Sobczak
Post by Mateusz Viste
Lubię proste i skuteczne narzędzia
Przy pracy jednoosobowej takimi narzędziami są zip oraz unzip.
Wyczuwam bratnią duszę. Doceniam.
Post by Maciej Sobczak
Polecam. Zwłaszcza, że oprócz historii zmian potrafią zupełnie
naturalnie zrobić backup - a to jest *ważniejsze*, niż zabawa w
commity. Nie, lokalny git to nie jest backup.
Z tym jednak zgodzić się nie mogę... Lokalny VCS to oczywiście nie
backup, ale lokalny zestaw plików *.zip też nim nie jest. W obu
przypadkach wypadałoby zrzucić pliki gdzieś na zewnątrz. svn akurat
ma to w standardzie (git też, chyba że ktoś upiera się korzystać z tych
jego "lokalnych" funkcji).
Post by Maciej Sobczak
Jednoosobowy lokalny git ma wartość co najwyżej hobbystyczną albo
edukacyjną ("Czy ma Pan doświadczenie z gitem? Tak, od 5 lat."), ale
jego użytkowa wartość dodana wynosi epsilon.
Bez przesady. Lokalny git, svn czy inny rcs to narzędzia które mają
sens nawet lokalny. I oczywiście można zadowolić się zipem, zip-diffem
itd, ale kosztem pewnej wygody użytkowania. Zamiast robić zipa i
kopiować go gdzieś na jakiś serwer po FTP, rsync itp, robię zwyczajne
svn commit i mam pewność, że moje zmiany już się nie zgubią.
Korzystanie z ZIP to również marnotrawstwo miejsca - ten sam plik
będzie w każdym zipie zajmował tyle samo miejsca, choć od wielu lat nie
uległ zmianie. Jest jeszcze jeden aspekt: często zdarza się, że
potrzebuję prześledzić historię jednego pliku (spośród kilkunastu
tysięcy w projekcie) na przestrzeni paru lat. Ciężko mi wyobrazić to
sobie przy milionach plików ZIP.

Mateusz
Maciej Sobczak
2021-08-25 20:31:21 UTC
Permalink
Post by Mateusz Viste
Post by Maciej Sobczak
Przy pracy jednoosobowej takimi narzędziami są zip oraz unzip.
Wyczuwam bratnią duszę. Doceniam.
Post by Maciej Sobczak
Polecam. Zwłaszcza, że oprócz historii zmian potrafią zupełnie
naturalnie zrobić backup - a to jest *ważniejsze*, niż zabawa w
commity. Nie, lokalny git to nie jest backup.
Z tym jednak zgodzić się nie mogę... Lokalny VCS to oczywiście nie
backup, ale lokalny zestaw plików *.zip też nim nie jest.
Lokalny nie jest. Ale nie napisałem, że lokalny. Nawet pendrive załatwi sprawę łatwiej, niż szarpanie się z VCS. Bo oczywiście nie używamy cały czas tylko jednego pendrive'a. A może jednak Google Drive? Albo Box? A właściwie bez różnicy, bo zip w ogóle nie jest od tego uzależniony. Jest narzędziem tak łatwym w użyciu, że cokolwiek innego jest zawsze dodatkową komplikacją. Dotarło to do mnie, gdy pierwszy raz w życiu zzipowałem lokalne repo gita, żeby zrobić jego backup. Absurdalność tej czynności sprawiła, że to był też ostatni dzień mojego jednoosobowego użytkowania gita.
Post by Mateusz Viste
W obu
przypadkach wypadałoby zrzucić pliki gdzieś na zewnątrz. svn akurat
ma to w standardzie
Zdażyło mi się nawet wysłać zipa jako załącznik mailem. Nie, svn nie ma tego w standardzie. Właśnie o to chodzi - o *rozdzielenie* kompetencji. Zamrożenie stanu plików w katalogu to jedna rzecz (potrzebne do historii), składowanie tego stanu to inna rzecz (potrzebne do backupu). Zip jest banalnie skuteczny właśnie przez to, że tych rzeczy nie łączy.
Post by Mateusz Viste
Zamiast robić zipa i
kopiować go gdzieś na jakiś serwer
A jeśli nie chcę na "jakiś serwer"? Czemu wszyscy mają obsesję na punkcie wysyłania swojej pracy na "jakiś serwer"?
Kiedyś do komputera był podłączony magnetofon i był spokój. :-)
Post by Mateusz Viste
Korzystanie z ZIP to również marnotrawstwo miejsca - ten sam plik
będzie w każdym zipie zajmował tyle samo miejsca, choć od wielu lat nie
uległ zmianie.
Technicznie to prawda, ale użytkowo nigdy jeszcze nie doszedłem do tego, żeby martwić się o miejsce na skompresowane pliki źródłowe swojego autorstwa. Może za mało piszę. W każdym razie nie jest to showstopper.
Post by Mateusz Viste
Jest jeszcze jeden aspekt: często zdarza się, że
potrzebuję prześledzić historię jednego pliku (spośród kilkunastu
tysięcy w projekcie) na przestrzeni paru lat. Ciężko mi wyobrazić to
sobie przy milionach plików ZIP.
To jest dobry argument. Ale mówimy o użytkowaniu jednoosobowym. W takim kontekście nie zaobserwowałem (u siebie) takich potrzeb. Nawet wtedy, gdy korzystając jednoosobowo z gita, miałem taką możliwość na wyciągnięcie palca. Czyli podobnie jak z brakującym miejscem na dysku, nie jest to scenariusz, który mnie zatrzymuje w pracy.
Polecam narzędzi mniej, niż więcej.
--
Maciej Sobczak * http://www.inspirel.com
Mateusz Viste
2021-08-26 07:40:41 UTC
Permalink
Post by Maciej Sobczak
Post by Mateusz Viste
Z tym jednak zgodzić się nie mogę... Lokalny VCS to oczywiście nie
backup, ale lokalny zestaw plików *.zip też nim nie jest.
Lokalny nie jest. Ale nie napisałem, że lokalny.
Napisał kolega, że "potrafią zupełnie naturalnie zrobić backup". Na to
ja odpowiadam, że nie - nie potrafią.
Post by Maciej Sobczak
Nawet pendrive załatwi sprawę łatwiej, niż szarpanie się z VCS.
Wyczuwam traumatyczne doświadczenia z VCS (może z gitem? w tym wypadku
nie dziwię się nabytym uprzedzeniom). Praca z svnem nie jest żadnym
szarpaniem. Powiedziałbym nawet, że w porównaniu do moich doświadczeń
sprzed VCS (na dyskietkach, zipach, itp), jest przyjemnością.

A pendrive nie załatwi sprawy, z tego prostego powodu że nie jest
geograficznie odległy.
Post by Maciej Sobczak
Zdażyło mi się nawet wysłać zipa jako załącznik mailem.
Mi to się też zdarza (bez kropki). Ale nie jako ersatz backupu, a tym
bardziej VCSa.
Post by Maciej Sobczak
A jeśli nie chcę na "jakiś serwer"? Czemu wszyscy mają obsesję na
punkcie wysyłania swojej pracy na "jakiś serwer"?
Bo to podstawa sensownego backupu. Po każdym 'svn commit' mam przyjemną
świadomość, że mój trud już nie zaginie, choćby mi komputer zaraz
wybuchł albo dom spłonął. Żadnych pendrajwów, żadnych dyskietek,
żadnych parametrów do zipa - tylko svn commit, i po mniej niż sekundzie
stan mojego projektu jest zarchiwizowany kilkaset km ode mnie (albo i
dalej).
Post by Maciej Sobczak
Kiedyś do komputera był podłączony magnetofon i był spokój. :-)
Moja mama opowiadała mi kiedyś, jak to pisała pracę magisterską z
magnetofonem. Było fajnie póki dziad taśmy nie wciągnął. Skończyło się
przepisywaniem wszystkiego na nowo, na podstawie ręcznych notatek.
Post by Maciej Sobczak
Post by Mateusz Viste
Korzystanie z ZIP to również marnotrawstwo miejsca - ten sam plik
będzie w każdym zipie zajmował tyle samo miejsca, choć od wielu lat
nie uległ zmianie.
Technicznie to prawda, ale użytkowo nigdy jeszcze nie doszedłem do
tego, żeby martwić się o miejsce na skompresowane pliki źródłowe
swojego autorstwa. Może za mało piszę. W każdym razie nie jest to
showstopper.
Program to przecież nie tylko kod, może zawierać także pliki
multimedialne, czcionki, jakieś zewnętrzne biblioteki, stronę
www, itp. Zerknąłem na moją pierwszą z brzegu gierkę:
http://simplesok.sf.net/
Wielkość trunka 5 MiB. Po skompresowaniu zipem 3.8 MiB. Razy 109
rewizji, to już ponad 400 MiB... Ok, w dobie chmurowych gigabajtów to
nie jest "showstopper", ale niemniej dręczyłaby mnie zabawa z 400M
zipów dla jednej malutkiej gierki.
Post by Maciej Sobczak
To jest dobry argument. Ale mówimy o użytkowaniu jednoosobowym. W
takim kontekście nie zaobserwowałem (u siebie) takich potrzeb.
A mi to się zdarzyło co najmniej kilka razy. Głównie w ramach szukania
jakiegoś błędu i zastanawiania się dlaczego w pliku bb.c zmieniłem x=1
na x+=1 i w jakich okolicznościach do tego doszło. Nie jest to potrzeba
codzienna, ale w stosownym kontekście bardzo się przydaje.
Post by Maciej Sobczak
Polecam narzędzi mniej, niż więcej.
Też wychodzę z takiego założenia i filozofię bardzo doceniam, niemniej
filtr oleju w aucie odkręcam nie (jakże uniwersalnym) młotkiem, tylko
wyspecjalizowanym do tego narzędziem.

Mateusz
Maciej Sobczak
2021-08-28 20:10:12 UTC
Permalink
Post by Mateusz Viste
Napisał kolega, że "potrafią zupełnie naturalnie zrobić backup". Na to
ja odpowiadam, że nie - nie potrafią.
No tak. Ostatecznie to jeden z kilku etapów.
Post by Mateusz Viste
A pendrive nie załatwi sprawy, z tego prostego powodu że nie jest
geograficznie odległy.
To zależy, jaką sprawę chcesz załatwić. Jest nieskończenie bardziej odległy od lokalnego repo. Nawet jak leży obok.
Post by Mateusz Viste
Post by Maciej Sobczak
A jeśli nie chcę na "jakiś serwer"? Czemu wszyscy mają obsesję na
punkcie wysyłania swojej pracy na "jakiś serwer"?
Bo to podstawa sensownego backupu.
Kiedyś trzymałem swoje pliki na "jakimś serwerze", gdzie admini zadbali o backup serwerów w taki sposób, że serwery nawzajem trzymały swoje kopie. Przyszedł wirus NIMDA i pozamiatał całą serwerownię. Dobrze, że miałem kopię u siebie.
Każde rozwiązanie ma swoje anegdoty.
Post by Mateusz Viste
http://simplesok.sf.net/
Wielkość trunka 5 MiB. Po skompresowaniu zipem 3.8 MiB. Razy 109
rewizji, to już ponad 400 MiB... Ok,
No właśnie, to jest dobry przykład. Bo ani 400MB to nie jest temat (najmniejszy pendrive dostępny w sklepie jest kilkadziesiąt razy większy), ani też wcale nie potrzebujesz tych 109 rewizji. Najważniejsza jest ostatnia, potem (dalej wstecz) ich wartość użytkowa maleje w błyskawicznym tempie.
Post by Mateusz Viste
A mi to się zdarzyło co najmniej kilka razy. Głównie w ramach szukania
jakiegoś błędu i zastanawiania się dlaczego w pliku bb.c zmieniłem x=1
na x+=1 i w jakich okolicznościach do tego doszło.
No właśnie. I jeśli masz dokumentację albo chociaż komentarze w kodzie, to nie potrzebujesz historii, żeby na to pytanie odpowiedzieć. A jeśli nie masz, to nawet 109 rewizji, gdzie w 75 pojawia się x+=1, dalej będzie zagadką.
Post by Mateusz Viste
filtr oleju w aucie odkręcam nie (jakże uniwersalnym) młotkiem, tylko
wyspecjalizowanym do tego narzędziem.
Zip służy do archiwizacji.
--
Maciej Sobczak * http://www.inspirel.com
Mateusz Viste
2021-08-30 07:54:59 UTC
Permalink
Post by Maciej Sobczak
wcale nie potrzebujesz tych 109 rewizji. Najważniejsza jest ostatnia,
potem (dalej wstecz) ich wartość użytkowa maleje w błyskawicznym
tempie.
Potrzebuję niektórych, ale nie jestem w stanie zawczasu stwierdzić,
których dokładnie. Łatwy wgląd w przeszłość jest bardzo przydatny w
ramach szukania egzotycznych regresji, o czym już wcześniej wspominałem.
Post by Maciej Sobczak
No właśnie. I jeśli masz dokumentację albo chociaż komentarze w
kodzie, to nie potrzebujesz historii, żeby na to pytanie
odpowiedzieć. A jeśli nie masz, to nawet 109 rewizji, gdzie w 75
pojawia się x+=1, dalej będzie zagadką.
Każda zmiana (commit) opatrzona jest komentarzem który mówi, dlaczego ta
zmiana została dokonana. Komentarze w kodzie oczywiście też są fajne,
ale to zupełnie inny poziom dokumentacji.
Post by Maciej Sobczak
Post by Mateusz Viste
filtr oleju w aucie odkręcam nie (jakże uniwersalnym) młotkiem,
tylko wyspecjalizowanym do tego narzędziem.
Zip służy do archiwizacji.
Stąd moje zdziwienie, że ktoś nalega aby używać ich do
śledzenia/opisywania zmian w kodzie.

Mateusz
heby
2021-08-26 07:55:57 UTC
Permalink
Post by Maciej Sobczak
Nawet pendrive
A jak się popsuje?
Post by Maciej Sobczak
załatwi sprawę łatwiej, niż szarpanie się z VCS.
Nie.

Odpalanie działającego, nowego repozytorium w SVN na lokalnym dysku jest
jednym kliknięciem w TortoiseSVN. Reszta, to darmowy bonus. Szczególnie
dla progrmisty.

W porównaniu z szarpaniem się z plikami ZIP, to SVN urasta do zbawcy
ludzkości pod względem *łatwości* pracy. Dwa klinknięcia i masz backup z
historią, revertem, blame, opisem, sandboxem.

Proponowanie ZIPa zamiast jakiegoś VCS dla *programisty* urąga logice.
kriters
2021-08-25 21:00:45 UTC
Permalink
Post by Maciej Sobczak
Post by Mateusz Viste
Lubię proste i skuteczne narzędzia
Przy pracy jednoosobowej takimi narzędziami są zip oraz unzip. Polecam.
Zwłaszcza, że oprócz historii zmian potrafią zupełnie naturalnie zrobić backup - a to jest *ważniejsze*, niż zabawa w commity.
Nie, lokalny git to nie jest backup.
Jednoosobowy lokalny git ma wartość co najwyżej hobbystyczną albo edukacyjną ("Czy ma Pan doświadczenie z gitem? Tak, od 5 lat."), ale jego użytkowa wartość dodana wynosi epsilon.
Co za kompletna bzdura. "Praca" z zipami to koszmar do którego nikt
normalny nie chce wracać. Zipy to się mogą co najwyżej tworzyć z
automatu ale lepiej żeby nikt nie musiał nigdy do nich zaglądać.
Maciej Sobczak
2021-08-28 19:46:37 UTC
Permalink
Post by kriters
Co za kompletna bzdura. "Praca" z zipami to koszmar do którego nikt
normalny nie chce wracać. Zipy to się mogą co najwyżej tworzyć z
automatu ale lepiej żeby nikt nie musiał nigdy do nich zaglądać.
A czemu nie zaglądać? Bo wstyd patrzeć? Przecież tam jest dokładnie to samo, co w historii commitów gita. Ten sam syf.
Właśnie o to chodzi. Git może dać inną prezentację, ale informacja jest ta sama.

A jak się rozpakuje zipa w osobnym katalogu, to mamy równocześnie dostępne pliki z jednego punktu w historii projektu. Jeśli ktoś korzysta z nawigacji w IDE, to ta nawigacja działa. Jeśli w projekcie są media, to można je zobaczyć/przesłuchać. Itd. To jest komfort pracy daleko wykraczający poza tekstowy diff, nawet taki kolorowy. A jak mam robić git checkout do osobnego katalogu, żeby w pełnym komforcie obejrzeć różnice (niekoniecznie tekstowe), to to jest ten moment, w którym wartość dodana lokalnego gita wynosi epsilon. Git służy do synchronizacji zmian i tylko tam ma wartość dodaną. Jak jest jedno "repo", to git nic nie wnosi.

Git ma jeszcze jedną smutną wadę. Otóż jego historia zmian ciągle rośnie (chociaż jej użyteczność wcale nie, bo zwykle potrzebne jest tylko jakieś ostatnie okno czasowe a nie całość) - a backup takiego repo staje się z czasem coraz bardziej uciążliwy.
--
Maciej Sobczak * http://www.inspirel.com
kriters
2021-08-28 20:31:43 UTC
Permalink
Post by Maciej Sobczak
Post by kriters
Co za kompletna bzdura. "Praca" z zipami to koszmar do którego nikt
normalny nie chce wracać. Zipy to się mogą co najwyżej tworzyć z
automatu ale lepiej żeby nikt nie musiał nigdy do nich zaglądać.
A czemu nie zaglądać? Bo wstyd patrzeć? Przecież tam jest dokładnie to samo, co w historii commitów gita. Ten sam syf.
Właśnie o to chodzi. Git może dać inną prezentację, ale informacja jest ta sama.
A jak się rozpakuje zipa w osobnym katalogu, to mamy równocześnie dostępne pliki z jednego punktu w historii projektu. Jeśli ktoś korzysta z nawigacji w IDE, to ta nawigacja działa. Jeśli w projekcie są media, to można je zobaczyć/przesłuchać. Itd. To jest komfort pracy daleko wykraczający poza tekstowy diff, nawet taki kolorowy. A jak mam robić git checkout do osobnego katalogu, żeby w pełnym komforcie obejrzeć różnice (niekoniecznie tekstowe), to to jest ten moment, w którym wartość dodana lokalnego gita wynosi epsilon. Git służy do synchronizacji zmian i tylko tam ma wartość dodaną. Jak jest jedno "repo", to git nic nie wnosi.
Brzmi jak opinia kogoś kto gita zna tylko z opowiadań. Też kiedyś
używałem zipów, potem wykupiłem nawet jakieś narzędzia, które takie
porównywanie wersji ułatwiały. A potem poznałem gita i od tego czasu
nigdy z tych narzędzi ani z zipów nie skorzystałem. Teraz kilkoma
kliknięciami sprawdzam co w danym okresie zmieniłem, po co to zmieniłem,
przełączam się między feature branchami żeby nie musieć mieć x kopii
tego samego projektu na dysku, dodaje taga wywołującego automatyczny
deploy i robię milion innych rzeczy. Miałbym po nieudanych zmianach w
kodzie szukać w którym zipie mam poprzednią wersję? W sumie to są takie
oczywistości, że aż dziwnie tłumaczyć.
Maciej Sobczak
2021-08-29 18:39:48 UTC
Permalink
Post by kriters
Brzmi jak opinia kogoś kto gita zna tylko z opowiadań.
Jesteś profilerem brzmieniowym?
Post by kriters
Też kiedyś
używałem zipów, [...] A potem poznałem gita i od tego czasu
nigdy z tych narzędzi ani z zipów nie skorzystałem.
No widzisz, to jest najfajniesza część. Też byłem na etapie zachwytu nad gitem. Teraz jestem na tym następnym.
Bo to jest trochę jak tutaj:

https://www.reddit.com/r/aoe2/comments/8jvz1a/what_is_a_noob_comprehensive_framework_and/

;-) ;-) ;-)
Post by kriters
przełączam się między feature branchami
No właśnie. To jest ta część gita, która mnie najbardziej wkurza. Kto w ogóle wymyślił to *przełączanie*? Od przełączania są okna na ekranie a nie jakieś jedno i to samo miejsce w strukturze katalogów na dysku.
Ja chcę mieć kilka rzeczy dostępnych *równocześnie*. I nie, w normalnych programach nie robię "commita", żeby przełączyć się do drugiego okienka.

$ git checkout myfeature
error: Your local changes to the following files would be overwritten by checkout:
...
Please commit your changes or stash them before you switch branches.
Aborting
$

Poważnie?
Post by kriters
Miałbym po nieudanych zmianach w
kodzie szukać w którym zipie mam poprzednią wersję?
Jeśli nie wiesz, w którym pliku co masz, to bida. Taka ogólna.
Post by kriters
W sumie to są takie
oczywistości, że aż dziwnie tłumaczyć.
Wykres i tabelka ze strony powyżej. ;-)
--
Maciej Sobczak * http://www.inspirel.com
kriters
2021-08-29 20:12:28 UTC
Permalink
Post by Maciej Sobczak
Post by kriters
Brzmi jak opinia kogoś kto gita zna tylko z opowiadań.
Jesteś profilerem brzmieniowym?
Akurat nie tylko ja to zauważyłem.
Post by Maciej Sobczak
Post by kriters
Też kiedyś
używałem zipów, [...] A potem poznałem gita i od tego czasu
nigdy z tych narzędzi ani z zipów nie skorzystałem.
No widzisz, to jest najfajniesza część. Też byłem na etapie zachwytu nad gitem. Teraz jestem na tym następnym.
Ja na etapie zachwytu byłem kilka lat temu. W międzyczasie poznałem też
trochę wad. I nie trafiłem na wadę która by w jakimkolwiek stopniu
przysłoniła zalety. Ale jak kto woli. Można używać notatnika a wersje
kodu trzymać na odpowiednio opisanych dyskietkach.
Mateusz Viste
2021-08-30 07:35:45 UTC
Permalink
Ale jak kto woli. Można używać notatnika a wersje kodu trzymać na
odpowiednio opisanych dyskietkach.
Co złego jest w notatniku? Ja tylko tego używam - zawodowo jak i
prywatnie. Te wszelkie nowoczesne IDE tylko wprowadzają szum
człowiekowi w głowie. Jak patrzę na programistów działających z różnymi
IDE na kilku ekranach to dziwię się, że udaje im się cokolwiek zrobić.
Moja ewolucja pisania doprowadziła mnie do notatnika (kwrite) na
ekranie 15", tylko tak jestem w stanie skupić się na tym, co istotne.
Nie, to nie prowokacja.

Mateusz
heby
2021-08-30 07:54:12 UTC
Permalink
Post by Mateusz Viste
Ale jak kto woli. Można używać notatnika a wersje kodu trzymać na
odpowiednio opisanych dyskietkach.
Co złego jest w notatniku?
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor zainteresują
się choćby Atomem. Ma zdumiewające funkcjonalności, np. wiele kursorów:


Mateusz Viste
2021-08-30 08:44:56 UTC
Permalink
Post by heby
Post by Mateusz Viste
Ale jak kto woli. Można używać notatnika a wersje kodu trzymać na
odpowiednio opisanych dyskietkach.
Co złego jest w notatniku?
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor
zainteresują się choćby Atomem. Ma zdumiewające funkcjonalności, np.
http://youtu.be/d3fg2z1FL7A
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB. Po
instalacji 581 MiB. W tym takie perełki jak libvulkan czy libffmpeg...
Czy ten świat zwariował? No ale uruchamiam.

I nie podoba mi się - za dużo przycisków, opcji, formatek... Do tego
próbuje mi narzucać jakiś "project management". Ja sam sobie umiem
zarządzać własnymi plikami, nie potrzebuję nachalnej pomocy.
M.in. dlatego używam kwrite a nie np. kate, ten drugi miewa podobne
zapędy. Atom do tego próbuje mi wciskać jakieś integracje z (za
przeproszeniem) gitem. Dość gita widzę w internecie. Przypomina mi się
kawał o Stalinie i puszce: w TV Stalin, w radiu też, w gazecie to samo.
Boję się otworzyć konserwę.

Funkcja wielu kursorów jest zaiste zdumiewająca. Nie przypominam sobie
jednak, bym kiedykolwiek pomyślał "przydałoby mi się coś takiego".

Mateusz
heby
2021-08-30 09:03:37 UTC
Permalink
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Ale jak kto woli. Można używać notatnika a wersje kodu trzymać na
odpowiednio opisanych dyskietkach.
Co złego jest w notatniku?
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor
zainteresują się choćby Atomem. Ma zdumiewające funkcjonalności, np.
http://youtu.be/d3fg2z1FL7A
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB.
To słaby argument. Atom wstaje szybko i tylko to się liczy. Czasy dysków
250MB mineły w okolicy połowy lat 90.
Post by Mateusz Viste
I nie podoba mi się - za dużo przycisków, opcji, formatek...
Nie korzystasz z nich. Jak sam widzisz, domyśly tryb pracy Atom składa
się z listy "rzeczy" po lewej i edytora. Nie ma nic więcej i prawie
wszyscy uzywają go właśnie w taki sposób.
Post by Mateusz Viste
Do tego
próbuje mi narzucać jakiś "project management". Ja sam sobie umiem
zarządzać własnymi plikami, nie potrzebuję nachalnej pomocy.
Nie ma potrzeby z teo korzystać.
Post by Mateusz Viste
zapędy. Atom do tego próbuje mi wciskać jakieś integracje z (za
przeproszeniem) gitem. Dość gita widzę w internecie. Przypomina mi się
kawał o Stalinie i puszce: w TV Stalin, w radiu też, w gazecie to samo.
Boję się otworzyć konserwę.
Integracje z VCS są rzeczą oczywistą w edytorach dla programistów.
Spróbuj znaleźc jakiś bez, przeznaczony własnie dla programistów. Szanse
niewielkie. Po co komu edytor bez VCS?
Post by Mateusz Viste
Funkcja wielu kursorów jest zaiste zdumiewająca. Nie przypominam sobie
jednak, bym kiedykolwiek pomyślał "przydałoby mi się coś takiego".
Wiec tu maz przykład z życia wzięty:



w 4:48.

Zauważ, że Atom to obecnie ulubiony edytor domowych hackerów. Nie vi,
ale Atom właśnie. Nie bez powodu, pisany jest z myslą o tym, aby skupiać
się na kodzie i mieć *naprawdę* użyteczne ficzery.
Mateusz Viste
2021-08-30 09:51:26 UTC
Permalink
Post by heby
Post by Mateusz Viste
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB.
To słaby argument. Atom wstaje szybko i tylko to się liczy.
To nie był żaden argument :)
To był powód, dla którego *mi* dane rozwiązanie nie odpowiada. Jak
zainstalowałem atoma (przypominam: edytor tekstu dla programisty) i
zobaczyłem, że pożarł niemal 600 MB, to mnie niesamowicie brzuch
rozbolał. Usunąłem i już przeszło. Z tym nie da się dyskutować. Można
ew. próbować leczyć, ale mi ta moja patologia zacofania odpowiada.
Post by heby
Nie korzystasz z nich. (...)
Nie ma potrzeby z teo korzystać.
No to ja się pytam: na kij mi to, skoro i tak z 90% rzeczy nie
skorzystam? Co innego, gdyby nie było alternatywy, ale szczęśliwie mam
alternatywę w postaci notatnika - zajmującego ok. 280 KiB i z
możliwości którego korzystam w jakichś 95%. I tak sobie razem żyjemy
szczęśliwie.
Post by heby
Integracje z VCS są rzeczą oczywistą w edytorach dla programistów.
Spróbuj znaleźc jakiś bez, przeznaczony własnie dla programistów.
Proszę: kwrite. Pewno powiesz, że to nie edytor "dla programistów"...
Ale chyba jednak jest, bo po co nie-programiście podświetlanie składni
dla C, Java, CSS, itp?
Post by heby
Szanse niewielkie. Po co komu edytor bez VCS?
Edytor do pisania. VCS do VCS-owania. Ja VCS-uję sobie z linii poleceń.
Post by heby
Zauważ, że Atom to obecnie ulubiony edytor domowych hackerów.
To ci sami, co zachwycają się gitem? Ech, młodzież...

Mateusz
heby
2021-08-30 10:29:07 UTC
Permalink
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB.
To słaby argument. Atom wstaje szybko i tylko to się liczy.
To nie był żaden argument :)
Wobec tego, skoro to nie argument, to co Ci przeszkadza?
Post by Mateusz Viste
To był powód, dla którego *mi* dane rozwiązanie nie odpowiada.
Czyli argument?

Ale nie przedstawiłeś *racjonalnego* agrumentu przeciw. Nie bo nie. Ja
tego argumentem nie nazywam.
Post by Mateusz Viste
No to ja się pytam: na kij mi to, skoro i tak z 90% rzeczy nie
skorzystam?
Bo pozostałych 10% nie ma w notatniku.
Post by Mateusz Viste
Post by heby
Integracje z VCS są rzeczą oczywistą w edytorach dla programistów.
Spróbuj znaleźc jakiś bez, przeznaczony własnie dla programistów.
Proszę: kwrite. Pewno powiesz, że to nie edytor "dla programistów"...
Ale chyba jednak jest, bo po co nie-programiście podświetlanie składni
dla C, Java, CSS, itp?
Podświetla składnie xmla? Czy kto piszący xmla to programita?

Ogólnie podświetlanie składni jest ficzerem używanym przez programistów,
ale niekoniecznie tylko dla nich.
Post by Mateusz Viste
Post by heby
Szanse niewielkie. Po co komu edytor bez VCS?
Edytor do pisania. VCS do VCS-owania. Ja VCS-uję sobie z linii poleceń.
I widzisz czytelne diffy? Czy masz już w mózgu parser united diffa?
Widziałeś jak się pracuje z Tortoise/Rabbit lub ze zintegrowanym VCS w
edytor?

Ja nie potrafie znaleźc argumentów przeciwko taiej integracji.
Najzwyczajniej, dzielenie przez zero.
Post by Mateusz Viste
Post by heby
Zauważ, że Atom to obecnie ulubiony edytor domowych hackerów.
To ci sami, co zachwycają się gitem? Ech, młodzież...
Ta młodzież potrafi pisać szybciej i skuteczniej, niż stare dziadki, jak
ja. Głównie dlatego że nie przejmują się idityzmami typu
"przyzwyczajenia" tylko szukają rozwiązań optymalnych.
Mateusz Viste
2021-08-30 11:20:17 UTC
Permalink
Post by heby
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB.
To słaby argument. Atom wstaje szybko i tylko to się liczy.
To nie był żaden argument :)
Wobec tego, skoro to nie argument, to co Ci przeszkadza?
Rozmiar nie jest argumentem. Argumentem jest ból brzucha, który rozmiar
u mnie powoduje. I on mi przeszkadza. Naprawdę.
Post by heby
Ale nie przedstawiłeś *racjonalnego* agrumentu przeciw.
Przecież podałem: widząc edytor tekstowy o rozmiarze 400 MiB ściska mnie
pod żołądkiem. A ja wolę żyć bez bólu, niż z bólem. Czy to
wystarczająco racjonalne?
Post by heby
Post by Mateusz Viste
podświetlanie składni dla C, Java, CSS, itp?
Podświetla składnie xmla? Czy kto piszący xmla to programita?
Nie wiem, gdzie wyczytałeś o XMLu... Przecież wyraźnie pisałem o czymś
innym. Tutaj dwa konkretne przykłady jak to wygląda, bo masz zdaje się
nierzeczywiste wyobrażenia:

Loading Image...
Loading Image...

Podświetlanie składni jest.
Auto-indentacja jest (brak "napierniczania spacji"!).
Search i search & replace są.
Konfigurowalna szerokość tabulacji jest.
Auto-save jest.

Nic więcej mi nie potrzeba. Jest nawet kilka dodatkowych, potencjalnie
fajnych rzeczy, choć z nich nie korzystam: zawijanie kodu, tworzenie
zakładek w kodzie czy też podpowiadanie nazw zmiennych.
Post by heby
I widzisz czytelne diffy? Czy masz już w mózgu parser united diffa?
Widziałeś jak się pracuje z Tortoise/Rabbit lub ze zintegrowanym VCS
w edytor?
Tak, widziałem. Gdybym całe dnie spędzał na oglądaniu diffów to może
używałbym jakiegoś upiękczacza, ale analiza diffów to może z 5% mojego
czasu. svn diff jest dla mnie jak najbardziej czytelny, i zupełnie
wystarczający. A wygląda tak:

svn diff unchtest.c
Index: unchtest.c
===================================================================
--- unchtest.c (revision 339)
+++ unchtest.c (working copy)
@@ -80,7 +80,8 @@
int decodedbytes;
unsigned char buffer[4096];

- bytes = min((rand() % 256) + 1, file_chunk_len - bytesprocessed);
+ bytes = (rand() % 256) + 1;
+ if (bytes > file_chunk_len - bytesprocessed) {
+ bytes = file_chunk_len - bytesprocessed;
+ }
printf("processing %4zu bytes of chunked data", bytes);
memcpy(buffer, file_chunked + bytesprocessed, bytes);

Ja to czytam bez problemu, nie potrzeba mi żadnych fikuśnych kolorków.
A gdybym *naprawdę* potrzebował zastanowić się głęboko nad jakimś
diffem, to po prostu wrzuciłbym go do pliku i otworzył domyślną,
systemową diff-wyświetlarką (kompare).

Mateusz
heby
2021-08-30 11:30:31 UTC
Permalink
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Post by heby
Post by Mateusz Viste
Pokrótce obejrzałem. Pierwszy szok: rpm o rozmiarze 194 MiB.
To słaby argument. Atom wstaje szybko i tylko to się liczy.
To nie był żaden argument :)
Wobec tego, skoro to nie argument, to co Ci przeszkadza?
Rozmiar nie jest argumentem. Argumentem jest ból brzucha, który rozmiar
u mnie powoduje. I on mi przeszkadza. Naprawdę.
Rozumiem. Czyli dyskusja bez sensu, nie masz argumentacji racjonalnej.
Post by Mateusz Viste
Przecież podałem: widząc edytor tekstowy o rozmiarze 400 MiB ściska mnie
pod żołądkiem. A ja wolę żyć bez bólu, niż z bólem. Czy to
wystarczająco racjonalne?
Nie, to ani troche racjonalne. Rozmiar współczesnego software jest
wiekszy niż w czasach Atari. Bo i mozliwości większe. Dam przykład: do
pythona jest autouzupełnianie wspomagane AI. Ile GB poświęcisz na
ficzer, któy kilkukrotnie przyspiesza pisanie kodu? Gdzie jest granica
za którą boli brzuszek? Może to ból fantomowy?

Dlaczego śladowy rozmiar na dysku jest argumentem? Rozmawiamy o
rozmiarze będacym promilem obecnej pojemnosci komputera z hipermerketu
do oglądania pono. To dużo?
Post by Mateusz Viste
Podświetlanie składni jest.
Auto-indentacja jest (brak "napierniczania spacji"!).
Search i search & replace są.
Konfigurowalna szerokość tabulacji jest.
Auto-save jest.
Wniosek: to nie notatnik.
Post by Mateusz Viste
Nic więcej mi nie potrzeba.
Wydaje Ci się. Najzywczajniej nie miałeś kontaktu z narzędziami takimi
jak Atom, dlatego nie widzisz przestrzeni do rowijania się.

Pocieszę Cię: ja tez nie używam Atmoma. Ale używam np. Visual Studio.
Post by Mateusz Viste
Jest nawet kilka dodatkowych, potencjalnie
fajnych rzeczy, choć z nich nie korzystam: zawijanie kodu, tworzenie
zakładek w kodzie czy też podpowiadanie nazw zmiennych.
Więc to nie jest notatnik. Skąd tu się wziął notatnik w tej dyskusji?
Post by Mateusz Viste
Post by heby
I widzisz czytelne diffy? Czy masz już w mózgu parser united diffa?
Widziałeś jak się pracuje z Tortoise/Rabbit lub ze zintegrowanym VCS
w edytor?
Tak, widziałem. Gdybym całe dnie spędzał na oglądaniu diffów to może
używałbym jakiegoś upiękczacza, ale analiza diffów to może z 5% mojego
czasu. svn diff jest dla mnie jak najbardziej czytelny, i zupełnie
svn diff unchtest.c
Index: unchtest.c
===================================================================
--- unchtest.c (revision 339)
+++ unchtest.c (working copy)
@@ -80,7 +80,8 @@
int decodedbytes;
unsigned char buffer[4096];
- bytes = min((rand() % 256) + 1, file_chunk_len - bytesprocessed);
+ bytes = (rand() % 256) + 1;
+ if (bytes > file_chunk_len - bytesprocessed) {
+ bytes = file_chunk_len - bytesprocessed;
+ }
printf("processing %4zu bytes of chunked data", bytes);
memcpy(buffer, file_chunked + bytesprocessed, bytes);
Ja to czytam bez problemu, nie potrzeba mi żadnych fikuśnych kolorków.
Bo oto trywialny diff. Dodałeś w nim linijki.

Teraz zrób to samo dla difa w którym zmieniłeś 1 znak w 100 znakowej
linijce.

Jak wiem, że grunt w dyskusji to dobierać przykłady podpierajace własne
tezy, wiec sie nie dziwie, że wybrałeś przykład diffa czytelnego dla
ksiegowej.
Post by Mateusz Viste
A gdybym *naprawdę* potrzebował zastanowić się głęboko nad jakimś
diffem, to po prostu wrzuciłbym go do pliku i otworzył domyślną,
systemową diff-wyświetlarką (kompare).
Co porządy edytor IDE może zrobić automatycznie, bez *dodatkowej*
czynności. I dużo, dużo więcej.
Mateusz Viste
2021-08-30 12:21:22 UTC
Permalink
Post by heby
Wniosek: to nie notatnik.
Przyznam, że takiego obrotu dyskusji się nie spodziewałem.
Post by heby
Wydaje Ci się. Najzywczajniej nie miałeś kontaktu z narzędziami
takimi jak Atom, dlatego nie widzisz przestrzeni do rowijania się.
Miałem kontakt z różnymi narzędziami - m.in w ramach dobierania
propozycji dla moich zespołów programistów. Jeśli *o mnie* chodzi to
nie odkryłem nic co odpowiadałoby mi bardziej niż notatnik. Ok, nie
notatnik, skoro nie uznajesz takiej terminologii - nazwijmy go zatem
"Domyślnym, podstawowym edytorem tekstu w KDE". :)
Większość osób wybrało wówczas code::blocks na stosownej ilości ekranów
("bo widać wszystkie pliki od razu", "bo daje fajne podpowiedzi", "bo
integracja z svn", itp...). Ja zostałem z notatnikiem i laptopem 15".

Testowałem również kilka "edytorów dla programistów", jednak te zawsze
okazywały się *dla mnie* zbyt wyszukane. Atoma nie testowałem, być może
nie istniał 15 lat temu.
Post by heby
Więc to nie jest notatnik. Skąd tu się wziął notatnik w tej dyskusji?
Mój błąd, wybacz. Chodziło mi o "podstawowy edytor tekstowy pełniący
rolę domyślnego notatnika w KDE". Wbrew tej ironii muszę jednak przyznać
Ci rację - jego opis w KDE jasno wskazuje, że od początku miał być
czymś więcej.

"KWrite is more than a text editor. It is meant to be a programmer's
editor, and could be considered as at least a partial alternative to
more powerful editors."
Post by heby
Co porządy edytor IDE może zrobić automatycznie, bez *dodatkowej*
czynności. I dużo, dużo więcej.
Może i porządny, skoro tak go zachwalasz - ale 400 MiB?? To jest
przecież 290 dyskietek! Nie poświęcę tylu dyskietek dla funkcji, z
której skorzystam *może* raz na kilka lat. Nie nie, zostanę jednak z
moim notat- tfu, domyślnym edytorem tekstu KDE.

Mateusz
heby
2021-08-30 12:39:00 UTC
Permalink
Post by Mateusz Viste
Post by heby
Wniosek: to nie notatnik.
Przyznam, że takiego obrotu dyskusji się nie spodziewałem.
Czego się spodziewałes? Używasz notatnika z ficzerami do programowania.
Post by Mateusz Viste
Post by heby
Więc to nie jest notatnik. Skąd tu się wziął notatnik w tej dyskusji?
Mój błąd, wybacz. Chodziło mi o "podstawowy edytor tekstowy pełniący
rolę domyślnego notatnika w KDE". Wbrew tej ironii muszę jednak przyznać
Ci rację - jego opis w KDE jasno wskazuje, że od początku miał być
czymś więcej.
"KWrite is more than a text editor. It is meant to be a programmer's
editor, and could be considered as at least a partial alternative to
more powerful editors."
Wiec to nie notatnik. Teraz wyobraź sobie niedzielnego studenta, który
czyta ten usenet spijajac mądrość prosto z kabla ethernetowego i
dowiaduje się że *doświadczeni* wyjadacze używają ... notatnika do
pisania kodu.

Notepad.exe? A to ja mam!
Post by Mateusz Viste
Post by heby
Co porządy edytor IDE może zrobić automatycznie, bez *dodatkowej*
czynności. I dużo, dużo więcej.
Może i porządny, skoro tak go zachwalasz - ale 400 MiB??
kwrite to ponad 200MiB.
Post by Mateusz Viste
To jest
przecież 290 dyskietek!
A ile kaset do Atari w normalu?
Post by Mateusz Viste
Nie poświęcę tylu dyskietek dla funkcji, z
której skorzystam *może* raz na kilka lat. Nie nie, zostanę jednak z
moim notat- tfu, domyślnym edytorem tekstu KDE.
O ile masz KDE. Od razu podpowiem: mało kto ma KDE.
Maciek Godek
2021-08-30 12:53:26 UTC
Permalink
Post by heby
Wiec to nie notatnik. Teraz wyobraź sobie niedzielnego studenta, który
czyta ten usenet spijajac mądrość prosto z kabla ethernetowego i
dowiaduje się że *doświadczeni* wyjadacze używają ... notatnika do
pisania kodu.
Notepad.exe? A to ja mam!
Świetnie. Wyobraziłem sobie.
I co dalej?
heby
2021-08-30 13:04:06 UTC
Permalink
Post by Maciek Godek
Post by heby
Notepad.exe? A to ja mam!
Świetnie. Wyobraziłem sobie.
I co dalej?
Możesz przygotować listę zakupów do spożywczaka. Co prawda ja mam do
tego spacjalizowane narzędzie, ale po coś najlepsi programiści świata w
MS ten program napisali, w pocie czoła. Udawajmy więc, że jest uzyteczny
w *czymkolwiek*.
Maciek Godek
2021-08-30 13:11:12 UTC
Permalink
Post by heby
Post by Maciek Godek
Post by heby
Notepad.exe? A to ja mam!
Świetnie. Wyobraziłem sobie.
I co dalej?
Możesz przygotować listę zakupów do spożywczaka. Co prawda ja mam do
tego spacjalizowane narzędzie, ale po coś najlepsi programiści świata w
MS ten program napisali, w pocie czoła. Udawajmy więc, że jest uzyteczny
w *czymkolwiek*.
Tzn. ze swoim wyobrażeniem niedzielnego studenta mam przygotowywać listę zakupów do spożywczaka?
Nie bardzo rozumiem.

Spodziewałem się raczej jakiejś historii.

Że na przykład ten student zaczyna programować w tym notatniku duży system planowania lotów samolotami, który sprzedaje za miliony liniom lotniczym, ale przez to, że mu się nie podświetliła składnia pomylił "elif" z "file" i wszyscy zginęli.

Albo jakiejkolwiek innej konsekwencji tego że "ktoś kiedyś przeczytał coś gdzieś w Internecie".
heby
2021-08-30 13:19:17 UTC
Permalink
Post by Maciek Godek
Post by heby
Post by Maciek Godek
Post by heby
Notepad.exe? A to ja mam!
Świetnie. Wyobraziłem sobie.
I co dalej?
Możesz przygotować listę zakupów do spożywczaka. Co prawda ja mam do
tego spacjalizowane narzędzie, ale po coś najlepsi programiści świata w
MS ten program napisali, w pocie czoła. Udawajmy więc, że jest uzyteczny
w *czymkolwiek*.
Tzn. ze swoim wyobrażeniem niedzielnego studenta mam przygotowywać listę zakupów do spożywczaka?
Nie bardzo rozumiem.
Nie rozumiesz, bo chcesz się przypierdolić o słówka. Czego się
spodziewasz, rzeczowej odpowiedzi czy kpiny?
Post by Maciek Godek
Spodziewałem się raczej jakiejś historii.
Hisotria jest dwojaka:
1) jedni mają niedyspozycje żoładkowe i używają "notatnika do
programowania" oraz dekodera neuronowego diffów i VCSa na ZIPach

2) inni szukają co obecnie jest wygodnym narzedziem i mają ogromne,
serwerowe dyski >250MiB w raidzie na MFM.

Obie kończą się tak samo, wykonaną pracą, szczęśliwoscią ogólną,
poklepywaniem po plecach, premią i talonem na RTXa.

Masz rację, nie ma śladu różnicy. Na końcu oboje są turing complete.
Post by Maciek Godek
Że na przykład ten student zaczyna programować w tym notatniku duży system planowania lotów samolotami, który sprzedaje za miliony liniom lotniczym, ale przez to, że mu się nie podświetliła składnia pomylił "elif" z "file" i wszyscy zginęli.
No na przykład. Choć podpowiem, że akurat tego typu pomyłki nie są do
poprawiania przez IDE. Od tego są nieco inne techniki. IDE ma zapewnić
wygodę pisania. Nie bezpieczeństwo kodu. Ale jeśli ktoś pakuje swoje
pliki z notatnika do ZIPa to może nie ma co wchodzić tak głęboko w
skomplikowane detale norm jakościowych i współczesnych technik...
Maciek Godek
2021-08-30 13:37:53 UTC
Permalink
Post by heby
Post by Maciek Godek
Post by heby
Post by Maciek Godek
Post by heby
Notepad.exe? A to ja mam!
Świetnie. Wyobraziłem sobie.
I co dalej?
Możesz przygotować listę zakupów do spożywczaka. Co prawda ja mam do
tego spacjalizowane narzędzie, ale po coś najlepsi programiści świata w
MS ten program napisali, w pocie czoła. Udawajmy więc, że jest uzyteczny
w *czymkolwiek*.
Tzn. ze swoim wyobrażeniem niedzielnego studenta mam przygotowywać listę zakupów do spożywczaka?
Nie bardzo rozumiem.
Nie rozumiesz, bo chcesz się przypierdolić o słówka. Czego się
spodziewasz, rzeczowej odpowiedzi czy kpiny?
Nie rozumiem, bo to, co piszesz, jest dla mnie niezrozumiałe.
Podałeś przykład jakiegoś studenta, który czyta sobie gości, którzy spierają się na usenecie o jakieś pierdoły.
I jak rozumiem, to ma być jakaś ilustracja czegoś.

Ja się natomiast pytam: czego to ma być ilustracja?

Czy ten student ma być zażenowany?
Czy może to ma odcisnąć na nim takie piętno, że będzie się bał zainstalować Visual Studio?

Naprawdę nie rozumiem czemu to miało służyć.
Post by heby
Post by Maciek Godek
Spodziewałem się raczej jakiejś historii.
1) jedni mają niedyspozycje żoładkowe i używają "notatnika do
programowania" oraz dekodera neuronowego diffów i VCSa na ZIPach
No tak. Ogólnie różni ludzie mają różnie. Sądzę, że dla nikogo, kto żyje dłużej niż 5 lat, nie jest to wielkie zaskoczenie.
Post by heby
2) inni szukają co obecnie jest wygodnym narzedziem i mają ogromne,
serwerowe dyski >250MiB w raidzie na MFM.
Obie kończą się tak samo, wykonaną pracą, szczęśliwoscią ogólną,
poklepywaniem po plecach, premią i talonem na RTXa.
Masz rację, nie ma śladu różnicy. Na końcu oboje są turing complete.
Nie. To nie jest istotne czego używasz. Istotne jest to, jakie dajesz efekty.
"Po owocach ich poznacie"

Na stronie Mateusza można się dowiedzieć o jakichś 40 napisanych przez niego programach, gierkach, programikach.
Napisanych w notatniku, co pewnie dla ich użytkowników jest zupełnie bez znaczenia.
Post by heby
Post by Maciek Godek
Że na przykład ten student zaczyna programować w tym notatniku duży system planowania lotów samolotami, który sprzedaje za miliony liniom lotniczym, ale przez to, że mu się nie podświetliła składnia pomylił "elif" z "file" i wszyscy zginęli.
No na przykład. Choć podpowiem, że akurat tego typu pomyłki nie są do
poprawiania przez IDE. Od tego są nieco inne techniki. IDE ma zapewnić
wygodę pisania. Nie bezpieczeństwo kodu. Ale jeśli ktoś pakuje swoje
pliki z notatnika do ZIPa to może nie ma co wchodzić tak głęboko w
skomplikowane detale norm jakościowych i współczesnych technik...
Nie ma co wchodzić, bo to są zupełnie ortogonalne kwestie.
I bez trudu mogę sobie wyobrazić, że ktoś wysyła swój kod źródłowy do audytu w postaci pliku zip, mejlem.
heby
2021-08-30 14:08:33 UTC
Permalink
Post by Maciek Godek
Nie rozumiem, bo to, co piszesz, jest dla mnie niezrozumiałe.
Podałeś przykład jakiegoś studenta, który czyta sobie gości, którzy spierają się na usenecie o jakieś pierdoły.
I jak rozumiem, to ma być jakaś ilustracja czegoś.
Ilustracja procesu tworzenia się legendy. Kilku kolesi źle używających
svn uważa że na ich podstawie svn jest do dupy i trzeba robić jakieś
serwery a branche trwają dłużej niż przydatność serka heterogenizowanego
w lodówce.

Ktoś szuka takiej informacji w google i dostaje brednie.

No więc ja jestem Kapitan Poprawiacz i własnie poprawiam, co by błoto
obrzucające svn ochlapało też gita, notatniki i ZIPy. bo to też brednie.
Nic nie robi lepiej dezinformacji jak jest zestawienie z drugą taką samą.
Post by Maciek Godek
Ja się natomiast pytam: czego to ma być ilustracja?
Obiegu informacji w internecie. No, może przesadzam, że informacji.
Opinii bezujących na ignorancji.
Post by Maciek Godek
Czy ten student ma być zażenowany?
Wystarczy że będzie ubrany i nie słuchający Justina Bimbera.
Post by Maciek Godek
Czy może to ma odcisnąć na nim takie piętno, że będzie się bał zainstalować Visual Studio?
Ba, kto wie. Tylko nie Studio, a Code. Wyjdzie mu na dobre. To dobry
kawałek softu jest. Tyci tyci lepszy niż notepad.exe.
Post by Maciek Godek
Naprawdę nie rozumiem czemu to miało służyć.
Rozgniataniu dezinformacji na miejscu, gdzie ona się tworzy.
Post by Maciek Godek
Post by heby
Masz rację, nie ma śladu różnicy. Na końcu oboje są turing complete.
Nie. To nie jest istotne czego używasz. Istotne jest to, jakie dajesz efekty.
"Po owocach ich poznacie"
Dalej nie pojmujesz. To że dwóch rolników ma jabłka, to nie koniec.
Pytanie dlaczego jeden z nich używa w tym celu hodowli jabłonek w
doniczkach i rezultaty ma w 3 pokoleniu ale za to prowadzi szkołe "jak
porządnie hodować jabłka" i wydaje nawet tygodnik "hodowla jabłek
prostymi metodami" na pl.soc.rolnictwo. I wtedy ochodzisz do poważnego
tematu *ekonomicznego* uzasadnienia. I tu się wszystko sypie. Co innego
skutecznośc (obaj mają jabłka) a co innego ekonomia (jeden dał radę na
tym zarobić albo się w goóle doczekał).

Używanie notatników i ZIPów do programowania to identyczny problem jak
Amisze i ich stosunek do elektryki.
Post by Maciek Godek
Na stronie Mateusza można się dowiedzieć o jakichś 40 napisanych przez niego programach, gierkach, programikach.
Napisanych w notatniku, co pewnie dla ich użytkowników jest zupełnie bez znaczenia.
Super.

Pisywałem programiki nawet w mcedit.

Nie pisuję od dłuższej chwili.

Wiesz czemu? Bo to głupie. To rodzaj zawodów "kto da radę wymontować
wiecej podzespołów z samochodu i dalej jechać". Niewątpliwie
interesujące, ale czy aby na pewno chodzi o to samo co reszcie
kierowców? Można popatrzeć, pokiwać głową i odjechać.

Masz darmowe narzędzia usprawniajace pracę. Nie używasz ich bo chcesz
coś udowodnić światu? Jesli tak, to proszę bardzo, błagam jednak: nie
dawaj takich rad innym. To niepoważne.

Po co tracić życie na męczenie się z gównianymi narzedziami, skoro za
darmo są lepsze?
Post by Maciek Godek
I bez trudu mogę sobie wyobrazić, że ktoś wysyła swój kod źródłowy do audytu w postaci pliku zip, mejlem.
Całe szczęscie nie o wysyłaniu autytów ZIPem tutaj rozmawialiśmy.

Ale dobrze kombinujesz jako dyskutant. Jeszcze kilka postów i dojdziesz
do wprawy uciekania od tematu co pół zdania.
Mateusz Viste
2021-08-30 12:56:13 UTC
Permalink
Post by heby
O ile masz KDE. Od razu podpowiem: mało kto ma KDE.
W sensie, że mało kto ma Linuksa? Nie wiem, nie prowadziłem badań, ale
wśród programistów to chyba dość popularna opcja. A wśród Linuksowców
KDE jest mainstreamowy - a przynajmniej był 20 lat temu, kiedy zacząłem
go używać. Zmieniło się coś?

Mateusz
heby
2021-08-30 13:07:11 UTC
Permalink
Post by Mateusz Viste
Post by heby
O ile masz KDE. Od razu podpowiem: mało kto ma KDE.
W sensie, że mało kto ma Linuksa?
Nie. KDE *w* Linuxie.

Przykład zupełnie subiektywny:

https://eischmann.wordpress.com/tag/ubuntu/
Post by Mateusz Viste
wśród programistów to chyba dość popularna opcja. A wśród Linuksowców
KDE jest mainstreamowy - a przynajmniej był 20 lat temu, kiedy zacząłem
go używać. Zmieniło się coś?
Tak, domyslnie Ubuntu nie instaluje KDE.

Wiec twoje kwrite waży 200MB dla kogoś z domyslnej instalki Ubuntu.

200MB na byle notatnik? Panie, co za czasy.
Maciek Godek
2021-08-30 13:39:29 UTC
Permalink
Post by heby
Post by Mateusz Viste
wśród programistów to chyba dość popularna opcja. A wśród Linuksowców
KDE jest mainstreamowy - a przynajmniej był 20 lat temu, kiedy zacząłem
go używać. Zmieniło się coś?
Tak, domyslnie Ubuntu nie instaluje KDE.
Wiec twoje kwrite waży 200MB dla kogoś z domyslnej instalki Ubuntu.
200MB na byle notatnik? Panie, co za czasy.
Gnome ma swój własny "notatnik".
Aż by się chciało powiedzieć: doncz ju gedit?
heby
2021-08-30 13:51:36 UTC
Permalink
Post by Maciek Godek
Post by heby
200MB na byle notatnik? Panie, co za czasy.
Gnome ma swój własny "notatnik".
Będę pamiętał, jak przytrafi się coś do notowania.
Post by Maciek Godek
Aż by się chciało powiedzieć: doncz ju gedit?
Jes, aj dont.
heby
2021-08-30 11:42:49 UTC
Permalink
Post by Mateusz Viste
Przecież podałem: widząc edytor tekstowy o rozmiarze 400 MiB ściska mnie
pod żołądkiem.
$ apt-get install kwrite
[...] After this operation, 212 MB of additional disk space will be
used. [...]

To powoduje, dla odmiany, ból watroby?
Mateusz Viste
2021-08-30 12:50:54 UTC
Permalink
Post by heby
Post by Mateusz Viste
Przecież podałem: widząc edytor tekstowy o rozmiarze 400 MiB ściska
mnie pod żołądkiem.
$ apt-get install kwrite
[...] After this operation, 212 MB of additional disk space will be
used. [...]
To powoduje, dla odmiany, ból watroby?
No wiesz, dla kogoś kto nie ma Linuksa to w ogóle będzie kosmiczny
rozmiar, bo wyjdzie że musi doinstalować kilka GB rzeczy wszelakich :)

Najwyraźniej nie masz KDE, i package manager wlicza w te 212 MB
wszelkie jego niezbędne pliki. Sama aplikacja (kwrite) zajmuje jakieś
300 KiB. Być może Gnome ma jakiś odpowiednik, nie wiem. Ja "od zawsze"
działam pod KDE.

Mateusz
heby
2021-08-30 13:11:52 UTC
Permalink
Post by Mateusz Viste
Post by heby
$ apt-get install kwrite
[...] After this operation, 212 MB of additional disk space will be
used. [...]
No wiesz, dla kogoś kto nie ma Linuksa to w ogóle będzie kosmiczny
rozmiar, bo wyjdzie że musi doinstalować kilka GB rzeczy wszelakich :)
Najwyraźniej nie masz KDE
Dziekuję, nie przypuszczałbym.
Post by Mateusz Viste
, i package manager wlicza w te 212 MB
wszelkie jego niezbędne pliki. Sama aplikacja (kwrite) zajmuje jakieś
300 KiB.
Patrz: większośc apliakcji z Qt zajmuje kilka MB. Ale samo Qt wazy ze 100MB.

Każda apliakcja na Windowsie, bedzie miała własne Qt.

Efektem czego okienko z hello world będzie ważyło 102MB.

To już ból brzucha czy jeszcze nie?

A jak będzie ważyła 2MB na Linuxie to oznacza supremację Linuxa nad
Windowsem, czy jeszcze nie?

A jak apt-get czasami dociągnie Qt a czasami nie to będę miał bóle
pulsacyjne?
Post by Mateusz Viste
Ja "od zawsze"
działam pod KDE.
Stąd subiektywne i relatywistyczne bóle fantomowe na widok małej appki
do pisania kodu którą dziwnym trafem używa bardzo dużo całkiem niezłych
programistów. Może im boleści nie przeszkadzają.
Mateusz Viste
2021-08-30 14:02:02 UTC
Permalink
Post by heby
A jak będzie ważyła 2MB na Linuxie to oznacza supremację Linuxa nad
Windowsem, czy jeszcze nie?
Nie oszukujmy się, i bez tego sprawa jest przecież oczywista.
Powszechne użycie bibliotek współdzielonych to tylko kropla w oceanie
lepszości. Mimo tego, ktoś jest w stanie wydać notatnik dla Linuksa
o rozmiarze 400 MB. Co tam siedzi - cały system operacyjny wraz ze
sterownikami do wszystkich istniejących kart graficznych?
Post by heby
Stąd subiektywne i relatywistyczne bóle fantomowe na widok małej
appki do pisania kodu
W 2021 r. "mała apka" to 400 MB. Muszę zapamiętać, bo nie nadążam za
tym całym postępem. Boję się zapytać - gdzie zaczyna się "duża apka"?
Albo może zacznijmy od "normalnej apki", żebym miał czas się
przygotować.

Parę lat temu popełniłem to: http://atomiks.sf.net
Bardzo się wówczas przejmowałem, że przy wielkości 400 KiB mój remake
jest 2x większy od swojego pierwowzoru. Teraz widzę, że ludzkość jest
już na zupełnie innym etapie...


Mateusz
heby
2021-08-30 14:16:38 UTC
Permalink
Post by Mateusz Viste
Post by heby
A jak będzie ważyła 2MB na Linuxie to oznacza supremację Linuxa nad
Windowsem, czy jeszcze nie?
Nie oszukujmy się, i bez tego sprawa jest przecież oczywista.
Powszechne użycie bibliotek współdzielonych to tylko kropla w oceanie
lepszości. Mimo tego, ktoś jest w stanie wydać notatnik dla Linuksa
o rozmiarze 400 MB. Co tam siedzi - cały system operacyjny wraz ze
sterownikami do wszystkich istniejących kart graficznych?
Możesz sam sprawdzić. Polecam wersję portable dla windowsa, do analizy.
Post by Mateusz Viste
Post by heby
Stąd subiektywne i relatywistyczne bóle fantomowe na widok małej
appki do pisania kodu
W 2021 r. "mała apka" to 400 MB.
No. To jakieś 2 promile miejsca na przeciętnym dysku. Coś koło 2gr jesli
dobrze liczę ceny. Nie opłaca się.
Post by Mateusz Viste
tym całym postępem. Boję się zapytać - gdzie zaczyna się "duża apka"?
Np. taki Windows. Ze 30GB tylko do tego, co Amiga miała w 512kB i to
ROMu. I tu i tu kreski, prostokąty, obrazki, kursor myszki. Też nie
rozumiem.
Post by Mateusz Viste
Parę lat temu popełniłem to: http://atomiks.sf.net
Super. Ale nijak nie kojarzę aby ktoś coś mówił, że chce edytor
pracujacy na CP/M z 48kB RAMu. Coś przeoczyłem? Już używacie komputerów
z dyskami twardymi kupionymi w tym wieku?

Dzięki temu że nikt nie liczy pojedynczych bajtów masz apliakcję bogatą
w ficzery i przenośną.

Jak będziesz chciał edytor w 64kB to da się go napisac, tylko nie
będziesz go chciał używać.
Post by Mateusz Viste
Bardzo się wówczas przejmowałem, że przy wielkości 400 KiB mój remake
jest 2x większy od swojego pierwowzoru. Teraz widzę, że ludzkość jest
już na zupełnie innym etapie...
Ludzkośc najzwyczajniej preferuje przenośnośc nad vendor-lockin i to
jeden z powodów dla których taki kwrite waży 200MiB.
Mateusz Viste
2021-08-30 14:30:47 UTC
Permalink
Post by heby
Ludzkośc najzwyczajniej preferuje przenośnośc nad vendor-lockin i to
jeden z powodów dla których taki kwrite waży 200MiB.
Pomyliłeś się o kilkaset procent: zapomniałeś dodać bibliotek Xorg,
sterowników wszelakich, kernela Linux, narzędzi konsolowych, itd itp.
Nie bójmy się prawdy: kwrite to dobre 10 GB danych, jeśli nie
więcej. Szaleństwo.

Mateusz

Maciek Godek
2021-08-30 09:11:52 UTC
Permalink
Post by heby
Post by Mateusz Viste
Ale jak kto woli. Można używać notatnika a wersje kodu trzymać na
odpowiednio opisanych dyskietkach.
Co złego jest w notatniku?
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor zainteresują
się choćby Atomem.
Ludzie generalnie mają swoje przyzwyczajenia. To one są w ostatecznym rachunku rozstrzygające
dla tego, czy ktoś będzie używał, gita, svna czy zipa; czy wybierze notatnik, notepad++, emacsa,
vima, VS Code czy jakieś rozbudowane IDE.

Przy tym wszystkim, to są tylko narzędzia. Naprawdę nie ma znaczenia, jakiego narzędzia ktoś używa
- liczy się efekt, który potrafi z pomocą tych narzędzi osiągnąć. Jeżeli ktoś dobrze się odnajduje
w programowaniu w Notatniku i nie widzi potrzeby zmiany, to też nie wydaje mi się, żeby trzeba mu
było na siłę wciskać jakąś alternatywę. Tym bardziej, że jeżeli pojawią się alternatywy które naprawdę
dodają potrzebną wartość, nie będzie trzeba nikogo przekonywać.

To, że ktoś ma przyzwyczajenia odmienne od Twoich przyzwyczajeń, albo od przyzwyczajeń Twoich znajomych,
naprawdę nie musi oznaczać - tak jak pisałeś wyżej - że "jest idiotą".

Podobnie, nie każdy musi mieć ochotę na "absurdalnie prostego jednego apt-geta,
dwa pliki konfiguracyjne i trzy polecenia w konsoli" - tym bardziej,
że niewykonywanie tych czynności zawsze będzie nieskończenie prostsze (pomijając
nawet tę kwestię, że na czymś tego "apt-geta" trzeba wykonać).

Właściwie to bardzo żałuję, że poruszyłem w tym wątku temat gita.
Osobiście uważam, że to jest narzędzie bardzo pomagające w porządkowaniu
zmian, które wprowadza się do kodu. SVN nie różni się zasadniczo sposobem
użytkowania, i pod wieloma względami jest równie dobry (choć z różnych względów
uważam rekomendowane go dzisiaj za nie najlepszy pomysł). To, jaki system się wybierze,
nie ma wielkiego znaczenia - znaczenie ma to, żeby wprowadzać swoje zmiany
w uporządkowany sposób.

W każdym razie, gdybym pisał swoją odpowiedź drugi raz, pewnie bym tę kwestię całkowicie
przemilczał, bo z jednej strony jej znaczenie dla tego wątku jest marginalne, a z drugiej
- ilość gówna, jakie się przy tej okazji wylewa, jest katastrofalna.

Właściwie to tyle w temacie.
heby
2021-08-30 09:29:29 UTC
Permalink
Post by Maciek Godek
Post by heby
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor zainteresują
się choćby Atomem.
Ludzie generalnie mają swoje przyzwyczajenia. To one są w ostatecznym rachunku rozstrzygające
dla tego, czy ktoś będzie używał, gita, svna czy zipa; czy wybierze notatnik, notepad++, emacsa,
vima, VS Code czy jakieś rozbudowane IDE.
Nie. Nie wybierzesz notatnika, jeśli potrzebujez debugu.

Nie przyzyczajenia wybierają narzędzia, Potrzeby i dopiero drugorzędnie
przyzwyczajenia.

Jesli jest inaczej - nie nadajesz się do zagadnienia bo dobiersz
narzędzia z klucza religijnego a nie pragmatycznego.
Post by Maciek Godek
Przy tym wszystkim, to są tylko narzędzia. Naprawdę nie ma znaczenia, jakiego narzędzia ktoś używa
Ma zasadnicze. Zaryzykuje, że krytyczne jest czy ktoś używa narzędzia
pozwalajacego autoformatować kod, czy pisze na odpierdol w notatniku.
Efekty są w jakości.
Post by Maciek Godek
- liczy się efekt, który potrafi z pomocą tych narzędzi osiągnąć.
Nie, liczą się też koszty tego efektu, czasem jest to pierwszorzędny cel.

Atom czy inny wypasiony edytor sformatuje Ci kod w pythonie
automatycznie. Notatnik nie. Efektem czego będziesz napierniczał
spacją/tabulacją w notatniku znacznie częsciej, tracąc czas na
ascii-art. W domu rób co chcesz, choć to głupie. W przypadku firmy -
nie. Tam napierniczanie spacją kosztuje konkretne pieniądze. Efektem
czego ludzie z firm przenoszą do domu metodę pracy w której dobieraja
narzedzie w posób pragmatyczny, do celu.
Post by Maciek Godek
To, że ktoś ma przyzwyczajenia odmienne od Twoich przyzwyczajeń, albo od przyzwyczajeń Twoich znajomych,
naprawdę nie musi oznaczać - tak jak pisałeś wyżej - że "jest idiotą".
Nie napisałem tego w kontekście edytorów. Napisałem to w kontekście
dyskusji wybrania nagłupszego rozwiązania i stawiania go w szeregu z
resztą świata, całkiem na poważnie. Jak ZIPy.
Post by Maciek Godek
Podobnie, nie każdy musi mieć ochotę na "absurdalnie prostego jednego apt-geta,
dwa pliki konfiguracyjne i trzy polecenia w konsoli" - tym bardziej,
że niewykonywanie tych czynności zawsze będzie nieskończenie prostsze (pomijając
nawet tę kwestię, że na czymś tego "apt-geta" trzeba wykonać).
Możesz na windowsie uzyć apt-get, nit nie broni, nawet wspierają.

Masz ciekawe podejście: aby uzyskać duży zysk trzeba coś robić i to jest
straszliwy problem "bo przyzwyczajenia". Serio, myslisz że dobry
programista to jest ten co ma "przyzwyczajenia" i preferuje je nad
rozwiązania optymalne?

Poświęcając koło 5 minut dostajesz nieskończoną ilośc ficzerów których
nie ma bez tych 5 minut. Kto rozsądny będzie cały czas pracował na długu
technologicznym w narzedziach, bo mu szkoda 5 mintut raz w życiu na
postawienie serwera?
Post by Maciek Godek
Właściwie to bardzo żałuję, że poruszyłem w tym wątku temat gita.
Nie żałuj, dzięi temu dowiedzieliśmy ile religii jest w tym temacie, a
ile faktów.
Post by Maciek Godek
Osobiście uważam, że to jest narzędzie bardzo pomagające w porządkowaniu
zmian, które wprowadza się do kodu.
Cieszymy się. Nikt z tym nie dyskutuje, może poza Maciejem, ale jego
odmrozili przed chwilą i jeszcze się nie zorientował który rok mamy.
Post by Maciek Godek
- ilość gówna, jakie się przy tej okazji wylewa, jest katastrofalna.
Ilość gówna jest adekwatna do poziomu dyskutowania z okolic "svn do do
bani bo mi się długo branche robiły" i tym podobe debilizmy. Jak się nie
zareaguje na to, to potem zostaje, przysycha i na koniec ludzie czytaja
w necie że git dobry, svn nie bo jakiś ktoś na usenecie tak powiedział i
nikt go nie kopnął w tyłek, odruchowo, za bredzenie.
Maciek Godek
2021-08-30 09:53:07 UTC
Permalink
Post by heby
Post by Maciek Godek
Post by heby
Wszystko. Jeśli chcesz mieć *nie* IDE ale porządny edytor zainteresują
się choćby Atomem.
Ludzie generalnie mają swoje przyzwyczajenia. To one są w ostatecznym rachunku rozstrzygające
dla tego, czy ktoś będzie używał, gita, svna czy zipa; czy wybierze notatnik, notepad++, emacsa,
vima, VS Code czy jakieś rozbudowane IDE.
Nie. Nie wybierzesz notatnika, jeśli potrzebujez debugu.
Faktycznie. Wtedy użyjesz debuggera.

Podobnie, notatnik nie skompiluje ci Twojego kodu źródłowego. Do tego jest kompilator.

Ale po co tracić czas na równie błyskotliwe obserwacje?
Post by heby
Nie przyzyczajenia wybierają narzędzia, Potrzeby i dopiero drugorzędnie
przyzwyczajenia.
Dokładnie. Więc jeżeli ktoś używa Notatnika zamiast Atoma, to najwidoczniej Notatnik spełnia jego potrzeby.
Post by heby
Jesli jest inaczej - nie nadajesz się do zagadnienia bo dobiersz
narzędzia z klucza religijnego a nie pragmatycznego.
Stwierdzenie trochę od czapy. Jeżeli Twoje narzędzia okażą się skuteczne, to to były "wystarczająco dobre narzędzia".
W ostatecznym rozrachunku liczy się to, czy rozwiązałeś problem.

W posiadaniu przyzwyczajneń nie ma nic religinego. Natomiast atakowanie cudzych narzędzi bez jakiegokolwiek kontekstu to zwykła forma prymitywnej mentalności plemiennej.
Post by heby
Post by Maciek Godek
Przy tym wszystkim, to są tylko narzędzia. Naprawdę nie ma znaczenia, jakiego narzędzia ktoś używa
Ma zasadnicze. Zaryzykuje, że krytyczne jest czy ktoś używa narzędzia
pozwalajacego autoformatować kod, czy pisze na odpierdol w notatniku.
Efekty są w jakości.
Post by Maciek Godek
- liczy się efekt, który potrafi z pomocą tych narzędzi osiągnąć.
Nie, liczą się też koszty tego efektu, czasem jest to pierwszorzędny cel.
Atom czy inny wypasiony edytor sformatuje Ci kod w pythonie
automatycznie.
Akurat w Pythonie nie da się sformatować kodu automatycznie.

Notatnik nie. Efektem czego będziesz napierniczał
Post by heby
spacją/tabulacją w notatniku znacznie częsciej, tracąc czas na
ascii-art. W domu rób co chcesz, choć to głupie. W przypadku firmy -
nie. Tam napierniczanie spacją kosztuje konkretne pieniądze.
Ani napierniczanie spacją, ani automatyczne wcinanie, nie jest czymś, co by interesowało jakąkolwiek firmę.

Firmę interesuje to, czy pracownik w określonym czasie wywiązuje się ze swoich obowiązków.
Post by heby
Post by Maciek Godek
To, że ktoś ma przyzwyczajenia odmienne od Twoich przyzwyczajeń, albo od przyzwyczajeń Twoich znajomych,
naprawdę nie musi oznaczać - tak jak pisałeś wyżej - że "jest idiotą".
Nie napisałem tego w kontekście edytorów. Napisałem to w kontekście
dyskusji wybrania nagłupszego rozwiązania i stawiania go w szeregu z
resztą świata, całkiem na poważnie. Jak ZIPy.
Owszem, napisałeś to w kontekście wyboru narzędzi.
Post by heby
Post by Maciek Godek
Podobnie, nie każdy musi mieć ochotę na "absurdalnie prostego jednego apt-geta,
dwa pliki konfiguracyjne i trzy polecenia w konsoli" - tym bardziej,
że niewykonywanie tych czynności zawsze będzie nieskończenie prostsze (pomijając
nawet tę kwestię, że na czymś tego "apt-geta" trzeba wykonać).
Możesz na windowsie uzyć apt-get, nit nie broni, nawet wspierają.
Masz ciekawe podejście: aby uzyskać duży zysk trzeba coś robić i to jest
straszliwy problem "bo przyzwyczajenia". Serio, myslisz że dobry
programista to jest ten co ma "przyzwyczajenia" i preferuje je nad
rozwiązania optymalne?
Jaki "duży zysk"? Postawienie serwera svn to "duży zysk"?
W przypadku gita nie muszę stawiać żadnego serwera.
I to nie tylko to, że mogę np. użyć githuba, który już stoi,
ale mogę też lokalnie synchronizować repozytorium z tym
na pendrivie, gdybym chciał. Bez żadnego serwera.
Post by heby
Ilość gówna jest adekwatna do poziomu dyskutowania z okolic "svn do do
bani bo mi się długo branche robiły" i tym podobe debilizmy. Jak się nie
zareaguje na to, to potem zostaje, przysycha i na koniec ludzie czytaja
w necie że git dobry, svn nie bo jakiś ktoś na usenecie tak powiedział i
nikt go nie kopnął w tyłek, odruchowo, za bredzenie.
O rety, i co wtedy? I wtedy ludzie zaczynają myśleć, że "git jest lepszy od svn"?
I używają gita zamiast svna?
I ludzie przywyczajeni do svna nie mogą tego nieść, bo im "git blame" zabiera za dużo czasu na ich jednoosobowym projekcie?
heby
2021-08-30 10:22:39 UTC
Permalink
Post by Maciek Godek
Post by heby
Post by Maciek Godek
Ludzie generalnie mają swoje przyzwyczajenia. To one są w ostatecznym rachunku rozstrzygające
dla tego, czy ktoś będzie używał, gita, svna czy zipa; czy wybierze notatnik, notepad++, emacsa,
vima, VS Code czy jakieś rozbudowane IDE.
Nie. Nie wybierzesz notatnika, jeśli potrzebujez debugu.
Faktycznie. Wtedy użyjesz debuggera.
Podobnie, notatnik nie skompiluje ci Twojego kodu źródłowego. Do tego jest kompilator.
Ale po co tracić czas na równie błyskotliwe obserwacje?
Aby wypunktować głupie stwierdzenie "ludzie uzyją tego do czego są
przyzwyczajeni".

Mądrzy ludzie użyją tego, co lepiej się sprawdzi. Liczę na to, że o
głupich tu nie rozmawiamy.

Akurat Notatnik nie sprawdza się w *niczym* lepiej, lub są to przesłanki
poza tematem programowania, wymyślane na siłę.
Post by Maciek Godek
Post by heby
Nie przyzyczajenia wybierają narzędzia, Potrzeby i dopiero drugorzędnie
przyzwyczajenia.
Dokładnie. Więc jeżeli ktoś używa Notatnika zamiast Atoma, to najwidoczniej Notatnik spełnia jego potrzeby.
Musi mieć zerowe potrzeby, wtedy Notatnik jest prawidłowym wyborem.

Ludzie parający się programowaniem zawodowo lub hobbystycznie miewają
potrzeby większe od zera. Zaczynając od kolorowania składni, na przykład.
Post by Maciek Godek
Post by heby
Jesli jest inaczej - nie nadajesz się do zagadnienia bo dobiersz
narzędzia z klucza religijnego a nie pragmatycznego.
Stwierdzenie trochę od czapy. Jeżeli Twoje narzędzia okażą się skuteczne, to to były "wystarczająco dobre narzędzia".
Nie.

Wystarczająco dobre narzędzia prawie nigdy nie bywają optymalne.

Skutecznośc nie jest miarą optymalności.

Można skutecznie dojśc na piechotę do Bratysławy, ale można optymalnie
skorzytać z transportu mechanicznego.

Skuteczność ma sens tylko pod warunkiem że jest biska optymalnej.
Inaczej jesteś jak ten hindus który wydłubał basen patykiem. Fajnie,
tylko niekoniecznie ma to zastosowanie komercyjne.
Post by Maciek Godek
W ostatecznym rozrachunku liczy się to, czy rozwiązałeś problem.
Nie tylko. Liczy się tez jakim kosztem. Nie chcesz prowadzić firmy gdzie
dev jest na notatniku, tak samo jak nie chcesz używać edytora do pisania
listy zakupów w celu napisania jakiegoś domowego exampla w pythonie. To
złe narzędzie. To sie nawet nazywa: golden hammer. Tylko że w tym
wypadku to jest golden stick i to z tektury.
Post by Maciek Godek
W posiadaniu przyzwyczajneń nie ma nic religinego. Natomiast atakowanie cudzych narzędzi bez jakiegokolwiek kontekstu to zwykła forma prymitywnej mentalności plemiennej.
Ajeż kontekst jest. Nawet go wyjasniłem: narzędzie dla programistów
posiadają ficzery dla programistów.

Notatnik nie ma żadnych ficzerów dla programitów. To jak byś powiedział,
że ktoś atakuje Cie za to że używasz wiadra zamiast betoniarki, bo takie
masz przyzwyczajenia. To je zmień. Wiadro jest niewydajne. Jeśli
będziesz używać wiadra, to nie dziw się, że ludzie używajacy betoriarek
będą rechotać na samą myśl o takiej organizacji pracy. Możesz być
wiadranym mistrzem betonowania. Dalej to bez sensu w profesjonalnych i
amatorskich zastosowaniach.
Post by Maciek Godek
Post by heby
Atom czy inny wypasiony edytor sformatuje Ci kod w pythonie
automatycznie.
Akurat w Pythonie nie da się sformatować kodu automatycznie.
Zbawne. Bo mi formatuje. Może mam innego pythona. Naciskam enter i
edytor wie ile wyciąć zrobić. Magia. Czasami nie wie, ale naciśniecie 1
raz backspace na kilka linijek jest lepsze niż 10x tab co każdą.
Post by Maciek Godek
Notatnik nie. Efektem czego będziesz napierniczał
Post by heby
spacją/tabulacją w notatniku znacznie częsciej, tracąc czas na
ascii-art. W domu rób co chcesz, choć to głupie. W przypadku firmy -
nie. Tam napierniczanie spacją kosztuje konkretne pieniądze.
Ani napierniczanie spacją, ani automatyczne wcinanie, nie jest czymś, co by interesowało jakąkolwiek firmę.
Wiec nigdy nie widziałeś na czym polega wydajnosc pracy w firmach.
Interesuje ich jak szybko jesteś w stanie pracować. Z tych samych
powodów ekipa remontowa dostaje od szefa wiertarki a nie patyki do
dłubania w betonie, choć oba narzędzia w gruncie rzeczy na końcu
uzyskają ten sam efekt.
Post by Maciek Godek
Firmę interesuje to, czy pracownik w określonym czasie wywiązuje się ze swoich obowiązków.
Nie. Firmę interesuje jak zwiększyć wydajność pracy. Praca z Notatnikiem
jest biegunowo odległa od tego celu. Jeśli nie zmieniasz narzędzi na
wydajniejsze - odpadasz. ta zasada obowiązuje nawet amatora programistę.
Post by Maciek Godek
Post by heby
Masz ciekawe podejście: aby uzyskać duży zysk trzeba coś robić i to jest
straszliwy problem "bo przyzwyczajenia". Serio, myslisz że dobry
programista to jest ten co ma "przyzwyczajenia" i preferuje je nad
rozwiązania optymalne?
Jaki "duży zysk"? Postawienie serwera svn to "duży zysk"?
W porównaniu z ZIPami o które tu głównie cała dyskusja się rozbija. A
teraz przyplątał się Notatnik. Czy jutro dowiem się, że najlepszym
językiem do wszystkiego jest assembler a za maszynę styknie coś na Z80?
To jakiś konkurs w celu ośmieszenia zawodu programisty?
Post by Maciek Godek
W przypadku gita nie muszę stawiać żadnego serwera.
Podobnie jak w przyapdku SVN. Serwer natomiast pojawił się jako coś, co
miało pokazać że *nawet* jesli go postawisz, to koszt tej operacji jest
śmiesznie mały w porównaniu z zyskiem. Czy serwer czy nie, argument o
tym że to trudne, jest po prostu żałosny.
Post by Maciek Godek
Post by heby
Ilość gówna jest adekwatna do poziomu dyskutowania z okolic "svn do do
bani bo mi się długo branche robiły" i tym podobe debilizmy. Jak się nie
zareaguje na to, to potem zostaje, przysycha i na koniec ludzie czytaja
w necie że git dobry, svn nie bo jakiś ktoś na usenecie tak powiedział i
nikt go nie kopnął w tyłek, odruchowo, za bredzenie.
O rety, i co wtedy? I wtedy ludzie zaczynają myśleć, że "git jest lepszy od svn"?
Tak. Możesz sobie zobaczyć taki efekt włanie po tym wątku. ktos gdzieś
coś przeczytał, źle użył i urosło uprzedzenie w postaci wypowiedzi
rozminiętych z prawdą. Tego typu brednie należy przecinać zanim wyrosną
na legendy z którymi nie da się już wlaczyć.
heby
2021-08-29 12:23:40 UTC
Permalink
Post by Maciej Sobczak
Post by kriters
automatu ale lepiej żeby nikt nie musiał nigdy do nich zaglądać.
A czemu nie zaglądać? Bo wstyd patrzeć?
Bo miejsca na dysku szkoda.
Post by Maciej Sobczak
Przecież tam jest dokładnie to samo, co w historii commitów gita. Ten sam syf.
Jesli kto ma syf.
Post by Maciej Sobczak
Właśnie o to chodzi. Git może dać inną prezentację, ale informacja jest ta sama.
Nie jest ta sama. Ogólnie VCS dorobiły się znaczących usodkonaleń od lat
60-tych. Może warto ponownie sprawdzić, co nowego w informtyce, wydajesz
się być jakiś odmrożony z czasów Elvisa. Współczesne VCS pomagają w
nawigacji zmian w kodzie źródłowym. Twóje ZIPy z porównywarką nie mają
nawet śladowej funkcjonalnosci tego typu.
Post by Maciej Sobczak
A jak się rozpakuje zipa w osobnym katalogu, to mamy równocześnie dostępne pliki z jednego punktu w historii projektu.
A jak się zrobi checkout...

Ale moment, ludzie nie są aż tak głupi. Najzwyczajniej robią switch.
Zajmuje to 2-3 sekundy. Albo check for modifications. Albo blame. Zależy
co chcą znaleźć.
Post by Maciej Sobczak
Jeśli ktoś korzysta z nawigacji w IDE, to ta nawigacja działa.
Zupełnie jak w VCS.
Post by Maciej Sobczak
Jeśli w projekcie są media, to można je zobaczyć/przesłuchać.
Zupełnie jak w VCS.
Post by Maciej Sobczak
Itd. To jest komfort pracy daleko wykraczający poza tekstowy diff, nawet taki kolorowy.
Oczywisćie, to komfort daleko wykraczajacy poza pojęcie komfotu.
Nazwałbym to mordęgą, rozpakowywanie 70 ZPIów, aby stwierdzić kiedy
zmieniła się linika numer 10345 w pliku main.cpp. U mnie zajmuje to sekundy.
Post by Maciej Sobczak
A jak mam robić git checkout do osobnego katalogu, żeby w pełnym komforcie obejrzeć różnice (niekoniecznie tekstowe)
Na SVN oglada je bez zrzucania plików lokalnie. Zdalnie. Co powiesz na
taką innowację z cuting edge VCS? Komfort nawet pełnieszy - jest np.
blame. Zawze możesz sobie zrobić checkout, choć nie pamiętam, abym tego
kiedykowleik miał potrzebę użyć w celu porównania czegokolwiek.
Post by Maciej Sobczak
, to to jest ten moment, w którym wartość dodana lokalnego gita wynosi epsilon.
Najzwyczajniej nigdy nie pracowałeś w jakimkolwiek projekcie z VCS.
Nawet git, którego nie lubie nawet bardziej niż svn, jest <bład:
dzielenie przez zero> lepszy od ZIPów.
Post by Maciej Sobczak
Git służy do synchronizacji zmian i tylko tam ma wartość dodaną. Jak jest jedno "repo", to git nic nie wnosi.
Nie pojmujesz jak wygląda typowy flow pracy w zespole. Nic dziwnego, że
gadasz głupoty. Systemy kontroli wersji to nie system archiwizacji
wersji. Tylko *kontroli*. To coś innego.
Post by Maciej Sobczak
Git ma jeszcze jedną smutną wadę. Otóż jego historia zmian ciągle rośnie (chociaż jej użyteczność wcale nie, bo zwykle potrzebne jest tylko jakieś ostatnie okno czasowe a nie całość) - a backup takiego repo staje się z czasem coraz bardziej uciążliwy.
Zastanów się jak bardzo uciązliwy jest backup repo SVN majacego 15 lat i
30GB kodu źródłowego w trunku + ze sto tyś branchy. Czy tak bardzi
uciążliwy, że siedzi nad tym biblion ludzi przepisujac repo na kartki,
czy może jednak technologia ma rozwiązanie pozwalajace jakos to ogarnąć
automatycznie i bez awari przez ten cały czas? By chyba nie myslisz, że
ktoś to pakuje do ZIPa i nagrywa na CDki...
Maciej Sobczak
2021-08-29 18:57:24 UTC
Permalink
Na SVN oglada je bez zrzucania plików lokalnie. Zdalnie. [...]
Nie pojmujesz jak wygląda typowy flow pracy w zespole.
Czyli gadamy sobie na różne tematy. Od jakiegoś czasu rozważamy temat użytkowania VCS *lokalnie* i *jednoosobowo*.
Pomyliłeś dyskusje, stąd nieporozumienie.
Systemy kontroli wersji to nie system archiwizacji
wersji. Tylko *kontroli*. To coś innego.
To też ciekawe rozróżnienie. Bo ja dodatkowo jeszcze odróżniam "control" od "tracking". Ale nie ma to wielkiego znaczenia przy pracy *lokalnej* i *jednoosobowej*.
Zastanów się jak bardzo uciązliwy jest backup repo SVN majacego 15 lat i
30GB kodu źródłowego w trunku + ze sto tyś branchy.
Każdy problem ma swoje rozwiązanie, odpowiednim kosztem. Pytanie, jaki problem chcemy mieć. Czasem racjonalnie można wybrać mniejszy i o tych wyborach tutaj rozmawiamy.
--
Maciej Sobczak * http://www.inspirel.com
heby
2021-08-29 21:26:33 UTC
Permalink
Post by Maciej Sobczak
Na SVN oglada je bez zrzucania plików lokalnie. Zdalnie. [...]
Nie pojmujesz jak wygląda typowy flow pracy w zespole.
Czyli gadamy sobie na różne tematy. Od jakiegoś czasu rozważamy temat użytkowania VCS *lokalnie* i *jednoosobowo*.
Dokładnie tak. Kiedy pracujesz zespole z uzyciem VCS, jego przydatnośc
okazuje się tak duża, że stosujesz go w zyciu "prywatnym". Osobicie mam
postawiony SVN w domu. Do małych, duperelowatych projekcików stosuje
dokładnie te same metody pracy, co w zespole. Ułatwiają życie. Nie tylko
mi. Kilka osób z mojego otoczenia postawiło sobie różne VCS w domu,
wliczając to trzymanie tam prywatnych programów, list zakupów, podań do
spółdzielni, telefonów do lekarzy. Niektórzy nawet przećwiczyli
domowników w ich używaniu. Masz dwa wyjścia: albo to idioci, albo ZIPy
są idityczne.

Z powodu mozliwoci stworzenia repozytorium jednym kliknieciem, nie ma
nawet argumentu że to trudne. To trywialne. Dlaczego więcenie używać?
Nie wszyscy są tak głupi, aby uwierzyć w "traumatyczne robienie branchy
w SVN".

Postawienie SVNa na apache2 jest tak proste, że aż wstydliwe, choć
trzeba poza klikaniem wciskać klawisze. Raz na parę lat. Faktycznie,
dramat. Stworzenie repo w katalogu na dysku lokalnym to 1 kliknięcie.
Nie ma argumentu przeciwko.
Post by Maciej Sobczak
Pomyliłeś dyskusje, stąd nieporozumienie.
To nie jest nieporozumienie. Najzwyczajniej nie rozumiesz po co komu
VCS. Wniosek z tego: nie pracowałeś w zespole. Inaczej nawyki
przenikneły by do częsci prywatnej. Czy to dupna aplikacja czy nastepny
program do rysowania choinki na zaliczenie - w obu przypadkach VCS
będzie lepszym wyborem niż idityczne ZIPy.
Post by Maciej Sobczak
Systemy kontroli wersji to nie system archiwizacji
wersji. Tylko *kontroli*. To coś innego.
To też ciekawe rozróżnienie. Bo ja dodatkowo jeszcze odróżniam "control" od "tracking". Ale nie ma to wielkiego znaczenia przy pracy *lokalnej* i *jednoosobowej*.
Tracking/conrol samego siebie jest równie ważny co tracking/control
kolegów. Po kilku latach nie ma żadnej różnicy kto napisał daną linijkę
kodu. Ważne, że wiadomo po co ją napisano, kiedy ją napisano i co
zmieniono przy okazji. Ta wiedza, pod warunkiem nie posiadania "syfu",
jest w repozytorium VCS. Ale nie ma jej w ZIPach. w ZIPach nic nie ma
poza archiwami i skranie nieskuteczną metodą prowadzenia śledztwa.
Post by Maciej Sobczak
Zastanów się jak bardzo uciązliwy jest backup repo SVN majacego 15 lat i
30GB kodu źródłowego w trunku + ze sto tyś branchy.
Każdy problem ma swoje rozwiązanie, odpowiednim kosztem.
Zaczynasz bredzić. Kosztem? Zastanówmy się: firma ma koszt w postaci
sensownego NASu i backupów. W domu stosujesz ze dwa skrypty do
automatycznego backupu repo np. na google drive. Czy tu czy tu, problem
jest albo w jakosci hardewareowych rozwiązań, albo w sprycie usera. Oba
mają za zadanie utrzymać kilka plików w rozsądnym stanie. Potrafimy
utrzymywać pliki w rozsądnym stanie od lat 80, co najmniej. Ba, dostępne
jest to dla domowego usera prawie za darmo. To jest ten "odpowiedni
koszt" po którym wszystkim mają wypoaść pety z gęby z wrażenia jakie
drogie jest utrzymanie w domu SVN/git/whatever?
Post by Maciej Sobczak
Pytanie, jaki problem chcemy mieć.
Posiadanie setki paczek ZIPa to *jest* problem sam w sobie. Przy nim,
duperela jak backup repozytorium, jest nieistotna. SVN nie ma żadnych
wad, o których w tym wątku bredzono. Ma inne, które nie padły. Wniosek z
tego że ludzie piszą o problemach, których sami nie doświadczyli. Za to
pojawia się ZIP, który nie ma śladu zalety, same wady i stawia się go w
alternatywie dla roziązań milion razy lepszych, prostzych i
funkcjonalnych. Piłeś? Nie pisz.
Post by Maciej Sobczak
Czasem racjonalnie można wybrać mniejszy
ZIPy nie są *alternatywą* do czegokolwiek. Go gówno. Oferujesz do
zastosowań domowych gówniany sposób "kontroli" wersji i tylko mniej
gówniany sposób "archiwizacji", mimo że argumenty o kłopotliwości
przeciętnego VCS są najzwyczajniej zmyślonym bredzeniem osoby która nie
ma pojęcia jak działają w praktyce, czy to dużej firmy czy przeciętnego
Janusza programowania. ZIPy nie są alternatywą. To najgorsze gówno w
jakie można wdepnąć jako programista. Najzwyczajneij wszytkie inne
rozwiązania są o kilometr dalej w rozwoju i wygodzie. Uznałbym że to
prowokacja, ale coś czuje, że nie tym razem.
Mateusz Viste
2021-08-30 07:26:02 UTC
Permalink
Post by heby
Postawienie SVNa na apache2 jest tak proste, że aż wstydliwe, choć
trzeba poza klikaniem wciskać klawisze.
Rozumiem, że stawiasz na apache2. Zapytam, bom ciekaw - dlaczego?
Testowałem onegdaj kilka sposobów instalacji svn, i w wariancie z
apache nie udało mi się znaleźć żadnej wartości dodanej w porównaniu do
ssh, za to trzeba męczyć się z niepotrzebnym, publicznym httpd.

No chyba, że z jakichś (innych) powodów masz już swoje PKI i we
wszelkich interfejsach uwierzytelniasz użytkowników za pomocą osobowych
x509. Czy to ten przypadek?

Mateusz
heby
2021-08-30 07:49:49 UTC
Permalink
Post by Mateusz Viste
Post by heby
Postawienie SVNa na apache2 jest tak proste, że aż wstydliwe, choć
trzeba poza klikaniem wciskać klawisze.
Rozumiem, że stawiasz na apache2.
Zależy. Adhoc - w pliku. Czasami stawiam szybkie repo do jakiegoś
jednorazowego projektu.
Post by Mateusz Viste
Zapytam, bom ciekaw - dlaczego?
Ponieważ mam do niego dostęp przez VPNa. I cześciowo z powodu
przyzwyczajenia, ponieważ miałem tak "od zawsze" czyli od jakiś nastu
lat, a kiedyś byłem zmuszo ny do pracy z tym repo bez VPNa, przez
web-proxy. Dzisiaj nie mam racjonalnego argumentu dlaczego apache2.
Post by Mateusz Viste
Testowałem onegdaj kilka sposobów instalacji svn, i w wariancie z
apache nie udało mi się znaleźć żadnej wartości dodanej w porównaniu do
ssh, za to trzeba męczyć się z niepotrzebnym, publicznym httpd.
Wiec nie ma śladu potrzeby, abyś się z tym męczył.
Post by Mateusz Viste
No chyba, że z jakichś (innych) powodów masz już swoje PKI i we
wszelkich interfejsach uwierzytelniasz użytkowników za pomocą osobowych
x509. Czy to ten przypadek?
Nie, wyłacznie przyzwyczajenie. Zauważ, że nigdzie go w dyskusji nie
preferuję. Przecięny klikacz może sobie stworzyć puste repo 1
kliknieciem w Tortoise i pozamiatane. DAV/mod_svn/apache2 są pokazane
tylko jako kontrast do hasła "trzeba sie namęczyć aby postawić serwer".
Nie trzeba. O ile pamiętam to 1 apt-get, dwa pliki konfiguracyjne, ze 3
polecenia w konsoli i bangla. Postawienie serwera svn na apache2 jest
najtrudniejsze, ale dalej - absurdalnie proste.
Maciek Godek
2021-08-24 14:33:51 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
No dobra, to już jest coś.
A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach tworzysz plik cache.xml?
Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało mi.
Post by Maciek Godek
W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania programu?
vector<string>, robię strs = implode(magic_str, vector<string>)
Skąd jest ta funkcja "implode"?
to moja funkcja a la PHP - łączy stringi z kolekcji przedzielone pierwszym parametrem w jeden string
Tzn. się domyślam do czego służy.
Raczej bym chciał zobaczyć definicję, żeby stwierdzić, czy nie ma w niej jakiegoś nieoczywistego błędu
(skoro to nie jest funkcja z biblioteki standardowej)

Ewentualnie możesz spróbować ją zamienić na biblioteczną, np. z boost:

https://stackoverflow.com/questions/5689003/how-to-implode-a-vector-of-strings-into-a-string-the-elegant-way

(tak czy siak, lepiej w miarę możliwości korzystać z gotowców, niż pisać własne funkcje na rzeczy, dla których gotowce istnieją)
Post by Robert Magdziarz
Post by Maciek Godek
Post by Robert Magdziarz
moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>
Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również plik z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś pliku) i wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie te logi przeanalizował.
Post by Robert Magdziarz
Post by Maciek Godek
Używasz systemu kontroli wersji (np. git) do rozwijania programu?
nie
To zacznij. Najlepiej już dziś.
na razie czytam książkę o git-cie
W najprostszym razie piszesz po prostu "git init" w folderze, który chcesz wersjonować, i później "git commit zmodyfikowane_pliki..." po każdej istotnej zmianie.

Ale najlepiej założyć sobie konto na jakimś serwisie w rodzaju githuba albo gitlaba i tam trzymać cały kod (wtedy dochodzą jeszcze operacje "git push" i "git pull", żeby synchronizować ze sobą repozytoria)

To jest o tyle spoko, że te serwisy od razu udostępniają narzędzia do wygodnego przeglądania zmian.
Robert Magdziarz
2021-08-25 16:14:39 UTC
Permalink
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
Skąd jest ta funkcja "implode"?
to moja funkcja a la PHP - łączy stringi z kolekcji przedzielone pierwszym parametrem w jeden string
Tzn. się domyślam do czego służy.
Raczej bym chciał zobaczyć definicję, żeby stwierdzić, czy nie ma w niej jakiegoś nieoczywistego błędu
(skoro to nie jest funkcja z biblioteki standardowej)
string implode(const string delim, const vector<string> &v) {
string s = "";
for (auto iter = v.begin(); iter != v.end(); ++iter) {
s += (*iter);
if (iter + 1 != v.end()) {
s += delim;
}
}
return s;
}
Maciek Godek
2021-08-25 19:22:56 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
Skąd jest ta funkcja "implode"?
to moja funkcja a la PHP - łączy stringi z kolekcji przedzielone pierwszym parametrem w jeden string
Tzn. się domyślam do czego służy.
Raczej bym chciał zobaczyć definicję, żeby stwierdzić, czy nie ma w niej jakiegoś nieoczywistego błędu
(skoro to nie jest funkcja z biblioteki standardowej)
string implode(const string delim, const vector<string> &v) {
string s = "";
for (auto iter = v.begin(); iter != v.end(); ++iter) {
s += (*iter);
if (iter + 1 != v.end()) {
s += delim;
}
}
return s;
}
Jak dla mnie to wygląda całkiem prawilnie (choć z C++em to nigdy do końca nie wiadomo).
Rozumiem że "string" to std::string i "vector" to std::vector?

W każdym razie raczej wygląda na to, że string jest pusty, bo tablica z jakichś względów jest pusta.

Jesteś w stanie określić wszystkie operacje, których dokonujesz na tej tablicy?
Robert Magdziarz
2021-08-26 04:57:56 UTC
Permalink
Post by Maciek Godek
Rozumiem że "string" to std::string i "vector" to std::vector?
tak
Post by Maciek Godek
W każdym razie raczej wygląda na to, że string jest pusty, bo tablica z jakichś względów jest pusta.
tak
Post by Maciek Godek
Jesteś w stanie określić wszystkie operacje, których dokonujesz na tej tablicy?
algorytm wstawiający stringi do vectora jest skomplikowany (liczy setki linii) i prawdopodobnie zawiera błąd logiczny, ale nie wiem jak ten błąd znaleźć
Maciek Godek
2021-08-26 06:59:12 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Jesteś w stanie określić wszystkie operacje, których dokonujesz na tej tablicy?
algorytm wstawiający stringi do vectora jest skomplikowany (liczy setki linii) i prawdopodobnie zawiera błąd logiczny, ale nie wiem jak ten błąd znaleźć
Jedną z metod jest pisanie przypadków testowych. Jeżeli jesteś w stanie wyodrębnić ten algorytm do osobnego programu, i uruchamiać z różnymi danymi wejściowymi, to to już jest duże ułatwienie.

Wówczas jednym z pomysłów, oprócz ręcznego napisania przypadków testowych, byłoby też napisanie generatora losowych danych wejściowych, które powinny spełniać założenia algorytmu.

Stąd kolejne pytanie: czy ten "algorytm" jest w miarę scentralizowany (tzn. jest jedna funkcja/procedura, która zajmuje się wstawianiem danych do tablicy), czy może rozproszony po całym programie?

W tym pierwszym przypadku byłoby oczywiście łatwiej, ale jeżeli tak nie jest, to trzeba by zakasać rękawy i wyszukać wszystkie miejsca w programie, które modyfikują tę tablicę.

Inna alternatywa byłaby taka, żeby ten algorytm napisać od podstaw, w sposób bardziej zdyscyplinowany.
Robert Magdziarz
2021-08-26 14:40:00 UTC
Permalink
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
Jesteś w stanie określić wszystkie operacje, których dokonujesz na tej tablicy?
algorytm wstawiający stringi do vectora jest skomplikowany (liczy setki linii) i prawdopodobnie zawiera błąd logiczny, ale nie wiem jak ten błąd znaleźć
Jedną z metod jest pisanie przypadków testowych. Jeżeli jesteś w stanie wyodrębnić ten algorytm do osobnego programu, i uruchamiać z różnymi danymi wejściowymi, to to już jest duże ułatwienie.
Wówczas jednym z pomysłów, oprócz ręcznego napisania przypadków testowych, byłoby też napisanie generatora losowych danych wejściowych, które powinny spełniać założenia algorytmu.
tego się praktycznie nie da zrobić, bo danymi wejściowymi do mojego programu są pliki z kodem źródłowym w PHP (program przetwarza programy w PHP)
Post by Maciek Godek
Stąd kolejne pytanie: czy ten "algorytm" jest w miarę scentralizowany (tzn. jest jedna funkcja/procedura, która zajmuje się wstawianiem danych do tablicy), czy może rozproszony po całym programie?
algorytm składa się z wielu funkcji w różnych plikach kodu źródłowego
Post by Maciek Godek
W tym pierwszym przypadku byłoby oczywiście łatwiej, ale jeżeli tak nie jest, to trzeba by zakasać rękawy i wyszukać wszystkie miejsca w programie, które modyfikują tę tablicę.
Inna alternatywa byłaby taka, żeby ten algorytm napisać od podstaw, w sposób bardziej zdyscyplinowany.
Maciek Godek
2021-08-26 16:36:00 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Wówczas jednym z pomysłów, oprócz ręcznego napisania przypadków testowych, byłoby też napisanie generatora losowych danych wejściowych, które powinny spełniać założenia algorytmu.
tego się praktycznie nie da zrobić, bo danymi wejściowymi do mojego programu są pliki z kodem źródłowym w PHP (program przetwarza programy w PHP)
Dlaczego miałoby się nie dać tego zrobić?

Języki programowania mają regularne gramatyki, więc generowanie różnej maści programów nawet na podstawie samego BNFa jest względnie łatwe w realizacji.
Tutaj jest jakiś zabawkowy przykład dla zdań języka Angielskiego:
https://github.com/norvig/paip-lisp/blob/master/docs/chapter2.md
Post by Robert Magdziarz
Post by Maciek Godek
Stąd kolejne pytanie: czy ten "algorytm" jest w miarę scentralizowany (tzn. jest jedna funkcja/procedura, która zajmuje się wstawianiem danych do tablicy), czy może rozproszony po całym programie?
algorytm składa się z wielu funkcji w różnych plikach kodu źródłowego
No tak zapewne jest. Ale chodzi o to, czy ma jeden "punkt wejścia" w Twoim programie?
Robert Magdziarz
2021-08-26 17:19:16 UTC
Permalink
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
Stąd kolejne pytanie: czy ten "algorytm" jest w miarę scentralizowany (tzn. jest jedna funkcja/procedura, która zajmuje się wstawianiem danych do tablicy), czy może rozproszony po całym programie?
algorytm składa się z wielu funkcji w różnych plikach kodu źródłowego
No tak zapewne jest. Ale chodzi o to, czy ma jeden "punkt wejścia" w Twoim programie?
tak
Robert Magdziarz
2021-08-26 17:29:48 UTC
Permalink
Post by Maciek Godek
Post by Robert Magdziarz
Post by Maciek Godek
Wówczas jednym z pomysłów, oprócz ręcznego napisania przypadków testowych, byłoby też napisanie generatora losowych danych wejściowych, które powinny spełniać założenia algorytmu.
tego się praktycznie nie da zrobić, bo danymi wejściowymi do mojego programu są pliki z kodem źródłowym w PHP (program przetwarza programy w PHP)
Dlaczego miałoby się nie dać tego zrobić?
Mój program dla tych samych danych wejściowych (tego samego kodu PHP) zachowuje się poprawnie, a czasami (ów rzadki przypadek) niepoprawnie.
Robert Magdziarz
2021-08-26 19:32:54 UTC
Permalink
Post by Robert Magdziarz
Mój program dla tych samych danych wejściowych (tego samego kodu PHP) zachowuje się poprawnie, a czasami (ów rzadki przypadek) niepoprawnie.
Sprawdziłeś już valgrinda? Isnieje wysokie prawdopodobieństwo, że da
prawidłową odpowiedź na to pytanie.
Nie bardzo go rozumiem:

==4215==
==4215== HEAP SUMMARY:
==4215== in use at exit: 238,583 bytes in 1,676 blocks
==4215== total heap usage: 29,427,297 allocs, 29,425,621 frees, 391,059,828 bytes allocated
==4215==
==4215== LEAK SUMMARY:
==4215== definitely lost: 0 bytes in 0 blocks
==4215== indirectly lost: 0 bytes in 0 blocks
==4215== possibly lost: 0 bytes in 0 blocks
==4215== still reachable: 238,583 bytes in 1,676 blocks
==4215== of which reachable via heuristic:
==4215== newarray : 1,408 bytes in 11 blocks
==4215== suppressed: 0 bytes in 0 blocks
==4215== Rerun with --leak-check=full to see details of leaked memory
==4215==
==4215== For counts of detected and suppressed errors, rerun with: -v
==4215== Use --track-origins=yes to see where uninitialised values come from
==4215== ERROR SUMMARY: 8864 errors from 8 contexts (suppressed: 0 from 0)
heby
2021-08-26 19:54:14 UTC
Permalink
Post by Robert Magdziarz
==4215== ERROR SUMMARY: 8864 errors from 8 contexts (suppressed: 0 from 0)
Nie ma nic wcześniej?

valgrind moj-program 2>error.txt
Robert Magdziarz
2021-08-27 06:04:00 UTC
Permalink
Post by heby
Post by Robert Magdziarz
==4215== ERROR SUMMARY: 8864 errors from 8 contexts (suppressed: 0 from 0)
Nie ma nic wcześniej?
valgrind moj-program 2>error.txt
==4215== Memcheck, a memory error detector
==4215== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4215== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==4215== Command: ./dirtyphp --application=/home/robert/Projekty/design-patterns/src --result=/home/robert/Projekty/design-patterns/src_obfuscated --vendor=/home/robert/Projekty/design-patterns/vendor --vendorframeworks=symfony --vendorsystems=symfony --maxlinelen=1977
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A80D: __wmemchr_avx2 (memchr-avx2.S:233)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x425F02: str_replace(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (common.hpp:385)
==4215== by 0x423CB6: explode(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (common.cpp:369)
==4215== by 0x42BFA9: cache::load_vendor_cache(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::unordered_map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, std::hash<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::equal_to<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, identifiers_vector*> > >&, std::unordered_map<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, std::hash<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::equal_to<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > >, std::allocator<std::pair<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const, identifiers_vector*> > >&) (cache.cpp:161)
==4215== by 0x440E8A: obfuscator::get_cmdline_options(int, char const**) (obfuscator.cpp:422)
==4215== by 0x414943: main (dirtyphp.cpp:103)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A7CC: __wmemchr_avx2 (memchr-avx2.S:213)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x425F02: str_replace(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (common.hpp:385)
==4215== by 0x43783B: backslash_special(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (common.hpp:404)
==4215== by 0x4389FC: exec_php_script(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (common.hpp:409)
==4215== by 0x44CBE8: obfuscator::remove_comments(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) const (obfuscator.cpp:986)
==4215== by 0x446B1F: obfuscator::perform_remove_comments(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:621)
==4215== by 0x445D79: obfuscator::check_application(bool) (obfuscator.cpp:570)
==4215== by 0x414F4F: main (dirtyphp.cpp:131)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A7E6: __wmemchr_avx2 (memchr-avx2.S:221)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x425F02: str_replace(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (common.hpp:385)
==4215== by 0x43783B: backslash_special(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (common.hpp:404)
==4215== by 0x4389FC: exec_php_script(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (common.hpp:409)
==4215== by 0x44CBE8: obfuscator::remove_comments(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) const (obfuscator.cpp:986)
==4215== by 0x446B1F: obfuscator::perform_remove_comments(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:621)
==4215== by 0x445D79: obfuscator::check_application(bool) (obfuscator.cpp:570)
==4215== by 0x414F4F: main (dirtyphp.cpp:131)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A80D: __wmemchr_avx2 (memchr-avx2.S:233)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452EC6: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1440)
==4215== by 0x4492EC: obfuscator::perform_remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:762)
==4215== by 0x44B179: obfuscator::obfuscate_application(bool) (obfuscator.cpp:881)
==4215== by 0x415085: main (dirtyphp.cpp:133)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A7E6: __wmemchr_avx2 (memchr-avx2.S:221)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452F2F: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1445)
==4215== by 0x4492EC: obfuscator::perform_remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:762)
==4215== by 0x44B179: obfuscator::obfuscate_application(bool) (obfuscator.cpp:881)
==4215== by 0x415085: main (dirtyphp.cpp:133)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A823: __wmemchr_avx2 (memchr-avx2.S:240)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452DEF: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1430)
==4215== by 0x4492EC: obfuscator::perform_remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:762)
==4215== by 0x44B179: obfuscator::obfuscate_application(bool) (obfuscator.cpp:881)
==4215== by 0x415085: main (dirtyphp.cpp:133)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A7CC: __wmemchr_avx2 (memchr-avx2.S:213)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452E64: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1435)
==4215== by 0x4492EC: obfuscator::perform_remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:762)
==4215== by 0x44B179: obfuscator::obfuscate_application(bool) (obfuscator.cpp:881)
==4215== by 0x415085: main (dirtyphp.cpp:133)
==4215==
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A887: __wmemchr_avx2 (memchr-avx2.S:282)
==4215== by 0x4F7667A: std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::find(wchar_t const*, unsigned long, unsigned long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==4215== by 0x424757: str_replace_in_place(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&) (common.cpp:450)
==4215== by 0x425F02: str_replace(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) (common.hpp:385)
==4215== by 0x437E84: backslash_special(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (common.hpp:404)
==4215== by 0x4389FC: exec_php_script(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (common.hpp:409)
==4215== by 0x44CF91: obfuscator::remember_strings(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, bool) (obfuscator.cpp:1005)
==4215== by 0x4484F2: obfuscator::perform_remember_and_replace_strings(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (obfuscator.cpp:710)
==4215== by 0x44B850: obfuscator::obfuscate_application(bool) (obfuscator.cpp:927)
==4215== by 0x415085: main (dirtyphp.cpp:133)
==4215==
Maciek Godek
2021-08-27 08:31:58 UTC
Permalink
Post by Robert Magdziarz
Post by heby
Post by Robert Magdziarz
==4215== ERROR SUMMARY: 8864 errors from 8 contexts (suppressed: 0 from 0)
Nie ma nic wcześniej?
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== at 0x590A80D: __wmemchr_avx2 (memchr-avx2.S:233)
To ostrzeżenie sugeruje, że teoretycznie może to być problem z implementacją funkcji wmemchr dla procesorów Intela z tymi ich czarodziejskimi rozszerzeniami. Możesz spróbować skompilować z flagą -march=x86_64 i zobaczyć, czy valgrind będzie nadal wypluwał to ostrzeżenie. Jeżeli nie, to spróbuj użyć tak skompilowanej wersji do odtworzenia błędu (za pomocą takiego kombajnu, o którym pisałem w poprzednim poście). Jeżeli błędu nie zdołasz odtworzyć, będzie to oznaczało, że to może być wina błędnej implementacji funkcji systemowej, i możesz to ewentualnie zgłosić do GCC albo do Intela.
heby
2021-08-27 12:42:02 UTC
Permalink
Post by Robert Magdziarz
==4215== by 0x43783B: backslash_special(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (common.hpp:404)
==4215== by 0x4389FC: exec_php_script(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (common.hpp:409)
Gdzieś w tej okolicy możesz działać na niezainicjowanej pamięci. Albo
wyskoczyłeś poza zakres tablicy albo wręcz przekazałałeś zdeallokowany
pointer wskazujacy w kosmos.
Post by Robert Magdziarz
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452EC6: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1440)
Tu podobnie.

Sprawdź co robisz w tych linijkach, które podpowiedział valgrind.

Przy okazji: kompilowałeś program z -O0? Takie błedy często się
ujawniają po wyłączeniu optymalizacji.
Robert Magdziarz
2021-08-27 14:58:33 UTC
Permalink
Post by heby
==4215== by 0x43783B: backslash_special(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >) (common.hpp:404)
==4215== by 0x4389FC: exec_php_script(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (common.hpp:409)
Gdzieś w tej okolicy możesz działać na niezainicjowanej pamięci. Albo
wyskoczyłeś poza zakres tablicy albo wręcz przekazałałeś zdeallokowany
pointer wskazujacy w kosmos.
==4215== Conditional jump or move depends on uninitialised value(s)
==4215== by 0x424ABA: is_subdir_of_any(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::vector<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&) (common.cpp:476)
==4215== by 0x452EC6: obfuscator::remember_identifiers(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, identifiers_vector*, bool, bool) (obfuscator.cpp:1440)
Tu podobnie.
Sprawdź co robisz w tych linijkach, które podpowiedział valgrind.
kod wygląda ok
Post by heby
Przy okazji: kompilowałeś program z -O0? Takie błedy często się
ujawniają po wyłączeniu optymalizacji.
co to znaczy "ujawniają się"? core dumped?
heby
2021-08-27 15:11:02 UTC
Permalink
Post by Robert Magdziarz
Post by heby
Przy okazji: kompilowałeś program z -O0? Takie błedy często się
ujawniają po wyłączeniu optymalizacji.
co to znaczy "ujawniają się"? core dumped?
Nie tylko. Możesz mieć wiecej sytuacji błednych, które wcześniej
przechodziły. Przykładowo: urwana referencja do obiektu na stosie (który
został zniszczony) w przypadku -O0 wylatuje błedem znacznie częsciej niż
przy -O2. Z uwagi na to że -O0 robi ogólnie wiecej operacji (np. nie
robi inline i zamazuje stos) i ma większe szanse wdepnąć w śmieci.
heby
2021-08-27 15:13:05 UTC
Permalink
Post by Robert Magdziarz
Post by heby
Sprawdź co robisz w tych linijkach, które podpowiedział valgrind.
kod wygląda ok
Zaryzykuje, że urwalo Ci gdzieś referencje. Valgrid raportuje podobne
rzeczy w przypadku std::string const& getTempValue(); czyli to co
zostanie zwrócone jest czasami jeszcze troche działające i wylatuje
później, przy dalszych operacjach.
Robert Magdziarz
2021-08-27 15:57:25 UTC
Permalink
Post by heby
Post by Robert Magdziarz
Post by heby
Sprawdź co robisz w tych linijkach, które podpowiedział valgrind.
kod wygląda ok
Zaryzykuje, że urwalo Ci gdzieś referencje. Valgrid raportuje podobne
rzeczy w przypadku std::string const& getTempValue(); czyli to co
zostanie zwrócone jest czasami jeszcze troche działające i wylatuje
później, przy dalszych operacjach.
wydaje mi się że wszystko jest dobrze
poza tym wymienione wiersze kodu nie należą do wspomnianego "wadliwego" algorytmu, który mam poprawić
Maciek Godek
2021-08-27 18:59:07 UTC
Permalink
Post by Robert Magdziarz
Post by heby
Post by Robert Magdziarz
Post by heby
Sprawdź co robisz w tych linijkach, które podpowiedział valgrind.
kod wygląda ok
Zaryzykuje, że urwalo Ci gdzieś referencje. Valgrid raportuje podobne
rzeczy w przypadku std::string const& getTempValue(); czyli to co
zostanie zwrócone jest czasami jeszcze troche działające i wylatuje
później, przy dalszych operacjach.
wydaje mi się że wszystko jest dobrze
poza tym wymienione wiersze kodu nie należą do wspomnianego "wadliwego" algorytmu, który mam poprawić
Jeżeli owe wiersze kodu są uruchomione przed odpaleniem Twojego algorytmu, to mogą coś napsuć w stanie programu. Urok takich języków jak C polega na tym, że możesz sobie niechcący nadpisać jakiś losowy fragment pamięci, co może później mieć zupełnie katastrofalne skutki.

(W sumie jeżeli nawet są uruchomione po Twoim algorytmie, ale zanim uzyskasz dostęp do pliku, to też się mogą wydarzyć dziwne rzeczy, ale tutaj wygląda na to, że sam plik jest generowany prawidłowo)
Maciek Godek
2021-08-27 09:44:48 UTC
Permalink
Jesteś w stanie odpalać swój program w trybie wsadowym, tzn. bez interfejsu użytkownika?
Chodziłoby o to, żeby np. odpalić go milion razy, albo przez cały dzień, z tymi samymi danymi wejściowymi, i zebrać statystyki zachowania programu - w ilu procentach przypadków daje błędne wyniki.
rozważę to; ale czy taka statystyka pomoże mi w znalezieniu przyczyny problemu?
Przede wszystkim, jeżeli zdołasz zautomatyzować odtwarzanie błędu, to to będzie bardzo pomocne do jego rozwiązania.

Statystykę warto przy okazji poznać, żeby wiedzieć, czego można się spodziewać. Może być tak, że zebranie statystyki nic nie da, bo warunki testowe będą zawierały błąd systematyczny. Warto zapoznać się z tą prezentacją -- ona co prawda mówi o wydajności programów, ale wylicza kilka czynników, które mogą mieć wpływ na zachowanie programu:



W szczególności wyrównanie adresów lub jego brak, jest takim czynnikiem.
Autor prezentacji stworzył plug-in do clanga o nazwie "stabilizer", i gdyby normalnie błąd nie chciał się odtworzyć, możesz spróbować go użyć (bo on właśnie randomizuje adresy, do których sięga program)

[Tyle że ja sam tego nigdy nie używałem, więc w razie czego nie pomogę]
Kolejny trop to pytanie, czy są w Twoim programie jakieś funkcje, których zachowanie zależy od aktualnej daty/godziny, albo czy używasz jakichś funkcji randomizujących.
używam w programie generatora liczb losowych ale nie w tym algorytmie
Losowych, czy pseudo-losowych?
Robert Magdziarz
2021-08-27 10:14:01 UTC
Permalink
Post by Maciek Godek
Kolejny trop to pytanie, czy są w Twoim programie jakieś funkcje, których zachowanie zależy od aktualnej daty/godziny, albo czy używasz jakichś funkcji randomizujących.
używam w programie generatora liczb losowych ale nie w tym algorytmie
Losowych, czy pseudo-losowych?
pseudo, komputery są kiepskie w generowaniu liczb losowych
Maciek Godek
2021-08-27 10:16:29 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Kolejny trop to pytanie, czy są w Twoim programie jakieś funkcje, których zachowanie zależy od aktualnej daty/godziny, albo czy używasz jakichś funkcji randomizujących.
używam w programie generatora liczb losowych ale nie w tym algorytmie
Losowych, czy pseudo-losowych?
pseudo, komputery są kiepskie w generowaniu liczb losowych
No, ale ludzie są całkiem nieźli.
Np. czas uruchomienia programu może służyć jako zarodek dla generatora, i wtedy działanie programu jest rzeczywiście losowe. Albo wartość zarodka może nie być określona przez Twój program i może być - z jego punktu widzenia - losowa.
Robert Magdziarz
2021-08-25 11:53:35 UTC
Permalink
Post by Maciek Godek
Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również plik z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś pliku) i wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie te logi przeanalizował.
Zrobiłem makro TRACE(...) ale problem jest w tym, że nie udaje mi się odtworzyć błędnego przypadku, występuje zbyt rzadko i nie wiem od czego zależy.
Robert Magdziarz
2021-08-25 12:08:16 UTC
Permalink
Pomyślełem, że skoro problem strs="" występuje tak rzadko to mogę nic nie zapisywać do cache.xml gdy wyliczone strs="". Program raz na jakiś czas będzie działał wolniej, ale będzie nadal produkował poprawne wyniki, więc nie jest to jakaś poważna wada. Chyba tak zrobię.
Zbych
2021-08-23 14:55:35 UTC
Permalink
Post by Robert Magdziarz
Post by Maciek Godek
Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w C++, na co dzień programuję w PHP).
Dołóż do listy jeszcze użycie sanitizerów:
https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

I koniecznie logowanie poszczególnych przetwarzania danych na
poszczególnych etapach, to jest chyba najlepsza metoda na rzadkie
przypadki (pod warunkiem, że wcześniej czy później uda się powtórzyć błąd).
Maciej Sobczak
2021-08-23 18:51:35 UTC
Permalink
Post by Robert Magdziarz
Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami? Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.
valgrind

Może problem w sensie niespodziewanych wyników występuje rzadko, ale być może niewłaściwe operacje (odczyt zmiennych przed zapisem, użycie zaraz po zwolnieniu bloku, itp.) są znacznie częstsze, tylko zwykle nie dają złych objawów. Valgrind pomaga takie sytuacje wykryć. Przy okazji wpływa na upływ czasu w programie, co może zarówno utrudnić jak i ułatwić szukanie błędów związanych z wielowątkowością. W każdym razie - jego użycie nic nie boli, puszcza się to tak (Linux):

$ valgrind ./mojprogram

Są jeszcze różne fajne opcje, nie pamiętam. Ale to jedno z najzacniejszych narzędzi diagnostycznych, ever.
--
Maciej Sobczak * http://www.inspirel.com
heby
2021-08-24 19:05:15 UTC
Permalink
valgrind [...]
W tym przypadku koniecznie --track-origins=yes
Loading...