рдЕрдЪреНрдЫреЗ рдХреЛрдб рдХрд╛ рдореБрдЦреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд

рд╡рд┐рд╡рд┐рдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмреАрд╕ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ, рдЕрдЪреНрдЫреЗ рдХреЛрдб рдХрд╛ рдореБрдЦреНрдп рд╕рд┐рджреНрдзрд╛рдВрддред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдФрд░ рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдХреЛрдб рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде, рдЕрд╕рдВрдЧрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдПрдХ рдЯреАрдо рдореЗрдВ рдПрдХрдЬреБрдЯ рдХрд┐рдпрд╛ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪрдордХ рдХреЗ рдмрд┐рдирд╛ рд╡рд░реНрд╖реЛрдВ рддрдХ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдП рд░рдЦрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВ: 15 рдорд┐рдирдЯ
рддрдХрдиреАрдХ рдХреА рд╕рдордЭ: 10 рдорд┐рдирдЯ
рдореВрд░реНрдд рдкрд░рд┐рдгрд╛рдо: 30 рдорд┐рдирдЯ

рдЗрд╕ рдкреНрд░рдХрд╛рд░,

рдХреНрдпреЛрдВ?


рдмреБрд░реЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рд╣реА рдкрд▓ рдореЗрдВ рджреЛ рдмрд╛рд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрдереНрдп рд╕реЗ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреБрдЫ рдХреЛрдб рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЪреАрдЦрддрд╛ рд╣реБрдЖ рдЙрдарддрд╛ рд╣реВрдВ

рдЦрд░рд╛рдм рдХреЛрдб рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╢реНрдЪрд░реНрдп рд▓рд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ: рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ рдХреБрдЫ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ред рджрд░рдЕрд╕рд▓, рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд▓реЗрдЦрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЕрдЪреНрдЫреЗ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕рдХреА рд╕рдордЭ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдПрдХ рд╡рд┐рд╢реБрджреНрдз рдорд╛рдирд╡реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдзреНрдпрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ; рдпрд╣ рд╕рд╛рд░ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛрдб рдкрдврд╝рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдЪрд░ рдХрд╛ рдирд╛рдо рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЙрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХрд╛ рд╕рд╛рд░ рджреЗрдЦрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдХреЛрдб рдХреА рд╕рдордЭрджрд╛рд░реА рдирд╛рдореЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИред рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ, рдЪрд░ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗред рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╛рдо рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрддрдиреА рд╣реА рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕рд╛ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ:

function locator($device) {
    // Can we locate the device?
    if ($device->token != "" && $device->expire <= $now) {
        return false;
    }

    $modelNotifier = new ModelNotifier($device); 
    return $modelNotifier->go();
}

, - . .


. , , $device->expire , . ModelNotifier->go() , . , , token . , .

, : token!="", . , , .

, . тАФ . , ; , . , .

.

?


, тАФ .

, , , . , тАФ тАФ .

:

function locator($device) {
    // Can we locate the device?
    if ($device->token != "" && $device->expire <= $now) {
        return false;
    }

    $modelNotifier = new ModelNotifier($device); 
    return $modelNotifier->go();
}

, , : тАЬ ?тАЭ

:

function ModelDevice::isLocatable() {
    return ($this->token != "" && $this->expire <= $now);
}

тАж

function locateAndNotifyDevice(ModelDevice $device) {
    if (!$device->isLocatable()) {
        return false;
    }

    $modelNotifier = new ModelNotifier($device);
    return $modelNotifier->go();
}

, , - , .

. isLocatable(). : , :

  1. ?
  2. ?

: , .

:

function isDeviceExpired() {
    return ($this->expireAtUnixtime >= $now);
}

function isOurTokenValid() {
    return ($this->token != "");
}

function isLocatable() {
    return ($this->isOurTokenValid() && !$this->isDeviceExpired());
}

. : isLocatable() , . isDeviceExpired(), , .

тАФ .

, , , token . , : .

, : . Instant win!

?


, . ! , .

-, . , , . , : . , , . . , ? :)

-, - (тАЬ ?тАЭ) (тАЬ ?тАЭ) . isLocatable(), : , . тАФ , . тАЬтАЭ locateDevice(), ; , , . тАФ , .

-, , CPU, . , тАФ 1/3 *. , , . , . , , . , .

*300ms тАФ .


:

function getConfig() {
    if ($this->hasOption('configs')) {
        $configs = $this->getOption('configs');
    } else if ($this->hasOption('config')) {
        $configs = [ $this->getOption('config') ];
    }

    if (isset($configs)) {
        $root = $this->getOption('root', null);
        if (!$root) {
            if (isset($_SERVER['PWD'])) {
                $root = $_SERVER['PWD'];
            } else if (isset($_SERVER['DOCUMENT_ROOT'])) {
                $root = $_SERVER['DOCUMENT_ROOT'];
            }
        }

        $configs->root = $root;
    }

    return $configs;
}

: ( ), . :

function grabConfiguration() {
    if ($this->hasOption('configs')) {
        return $this->getOption('configs');
    } else if ($this->hasOption('config')) {
        return [ $this->getOption('config') ];
    }
}

function figureOutRootFolder() {
    $root = $this->getOption('root', null);
    if (!$root) {
        $root = $_SERVER['PWD'];
    }
    if (!$root) {
        $root = $_SERVER['DOCUMENT_ROOT'];
    }
    return $root;
}

function getConfigs() {
    $configs = $this->grabConfiguration();  
    if (!is_null($configs)) {
        $configs->rootFolder = $this->figureOutRootFolder();        
    }
    return $configs;
}

iOS:

if ([imageEntry objectForKey:@"fullscreenUrl"]==nil) {
    NSString *kind = [imageEntry objectForKey:@"kind"];
    if ([kind isEqualToString:@"pdf"]) {
        UIImage *i = [UIImage imageNamed:@"galleryPdfIcon"];
        [self.uiImagesCache setObject:i forKey:@(photoIndex)];
        *photoSize = NIPhotoScrollViewPhotoSizeOriginal;
        return i;
    } else if ([kind isEqualToString:@"video"]) {
        UIImage *i = [UIImage imageNamed:@"galleryVideoIcon"];
        [self.uiImagesCache setObject:i forKey:@(photoIndex)];
        *photoSize = NIPhotoScrollViewPhotoSizeOriginal;
        return i;
    } else {
        UIImage *i = [UIImage imageNamed:@"galleryBrokenImage"];
        [self.uiImagesCache setObject:i forKey:@(photoIndex)];
        *photoSize = NIPhotoScrollViewPhotoSizeOriginal;
        return i;
    }
}

, . . :

- (UIImage *) genericImageForKind:(NSString *) imageKind {
    UIImage *candidate = nil;

    if ([kind isEqualToString:@"pdf"]) {
        candidate = [UIImage imageNamed:@"galleryPdfIcon"];
    } else if ([kind isEqualToString:@"video"]) {
        candidate = [UIImage imageNamed:@"galleryVideoIcon"];
    } else {
        candidate = [UIImage imageNamed:@"galleryBrokenImage"];
    }

    return candidate;
}

тАж

if ([imageEntry objectForKey:@"fullscreenUrl"]==nil) {
    NSString *kind = [imageEntry objectForKey:@"kind"];
    UIImage *genericImage = [self genericImageForKind:kind];
    if (genericImage) {
        [self.uiImagesCache setObject:genericImage forKey:@(photoIndex)];
        *photoSize = NIPhotoScrollViewPhotoSizeOriginal;
    } 

    return nil;
}

SQL . , , , , .

function(err, dResults) {
    if (err) {
        console.log(err);
        callback(err);
        return;
    }

    var i=0, lastDownloaded = null;
    var unixtimes = Object.keys(dResults);
    for(i=0;i<unixtimes.length;i++) {
        if (dResults[unixtimes[i]].isDownloaded) { 
            lastDownloaded = unixtimes[i];
        }
    }

    for(i=0;i<unixtimes.length;i++) {
        if (unixtimes[i]>lastDownloaded) {
            delete dResults[unixtimes[i]];
        }
    }

    self.getOpenPrice(symbol, function(err, openPrice) {
        callback(err, dResults, openPrice);
    });
}

:

function getLastDownloadedUnixtime(entries) {
    var lastDownloadedUnixtime = null;

    var unixtimes = Object.keys(entries);
    unixtimes.forEach(function(unixtime) {
        if (entries[unixtime].isDownloaded) { 
            lastDownloadedUnixtime = unixtime;
        }
    });

    return lastDownloadedUnixtime;
}

function cleanupEntriesNewerThanLastDownloadedUnixtime(entries, lastDownloadedUnixtime) {
    var unixtimes = Object.keys(entries);
    for(var i=0;i<unixtimes.length;i++) {
        if (unixtimes[i]>lastDownloadedUnixtime) {
            delete entries[unixtimes[i]];
        }
    }
}

тАж

function(err, dResults) {
    if (err) {
        console.log(err);
        callback(err);
        return;
    }

    var lastDownloadedUnixtime = getLastDownloadedUnixtime(dResults);
    cleanupEntriesNewerThanLastDownloadedUnixtime(dResults, lastDownloadedUnixtime);

    self.getOpenPrice(symbol, function(err, openPrice) {
        callback(err, dResults, openPrice);
    });
}

XML Amazon S3. , , XML :

strcat(xml, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
strcat(xml, "<Delete>\n");
strcat(xml, "<Quiet>true</Quiet>\n");

for (uint32_t i=0;i<batchCount;i++) {
    char *escapedPath=Deleter::xmlEscape(batch[i]);
    strcat(xml, "\t<Object><Key>");
    strcat(xml, escapedPath);
    free(escapedPath);
    strcat(xml, "</Key></Object>\n");
    LOG(LOG_DBG, "[Delete] %s", batch[i]);
}

strcat(xml, "</Delete>\n");

, :

void addPathToDeleteXml(char *xml, char *path) {
    char *escapedPath=Deleter::xmlEscape(path);
    strcat(xml, "\t<Object><Key>");
    strcat(xml, escapedPath);
    strcat(xml, "</Key></Object>\n");
    free(escapedPath);
}

void addBatchOfPathsToXml(char *xml, char **batch, uint32_t batchCount) {
    for (uint32_t i=0;i<batchCount;i++) {
        addPathToDeleteXml(xml, batch[i]);
        LOG(LOG_DBG, "[Delete] %s", batch[i]);
    }
}

тАж

strcat(xml, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
strcat(xml, "<Delete>\n");
strcat(xml, "<Quiet>true</Quiet>\n");

addBatchOfPathsToXml(xml, batch, batchCount);

strcat(xml, "</Delete>\n");



, тАФ . : , - . , - , - , , .

, . , . , , , .

. , . , . , .


тАФ . , : , , .

. тАФ , - .

. , , , autocomplete.

Update: ┬лif (true) return true┬╗ , .. , .

Source: https://habr.com/ru/post/In150868/


All Articles