Z dnia życia kuca, odcinek 3
Desktopowy instalator nieważne czego, ważne że nasz, że przez nas zrobiony i to nie jest nasze ostatnie słowo. Dodaję ficzery. Super, wszystko działa. Testuję, odpalam kilka razy. Kurde, coś jest nie tak. Jak klikam cancel, to apka się wiesza na dłuższy moment. Szperam, szperam. Cofam się kilka commitów wstecz, ale nadal to samo, a przecież na 100 % działało wcześniej.
Okazuje się, że procedura zakończenia instalacji obejmuje edycję pliczku, który ma jakieś 10 kB. Podmiana jednej linii. Wygląda to mniej więcej tak:
with open(filename, 'r+') as f:
data = f.readlines()
swap_line(data)
f.truncate(0)
f.writelines(data)
Otóż kolega wklepał f.truncate(0)
i hehe pora na CSa :DDD truncate
ucina resztę pliku, tylko że kolega zapomniał przesunąć pozycję file handle'a na początek pliku, więc efektywnie uciął dokładnie nic, tym samym dublując przy każdym wywołaniu jego rozmiar. I tak u mnie z 10 kB zrobiło się w krótkim czasie 12 GB zanim sczaiłem się ocb (:
Wgl fajnie, że to śmiga na produkcji od pół roku xd
Z dnia życia kuca, odcinek 3
Desktopowy instalator nieważne czego, ważne że nasz, że przez nas zrobiony i to nie jest nasze ostatnie słowo. Dodaję ficzery. Super, wszystko działa. Testuję, odpalam kilka razy. Kurde, coś jest nie tak. Jak klikam cancel, to apka się wiesza na dłuższy moment. Szperam, szperam. Cofam się kilka commitów wstecz, ale nadal to samo, a przecież na 100 % działało wcześniej.
Okazuje się, że procedura zakończenia instalacji obejmuje edycję pliczku, który ma jakieś 10 kB. Podmiana jednej linii. Wygląda to mniej więcej tak:
with open(filename, 'r+') as f:
data = f.readlines()
swap_line(data)
f.truncate(0)
f.writelines(data)
Otóż kolega wklepał f.truncate(0)
i hehe pora na CSa :DDD truncate
ucina resztę pliku, tylko że kolega zapomniał przesunąć pozycję file handle'a na początek pliku, więc efektywnie uciął dokładnie nic, tym samym dublując przy każdym wywołaniu jego rozmiar. I tak u mnie z 10 kB zrobiło się w krótkim czasie 12 GB zanim sczaiłem się ocb (:
Wgl fajnie, że to śmiga na produkcji od pół roku xd
@Pherun: Akcja wpisu zaczyna się w latach 70. - już wtedy młody Bohater wie, że adrenalina smakuje bardziej niż mleko w proszku.
Z dnia życia kuca, odcinek 3
Desktopowy instalator nieważne czego, ważne że nasz, że przez nas zrobiony i to nie jest nasze ostatnie słowo. Dodaję ficzery. Super, wszystko działa. Testuję, odpalam kilka razy. Kurde, coś jest nie tak. Jak klikam cancel, to apka się wiesza na dłuższy moment. Szperam, szperam. Cofam się kilka commitów wstecz, ale nadal to samo, a przecież na 100 % działało wcześniej.
Okazuje się, że procedura zakończenia instalacji obejmuje edycję pliczku, który ma jakieś 10 kB. Podmiana jednej linii. Wygląda to mniej więcej tak:
with open(filename, 'r+') as f:
data = f.readlines()
swap_line(data)
f.truncate(0)
f.writelines(data)
Otóż kolega wklepał f.truncate(0)
i hehe pora na CSa :DDD truncate
ucina resztę pliku, tylko że kolega zapomniał przesunąć pozycję file handle'a na początek pliku, więc efektywnie uciął dokładnie nic, tym samym dublując przy każdym wywołaniu jego rozmiar. I tak u mnie z 10 kB zrobiło się w krótkim czasie 12 GB zanim sczaiłem się ocb (:
Wgl fajnie, że to śmiga na produkcji od pół roku xd
10/10
@Pherun: Dlaczego taka niska ocena? Pytam z czystej ciekawości. Pamiętam jak czytałem to z 5 lat temu, to nawet mi się spodobał. Pesymistyczny, z fajnym zakończeniem. Niewiele jednak pamiętam z niego, co więc było takie złe w tym wpisie?
Z dnia życia kuca, odcinek 3
Desktopowy instalator nieważne czego, ważne że nasz, że przez nas zrobiony i to nie jest nasze ostatnie słowo. Dodaję ficzery. Super, wszystko działa. Testuję, odpalam kilka razy. Kurde, coś jest nie tak. Jak klikam cancel, to apka się wiesza na dłuższy moment. Szperam, szperam. Cofam się kilka commitów wstecz, ale nadal to samo, a przecież na 100 % działało wcześniej.
Okazuje się, że procedura zakończenia instalacji obejmuje edycję pliczku, który ma jakieś 10 kB. Podmiana jednej linii. Wygląda to mniej więcej tak:
with open(filename, 'r+') as f:
data = f.readlines()
swap_line(data)
f.truncate(0)
f.writelines(data)
Otóż kolega wklepał f.truncate(0)
i hehe pora na CSa :DDD truncate
ucina resztę pliku, tylko że kolega zapomniał przesunąć pozycję file handle'a na początek pliku, więc efektywnie uciął dokładnie nic, tym samym dublując przy każdym wywołaniu jego rozmiar. I tak u mnie z 10 kB zrobiło się w krótkim czasie 12 GB zanim sczaiłem się ocb (:
Wgl fajnie, że to śmiga na produkcji od pół roku xd
@Pherun: logika jest krótka, lecz z tłumikiem. Gdyby wrócił na początek pliku, uciął resztę i wkleił zmienioną treść z powrotem, to rozmiar byłby ten sam. A że nie wrócił i nie uciął nic, to po prostu dokleił zmienioną treść do niezmienionej.
Przykładowo- klasa średnia niska śpi.
Klasa średnia wysoka- zajmuje się swoimi sprawami, ale nie śpi, bo trzeba pewnych rzeczy dopilnować, oraz odpisać na Strimoidzie i przygotować pokój na sesję RPGa jutro.
Co łączy patoli z "bogaczami niskiej ligi" i klasą średnią średnią (nowobogackimi dupkami)- podaje odpowiedź- buractwo zazwyczaj.
Buractwo które każe się chwalić. Czuć się lepszym, innych pod byle pretekstem uważać za gówno, no i co najważniejsze- przejmować się.
Że jakiś anon w necie napisał że jesteś i byłeś i będziesz burakiem.
Amen.
XD
Pokaż ukrytą treść To tak dla przypomnienia za co mnie kiedyś "zczarnolistowałeś" sens
I dlaczego, dobrze wiedzieć, że pewne rzeczy pozostają bez zmian.
@sens
Chociaż nie może to o szaraka mi chodziło? xD
No ale to ponoć multi xDD
@Runchen: oho, chyba ci nadepnąłem czymś na odcisk xD Spoko, i tak cię lubię. Wsm to nawet nie pamiętam, żebym cię czarnolistował kiedykolwiek.
@sens: vermont ipa całkiem spoko ale summer ale to brałem tylko dlatego, że nic lepszego poza tym nie było
_ONGZNA: Ab zberPokaż ukrytą treść Nyy gur crbcyr V'ir zheqrerq... ol yrggvat lbh yvir!_ _WBXRE: V arire xrcg pbhag._ _ONGZNA: V qvq!_ _WBXRE: V xabj... Naq V ybir lbh sbe vg._
Dziś postanowiłem wydobyć z systemu informację o sile sygnału wifi, bo najwyraźniej to jest wiedza, jakiej użytkownik macOS nie jest w stanie otrzymać ot tak. No to cyk cyk, napisałem jakieś gówno w Swifcie. Okazało się, że można to nawet skompilować, no to skompilowałem. A ponieważ Swifta nie znam prawie w ogóle, to postanowiłem z niego po prostu wystawić takie małe API, a potem się zlinkować do tego z C i elo, pozamiatane. Ale takiego wała, przecież istnieje name mangling, a każdy kompilator robi to inaczej. Na szczęście okazuje się, że jak się wpisze swift demangle <zmanglowana nazwa>
, to dostajemy ładny i przejrzysty identyfikator. Zatem obrałem taktykę generowania assembly z tego swiftowego wrappera. Napisałem skrypt w Pythonie, który mi demangluje te nazwy w asm przy pomocy tego swiftowego czaru i jeszcze wypierdala .globl _main
, żeby linker nie robił spruty. I tak oto mogę się podłączyć na luziku fiku miku do systemowego API praktycznie nie tykając dwóch języków promowanych przez Apple: Objective-C, który ma składnię może nie najgorszą na świecie, ale też nie najlepszą, a poza tym jest już przestarzały oraz Swifta, w którym wszystko trzeba odpakowywać, a goły wskaźnik to jest jakieś zło i żeby się do niego dostać, to trzeba pisać jakieś zaklęcia typu UnsafePointer
(podkreślam UNSAFE), rawValue
, baseAddress
, bo oczywiście jest zanurzony gdzieś na samym dnie xD
W sumie pewnie istnieje jakiś lepszy sposób, ale całkiem nieźle się bawiłem dziś, czuję dobrze kuc.