FS рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдкреНрдд рдмрд╛рдЗрдХ рдХреА рдЦреЛрдЬ рдореЗрдВ linux + freebsd рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдореИрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдЬрдЧрд░ рд╡реЙрдЪрдбреЙрдЧ lib (
github ,
package.python.org ) рдкрд░ рдЖрдпрд╛ рдерд╛ред рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рдУрдПрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдореИрдХрдУрдПрд╕ (рдЕрдкрдиреА рдЦреБрдж рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ) рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рд╕рд╡рд╛рд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рд▓реЗрдЦрдХ рдХреЗ рднрд╛рд░рддреАрдп рдореВрд▓ рд╕реЗ рдбрд░реЗрдВрдЧреЗ рдирд╣реАрдВ
ред
рд╕реНрдерд╛рдкрдирд╛
рдЖрдк рддреИрдпрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг PIP рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
$ рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рд╣рд░реА
рдкреАрдЖрдИрдкреА рд╣реА рдПрдХ рдЕрдЬрдЧрд░-рдкрд╛рдЗрдк рдкреИрдХреЗрдЬ, рдкреЛрд░реНрдЯ рдбреЗрд╡реЗрд▓ / рдкреА-рдкрд╛рдЗрдк, рдЖрджрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реИредрдпрд╛ setup.py рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рдирд┐рд░реНрдорд╛рдгред
рдореВрд▓ рдореИрдиреБрдЕрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рд╕рдЪ рд╣реИ, рд╕рдВрд╕реНрдХрд░рдг 0.5.4 рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ, рдФрд░ рдЕрдм 0.6.0 рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреВрд░рд╛ рдЕрдВрддрд░ рдХреЙрдкреАрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ 4 рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдЗрдВрдбреЗрдВрдЯ рдХреЛ 2 рдХреЗ рдЗрдВрдбреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХрд╛ рд╣реИред "Google рдХреЛрдб рд╢реИрд▓реА"
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╛рдпрдерди рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рдХрд╛рдлреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд╡реЗ рд╕рднреА рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдВ рд░реВрд╕реА рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдЕрд╕рдВрдЧрдд рдУрдПрд╕ рдкрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдлреЙрд▓рдмреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЗрд▓ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдмрд╛рдж рдХреА рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рдПрдлрдПрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ "рдХрд╛рд╕реНрдЯ" рдмрдиреЗрдВрдЧреЗред рд╢рд╛рдпрдж рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдХрд┐рдпрд╛ :)рдореИрдВрдиреЗ рдЦреБрдж ubuntu 11.4 рдФрд░ freebsd-8.2 RELEASE рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред
рдореВрд▓ рдЙрджрд╛рд╣рд░рдг
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг, рд╡рд┐рд▓реЛрдкрди рдФрд░ рдирд╛рдордХрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрде / рдкрде / / smth рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рд╣рдо рдХрдиреЗрдХреНрдЯ:
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler
рдСрдмреНрдЬрд╝рд░реНрд╡рд░ рд╡рд░реНрдЧ рдХрд╛ рдЪрдпрди рдЖрдкрдХреЗ OS рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ /observers/__init__.py рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИред
FileSystemEventHandler рд╡рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИред рд╡рд╣ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕рдХреЗ рд╡рдВрд╢ рдХреЛ рд╕рд┐рдЦрд╛рдПрдВрдЧреЗ:
class Handler(FileSystemEventHandler): def on_created(self, event): print event def on_deleted(self, event): print event def on_moved(self, event): print event
FileSystemEventHandler.dispatch рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: on_modified, on_moved, on_created, on_deletedредрд╣рдо рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
observer = Observer() observer.schedule(Handler(), path='/path/to/smth', recursive=True) observer.start()
рдСрдмреНрдЬрд░реНрд╡рд░ рдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рджреВрд░ рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИред рд╢реБрд░реВ рдореЗрдВ () рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд░рдорд╢рдГ, рд╣рдореЗрдВ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рд╕рдордЭрджрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдЕрдкреЗрдХреНрд╖рд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЕрдм рдЖрдк рдмрд╕ рдПрдХ рдмреИрд╕рд╛рдЦреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
try: while True: time.sleep(0.1) except KeyboardInterrupt: observer.stop() observer.join()
рд╣рдо Ctrl + C (SIGINT) рдЖрдиреЗ рддрдХ FS рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреЗ рдзрд╛рдЧреЗ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ, рд╣рдорд╛рд░реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдПрдБ рдФрд░:
# mkdir foo # touch bar # mv bar baz # cd foo/ # mkdir foz # mv ../baz ./quz # cp ./quz ../hw # cd .. # rm -r ./foo # rm -f ./*
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░:
<DirCreatedEvent: src_path=/path/to/smth/foo> <FileCreatedEvent: src_path=/path/to/smth/bar> <FileMovedEvent: src_path=/path/to/smth/bar, dest_path=/path/to/smth/baz> <DirCreatedEvent: src_path=/path/to/smth/foo/foz> <FileMovedEvent: src_path=/path/to/smth/baz, dest_path=/path/to/smth/foo/quz> <FileCreatedEvent: src_path=/path/to/smth/hw> <FileDeletedEvent: src_path=/path/to/smth/foo/quz> <DirDeletedEvent: src_path=/path/to/smth/foo/foz> <DirDeletedEvent: src_path=/path/to/smth/foo> <FileDeletedEvent: src_path=/path/to/smth/hw>
рдИрд╡реЗрдВрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ, рд╡реЙрдЪрдбреЙрдЧ / рдИрд╡реЗрдВрдЯрд╕реЛрдореНрд╕ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдлрд╝рд╛рдЗрд▓рд╕рд┐рд╕реНрдЯрдордЗрд╡реЗрдВрдЯ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВред
рд╕рднреА рдХреЗ рдкрд╛рд╕ src_path, is_directory, event_type ("рдмрдирд╛рдпрд╛ рдЧрдпрд╛", "рд╣рдЯрд╛рдП рдЧрдП", рдЖрджрд┐) рдЧреБрдг рд╣реИрдВред рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП, dest_path рдЧреБрдг рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ... рдХреНрдпрд╛ рдХреБрдЫ рдФрд░ рд╣реИ?
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА FileSystemEventHandler рдХреЗ
рд╡рдВрд╢рдЬ рд╣реИрдВ :
PatternMatchingEventHandler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди FS рдиреЛрдбреНрд╕ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдореБрдЦреМрдЯрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ:
- * рдХреЛрдИ рднреА рдкрд╛рддреНрд░
- ? рдХреЛрдИ рдПрдХрд▓ рдЪрд░рд┐рддреНрд░
- [seq] рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛ рдХреЛрдИ рдПрдХрд▓ рд╡рд░реНрдг
- [! seq] рдХреЛрдИ рднреА рдПрдХрд▓ рд╡рд░реНрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗ рдирд╣реАрдВ рд╣реИ
рдмрдирд╛рддреЗ рд╕рдордп рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:
class Handler(PatternMatchingEventHandler): pass event_handler = Handler( patterns = ['*.py*'], ignore_patterns = ['cache/*'], ignore_directories = True, case_sensitive = False ) observer = Observer() observer.schedule(event_handler, path='/home/LOGS/', recursive=True)
RegexMatchingEventHandler рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ regexp рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:
class Handler(RegexMatchingEventHandler): pass event_handler = Handler( regexes = ['\.py.?'], ignore_regexes = ['cache/.*'], ignore_directories = True, case_sensitive = False )
рдирддреАрдЬрддрди, PatternMatchingEventHandler рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдорд┐рдд рдкреИрдЯрд░реНрди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдВрдд рдореЗрдВ, LoggingEventHandler logging.info () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред
- рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╢рд╛рдпрдж рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛ред
рдкреБрдирд╢реНрдЪ
рдЬрдм рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд┐рд╕рдореЗрдВ (рдФрд░ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ) рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ / рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдПрд╕рд╕реАрдЖрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рджред UnicodeEncodeError рд╡реЙрдЪрдбреЙрдЧ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдШрдЯрд┐рдд рд╣реЛрдЧрд╛ред Linux (inotify) рдкрд░, рдпрд╣
watchdog.observers.inotify.Inotify._add_watch рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рдХрд╛рд░рдг рдПрдПрд╕рд╕реАрдЖрдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝ рд░рд╣рд╛ рд╣реИред
рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдкреИрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from watchdog.observers.inotify import Inotify _save = Inotify._add_watch Inotify._add_watch = lambda self, path, mask: _save(self, path.encode('utf-8'), mask)
рдпрд╣рд╛рдБ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд░реАрдкреНрд░ ()
/home/atercattus/.wine/drive_c/users/Public/ u'/home/atercattus/.wine/drive_c/users/Public/\u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b' '/home/atercattus/.wine/drive_c/users/Public/\xd0\xa0\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x87\xd0\xb8\xd0\xb9 \xd1\x81\xd1\x82\xd0\xbe\xd0\xbb'