Monday, February 29, 2016

TakeOut and python sorter


რამდენიმე დღის წინ აღმოვაჩინე, რომ ჩემი google-ის ონლაინ დისკის (google drive) მოცულობა 115-დან ისევ 15 (ახლა უკვე 17) გიგაბაიტზე უნდა ჩამოსულიყო და სასწრაფოდ დავიწყე გამოსავლის ძებნა, რადგან უკვე 35 გიგაბაიტი დაკავებული იყო. როგორც გავარვიე, google არაფერს არ შლის უბრალოდ აღარ დამამატებინებდა თუ ლიმიტს უკვე გადავცდებოდი. ეს კარგი იყო, მაგრამ დრაივის გამოყენებაც მინდოდა. გავარკვიე, რომ გუგლს აქვს სერვისი takeout და არანაირ კავშირში არ არის საჭმელთან, ეს სერვისი საშუალებას გაძლევთ თქვენი მთელი ისტორია რაც google-ს უკავშირდება უბრალოდ აიღოთ და ლოკალურად გადმოტვირთოთ. მე კი მხოლოდ ჩემი ფოტოები მინდოდა, რომლებიც 23 გიგბაიტს იკავებდა დრაივზე. ამიტომ ავდექი და 2-2 გიგბაიტიან ნაწილებად გადმოვწერე ჩემი ფოტოები და მაინც მივაყოლე ყველა იმ სერვისის ისტორია, რომელიც გუგლთან მაკავშირებდა.


არქივის გაკეთება, რამდენიმე საათს ან უარეს შემთხვევაში დღეს წაიღებს, მაგრამ ღირს, რადგან იცი, რომ ყველაფერი შენთან არის და არ გიწევს ხელმისაწვდომობაზე და უსაფრთხოებაზე ფიქრი, ჩემი აზრით, რა თქმა უნდა. მოკლედ საბოლოოდ როდესაც უკვე გადმოწერილი არქივის ნაწილებმა Downloads ფოლდერი დაიკავა, შევუდექი ექსტრაქტირებას. მორჩენისთანავე გამიჩნდა შეგრძნება, რომ google-ს არ უნდოდა რომ ეს  ყველაფერი ამეღო მისი სერვერებიდან, რადგან ყველაფერი თარიღის მიხედვით იყო დალაგებული საქაღალდეებში და მსგავს კონტენტზე ერთიანი წვდომა არ მქონდა, უნდა შევსულიყავი არქივში, შემდეგ Takeout საქაღალდე, ამის შემდეგ სერვისის სახელი, ჩემს შემთხვევაში Google Photos და შემდეგ თარიღის მიხედვით დალაგებული საქაღალდე, რომელშიც მაქსიმუმ 20 ფოტოა და ამოწურვის დროს უნდა გამოვსულიყავი თარიღიან საქაღალდიდან და გადამენაცვლა სხვაში - იდიოტობა, იგივე სიტუაცია იყო სხვა სერვისების შემთხვევაში, სადაც Google Photos იცვლებოდა, შესაბამისი სერვისის სახელით.

ახლა კი გადავალ საქმეზე. მომინდა, ყველა სურათი და ვიდეო, რომელიც გადაღებული იყო პლანშეტით და მობილურით გადამეტანა ერთ საქაღალდეში სახელად Images (ან ნებისმიერში), მთავარია რომ შევიდოდი ამ საქაღალდეში ყველა სურათი მქონოდა ხელის გულზე გადაშლილი, მთელი ~11,000 სურათი :3. აი აქ კი ყველაფერი გართულდა, რადგან დაახლოებით 11,000 / 20 = 550 და უფრო მეტ საქაღალდეში უნდა შევსულიყავი და მეკოპირებინა ყველაფერი. მომინდა იმ დროის დათვლა, რომელიც ამის გასაკეთებლად დამჭირდებოდა. 550 საქაღალდე, რომელიც სხვადასხვა დონეზეა, მაგრამ დავივიწყოთ. უხეშად ავიღოთ, 1 წმ - შესვლა, 1წმ - Ctrl+A, 1წმ metadata.json ფაილის არ მონიშვნა (რომელიც ჩვეულებრივ ყველა ფოლდერშია, სადაც სერვისის ინფორმაციაა განთავსებული) 1 წმ - Ctrl+C, 1წმ - საერთო საქაღალდეზე ფოკუსირება, 1 წმ - Ctrl+V, 1 წმ - უკანა საქაღალდეზე გადაფოკუსირება, 1 წმ ზედა დოზე დაბრუნება და 2 წმ სხვა საქაღალდის მოძებნა და ყველაფერი იწყება თავიდან. ჯამში ერთი საქაღალდისთვის გამოვიდა 9 წამი და ეს ყველაფერი დავამრგვალოთ 10 წამამდე რადგან საქაღალდეები სხვადასხვა დონეზეც შეიძლება იყოს და ისიც გავითვალისწინოთ, რომ ლეპტოპზე მუშაობისას ტაჩპედით ამ ყველაფრის გაკეთება არც ისე კომფორტულია და ცოტა შესვენებაც გვჭირდება, კომპიუტერები არ ვართ. საბოლოოდ რომ გამოვთვალოთ 10 წმ x 550 საქაღალდეზე არის 5500 წამი - 91.(6) წუთი - 1,5 საათი. შესვენების გარეშე. 1,5 საათი.

მაინც არ ვაპირებდი ამ ყველაფრის გაკეთებას :3. გადავწყვიტე, რომ დამეწერა პროგრამა (გენიოსი ვარ), რომელიც ამ ყველაფერს ჩემზე სწრაფად, შეუსვენებლად და მარტივად გააკეთებდა. შემდეგ დავიწყე ფიქრი რა ენაზე? და მხოლოდ უკვე ამის შემდეგ გამახსენდა, რომ პითონის ბლოგიც მაქვს და პითონზე უნდა დამეწერა. C#-იც ვარიანტი იყო, მაგრამ cross platform არ იქნებოდა პროგრამა ასევე არქივი ubuntu-ზე მქონდა და ამ ყველაფრის კოპირება დიდი დროის ხარჯვაც იყო. ამიტომ შევუდექი ფაილებთან მუშაობისა და tkinter მოდულის გახსენებას. დიდი გასახსენებელი არც არაფერი იყო. შემდეგ კი ავიღე ფურცელი და პროგრამის არქიტექტურის ხაზვა დავიწყე (განა მართლა, ისე გავიაზრე, მელანი არ იყო). სანამ მივხვდებოდი, რომ ამ ყველაფრით უნდა დამეწყო, მაშინვე კოდის წერა დავიწყე და მერე მივხვდი, რომ არ უნდა მექნა, რადგან (იხ. სურათი ქვემოთ)


რა უნდა შეეძლოს პროგრამას და ზოგადი ფუნქციონალი:
ახლა ვაგრძელებ პოსტის რედაქტირებას  და ამ დროს ვიხსენებ როგორი გადატვირთული იყო GUI, ამიტომ  გაქვეყნებამდე დრო ავიღე და ახლა ვამბობ, რომ 6 GUI კონტროლიდან 2-ზე ჩამოვედი: 1 ღილაკითა და 1 Label-ით. მოკლედ რა ხდება, იხსნება პროგრამა და ხედავთ მიგრაციის დაწყების ღილაკსა და იარლიყს - მიგრაციის სტატუსი. ახლა მარტივია. 

საბოლოოდ, მინდა, რომ სურათების გარდა სხვა სერვისების ერთ საქაღალდეში თავმოყრაც იყოს შესაძლებელი.

კოდის წერა (5 დღეში გაწელილი 2-3 საათი), დაახლოებით ასეთი შეგრძენბა იყო, როგორც ქვემოთ სურათზეა ნაჩვენები. მინდოდა იდეალური, მაგრამ ბოლოს შემიძლია ვთქვა, რომ ბევრი აკლია.
რაც შეეხება კოდს, ერთიანად მოგიწევთ ხილვა, რადგან ბლოგში ნაგლეჯ-ნაგლეჯ ჩამატებას დიდი ძალისხმევა სჭირდება და ტაბულაციას (თუ სწორად ვამბობ) პითონში დიდი ყურადღება ექცევა.

ახლა დავიწყებ მოკლედ იმ ფუნქციების აღწერას, რომელსაც ვიყენებ:
1) get_takeout_path - სახელიდანაც ჩანს, რომ იმ საქაღალდის მისამართს იღებს, სადაც takeout საქაღალდეა მოთავსებული და დამთხვევას პოულობს მარტივი ლოგიკით
2) start_migration - რომელიც მიბმულია ღილაკის დაჭერის მოვლენაზე (event). პირველ რიგში ამოწმებს მომხმარებელი უთითებს თუ არა საქაღალდის მისამართს (ცუდი ლოგიკით) შემდეგ უკვე ქმნის ახალ საქაღალდეს, და პარალელურად ამოწმებს არსებობს თუ არა ის საქაღალდე სადაც უნდა გადააკოპიროს სურათები (საწყის ეტაპზე). თუ არსებობს, მაშინ უბრალოდ ბოლოში '1'-იანს დაამატებს. შემდეგ ქმნის საქაღალდეს და იწყებს ახალ thread-ს
3) migration_wrapper - ეს ფუნქცია კი უზრუნველყოფს, რომ სტატუსის იარლიყი იყოს მუდმივად განახლებული და მიგრაცია შესრულდეს
4) migrate - ფუნქცია იღებს ყველა საქაღალდეს (takeout-ის), მის შიდა საქაღალდეებს და ა.შ. და აკოპირებს სურათებს (ან ნებისმიერი გაფართოების ფაილს, რაც patterns ცვლადშია (global)). ამავე დროს აახლებს statusLabel-ს და აბრუნებს გადაკოპირებული ფაილების რიცხვს.

ასევე მოცემულია GUI, რომელიც მარტივია და ადვილად მისახვედრი. 

და ბოლოს იმედი მაქვს, რომ კოდს ვინმე გამოიყენებს და განავითარებს (უკეთესობისკენ, რა თქმა უნდა). ასევე მაქვს ცოტა სტატისტიკა, რომელიც ჩემი კომპიუტერიდან არის (პროცესორით i7 და 5400rpm HDD-ით, თუ რამე შუაშია ეს ყველაფერი და ალბათ არის).

სტანდარტული takeout-ის პირველი ორი ნაწილი, თავისი ჩახლართული საქაღალდეებით, 1291 სურათით და კიდევ გახსნილი რამდენიმე ფანჯრით

- 0:01:41.008077 (წუთი და 41 წამი), ანუ საშუალოდ 0.078 წამი ერთი სურათისთვის. საკმაოდ კარგი მაჩვენებელია ხელით გადატანასთან შედარებით. 

ასევე, მინდა აღვნიშნო, რომ ფაილები კოპირდება და არა გადადის (გადასვლის დროს ძველი ფაილი იშლება და ახალ ლოკაციაზე გადადის). 

No comments:

Post a Comment