Triki z PowerShellem #13 – Prędkość czasu

2009-12-31 13:47

Ostatni dzień roku to dobry moment na różne dziwne przemyślenia na temat czasu. Kiedyś z tej okazji wymyśliłem zupełnie nowy system kalendarza, a dzisiaj przypomniałem sobie o niezupełnie poważnym pomyśle autorstwa Rega, ze zbliżonej dziedziny.
Chodzi o oryginalną wielkość “fizyczną”: prędkość czasu. Ma ona ilościowo mierzyć znany wszystkim fakt, że wrażenie upływającego czasu jest różne w różnych sytuacjach. Gdy w rzeczywistości upłynął pewien czas t, a nam wydawało się, że minął raczej czas t', to odczuwana przez nas prędkość czasu \tau wynosi

\displaystyle \tau = \frac{t}{t'}.

Dla przykładu: na nudnym wykładzie mogło minąć ledwie 15 minut, podczas gdy nam wydaje się, że siedzimy na nim już godzinę; wówczas \tau_1 = 0,25 / 1 = 0,25. Z kolei grając przez trzy godziny możemy mieć wrażenie, że upłynęło tylko 30 minut – wtedy \tau_2 = 3 / 0,5 = 6. Jak widać \tau_1 < \tau_2, zatem teoria zgadza się tutaj z intuicją, co pozwala wnioskować, że wielkość jest dobrze zdefiniowana :)

Pozostaje jeszcze kwestia jej pomiaru. W swoim oryginalnym artykule (który w tajemniczy sposób zniknął z sieci) Reg zaproponował, że można by go przeprowadzić za pomocą odpowiedniego programu. Miałby on działać w tle, losować pewien interwał czasu i po jego upływie pytać użytkownika, ile czasu według niego upłynęło od ostatniego pytania. Z dokładnością do małych błędów pomiarowych (np. czasu potrzebnego na wpisanie odpowiedzi) metoda wydaje się dobra – czemu więc by jej nie zaimplementować? :]
To właśnie uczyniłem, posługując się oczywiście swoim ulubionym narzędziem na takie okazje, czyli PowerShellem. Pewnym problemem było to, jak w skrypcie konsolowym postarać się o mierzenie czasu w sposób, który byłby niezauważalny dla użytkownika. Da się to jednak łatwo zrobić, posługując się… wbudowanym w system Harmonogramem zadań (Task Scheduler). Istnieje bowiem do niego dobrze udokumentowane, ładne i przejrzyste COM-owe API (dostępne od Visty wzwyż), którego użycie w PowerShellu wygląda zresztą kilka razy lepiej niż w C++ ;P
Wynikowy skrypt wygląda więc następująco:

  1. # timespeed.ps1
  2. # Skrypt do mierzenia prędkości czasu
  3. param ([int]$minutes = 0)
  4.  
  5. # Stałe
  6. $TASK_NAME = "TimeSpeed_Task"   # Nazwa zadania w Harmonogramie
  7.  
  8. # Pobieramy obiekt harmonogramu zadań
  9. $ts = New-Object -ComObject Schedule.Service
  10. $ts.Connect($null, $null, $null, $null)
  11. $tf = $ts.GetFolder($(New-Object String @([char]92, 1))) # "\"
  12.  
  13. if ($minutes -eq 0)
  14. {
  15.     # Pierwsze uruchomienie
  16.     $task = $ts.NewTask(0)
  17.     $task.Data = ""
  18.     $continue = "T"
  19. }
  20. else
  21. {
  22.     # Kolejne uruchomienia
  23.     $task = $tf.GetTask($TASK_NAME).Definition
  24.    
  25.     # Pytamy użytkownika i liczymy prędkość czasu
  26.     $userMinutes = Read-Host -Prompt "Liczba minut od ostatniego razu"
  27.     $d_tau = $minutes / $userMinutes
  28.     if (-not [String]::IsNullOrEmpty($task.Data))
  29.     {
  30.         $timeData = $task.Data.Split(',')
  31.         $totalTime = [int]$timeData[0]
  32.         $totalUserTime = [int]$timeData[1]
  33.     }
  34.     $totalTime += $minutes
  35.     $totalUserTime += $userMinutes
  36.     $tau = $totalTime / $totalUserTime
  37.     $task.Data = $totalTime.ToString() + "," + $totalUserTime.ToString()
  38.    
  39.     # Wyświetlamy aktualne wyniki
  40.     "Rzeczywista liczba minut: " + $minutes | Out-Host
  41.     "Chwilowa prędkość czasu: " + $d_tau | Out-Host
  42.     "Całkowita prędkość czasu: " + $tau | Out-Host
  43.    
  44.     # Pytamy użytkownika, czy chce kontynuować
  45.     $continue = Read-Host -Prompt "Wykonać następny pomiar (T/n)?"
  46. }
  47.  
  48. if ($continue -ine "n")
  49. {
  50.     # Losujemy nowy interwał czasowy (od 5 do 60 minut, co 5)
  51.     $rand = New-Object System.Random
  52.     $nextMinutes = ($rand.Next(0, 12) + 1) * 5
  53.    
  54.     # Dodajemy trigger dla zadania (czas: za X minut)
  55.     $task.Triggers.Clear()
  56.     $trigger = $task.Triggers.Create(1) # 1 - trigger na określony czas
  57.     $nextTime = [DateTime]::Now.AddMinutes($nextMinutes)
  58.     $trigger.StartBoundary = $nextTime.ToString("o")
  59.    
  60.     # Dodajemy akcję (uruchomienie skryptu)
  61.     $task.Actions.Clear()
  62.     $action = $task.Actions.Create(0)   # 0 - uruchomienie polecenia
  63.     $action.Path = "powershell"
  64.     $action.Arguments = "-Command . '" + $MyInvocation.MyCommand.Path
  65.     $action.Arguments += "' -minutes " + $nextMinutes.ToString()
  66.    
  67.     # Dodajemy zadanie
  68.     # (6 - stwórz lub uaktualnij)
  69.     # (3 - zadanie uruchamiane tylko przy zalogowanym użytkowniku)
  70.     $tf.RegisterTaskDefinition($TASK_NAME, $task, 6, $null, $null, 3) | Out-Null
  71. }
  72. else
  73. {
  74.     # Koniec - usuwamy zdarzenie
  75.     try { $tf.DeleteTask($TASK_NAME, 0) } catch { }
  76. }

Przy swoim pierwszym uruchomieniu tworzy on nowe zadanie w Harmonogramie, które polega na jego ponownym odpaleniu po upływie losowej liczby minut (5, 10, 15, itd. aż do maks. 60 minut). Wtedy użytkownik jest pytany o to, ile czasu według niego upłynęło, a następnie wyświetlają się częściowe wyniki pomiaru. Wówczas można zdecydować o jego kontynuowaniu lub zakończeniu. (Zawsze można też ręcznie usunąć zadanie z Harmonogramu, rzecz jasna).

Skrypt w PSh do mierzenia prędkości czasu

I to w sumie tyle. Można już przystąpić do badań określających dokładnie, jak bardzo dłuży nam się czas do północy :))

Tags: , ,
Author: Xion, posted under Programming »


7 comments for post “Triki z PowerShellem #13 – Prędkość czasu”.
  1. I:
    December 31st, 2009 o 15:26

    Brawo, niezwykle przydatny program. Jestem przekonany ze wynik zapytania ile minelo czasu od poczatku pomiarow do konca bedzie zupelnie rozny od sumy pomiarow przeprowadzanych w miedzy czasie. Odczuwanie uplywu czasu jest czyms duzo bardziej zlozonym i sprowadzanie tego do liczby nie ma sensu…
    ale przeciez nie o to chodzi :)

  2. Reg:
    January 3rd, 2010 o 13:14

    Heh, niezły program! To fajnie że moja teoria nie została zapomniana :D

  3. TeWu:
    January 6th, 2010 o 0:20

    A mnie się zawsze wydawało, że ludzie bagatelizują znaczenie postrzegania czasu. Jak dla mnie jeżeli by zrobić ‘maszynę’ która by powodowało że wydawało by nam się, że np. cofnęliśmy się w czasie to było by to praktycznie to co ‘maszyna’ która faktycznie cofa w czasie.
    Tak samo postrzeganie zwolnienia lub przyśpieszenia czasu, jest praktycznie tym samym co faktyczne przyśpieszenie lub zwolnienie czasu.
    Zawsze mi się wydawało, że warto ten temat bardziej zgłębić, a nie uważać, że badania w tym kierunku nie będą skutkować czymś co potem miało by praktyczne zastosowanie.
    Ale to tylko takie moje gadanie :)

  4. I:
    January 7th, 2010 o 0:20

    Mi raczej nie przychodza do glowy zadne przydatne zastosowania blednej orientacji w czasie. Chociaz… mozna np. wlaczyc zupe do goowania i przespac czas gotowania, po czym wstac i miec juz gotowa zupe :>

  5. Xion:
    January 7th, 2010 o 10:21

    W zasadzie to na takie sytuacje wymyślono minutniki i zegarki z alarmem ;)

    A co do postrzegania czasu, to najciekawsze, co na ten temat słyszałem, to teoria, że czas w rzeczywistości w ogóle nie istnieje, a jego wrażenie jest artefaktem naszego sposobu postrzegania otoczenia. Trochę tak jak odczuwanie prędkości cząstek składających się na obiekt jako jego temperatury.

  6. I:
    January 7th, 2010 o 14:58

    Nie istnieje to troche za mocne sformulowanie. IMHO znacznie lepiej brzmi “czas obiektywnie nie plynie”. Kazda chwila – kazdy stan swiata w rzeczywistosci istnieje niezmiennie. Zgodnie z intuicja mozna powiedziec ze trwa caly czas (jest niezalezy od czasu), ma to sens tylko w przypadku gdy patrzymy na to obiektywnie – z zewnatrz. My ludzie w danej chwili jestesmy czescia stanu swiata i nie widzimy tego obiektywnie (tak jak np. ciagu liczb od 0 do inf gdzie kazda kolejna jest wynikiem dzialania na poprzedniej), znajdujemy sie w pewnym stanie i nosimy skutki stanow poprzednich (pamiec), stad tez poczucie uplywu czasu.
    Tak jakby to co sie wydarzy za rok caly czas gdzies itnieje – my istniejemy i ledwo pamietamy to co wydarzylo sie rok temu czyli teraz :) Mozemy przeniesc sie w czasie w kazdej chwili ale wtedy sami tez ulegniemy zmianie i bedziemy mieli nadal to samo poczucie ze jestesmu tu i teraz. Relacja miedzy danymi chwilami/stanami zostaje niezmienna – takze po prostu istnieje (istnieje bo moze istniec) ;]

  7. jcoffee:
    July 12th, 2010 o 1:38

    PowerShell to marna podróba Shell’a ;]

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.