56 KiB
Komputerowe wspomaganie tłumaczenia
12. Key logging [laboratoria]
Rafał Jaworski (2021)
Badania nad komputerowym wspomaganiem tłumaczenia często prowadzone są przy użyciu metodologii testowania interfejsów użytkownika - UI/UX testing. Program typu CAT traktuje się wówczas jak każdy inny program komputerowy i przeprowadza testy wydajności i użyteczności.
Testy takie prowadzone są zawsze na użytkownikach końcowych, w tym przypadku - na tłumaczach. Podstawowym celem testów jest próba zaobserwowania faktycznego sposobu pracy tłumacza - które funkcje programu są przez niego wykorzystywane najczęściej, jakich innych narzędzi poza CAT-em używa on do swojej pracy, które funkcje programu działają zgodnie, a które niezgodnie z intuicją użytkownika oraz wiele innych czynników. Aby wszystkie te analizy były możliwe, konieczne jest zgromadzenie jak największej ilości danych dotyczących przebiegu testu.
Testy są przede wszystkim nagrywane. Nagrywany jest zarówno ekran komputera (screen capture), jak i sam użytkownik pracujący przy komputerze. To jednak nie wszystko - często stosuje się specjalne techniki eye-trackingu, które są w stanie określić, w który punk ekranu użytkownik aktualnie patrzy. Dane pozyskane w ten sposób używane są do analizy czasu znalezienia przez użytkownika potrzebnej mu funkcji oraz zidentyfikowania miejsc, gdzie tej funkcji poszukiwał. Można również wyznaczyć obszary ekranu, które często skupiają uwagę użytkownika.
Dodatkowo stosuje się jeszcze jedną technikę, która jest szczególnie przydatna z punktu widzenia analizy procesu tłumaczenia. Wykonuje się pełny key logging, tj. zapisuje się każde uderzenie użytkownika w dowolny klawisz na klawiaturze wraz z precyzyjnym czasem tego uderzenia. Dane pozyskane w ten sposób pozwalają na przeprowadzenie szeregu interesujących analiz.
Zapoznajmy się najpierw z programem typu key logger:
sudo pip3 install keyboard
!pip install keyboard
Collecting keyboard Downloading keyboard-0.13.5-py3-none-any.whl (58 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m58.1/58.1 kB[0m [31m936.6 kB/s[0m eta [36m0:00:00[0mMB/s[0m eta [36m0:00:01[0m [?25hCollecting pyobjc Downloading pyobjc-10.3-py3-none-any.whl (4.0 kB) Collecting pyobjc-core==10.3 Downloading pyobjc_core-10.3-cp311-cp311-macosx_10_9_universal2.whl (774 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m774.8/774.8 kB[0m [31m7.2 MB/s[0m eta [36m0:00:00[0m31m10.5 MB/s[0m eta [36m0:00:01[0m [?25hCollecting pyobjc-framework-AddressBook==10.3 Downloading pyobjc_framework_AddressBook-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-AppleScriptKit==10.3 Downloading pyobjc_framework_AppleScriptKit-10.3-py2.py3-none-any.whl (3.9 kB) Collecting pyobjc-framework-ApplicationServices==10.3 Downloading pyobjc_framework_ApplicationServices-10.3-cp311-cp311-macosx_10_9_universal2.whl (31 kB) Collecting pyobjc-framework-Automator==10.3 Downloading pyobjc_framework_Automator-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-CFNetwork==10.3 Downloading pyobjc_framework_CFNetwork-10.3-cp36-abi3-macosx_11_0_universal2.whl (18 kB) Collecting pyobjc-framework-Cocoa==10.3 Downloading pyobjc_framework_Cocoa-10.3-cp311-cp311-macosx_10_9_universal2.whl (396 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m396.1/396.1 kB[0m [31m11.8 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-CoreAudio==10.3 Downloading pyobjc_framework_CoreAudio-10.3-cp311-cp311-macosx_10_9_universal2.whl (35 kB) Collecting pyobjc-framework-CoreAudioKit==10.3 Downloading pyobjc_framework_CoreAudioKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (7.4 kB) Collecting pyobjc-framework-CoreData==10.3 Downloading pyobjc_framework_CoreData-10.3-cp36-abi3-macosx_11_0_universal2.whl (17 kB) Collecting pyobjc-framework-CoreMIDI==10.3 Downloading pyobjc_framework_CoreMIDI-10.3-cp36-abi3-macosx_11_0_universal2.whl (17 kB) Collecting pyobjc-framework-CoreServices==10.3 Downloading pyobjc_framework_CoreServices-10.3-cp36-abi3-macosx_11_0_universal2.whl (29 kB) Collecting pyobjc-framework-CoreText==10.3 Downloading pyobjc_framework_CoreText-10.3-cp311-cp311-macosx_10_9_universal2.whl (30 kB) Collecting pyobjc-framework-DiscRecording==10.3 Downloading pyobjc_framework_DiscRecording-10.3-cp36-abi3-macosx_11_0_universal2.whl (14 kB) Collecting pyobjc-framework-DiscRecordingUI==10.3 Downloading pyobjc_framework_DiscRecordingUI-10.3-py2.py3-none-any.whl (4.3 kB) Collecting pyobjc-framework-DiskArbitration==10.3 Downloading pyobjc_framework_DiskArbitration-10.3-py2.py3-none-any.whl (4.4 kB) Collecting pyobjc-framework-DVDPlayback==10.3 Downloading pyobjc_framework_DVDPlayback-10.3-py2.py3-none-any.whl (7.8 kB) Collecting pyobjc-framework-ExceptionHandling==10.3 Downloading pyobjc_framework_ExceptionHandling-10.3-py2.py3-none-any.whl (6.6 kB) Collecting pyobjc-framework-InstallerPlugins==10.3 Downloading pyobjc_framework_InstallerPlugins-10.3-py2.py3-none-any.whl (4.4 kB) Collecting pyobjc-framework-IOBluetooth==10.3 Downloading pyobjc_framework_IOBluetooth-10.3-cp36-abi3-macosx_11_0_universal2.whl (41 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m41.4/41.4 kB[0m [31m1.2 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-IOBluetoothUI==10.3 Downloading pyobjc_framework_IOBluetoothUI-10.3-py2.py3-none-any.whl (3.6 kB) Collecting pyobjc-framework-LatentSemanticMapping==10.3 Downloading pyobjc_framework_LatentSemanticMapping-10.3-py2.py3-none-any.whl (5.0 kB) Collecting pyobjc-framework-LaunchServices==10.3 Downloading pyobjc_framework_LaunchServices-10.3-py2.py3-none-any.whl (3.5 kB) Collecting pyobjc-framework-OSAKit==10.3 Downloading pyobjc_framework_OSAKit-10.3-py2.py3-none-any.whl (3.8 kB) Collecting pyobjc-framework-PreferencePanes==10.3 Downloading pyobjc_framework_PreferencePanes-10.3-py2.py3-none-any.whl (4.4 kB) Collecting pyobjc-framework-Quartz==10.3 Downloading pyobjc_framework_Quartz-10.3-cp311-cp311-macosx_10_9_universal2.whl (227 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m227.2/227.2 kB[0m [31m7.5 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-ScreenSaver==10.3 Downloading pyobjc_framework_ScreenSaver-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.0 kB) Collecting pyobjc-framework-Security==10.3 Downloading pyobjc_framework_Security-10.3-cp311-cp311-macosx_10_9_universal2.whl (41 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m41.0/41.0 kB[0m [31m1.2 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-SecurityFoundation==10.3 Downloading pyobjc_framework_SecurityFoundation-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-SecurityInterface==10.3 Downloading pyobjc_framework_SecurityInterface-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-SearchKit==10.3 Downloading pyobjc_framework_SearchKit-10.3-py2.py3-none-any.whl (3.3 kB) Collecting pyobjc-framework-SyncServices==10.3 Downloading pyobjc_framework_SyncServices-10.3-cp36-abi3-macosx_11_0_universal2.whl (14 kB) Collecting pyobjc-framework-SystemConfiguration==10.3 Downloading pyobjc_framework_SystemConfiguration-10.3-cp36-abi3-macosx_11_0_universal2.whl (21 kB) Collecting pyobjc-framework-WebKit==10.3 Downloading pyobjc_framework_WebKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (44 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m44.7/44.7 kB[0m [31m1.4 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-AppleScriptObjC==10.3 Downloading pyobjc_framework_AppleScriptObjC-10.3-py2.py3-none-any.whl (4.0 kB) Collecting pyobjc-framework-CoreLocation==10.3 Downloading pyobjc_framework_CoreLocation-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-CoreWLAN==10.3 Downloading pyobjc_framework_CoreWLAN-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-ImageCaptureCore==10.3 Downloading pyobjc_framework_ImageCaptureCore-10.3-cp36-abi3-macosx_11_0_universal2.whl (16 kB) Collecting pyobjc-framework-IOSurface==10.3 Downloading pyobjc_framework_IOSurface-10.3-py2.py3-none-any.whl (4.6 kB) Collecting pyobjc-framework-NetFS==10.3 Downloading pyobjc_framework_NetFS-10.3-py2.py3-none-any.whl (3.8 kB) Collecting pyobjc-framework-OpenDirectory==10.3 Downloading pyobjc_framework_OpenDirectory-10.3-py2.py3-none-any.whl (11 kB) Collecting pyobjc-framework-ServiceManagement==10.3 Downloading pyobjc_framework_ServiceManagement-10.3-py2.py3-none-any.whl (4.9 kB) Collecting pyobjc-framework-iTunesLibrary==10.3 Downloading pyobjc_framework_iTunesLibrary-10.3-py2.py3-none-any.whl (4.8 kB) Collecting pyobjc-framework-AVFoundation==10.3 Downloading pyobjc_framework_AVFoundation-10.3-cp36-abi3-macosx_11_0_universal2.whl (67 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m68.0/68.0 kB[0m [31m2.4 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-CoreMedia==10.3 Downloading pyobjc_framework_CoreMedia-10.3-cp311-cp311-macosx_10_9_universal2.whl (29 kB) Collecting pyobjc-framework-CoreMediaIO==10.3 Downloading pyobjc_framework_CoreMediaIO-10.3-cp36-abi3-macosx_11_0_universal2.whl (17 kB) Collecting pyobjc-framework-StoreKit==10.3 Downloading pyobjc_framework_StoreKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-SceneKit==10.3 Downloading pyobjc_framework_SceneKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (33 kB) Collecting pyobjc-framework-libdispatch==10.3 Downloading pyobjc_framework_libdispatch-10.3-cp311-cp311-macosx_10_9_universal2.whl (20 kB) Collecting pyobjc-framework-libxpc==10.3 Downloading pyobjc_framework_libxpc-10.3-cp311-cp311-macosx_10_9_universal2.whl (19 kB) Collecting pyobjc-framework-AudioVideoBridging==10.3 Downloading pyobjc_framework_AudioVideoBridging-10.3-cp311-cp311-macosx_10_9_universal2.whl (11 kB) Collecting pyobjc-framework-Accounts==10.3 Downloading pyobjc_framework_Accounts-10.3-py2.py3-none-any.whl (4.7 kB) Collecting pyobjc-framework-EventKit==10.3 Downloading pyobjc_framework_EventKit-10.3-py2.py3-none-any.whl (6.4 kB) Collecting pyobjc-framework-GameCenter==10.3 Downloading pyobjc_framework_GameCenter-10.3-cp36-abi3-macosx_11_0_universal2.whl (19 kB) Collecting pyobjc-framework-Social==10.3 Downloading pyobjc_framework_Social-10.3-py2.py3-none-any.whl (4.0 kB) Collecting pyobjc-framework-GameKit==10.3 Downloading pyobjc_framework_GameKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (22 kB) Collecting pyobjc-framework-VideoToolbox==10.3 Downloading pyobjc_framework_VideoToolbox-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-AVKit==10.3 Downloading pyobjc_framework_AVKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-GameController==10.3 Downloading pyobjc_framework_GameController-10.3-cp36-abi3-macosx_11_0_universal2.whl (20 kB) Collecting pyobjc-framework-MapKit==10.3 Downloading pyobjc_framework_MapKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (22 kB) Collecting pyobjc-framework-MediaAccessibility==10.3 Downloading pyobjc_framework_MediaAccessibility-10.3-py2.py3-none-any.whl (4.1 kB) Collecting pyobjc-framework-MediaLibrary==10.3 Downloading pyobjc_framework_MediaLibrary-10.3-py2.py3-none-any.whl (3.9 kB) Collecting pyobjc-framework-MediaToolbox==10.3 Downloading pyobjc_framework_MediaToolbox-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-SpriteKit==10.3 Downloading pyobjc_framework_SpriteKit-10.3-cp311-cp311-macosx_10_9_universal2.whl (17 kB) Collecting pyobjc-framework-CloudKit==10.3 Downloading pyobjc_framework_CloudKit-10.3-py2.py3-none-any.whl (10 kB) Collecting pyobjc-framework-CoreBluetooth==10.3 Downloading pyobjc_framework_CoreBluetooth-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-CryptoTokenKit==10.3 Downloading pyobjc_framework_CryptoTokenKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-FinderSync==10.3 Downloading pyobjc_framework_FinderSync-10.3-py2.py3-none-any.whl (4.5 kB) Collecting pyobjc-framework-LocalAuthentication==10.3 Downloading pyobjc_framework_LocalAuthentication-10.3-py2.py3-none-any.whl (5.7 kB) Collecting pyobjc-framework-MultipeerConnectivity==10.3 Downloading pyobjc_framework_MultipeerConnectivity-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-NotificationCenter==10.3 Downloading pyobjc_framework_NotificationCenter-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-Contacts==10.3 Downloading pyobjc_framework_Contacts-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-ContactsUI==10.3 Downloading pyobjc_framework_ContactsUI-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.2 kB) Collecting pyobjc-framework-Metal==10.3 Downloading pyobjc_framework_Metal-10.3-cp36-abi3-macosx_11_0_universal2.whl (55 kB) [2K [38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m55.7/55.7 kB[0m [31m2.0 MB/s[0m eta [36m0:00:00[0m [?25hCollecting pyobjc-framework-MetalKit==10.3 Downloading pyobjc_framework_MetalKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.1 kB) Collecting pyobjc-framework-ModelIO==10.3 Downloading pyobjc_framework_ModelIO-10.3-cp36-abi3-macosx_11_0_universal2.whl (21 kB) Collecting pyobjc-framework-NetworkExtension==10.3 Downloading pyobjc_framework_NetworkExtension-10.3-cp36-abi3-macosx_11_0_universal2.whl (14 kB) Collecting pyobjc-framework-Photos==10.3 Downloading pyobjc_framework_Photos-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-PhotosUI==10.3 Downloading pyobjc_framework_PhotosUI-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-GameplayKit==10.3 Downloading pyobjc_framework_GameplayKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-Intents==10.3 Downloading pyobjc_framework_Intents-10.3-cp36-abi3-macosx_11_0_universal2.whl (32 kB) Collecting pyobjc-framework-MediaPlayer==10.3 Downloading pyobjc_framework_MediaPlayer-10.3-py2.py3-none-any.whl (6.5 kB) Collecting pyobjc-framework-SafariServices==10.3 Downloading pyobjc_framework_SafariServices-10.3-cp36-abi3-macosx_11_0_universal2.whl (7.4 kB) Collecting pyobjc-framework-ColorSync==10.3 Downloading pyobjc_framework_ColorSync-10.3-py2.py3-none-any.whl (5.6 kB) Collecting pyobjc-framework-CoreML==10.3 Downloading pyobjc_framework_CoreML-10.3-cp36-abi3-macosx_11_0_universal2.whl (11 kB) Collecting pyobjc-framework-CoreSpotlight==10.3 Downloading pyobjc_framework_CoreSpotlight-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-ExternalAccessory==10.3 Downloading pyobjc_framework_ExternalAccessory-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.3 kB) Collecting pyobjc-framework-MetalPerformanceShaders==10.3 Downloading pyobjc_framework_MetalPerformanceShaders-10.3-cp36-abi3-macosx_11_0_universal2.whl (33 kB) Collecting pyobjc-framework-Vision==10.3 Downloading pyobjc_framework_Vision-10.3-cp36-abi3-macosx_11_0_universal2.whl (17 kB) Collecting pyobjc-framework-AdSupport==10.3 Downloading pyobjc_framework_AdSupport-10.3-py2.py3-none-any.whl (3.0 kB) Collecting pyobjc-framework-BusinessChat==10.3 Downloading pyobjc_framework_BusinessChat-10.3-py2.py3-none-any.whl (3.1 kB) Collecting pyobjc-framework-NaturalLanguage==10.3 Downloading pyobjc_framework_NaturalLanguage-10.3-py2.py3-none-any.whl (4.9 kB) Collecting pyobjc-framework-Network==10.3 Downloading pyobjc_framework_Network-10.3-cp36-abi3-macosx_11_0_universal2.whl (14 kB) Collecting pyobjc-framework-UserNotifications==10.3 Downloading pyobjc_framework_UserNotifications-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-VideoSubscriberAccount==10.3 Downloading pyobjc_framework_VideoSubscriberAccount-10.3-py2.py3-none-any.whl (4.3 kB) Collecting pyobjc-framework-AuthenticationServices==10.3 Downloading pyobjc_framework_AuthenticationServices-10.3-cp36-abi3-macosx_11_0_universal2.whl (19 kB) Collecting pyobjc-framework-AutomaticAssessmentConfiguration==10.3 Downloading pyobjc_framework_AutomaticAssessmentConfiguration-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.9 kB) Collecting pyobjc-framework-CoreHaptics==10.3 Downloading pyobjc_framework_CoreHaptics-10.3-py2.py3-none-any.whl (5.0 kB) Collecting pyobjc-framework-CoreMotion==10.3 Downloading pyobjc_framework_CoreMotion-10.3-cp311-cp311-macosx_10_9_universal2.whl (9.8 kB) Collecting pyobjc-framework-DeviceCheck==10.3 Downloading pyobjc_framework_DeviceCheck-10.3-py2.py3-none-any.whl (3.3 kB) Collecting pyobjc-framework-ExecutionPolicy==10.3 Downloading pyobjc_framework_ExecutionPolicy-10.3-py2.py3-none-any.whl (3.3 kB) Collecting pyobjc-framework-FileProvider==10.3 Downloading pyobjc_framework_FileProvider-10.3-cp311-cp311-macosx_10_9_universal2.whl (18 kB) Collecting pyobjc-framework-FileProviderUI==10.3 Downloading pyobjc_framework_FileProviderUI-10.3-py2.py3-none-any.whl (3.3 kB) Collecting pyobjc-framework-LinkPresentation==10.3 Downloading pyobjc_framework_LinkPresentation-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-OSLog==10.3 Downloading pyobjc_framework_OSLog-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.0 kB) Collecting pyobjc-framework-PencilKit==10.3 Downloading pyobjc_framework_PencilKit-10.3-py2.py3-none-any.whl (3.6 kB) Collecting pyobjc-framework-PushKit==10.3 Downloading pyobjc_framework_PushKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.6 kB) Collecting pyobjc-framework-QuickLookThumbnailing==10.3 Downloading pyobjc_framework_QuickLookThumbnailing-10.3-py2.py3-none-any.whl (3.8 kB) Collecting pyobjc-framework-Speech==10.3 Downloading pyobjc_framework_Speech-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.5 kB) Collecting pyobjc-framework-SoundAnalysis==10.3 Downloading pyobjc_framework_SoundAnalysis-10.3-py2.py3-none-any.whl (3.8 kB) Collecting pyobjc-framework-SystemExtensions==10.3 Downloading pyobjc_framework_SystemExtensions-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.1 kB) Collecting pyobjc-framework-Accessibility==10.3 Downloading pyobjc_framework_Accessibility-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-AdServices==10.3 Downloading pyobjc_framework_AdServices-10.3-py2.py3-none-any.whl (3.1 kB) Collecting pyobjc-framework-AppTrackingTransparency==10.3 Downloading pyobjc_framework_AppTrackingTransparency-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-CallKit==10.3 Downloading pyobjc_framework_CallKit-10.3-py2.py3-none-any.whl (4.9 kB) Collecting pyobjc-framework-ClassKit==10.3 Downloading pyobjc_framework_ClassKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.7 kB) Collecting pyobjc-framework-KernelManagement==10.3 Downloading pyobjc_framework_KernelManagement-10.3-py2.py3-none-any.whl (3.3 kB) Collecting pyobjc-framework-MetalPerformanceShadersGraph==10.3 Downloading pyobjc_framework_MetalPerformanceShadersGraph-10.3-py2.py3-none-any.whl (6.0 kB) Collecting pyobjc-framework-MLCompute==10.3 Downloading pyobjc_framework_MLCompute-10.3-py2.py3-none-any.whl (6.4 kB) Collecting pyobjc-framework-PassKit==10.3 Downloading pyobjc_framework_PassKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (13 kB) Collecting pyobjc-framework-ReplayKit==10.3 Downloading pyobjc_framework_ReplayKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-ScreenTime==10.3 Downloading pyobjc_framework_ScreenTime-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-UniformTypeIdentifiers==10.3 Downloading pyobjc_framework_UniformTypeIdentifiers-10.3-py2.py3-none-any.whl (4.4 kB) Collecting pyobjc-framework-UserNotificationsUI==10.3 Downloading pyobjc_framework_UserNotificationsUI-10.3-py2.py3-none-any.whl (3.5 kB) Collecting pyobjc-framework-Virtualization==10.3 Downloading pyobjc_framework_Virtualization-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-DataDetection==10.3 Downloading pyobjc_framework_DataDetection-10.3-py2.py3-none-any.whl (3.1 kB) Collecting pyobjc-framework-IntentsUI==10.3 Downloading pyobjc_framework_IntentsUI-10.3-cp311-cp311-macosx_10_9_universal2.whl (9.6 kB) Collecting pyobjc-framework-LocalAuthenticationEmbeddedUI==10.3 Downloading pyobjc_framework_LocalAuthenticationEmbeddedUI-10.3-py2.py3-none-any.whl (3.5 kB) Collecting pyobjc-framework-MailKit==10.3 Downloading pyobjc_framework_MailKit-10.3-py2.py3-none-any.whl (4.5 kB) Collecting pyobjc-framework-MetricKit==10.3 Downloading pyobjc_framework_MetricKit-10.3-cp311-cp311-macosx_10_9_universal2.whl (8.1 kB) Collecting pyobjc-framework-PHASE==10.3 Downloading pyobjc_framework_PHASE-10.3-py2.py3-none-any.whl (6.2 kB) Collecting pyobjc-framework-ShazamKit==10.3 Downloading pyobjc_framework_ShazamKit-10.3-cp311-cp311-macosx_10_9_universal2.whl (8.6 kB) Collecting pyobjc-framework-ScreenCaptureKit==10.3 Downloading pyobjc_framework_ScreenCaptureKit-10.3-cp311-cp311-macosx_10_9_universal2.whl (11 kB) Collecting pyobjc-framework-AVRouting==10.3 Downloading pyobjc_framework_AVRouting-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.6 kB) Collecting pyobjc-framework-BackgroundAssets==10.3 Downloading pyobjc_framework_BackgroundAssets-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-ExtensionKit==10.3 Downloading pyobjc_framework_ExtensionKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.3 kB) Collecting pyobjc-framework-HealthKit==10.3 Downloading pyobjc_framework_HealthKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (19 kB) Collecting pyobjc-framework-MetalFX==10.3 Downloading pyobjc_framework_MetalFX-10.3-cp36-abi3-macosx_11_0_universal2.whl (10 kB) Collecting pyobjc-framework-SafetyKit==10.3 Downloading pyobjc_framework_SafetyKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.3 kB) Collecting pyobjc-framework-SharedWithYouCore==10.3 Downloading pyobjc_framework_SharedWithYouCore-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.9 kB) Collecting pyobjc-framework-SharedWithYou==10.3 Downloading pyobjc_framework_SharedWithYou-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.1 kB) Collecting pyobjc-framework-ThreadNetwork==10.3 Downloading pyobjc_framework_ThreadNetwork-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-Cinematic==10.3 Downloading pyobjc_framework_Cinematic-10.3-py2.py3-none-any.whl (4.2 kB) Collecting pyobjc-framework-SensitiveContentAnalysis==10.3 Downloading pyobjc_framework_SensitiveContentAnalysis-10.3-py2.py3-none-any.whl (3.4 kB) Collecting pyobjc-framework-Symbols==10.3 Downloading pyobjc_framework_Symbols-10.3-py2.py3-none-any.whl (2.9 kB) Collecting pyobjc-framework-CalendarStore==10.3 Downloading pyobjc_framework_CalendarStore-10.3-py2.py3-none-any.whl (4.8 kB) Collecting pyobjc-framework-Collaboration==10.3 Downloading pyobjc_framework_Collaboration-10.3-py2.py3-none-any.whl (4.5 kB) Collecting pyobjc-framework-DictionaryServices==10.3 Downloading pyobjc_framework_DictionaryServices-10.3-py2.py3-none-any.whl (3.5 kB) Collecting pyobjc-framework-FSEvents==10.3 Downloading pyobjc_framework_FSEvents-10.3-cp36-abi3-macosx_11_0_universal2.whl (12 kB) Collecting pyobjc-framework-InputMethodKit==10.3 Downloading pyobjc_framework_InputMethodKit-10.3-cp36-abi3-macosx_11_0_universal2.whl (9.8 kB) Collecting pyobjc-framework-InstantMessage==10.3 Downloading pyobjc_framework_InstantMessage-10.3-py2.py3-none-any.whl (5.0 kB) Collecting pyobjc-framework-ScriptingBridge==10.3 Downloading pyobjc_framework_ScriptingBridge-10.3-cp36-abi3-macosx_11_0_universal2.whl (8.5 kB) Installing collected packages: pyobjc-core, pyobjc-framework-Cocoa, pyobjc-framework-WebKit, pyobjc-framework-Virtualization, pyobjc-framework-VideoSubscriberAccount, pyobjc-framework-UserNotifications, pyobjc-framework-UniformTypeIdentifiers, pyobjc-framework-ThreadNetwork, pyobjc-framework-SystemExtensions, pyobjc-framework-SystemConfiguration, pyobjc-framework-Symbols, pyobjc-framework-StoreKit, pyobjc-framework-Speech, pyobjc-framework-SoundAnalysis, pyobjc-framework-Social, pyobjc-framework-ShazamKit, pyobjc-framework-SharedWithYouCore, pyobjc-framework-ServiceManagement, pyobjc-framework-Security, pyobjc-framework-ScriptingBridge, pyobjc-framework-ScreenTime, pyobjc-framework-ScreenSaver, pyobjc-framework-SafariServices, pyobjc-framework-ReplayKit, pyobjc-framework-Quartz, pyobjc-framework-PushKit, pyobjc-framework-PreferencePanes, pyobjc-framework-PhotosUI, pyobjc-framework-Photos, pyobjc-framework-PencilKit, pyobjc-framework-PassKit, pyobjc-framework-OSAKit, pyobjc-framework-OpenDirectory, pyobjc-framework-NotificationCenter, pyobjc-framework-NetworkExtension, pyobjc-framework-Network, pyobjc-framework-NetFS, pyobjc-framework-NaturalLanguage, pyobjc-framework-MultipeerConnectivity, pyobjc-framework-MLCompute, pyobjc-framework-MetricKit, pyobjc-framework-Metal, pyobjc-framework-MediaToolbox, pyobjc-framework-MediaAccessibility, pyobjc-framework-MailKit, pyobjc-framework-libxpc, pyobjc-framework-libdispatch, pyobjc-framework-LatentSemanticMapping, pyobjc-framework-KernelManagement, pyobjc-framework-iTunesLibrary, pyobjc-framework-IOSurface, pyobjc-framework-IOBluetooth, pyobjc-framework-Intents, pyobjc-framework-InstallerPlugins, pyobjc-framework-InputMethodKit, pyobjc-framework-ImageCaptureCore, pyobjc-framework-HealthKit, pyobjc-framework-GameController, pyobjc-framework-GameCenter, pyobjc-framework-FSEvents, pyobjc-framework-FinderSync, pyobjc-framework-FileProvider, pyobjc-framework-ExternalAccessory, pyobjc-framework-ExtensionKit, pyobjc-framework-ExecutionPolicy, pyobjc-framework-ExceptionHandling, pyobjc-framework-EventKit, pyobjc-framework-DVDPlayback, pyobjc-framework-DiskArbitration, pyobjc-framework-DiscRecording, pyobjc-framework-DeviceCheck, pyobjc-framework-DataDetection, pyobjc-framework-CryptoTokenKit, pyobjc-framework-CoreWLAN, pyobjc-framework-CoreSpotlight, pyobjc-framework-CoreMotion, pyobjc-framework-CoreML, pyobjc-framework-CoreMIDI, pyobjc-framework-CoreMediaIO, pyobjc-framework-CoreMedia, pyobjc-framework-CoreLocation, pyobjc-framework-CoreHaptics, pyobjc-framework-CoreData, pyobjc-framework-CoreBluetooth, pyobjc-framework-CoreAudio, pyobjc-framework-Contacts, pyobjc-framework-ColorSync, pyobjc-framework-Collaboration, pyobjc-framework-ClassKit, pyobjc-framework-CFNetwork, pyobjc-framework-CallKit, pyobjc-framework-CalendarStore, pyobjc-framework-BusinessChat, pyobjc-framework-BackgroundAssets, pyobjc-framework-AVRouting, pyobjc-framework-Automator, pyobjc-framework-AutomaticAssessmentConfiguration, pyobjc-framework-AuthenticationServices, pyobjc-framework-AudioVideoBridging, pyobjc-framework-AppTrackingTransparency, pyobjc-framework-AppleScriptObjC, pyobjc-framework-AppleScriptKit, pyobjc-framework-AdSupport, pyobjc-framework-AdServices, pyobjc-framework-AddressBook, pyobjc-framework-Accounts, pyobjc-framework-Vision, pyobjc-framework-VideoToolbox, pyobjc-framework-UserNotificationsUI, pyobjc-framework-SyncServices, pyobjc-framework-SpriteKit, pyobjc-framework-SharedWithYou, pyobjc-framework-SensitiveContentAnalysis, pyobjc-framework-SecurityInterface, pyobjc-framework-SecurityFoundation, pyobjc-framework-ScreenCaptureKit, pyobjc-framework-SceneKit, pyobjc-framework-SafetyKit, pyobjc-framework-QuickLookThumbnailing, pyobjc-framework-OSLog, pyobjc-framework-ModelIO, pyobjc-framework-MetalPerformanceShaders, pyobjc-framework-MetalKit, pyobjc-framework-MetalFX, pyobjc-framework-MediaLibrary, pyobjc-framework-MapKit, pyobjc-framework-LocalAuthentication, pyobjc-framework-LinkPresentation, pyobjc-framework-IOBluetoothUI, pyobjc-framework-IntentsUI, pyobjc-framework-InstantMessage, pyobjc-framework-GameKit, pyobjc-framework-FileProviderUI, pyobjc-framework-DiscRecordingUI, pyobjc-framework-CoreText, pyobjc-framework-CoreServices, pyobjc-framework-CoreAudioKit, pyobjc-framework-ContactsUI, pyobjc-framework-CloudKit, pyobjc-framework-AVKit, pyobjc-framework-AVFoundation, pyobjc-framework-Accessibility, pyobjc-framework-SearchKit, pyobjc-framework-PHASE, pyobjc-framework-MetalPerformanceShadersGraph, pyobjc-framework-MediaPlayer, pyobjc-framework-LocalAuthenticationEmbeddedUI, pyobjc-framework-LaunchServices, pyobjc-framework-GameplayKit, pyobjc-framework-DictionaryServices, pyobjc-framework-Cinematic, pyobjc-framework-ApplicationServices, pyobjc, keyboard Successfully installed keyboard-0.13.5 pyobjc-10.3 pyobjc-core-10.3 pyobjc-framework-AVFoundation-10.3 pyobjc-framework-AVKit-10.3 pyobjc-framework-AVRouting-10.3 pyobjc-framework-Accessibility-10.3 pyobjc-framework-Accounts-10.3 pyobjc-framework-AdServices-10.3 pyobjc-framework-AdSupport-10.3 pyobjc-framework-AddressBook-10.3 pyobjc-framework-AppTrackingTransparency-10.3 pyobjc-framework-AppleScriptKit-10.3 pyobjc-framework-AppleScriptObjC-10.3 pyobjc-framework-ApplicationServices-10.3 pyobjc-framework-AudioVideoBridging-10.3 pyobjc-framework-AuthenticationServices-10.3 pyobjc-framework-AutomaticAssessmentConfiguration-10.3 pyobjc-framework-Automator-10.3 pyobjc-framework-BackgroundAssets-10.3 pyobjc-framework-BusinessChat-10.3 pyobjc-framework-CFNetwork-10.3 pyobjc-framework-CalendarStore-10.3 pyobjc-framework-CallKit-10.3 pyobjc-framework-Cinematic-10.3 pyobjc-framework-ClassKit-10.3 pyobjc-framework-CloudKit-10.3 pyobjc-framework-Cocoa-10.3 pyobjc-framework-Collaboration-10.3 pyobjc-framework-ColorSync-10.3 pyobjc-framework-Contacts-10.3 pyobjc-framework-ContactsUI-10.3 pyobjc-framework-CoreAudio-10.3 pyobjc-framework-CoreAudioKit-10.3 pyobjc-framework-CoreBluetooth-10.3 pyobjc-framework-CoreData-10.3 pyobjc-framework-CoreHaptics-10.3 pyobjc-framework-CoreLocation-10.3 pyobjc-framework-CoreMIDI-10.3 pyobjc-framework-CoreML-10.3 pyobjc-framework-CoreMedia-10.3 pyobjc-framework-CoreMediaIO-10.3 pyobjc-framework-CoreMotion-10.3 pyobjc-framework-CoreServices-10.3 pyobjc-framework-CoreSpotlight-10.3 pyobjc-framework-CoreText-10.3 pyobjc-framework-CoreWLAN-10.3 pyobjc-framework-CryptoTokenKit-10.3 pyobjc-framework-DVDPlayback-10.3 pyobjc-framework-DataDetection-10.3 pyobjc-framework-DeviceCheck-10.3 pyobjc-framework-DictionaryServices-10.3 pyobjc-framework-DiscRecording-10.3 pyobjc-framework-DiscRecordingUI-10.3 pyobjc-framework-DiskArbitration-10.3 pyobjc-framework-EventKit-10.3 pyobjc-framework-ExceptionHandling-10.3 pyobjc-framework-ExecutionPolicy-10.3 pyobjc-framework-ExtensionKit-10.3 pyobjc-framework-ExternalAccessory-10.3 pyobjc-framework-FSEvents-10.3 pyobjc-framework-FileProvider-10.3 pyobjc-framework-FileProviderUI-10.3 pyobjc-framework-FinderSync-10.3 pyobjc-framework-GameCenter-10.3 pyobjc-framework-GameController-10.3 pyobjc-framework-GameKit-10.3 pyobjc-framework-GameplayKit-10.3 pyobjc-framework-HealthKit-10.3 pyobjc-framework-IOBluetooth-10.3 pyobjc-framework-IOBluetoothUI-10.3 pyobjc-framework-IOSurface-10.3 pyobjc-framework-ImageCaptureCore-10.3 pyobjc-framework-InputMethodKit-10.3 pyobjc-framework-InstallerPlugins-10.3 pyobjc-framework-InstantMessage-10.3 pyobjc-framework-Intents-10.3 pyobjc-framework-IntentsUI-10.3 pyobjc-framework-KernelManagement-10.3 pyobjc-framework-LatentSemanticMapping-10.3 pyobjc-framework-LaunchServices-10.3 pyobjc-framework-LinkPresentation-10.3 pyobjc-framework-LocalAuthentication-10.3 pyobjc-framework-LocalAuthenticationEmbeddedUI-10.3 pyobjc-framework-MLCompute-10.3 pyobjc-framework-MailKit-10.3 pyobjc-framework-MapKit-10.3 pyobjc-framework-MediaAccessibility-10.3 pyobjc-framework-MediaLibrary-10.3 pyobjc-framework-MediaPlayer-10.3 pyobjc-framework-MediaToolbox-10.3 pyobjc-framework-Metal-10.3 pyobjc-framework-MetalFX-10.3 pyobjc-framework-MetalKit-10.3 pyobjc-framework-MetalPerformanceShaders-10.3 pyobjc-framework-MetalPerformanceShadersGraph-10.3 pyobjc-framework-MetricKit-10.3 pyobjc-framework-ModelIO-10.3 pyobjc-framework-MultipeerConnectivity-10.3 pyobjc-framework-NaturalLanguage-10.3 pyobjc-framework-NetFS-10.3 pyobjc-framework-Network-10.3 pyobjc-framework-NetworkExtension-10.3 pyobjc-framework-NotificationCenter-10.3 pyobjc-framework-OSAKit-10.3 pyobjc-framework-OSLog-10.3 pyobjc-framework-OpenDirectory-10.3 pyobjc-framework-PHASE-10.3 pyobjc-framework-PassKit-10.3 pyobjc-framework-PencilKit-10.3 pyobjc-framework-Photos-10.3 pyobjc-framework-PhotosUI-10.3 pyobjc-framework-PreferencePanes-10.3 pyobjc-framework-PushKit-10.3 pyobjc-framework-Quartz-10.3 pyobjc-framework-QuickLookThumbnailing-10.3 pyobjc-framework-ReplayKit-10.3 pyobjc-framework-SafariServices-10.3 pyobjc-framework-SafetyKit-10.3 pyobjc-framework-SceneKit-10.3 pyobjc-framework-ScreenCaptureKit-10.3 pyobjc-framework-ScreenSaver-10.3 pyobjc-framework-ScreenTime-10.3 pyobjc-framework-ScriptingBridge-10.3 pyobjc-framework-SearchKit-10.3 pyobjc-framework-Security-10.3 pyobjc-framework-SecurityFoundation-10.3 pyobjc-framework-SecurityInterface-10.3 pyobjc-framework-SensitiveContentAnalysis-10.3 pyobjc-framework-ServiceManagement-10.3 pyobjc-framework-SharedWithYou-10.3 pyobjc-framework-SharedWithYouCore-10.3 pyobjc-framework-ShazamKit-10.3 pyobjc-framework-Social-10.3 pyobjc-framework-SoundAnalysis-10.3 pyobjc-framework-Speech-10.3 pyobjc-framework-SpriteKit-10.3 pyobjc-framework-StoreKit-10.3 pyobjc-framework-Symbols-10.3 pyobjc-framework-SyncServices-10.3 pyobjc-framework-SystemConfiguration-10.3 pyobjc-framework-SystemExtensions-10.3 pyobjc-framework-ThreadNetwork-10.3 pyobjc-framework-UniformTypeIdentifiers-10.3 pyobjc-framework-UserNotifications-10.3 pyobjc-framework-UserNotificationsUI-10.3 pyobjc-framework-VideoSubscriberAccount-10.3 pyobjc-framework-VideoToolbox-10.3 pyobjc-framework-Virtualization-10.3 pyobjc-framework-Vision-10.3 pyobjc-framework-WebKit-10.3 pyobjc-framework-iTunesLibrary-10.3 pyobjc-framework-libdispatch-10.3 pyobjc-framework-libxpc-10.3 [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: [0m[31;49m22.3[0m[39;49m -> [0m[32;49m24.0[0m [1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip install --upgrade pip[0m
import keyboard
def report_key(event):
print(event)
keyboard.on_release(callback=report_key)
keyboard.wait()
Exception in thread Thread-4 (listen): Traceback (most recent call last): File "/Users/potoato/.pyenv/versions/3.11.0/lib/python3.11/threading.py", line 1038, in _bootstrap_inner self.run() File "/Users/potoato/.pyenv/versions/3.11.0/lib/python3.11/site-packages/ipykernel/ipkernel.py", line 766, in run_closure _threading_Thread_run(self) File "/Users/potoato/.pyenv/versions/3.11.0/lib/python3.11/threading.py", line 975, in run self._target(*self._args, **self._kwargs) File "/Users/potoato/.pyenv/versions/3.11.0/lib/python3.11/site-packages/keyboard/__init__.py", line 294, in listen _os_keyboard.listen(self.direct_callback) File "/Users/potoato/.pyenv/versions/3.11.0/lib/python3.11/site-packages/keyboard/_darwinkeyboard.py", line 430, in listen raise OSError("Error 13 - Must be run as administrator") OSError: Error 13 - Must be run as administrator
[0;31m---------------------------------------------------------------------------[0m [0;31mKeyboardInterrupt[0m Traceback (most recent call last) Cell [0;32mIn[2], line 8[0m [1;32m 5[0m [38;5;28mprint[39m(event) [1;32m 7[0m keyboard[38;5;241m.[39mon_release(callback[38;5;241m=[39mreport_key) [0;32m----> 8[0m [43mkeyboard[49m[38;5;241;43m.[39;49m[43mwait[49m[43m([49m[43m)[49m File [0;32m~/.pyenv/versions/3.11.0/lib/python3.11/site-packages/keyboard/__init__.py:886[0m, in [0;36mwait[0;34m(hotkey, suppress, trigger_on_release)[0m [1;32m 884[0m [38;5;28;01melse[39;00m: [1;32m 885[0m [38;5;28;01mwhile[39;00m [38;5;28;01mTrue[39;00m: [0;32m--> 886[0m [43m_time[49m[38;5;241;43m.[39;49m[43msleep[49m[43m([49m[38;5;241;43m1e6[39;49m[43m)[49m [0;31mKeyboardInterrupt[0m:
UWAGA! Aby uruchomić powyższy kod na Linuxie konieczne są uprawnienia administratora (pytanie poza konkursem - dlaczego?)
Ćwiczenie 1: Wykorzystując powyższy kod napisz keylogger, który zapisuje wszystkie uderzenia w klawisze do pliku. Format pliku jest dowolny, każdy wpis musi zawierać precyzyjną godzinę uderzenia oraz uderzony klawisz. Uruchom program i przepisz paragraf dowolnie wybranego tekstu.
import keyboard
import time
def log_keystroke(event):
with open("keystroke_log.txt", "a") as log_file:
log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
log_file.write(f"{log_time} - {event.name}\n")
keyboard.on_press(log_keystroke)
keyboard.wait()
Celem powyższego ćwiczenia jest pozyskanie danych testowych. Dalsze analizy będziemy prowadzili już bez key loggera, starając się korzystać jedynie z danych zapisanych w pliku. Oczywiście, jeśli zajdzie taka konieczność, można w każdej chwili wygenerować sobie nowy plik.
Ćwiczenie 2: Napisz program, który wyliczy średnią prędkość pisania. Wykryj, kiedy użytkownik zaczął pisać. Nie bierz pod uwagę przerw dłuższych niż 5 sekund. Podaj prędkość pisania w znakach na minutę oraz słowach na minutę.
import keyboard
import time
class TypingSpeedCalculator:
def __init__(self):
self.start_time = None
self.end_time = None
self.total_chars = 0
self.typing_events = []
def on_key_press(self, event):
current_time = time.time()
if not self.typing_events:
self.start_time = current_time
print("Rozpoczęto odliczanie...")
if self.typing_events and (current_time - self.typing_events[-1][1] > 5):
self.start_time = current_time
self.total_chars = 0
print("Pauza...")
self.typing_events.append((event.name, current_time))
self.total_chars += 1
def calculate_speed(self):
if not self.typing_events:
return 0, 0
self.end_time = time.time()
total_time_minutes = (self.end_time - self.start_time) / 60
total_words = self.total_chars / 6
cpm = self.total_chars / total_time_minutes
wpm = total_words / total_time_minutes
return round(cpm, 2), round(wpm, 2)
def start(self):
print("Zacznij pisać. Gdy skończysz naciśnij 'esc'...")
keyboard.on_press(self.on_key_press)
keyboard.wait('esc')
cpm, wpm = self.calculate_speed()
print(f"Napisałeś: {cpm} na minutę, czyli {wpm} słów na sekundę!")
if __name__ == "__main__":
calc = TypingSpeedCalculator()
calc.start()
# nie byłem wstanie uruchomić skryptu w pliku .ipynb
Zacznij pisać. Gdy skończysz naciśnij 'esc'...
[0;31m---------------------------------------------------------------------------[0m [0;31mKeyboardInterrupt[0m Traceback (most recent call last) Cell [0;32mIn[3], line 46[0m [1;32m 44[0m [38;5;28;01mif[39;00m [38;5;18m__name__[39m [38;5;241m==[39m [38;5;124m"[39m[38;5;124m__main__[39m[38;5;124m"[39m: [1;32m 45[0m calc [38;5;241m=[39m TypingSpeedCalculator() [0;32m---> 46[0m [43mcalc[49m[38;5;241;43m.[39;49m[43mstart[49m[43m([49m[43m)[49m [1;32m 48[0m [38;5;66;03m# nie byłem wstanie uruchomić skryptu w pliku .ipynb[39;00m Cell [0;32mIn[3], line 39[0m, in [0;36mTypingSpeedCalculator.start[0;34m(self)[0m [1;32m 37[0m [38;5;28mprint[39m([38;5;124m"[39m[38;5;124mZacznij pisać. Gdy skończysz naciśnij [39m[38;5;124m'[39m[38;5;124mesc[39m[38;5;124m'[39m[38;5;124m...[39m[38;5;124m"[39m) [1;32m 38[0m keyboard[38;5;241m.[39mon_press([38;5;28mself[39m[38;5;241m.[39mon_key_press) [0;32m---> 39[0m [43mkeyboard[49m[38;5;241;43m.[39;49m[43mwait[49m[43m([49m[38;5;124;43m'[39;49m[38;5;124;43mesc[39;49m[38;5;124;43m'[39;49m[43m)[49m [1;32m 41[0m cpm, wpm [38;5;241m=[39m [38;5;28mself[39m[38;5;241m.[39mcalculate_speed() [1;32m 42[0m [38;5;28mprint[39m([38;5;124mf[39m[38;5;124m"[39m[38;5;124mNapisałeś: [39m[38;5;132;01m{[39;00mcpm[38;5;132;01m}[39;00m[38;5;124m na minutę, czyli [39m[38;5;132;01m{[39;00mwpm[38;5;132;01m}[39;00m[38;5;124m słów na sekundę![39m[38;5;124m"[39m) File [0;32m~/.pyenv/versions/3.11.0/lib/python3.11/site-packages/keyboard/__init__.py:882[0m, in [0;36mwait[0;34m(hotkey, suppress, trigger_on_release)[0m [1;32m 880[0m lock [38;5;241m=[39m _Event() [1;32m 881[0m remove [38;5;241m=[39m add_hotkey(hotkey, [38;5;28;01mlambda[39;00m: lock[38;5;241m.[39mset(), suppress[38;5;241m=[39msuppress, trigger_on_release[38;5;241m=[39mtrigger_on_release) [0;32m--> 882[0m [43mlock[49m[38;5;241;43m.[39;49m[43mwait[49m[43m([49m[43m)[49m [1;32m 883[0m remove_hotkey(remove) [1;32m 884[0m [38;5;28;01melse[39;00m: File [0;32m~/.pyenv/versions/3.11.0/lib/python3.11/site-packages/keyboard/__init__.py:117[0m, in [0;36m_Event.wait[0;34m(self)[0m [1;32m 115[0m [38;5;28;01mdef[39;00m [38;5;21mwait[39m([38;5;28mself[39m): [1;32m 116[0m [38;5;28;01mwhile[39;00m [38;5;28;01mTrue[39;00m: [0;32m--> 117[0m [38;5;28;01mif[39;00m [43m_UninterruptibleEvent[49m[38;5;241;43m.[39;49m[43mwait[49m[43m([49m[38;5;28;43mself[39;49m[43m,[49m[43m [49m[38;5;241;43m0.5[39;49m[43m)[49m: [1;32m 118[0m [38;5;28;01mbreak[39;00m File [0;32m~/.pyenv/versions/3.11.0/lib/python3.11/threading.py:622[0m, in [0;36mEvent.wait[0;34m(self, timeout)[0m [1;32m 620[0m signaled [38;5;241m=[39m [38;5;28mself[39m[38;5;241m.[39m_flag [1;32m 621[0m [38;5;28;01mif[39;00m [38;5;129;01mnot[39;00m signaled: [0;32m--> 622[0m signaled [38;5;241m=[39m [38;5;28;43mself[39;49m[38;5;241;43m.[39;49m[43m_cond[49m[38;5;241;43m.[39;49m[43mwait[49m[43m([49m[43mtimeout[49m[43m)[49m [1;32m 623[0m [38;5;28;01mreturn[39;00m signaled File [0;32m~/.pyenv/versions/3.11.0/lib/python3.11/threading.py:324[0m, in [0;36mCondition.wait[0;34m(self, timeout)[0m [1;32m 322[0m [38;5;28;01melse[39;00m: [1;32m 323[0m [38;5;28;01mif[39;00m timeout [38;5;241m>[39m [38;5;241m0[39m: [0;32m--> 324[0m gotit [38;5;241m=[39m [43mwaiter[49m[38;5;241;43m.[39;49m[43macquire[49m[43m([49m[38;5;28;43;01mTrue[39;49;00m[43m,[49m[43m [49m[43mtimeout[49m[43m)[49m [1;32m 325[0m [38;5;28;01melse[39;00m: [1;32m 326[0m gotit [38;5;241m=[39m waiter[38;5;241m.[39macquire([38;5;28;01mFalse[39;00m) [0;31mKeyboardInterrupt[0m:
Wróćmy teraz do procesu tłumaczenia. Analiza uderzeń klawiszy wykonanych podczas tłumaczenia pozwala wykryć dłuższe pauzy. Pauzy te najczęściej wskazują miejsca, w których tłumacz musi się głębiej zastanowić nad tłumaczeniem danego słowa lub frazy. Przerwę tę wykorzystuje na przykład na sprawdzenie tłumaczenia lub definicji w słowniku, przeglądanie wyników z pamięci tłumaczeń lub korzystanie z innych pomocy (eye-tracking mógłby w tym przypadku rozstrzygnąć, czym w istocie zajmuje się w tym momencie tłuamcz). Jest też możliwe, że tłumacz poświęca pauzę na tzw. cognitive pause-and-unload - rodzaj zamyślenia, pozwalający oczyścić myśli. Z punktu widzenia projektowania systemu wspomagającego tłumaczenie niezwykle istotna jest informacja, nad czym tłumacz musi się dłużej zastanowić. Minimalizacja liczby i czasu trwania takich przerw jest szansą na usprawnienie procesu tłumaczenia.
Ćwiczenie 3: Napisz program do wykrywania przerw w pisaniu. Raportuj długość oraz miejsce wystąpienia przerwy podając 20-znakowy kontekst z każdej strony. Wykryj każdą przerwę dłuższą niż 3 sekundy, posortuj wyniki malejąco po długości przerwy.
import keyboard
import time
class TypingBreakDetector:
def __init__(self):
self.last_time = None
self.typing_data = []
self.breaks = []
def on_key_press(self, event):
current_time = time.time()
character = event.name
if self.last_time:
break_length = current_time - self.last_time
if break_length > 3:
context_before = ''.join([ch[0] for ch in self.typing_data][-20:])
self.breaks.append((break_length, len(self.typing_data), context_before))
self.typing_data.append((character, current_time))
self.last_time = current_time
def report_breaks(self):
self.breaks.sort(reverse=True, key=lambda x: x[0])
for length, position, context_before in self.breaks:
context_after_index = position + 20
context_after = ''.join([ch[0] for ch in self.typing_data[position:context_after_index]])
print(f"Przerwa: {length:.2f} sekund")
print(f"Tekst przed: '{context_before}' [przerwa] po '{context_after}'")
print("")
def start(self):
print("Rozpoczęto detekcję przerw w pisaniu. Pisz cokolwiek i zatrzymaj się, aby zobaczyć wyniki.")
keyboard.on_press(self.on_key_press)
keyboard.wait('esc')
if __name__ == "__main__":
detector = TypingBreakDetector()
detector.start()
detector.report_breaks()