A ile ty skryptujesz?
04.05.2015 00:33
Jedna z książek, która na mnie bardzo wpłynęła swego czasu to zadziwiająca pozycja - "Zarządzanie czasem. Strategie dla administratorów systemów ". Nie żebym był administratorem systemów. Nie, żebym kiedykolwiek myślał o kwestii zarządzania czasem - ten zasadniczo dość często marnuję.
Ale książka ta zawiera trochę rzeczy, które po zaimplementowaniu w odpowiedni sposób zdecydowanie poprawiły jakość mojego życia. Niektóre z nich dotyczą prostych rzeczy, takich jak to, że portfel zawsze leży w tym samym miejscu, więc wiem, gdzie go szukać. Nie zaimplementowałem jednak systemu zarządzania zadaniami opisanego przez autora (ani też nie stosuję GTD ani pomidorów). Książka jednak pomogła mi zrozumieć kilka prawd dotyczących robienia pewnych rzeczy. A że była skierowana do ludzi "technicznych", to pomogła zrozumieć pewne prawdy dotyczące technikaliów, które "zwykli" ludzie będą ignorować.
Jedną z rzeczy, o których warto pamiętać, są skrypty. Skrypty pozwalają naszym komputerom robić pewne rzeczy bez naszego świadomego udziału. Skrypty zrobią po kolei to, co zrobiłby człowiek. I zazwyczaj zrobią to szybciej od człowieka.
Co powinniśmy skryptować? Wszystko! No, może niekoniecznie. Mówi się, że istnieją dwie kategorie rzeczy do zrobienia: rzeczy trudne i rzeczy łatwe. Przemnożyć to należy przez częstość wykonywania: rzeczy często wykonywane, rzeczy rzadko wykonywane. Co warto zautomatyzować z takich grup?
Rzeczy łatwe, ale wykonywane często.
Jest garść rzeczy, które są dość proste, ale wykonuje się je dość często i są żmudne. Na przykład prosty backup - podłączam dysk zewnętrzny i na niego kopiuję ważne dla mnie pliki.
Napisałem sobie do tego prosty skrypt .bat, który klikam dwukrotnie i który wykonuje wielokrotnie kopiowanie różnych źródeł i celów przy użyciu nieocenionego narzędzia robocopy. Po prostu klikam i kopia się dzieje sama, nie muszę się specjalnie przejmować - wszystko się dzieje samo.
W podobny sposób zautomatyzowałem sobie konwersję filmików z kamery samochodowej. Moja kamerka jest bardzo prostym sprzętem, który zapisuje filmiki w postaci plików AVI z kodekiem MJPEG. Te same pliki przekonwertowane do kodeka H.264 i w kontenerze MP4 zajmują o wiele mniej miejsca i nie tracą zbytnio na jakości. Konwersja jest dość prosta, wystarczy Handbrake lub mencoder. Dzięki automatyzacji nie muszę pamiętać o wszystkich parametrach, które powinienem przekazać do HandbrakeCLI i których nazwy niekoniecznie są specjalnie intuicyjne. Nie muszę również niczego klikać i mogę skrypt odpalić dla kilku filmików naraz. A do tego mogłem zrobić jeszcze jedną rzecz - skrypt potrafi automatycznie nazywać pliki w zależności od daty zapisu do pliku przez co z "SUNP0001.AVI" robi się nagle "20150503-1021.mp4". Mógłbym zmieniać nazwy ręcznie, ale coś może mnie wyręczyć!
Pewnym problemem może być tylko fakt, że skrypt wygląda jak magiczne zaklęcie i działa zapewne dobrze tylko dla określonego rodzaju filmików z określonej kamerki.
Rzeczy trudne, wykonywane rzadko
Są też operacje, które robi się dość rzadko i są nieco skomplikowane. To też warto zautomatyzować. Głównie dlatego, że jeżeli się coś robi rzadko, to się o tym potem zapomina.
Taką operacją może być na przykład stworzenie nowego certyfikatu do domowego OpenVPN. Operacja nie jest przesadnie trudna, ale wymaga uruchomienia openssl kilka razy podając różne parametry w odpowiedniej kolejności, a potem skopiowania wygenerowanych plików w odpowiednie miejsca. Skrypt, który raz napisałem, oszczędza moją pamięć - nie muszę się martwić tym, że zapomnę zrobić -config w wywołaniu openssl przez co to niezbyt zadziała.
Zdarza się również, że mam filmy zapisane kodekiem H.264, ale w kontenerze MKV. Mój telewizor nie obsługuje tego, ale poradzi sobie z MP4. Rzadko to rzadko, ale fajnie by było przerobić jedno na drugie, a najlepiej bez transkodowania i straty jakości (i czasu!) z tym związanej. Sprawa nie jest trudna, ale używa się narzędzi o których nie pamiętam (mkvtoolnix i MP4Box) aby wyekstrahować ścieżkę wideo i audio, a potem włożyć do pliku MP4.
I w końcu jest jeszcze jedna rzecz, wykonywana rzadko, ale skomplikowana. Ustawianie nowego komputera. Lubię kiedy pewne ustawienia systemu są skonfigurowane w określony sposób. Oczywiście, byłbym w stanie to wszystko samemu wyklikać, ale to zajmuje czas, a i tak zapewne zapomniałbym, co trzeba zrobić. Skrypt sam wyłączy pewne rzeczy, inne włączy i w ten sposób dostosuje komputer do moich oczekiwań. A jak często się go użyje? Raz na kilka lat!
Tutaj dygresja: podobny skrypt do konfiguracji wstępnej komputera, tylko służbowego, może być już wykonywany o wiele częściej, w zależności od wdrożenia. Używanie skryptów ma oczywiście też zaletę taką, że wykonuje się to na wielu komputerach automatycznie równocześnie. Bo są rzeczy wykonywane często i są też rzeczy wykonywane wielokrotnie na różnych maszynach. Nie jestem administratorem, więc Chef i Puppet to dla mnie czarna magia, ale proste skrypty spełniają obecnie swoje zadania.
A pozostałe dwie kategorie?
No dobrze, zostały nam proste rzeczy wykonywane rzadko - tych bym nie automatyzował.
Mam na dysku plik .bat, który "opakowuje" szyfrowanie z użyciem GPG. Ale jest to na tyle prosta komenda, że wpisuję ją "z palca" równie szybko. I nie muszę się zastanawiać ani jak się mój skrypt nazywa, ani jakie parametry mu są potrzebne.
Bo czy jest duża różnica pomiędzy:
gpg-encrypt ktos@ktos.info file.txt
a
gpg -e -a -r ktos@ktos.info file.txt
Gorzej się sprawa ma z rzeczami trudnymi, wykonywanymi często. Autor książki radzi w takiej sytuacji aby napisać lub znaleźć istniejące oprogramowanie, na wyższym poziomie działania niż prosty skrypt. Granica pomiędzy skryptem i programem oczywiście może być zatarta, ale to temat na inną dyskusję.
Mam na dysku również prosty skrypt, który miał w założeniu porównywać dwa foldery zwracając różnice pomiędzy nimi. Sposób prezentacji jego danych nie był specjalnie przyjazny. Okazało się, że to samo doskonale jest przecież w stanie zrobić kdiff3 czy WinMerge i to w graficznej formie zamiast suchej listy plików.
W podobny sposób wygodniejsze od wpisywania magicznych poleceń okazało się dodanie pod menu kontekstowe opcji "zmień rozmiar obrazka" uruchamiającego graficzny program pozwalający na wykonanie jeszcze do tego podglądu. A już w ogóle krokiem naprzód było zmienienie ręcznego wrzucania plików do galerii zdjęć (bo chodziło o galerię zdjęć na stronie internetowej) odpowiednią aplikacją internetową, która dostawała zdjęcia i sama robiła miniaturki. I pozwalała sortować i zmieniać kolejność interfejsem graficznym.
I także skrypt PowerShella do wyliczania sumy MD5 pliku jest gorszy od prostego programu md5sum - i o wiele mniej przenośny, bo istnieje tylko na moich komputerach, a md5sum także na wielu Linuksach.
Automatyzacja - opisz to!
Automatyzujesz? Świetnie! Tylko warto to robić z głową. Oprócz tego, co skryptować, ważne jest jeszcze jedno - aby to udokumentować. Mam na dysku kilka skryptów, które działają, ale do których nigdy nie pamiętam co należy przekazać, aby zadziałało. I muszę je sobie otwierać, analizować, i dopiero uruchamiać. Fajnie jest, gdyby to wszystko miało zrobione komentarze i opisy jak się używa. Niestety, część z nich pochodzi z mojej mrocznej przeszłości, kiedy wszelkiej pracy nad komentowaniem kodu unikałem jak ognia.
Moim osobistym problemem stało się również kolekcjonowanie skryptów w pewnym momencie. Było kilka rzeczy, które uznałem, że sobie zapiszę, że zapewne się przydadzą. I nigdy ich nie używałem. Obecnie siedzą w katalogu C:\Scripts i czekają, że kiedyś na nie spojrzę. Lub może by tak wreszcie usunąć?