ক্যালেন্ডারের মধ্যে দুর্নীতি: সদৃশ। কীভাবে তাদের কারণ এবং সংশোধন করা যায়?


1

আমি Calendarম্যাকোস এক্স মাউন্টেন সিংহ (10.8.5) চলমান একটি ম্যাক ব্যবহার করছি ।

এই ম্যাকটি নিয়মিত আইফোন চলমান আইওএস 7.1.2 এর সাথে নিয়মিত সিঙ্ক্রোনাইজ হয়।

এটি Calendar9 "ক্যালেন্ডার" এর মধ্যে আয়োজিত 15 বছরের ইভেন্টগুলি সংরক্ষণ করছে। যেহেতু এই তথ্যের কিছুটি অত্যন্ত সংবেদনশীল, পেশাগত বা ব্যক্তিগত, তাই আমি কোনও স্টোর পাবলিক স্টোর ক্যালেন্ডারে এটি সংহত করি না ( iCloud, Google Calendar…)। অন্যদিকে আমার অনেক Time Machineব্যাকআপ এবং পুরো ব্যাকআপ রয়েছে।

সম্প্রতি আমি বেশ অপ্রত্যাশিতভাবে আবিষ্কার করেছি যে 2001 এর গ্রীষ্ম থেকে আমি Calendarআমার ম্যাকের মধ্যে পুরো দিনের ইভেন্টগুলি নকল করেছি d এগুলির নকল প্রকৃতি সরাসরি দৃশ্যমান হওয়ায় আমি এগুলি দ্রুত দেখতে সক্ষম হয়েছি। এটি সাধারণ ঘটনা নয়: আমার পুরো দিনের বেশিরভাগ ইভেন্টগুলি নকল হয় না। তবে আমার 9 টি "ক্যালেন্ডার" সমস্ত এই দুর্নীতির শিকার হয়েছে । আমি অনুমান করি যে এই ক্ষেত্রে আমার কয়েকটি শতাধিক ইভেন্ট রয়েছে। আমি আমার আইফোনে একই দুর্নীতি দেখছি।


আমি আমার ক্যালেন্ডারের একটি রফতানি করেছি এবং সদৃশ এন্ট্রিগুলির একটি বের করেছি। 2 .icsএক্সট্রাক্টের মধ্যে একটি ভিন্নতার আউটপুট এখানে দেওয়া হল :

••My_Mac••$ diff duplicate.[12].ics
2c2
< UID:74FC7CC1-016C-4A74-9E02-7ECDD82C8129
---
> UID:9B6BC4CD-5859-4DC2-8DEA-9158CB8F9B0D
10,11c10,11
< X-WR-ALARMUID:D0FE4A14-981C-4409-84C1-B11107F7EC31
< UID:D0FE4A14-981C-4409-84C1-B11107F7EC31
---
> X-WR-ALARMUID:48141767-C3C6-4131-9984-0DD080833D9F
> UID:48141767-C3C6-4131-9984-0DD080833D9F
••My_Mac••$

স্বরলিপি: স্ট্রিং ••নামটির ••অর্থ হল "নাম" redacted হয়েছিল।

আমি এখানে /var/log/system.logযা খুঁজে পেয়েছি এবং যা সম্পর্কিত হতে পারে তা এখানে :

সেপ্টেম্বর 13 10:08:32 •• মাই_ম্যাক •• সিঙ্কসার্ভার [93677]: [0x7fbe60c0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 13 16:09:10 •• মাই_ম্যাক •• সিঙ্কসার্ভার [94189]: [0x7fd25a40bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 14 03:21:15 •• মাই_ম্যাক •• সিঙ্কসার্ভার [94351]: [0x7f9e1ac0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 14 08:56:41 •• মাই_ম্যাক •• সিঙ্কসার্ভার [94351]: [0x7f9e1ac0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
15 সেপ্টেম্বর 14:11:39 •• মাই_ম্যাক •• সিঙ্কসার্ভার [94351]: [0x7f9e1ac0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 16 00:25:17 •• মাই_ম্যাক •• সিঙ্কসার্ভার [95764]: [0x7faf92c0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 16 13:36:27 •• মাই_ম্যাক •• সিঙ্কসার্ভার [96213]: [0x7f9470c0bdd0] | সিঙ্কসার্ভার | সতর্কতা | ক্যালেন্ডারের সময় পরিবর্তনের সতর্কতার কারণে ওয়াচডগকে রিফ্রেশ করছে।
সেপ্টেম্বর 16 13:51:33 •• আমার_ম্যাক •• ক্যালেন্ডার এজেন্ট [90827]: line লাইনে সম্পত্তি নামের জন্য অবৈধ চর _
সেপ্টেম্বর 16 13:51:33 •• মাই_ম্যাক •• ক্যালেন্ডার এজেন্ট [90827]: অপ্রত্যাশিত ইওএফ, ফ্যালব্যাক হিসাবে শেষ টোকেনটি ফিরছে


এই নকল ইভেন্টগুলি কোথা থেকে আসছে তা আমি কীভাবে বিশ্লেষণ করব?

কোনও ইভেন্ট আমার এজেন্ডাদের এমন দুর্নীতি শুরু করতে পারে এমন তারিখ এবং সময় আমি কীভাবে খুঁজে পাব? ক্ষতির শুরু হওয়ার তারিখ ব্যতীত আমার ব্যাকআপগুলি খুব একটা সহায়ক নয়। তাছাড়া, তারা একটি মোট সঠিক ঘটনা যা ঘটেছে এর পুনর্নির্মাণের পরোক্ষভাবে হবে পরে ক্ষতি

আমি কীভাবে আমার সমস্ত "ক্যালেন্ডার" এর এই দুর্নীতির সঠিক দৃষ্টি পেতে পারি?

এবং তদুপরি, আমি কীভাবে এই বিশাল এবং আপাতদৃষ্টিতে এলোমেলো ডেটা দুর্নীতির সমাধান করতে পারি ?

উত্তর:


0

আমি এখনও এই দুর্নীতিগুলির সঠিক ব্যাখ্যা করতে পারি নি, তবে ক্ষতির পরিমাণ সম্পর্কে এবং তার সমাধানের জন্য কমপক্ষে আমি একটি সমাধান লিখেছি।

এখানে একটি পার্ল স্ক্রিপ্ট duplicate.pl:

$ cat <<'eof' >duplicate.pl
#!/usr/bin/perl
use strict ;
use warnings ;

# program reading on its standard input a file under
# ics format exported by iCal or Calendar
# Both only export one calendar at a time

# file = name of created file for a given calendar

my %file = () ;

# filedesc = file descriptor of the created calendar file

my %filedesc = () ;

# hash of all unduplicated events local_event_id
my %events = () ;

# current event storage
my @event = () ;
my $dtstart = '' ;
my $dtend = '' ;

# number of events analysed
my $num_event = 0 ;
my $duplicate = 0 ;
my $calendar = '' ;

# state booleans
my $in_header = 1 ;
my $in_event = 0 ;
my $in_summary = 0 ;
my $line = '' ;
my $summary = '' ;

# local event identifier :      summary;dtstart;dtend
# because ';' is never used within a name
my $local_event_id = '' ;

while (<STDIN>) {
        $line = $_ ;

# header :      BEGIN:VCALENDAR
#               ...
#               BEGIN:VEVENT

        if ( $in_summary ) {

#               continuation line of summary

                if ( $line =~ /^ (.+)\r\n$/ ) {
                        $summary .= $1 ;
                } else {

#                       end of summary continuation lines analysis

                        $in_summary = 0 ;
                }
        }
        if ( $line =~ /^SUMMARY[^:]*:(.+)\r\n$/ ) {
                $summary = $1 ;
                $in_summary = 1 ;
        } elsif ( $line =~ /^BEGIN:VEVENT/) {
                if ( $in_header ) {
                        $in_header = 0 ;

#                       print every lines of event or header

                        foreach $line (@event) {
                                printf {$filedesc{$calendar}} "%s", $line ;
                        }
                }
                $in_event = 1 ;
                @event = () ;
        } elsif ( $line =~ /^X-WR-CALNAME:(.+)\r\n$/) {
                $calendar = $1 ;

#               create .ics file

                if ( ! defined $file{$calendar} ) {
                        $file{$calendar} = $calendar . ".ics" ;
                        if ( -e $file{$calendar} ) {
                                die "$file{$calendar} already exists\n" ;
                        }
                        open ($filedesc{$calendar}, ">", $file{$calendar}) ;

#                       print every lines of header

                        foreach $line (@event) {
                                printf {$filedesc{$calendar}} "%s", $line ;
                        }
                        @event = () ;
                        $in_event = 0 ;
                }
#               printf STDOUT "calendar = %s\n", $calendar ;
#               printf STDOUT "file = %s\n", $file{$calendar} ;
#               printf STDOUT "fh = %d\n", $filedesc{$calendar} ;

        } elsif ( $line =~ /^DTSTART[^:]*:(.*)\r\n$/ ) {
                $dtstart = $1 ;

#               printf STDOUT "DTSTART = %32s\n", $dtstart ;

        } elsif ( $line =~ /^DTEND[^:]*:(.*)\r\n$/ ) {
                $dtend = $1 ;

#               printf STDOUT "DTEND = %32s\n", $dtend ;

        } elsif ( $line =~ /^END:VEVENT/ ) {

# it's only on closing an event definition that we have
# a complete local event identifier

                $local_event_id = "$summary" . ";" . "$dtstart" . ";" . "$dtend" ;


                if ( defined ( $events{"$local_event_id"} )) {

#                       duplicate event

                        printf STDOUT "\n\tduplicate\t%s\n", $local_event_id ;

#                       free event storage

                        @event = () ;
                        $in_event = 0 ;
                        $duplicate++ ;
                } else {

#                       new event
                        $events{$local_event_id} = 1;

                        if ($in_event) {

#                               print every lines of stored event

                                foreach $line (@event) {
                                        printf {$filedesc{$calendar}} "%s", $line ;
                                }
                                @event = () ;
                                $in_event = 0 ;
                                $num_event++ ;
                                $in_header = 1 ;

#                               show progress
                                if (($num_event % 100) == 0) {
                                        printf STDOUT "\n%8d", $num_event ;
                                } else {
                                        print STDOUT "." ;
                                }
                        }
                }
        } elsif ( $in_event == 0 ) {
                $in_header = 1 ;
        }

#       store every line of event or header

        if ($in_event || $in_header) {
                push (@event, $line) ;
        }

}

printf STDOUT "\nevents:%12d\n", $num_event ;
printf STDOUT "duplicates:%8d\n", $duplicate ;

#                       print every lines of ending

                        foreach $line (@event) {
                                printf {$filedesc{$calendar}} "%s", $line ;
                        }

close ($filedesc{$calendar}) ;
exit 0 ;
eof
$ chmod u+x duplicate.pl

এবং এখানে আমি এটি ব্যবহার করার পদ্ধতিটি এখানে:

  1. থেকে Calendar, এর মাধ্যমে একটি প্রদত্ত ক্যালেন্ডার রফতানি করুন:

    File > Export > Export...

    আসুন বলে দিন: Documents/Calendar/2015/professionnal.ics

    এনবি: এটি সমস্যার ক্ষেত্রে একটি ব্যাকআপ এবং এর সাহায্যে যে কোনও ফাইলের কারসাজির চেয়ে অনেক বেশি ব্যবহারিক হবে Time Machine

  2. উপরের স্ক্রিপ্টটি ইনস্টল করুন:

    ~/Documents/Calendar/src/duplicate.pl
    
  3. স্থির সংস্করণ পরীক্ষা করার জন্য ডিরেক্টরিতে যান, উদাহরণস্বরূপ:

    mkdir ~/Documents/Calendar/2015.fixed
    cd ~/Documents/Calendar/2015.fixed
    
  4. চালান duplicate.pl:

    ../src/duplicate.pl <../2015/professionnal.ics
    

    যা পঠিত ইভেন্টের সংখ্যা এবং পাওয়া নকলের সংখ্যা প্রদর্শন করবে এবং ক্যালেন্ডারের একটি নির্দিষ্ট সংস্করণ তৈরি করবে:

    ~/Documents/Calendar/2015.fixed/professionnal.ics
    
  5. সমস্ত কিছু ঠিক আছে তা যাচাই করতে ফলাফলটিকে মূল দূষিত সংস্করণের সাথে তুলনা করুন:

     diff ../2015/professionnal.ics .
    
  6. এর মধ্যে Calendarক্যালেন্ডারটি নির্বাচন করুন professionnalএবং এর মাধ্যমে মুছুন:

    Edit > Delete

  7. এর মাধ্যমে স্থিরকৃতটি আমদানি করুন:

    File > Import > Import...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.