Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Edycja hostów Windows'a - Ruby czyli rekordzista

Witam serdecznie. Może to już nudne, ale właśnie mi się nudziło i napisałem konsolowy skrypt do edycji hostów w języku znanym pod nazwą Ruby.

Użytkownik kuba144 przy wpisie Hosty w Win7 [...] powiedział:

To teraz proponuję wyścigi kto napisze krótszy kod ;p

Aktualnie mój stał się chyba rekordzistą, jeśli chodzi o ilość linii kodu (27 bez czterech linii komentarzy). Jedyne co trzeba tylko zrobić to dla zmiennej filename podać ścieżkę do pliku z hostami, względem lokalizacji, na której aktualnie pracujemy w konsoli (w przypadku Ruby >= 1.9. Jeśli posiadamy Ruby < 1.9 podajemy lokalizację względem skryptu). Nie jestem do końca pewien, czy działa on zupełnie bezbłędnie i jest idioto-odporny, ale funkcjonalności pracują jak należy. Obsługuje linie z komentarzami (czyli wyświetla je, podając ich indeksy) gdybyśmy oczywiście chcieli usunąć jakąś linię komentarzu. Oczywiście kod nie jest idealny, można by dodać czyszczenie konsoli, trochę fajerwerków, żeby ładniej wyglądało i lepiej się na programie pracowało, ale nie o to przecież chodzi, prawda? :)

Rzecz jasna sens egzystencji tego skryptu nie istnieje, bowiem łatwiej, szybciej (i tak dalej) jest otworzyć sobie ten plik w edytorze tekstu i zrobić to co trzeba. Jeśli komuś się będzie chciało go w ogóle uruchomić i dostrzeże jakiś błąd, poprosiłbym o zgłoszenie tego w komentarzach, a ja postaram się go naprawić.

Oto kod:filename = "host.txt" lines = File.readlines(filename) choice = 1 while choice != 4 puts "--------------- \n[1] Dodaj host [2] Usuń host [3] Pokaż hosty [4] Zapisz i wyjdź [Control + C] Wyjdź bez zapisu" choice = gets.to_i case choice # Add when 1 puts "Podaj całą linię, jaka ma zostać dodana:" line = gets lines << line # Remove when 2 puts "Podaj indeks linii, którą chcesz usunąć (indeks liczy się poczynając od zera" line = gets.to_i lines.delete_at(line) # Show when 3 lines.each_with_index do |line, index| puts "[#{index}] #{line}" # if line[0,1] != "#" end # Save and exit when 4 f = File.open(filename, "w") lines.each do |line| f.puts line end f.close end end 

windows programowanie

Komentarze

0 nowych
Frankfurterium   10 #1 19.04.2012 18:44

I w efekcie programów nie da się porównać (nawet pod względem długości), bo każdy działa w inny sposób i inaczej komunikuje się z użytkownikiem. Przed następnym challenge'em trzeba będzie zrobić dokładną analizę funkcjonalności :P

soanvig   10 #2 19.04.2012 18:52

I ustalić jakie warunki ma spełniac program :) Ja przy funkcjonalności swojego kierowałem się batchową wersją skryptu z:
http://www.dobreprogramy.pl/Hosty-w-Win-podejscie-proste,Blog,31402.html

Saskatchewan   8 #3 19.04.2012 19:26

Nieładnie tak usuwać oryginalny plik, a później zapisywać całość. Wyobraź sobie co by było gdybyś – jakimś cudem – dostał wyjątek przy próbie stworzenia pliku, albo w trakcie zapisu. ;-)

soanvig   10 #4 19.04.2012 20:21

No właśnie tak pomyślałem, że nieładnie tak usuwać. Pomyślę nad tym jutro i dodam jakieś zabezpieczenia, ewentualnie zmienię metodę

soanvig   10 #5 19.04.2012 20:29

Wstępnie poprawiłem tryb zapisu na "w", który automatycznie czyści plik i umożliwia ładny zapis. Jednak nie jestem do końca pewien jak dokładnie dokładnie tryb "w" działa, więc...

Druedain   14 #6 19.04.2012 21:20

Poczwórne wcięcia, oj oj :P

soanvig   10 #7 19.04.2012 22:15

Co kto lubi, jedni używają spacji do robienia wcięć, ja używam tabu o szerokości bodajże 4 (według programu gedit)

Druedain   14 #8 19.04.2012 23:49

Chodzi o poziom zagnieżdżenia!

  #9 19.04.2012 23:58

a ja nie mam najmniejszego pojęcia o co tu chodzi :D

soanvig   10 #10 20.04.2012 14:44

Nie wiem o co ci chodzi z tym poziomem zagnieżdżenia. To źle, że coś siedzi "tak głęboko"?

Demagog   4 #11 20.04.2012 16:37

No to czekamy na jakiegoś czarodzieja znającego Perla.
Czyli język będący u faworytem

Druedain   14 #12 20.04.2012 18:21

Tych czterech wcięć się uczepiłem, ale nie przejmuj się aż tak moim zrzędzeniem, nie jestem Linusem ;)

I na tym bym zakończył gdybyś napisał, że kod miał być przede wszystkim bardzo krótki…

Czy to źle? Warto się przejmować takimi sprawami, bo z tych 4 może się zrobić 14. Zaleca się raczej nie komplikować tak pojedynczych fragmentów kodu ze względu na rosnącą złożoność cyklomatyczną (maksymalny poziom zagnieżdżenia w kodzie jest tylko jednym z wielu czynników mających na to wpływ), co przekładać się może na problemy z późniejszym testowaniem i debugowaniem, czy zrozumieniem kodu przez kogoś innego. Oczywiście uwaga nie dotyczy pokazanego programu (swoją drogą gratuluję niezłego rozmiar ;) ) tylko zapytania o sens przejmowania się takimi rzeczami.

soanvig   10 #13 20.04.2012 19:09

Pewnie masz rację. Nie mam jeszcze takiego doświadczenia w programowaniu (głównie tu chodzi o duże projekty, prawda, żadnego takiego naprawdę dużego nigdy nie skończyłem), więc nie widziałem problemów w tym, że miałem X poziom zagnieżdżenia. Muszę o tym pamiętać jak coś kolejnego będę pisał. Tymczasem można zacząć ogłaszać takie challenge programistyczne, fajna zabawa :)

matiit   7 #14 20.04.2012 20:06

http://www.dobreprogramy.pl/Golf-Czyli-kto-napisze-krotszy-kod,Blog,31791.html

Zapraszam do konkursu ;)
Jest specyfikacja więc możemy pograć bardziej na serio :)

Saskatchewan   8 #15 20.04.2012 20:17

Mój skrypt do hostów w Pythonie (początkowe podkreślenia trzeba zamienić na wcięcia – nie chciałem, żeby mi coś wycięło). Wersja bez obsługi błędów, za to tylko 8 linii i tylko dwa poziomy wcięć :D

with open('hosts', 'r+') as file:
____lines = [line.strip() for line in file.readlines()]
____while True:
________choice=input('-'*80+'\n[1] Dodaj [2]Usuń [3]Pokaż [4]Zapisz i zakończ [Ctrl+C]Zakończ bez zapisywania\nPodaj numer opcji: ')
________if choice == '1': lines.append(input('Podaj całą linię do dodania: '))
________elif choice == '2': del lines[int(input('Podaj numer linii do usunięcia: '))]
________elif choice == '3': print('\n'.join('{}:\t{}'.format(i, line) for i, line in enumerate(lines)))
________elif choice == '4': file.truncate(0); file.seek(0); file.write('\n'.join(lines)); exit()

soanvig   10 #16 20.04.2012 20:45

No tak, zauważ, że wcisnąłeś kilka instrukcji do jednej linii. Tak upychać to ja też mogę :D

Saskatchewan   8 #17 21.04.2012 09:01

Wiem, zrobiłem to świadomie, żeby zaciemnić czytelność i… wygrać mniejszą liczbą linii. ;-) Ciekawe, kto teraz wpadnie na pomysł, żeby napisać program do edycji hostów w jednej linijce kodu C lub czegoś podobnego.