Добрый вечер, хабрачитатели!
Перед выходом8+ в 1: наш новый мессенджер под iOS и Android, мне пришлось проделать кое-какую работу по изучению тех мест, куда мы собирались публиковать пресс-релизы. Одним из таких мест стал Хабр.
Мы задались следующими вопросами:
![image](https://habrastorage.org/getpro/habr/post_images/5d9/b79/d44/5d9b79d443b9a714b7902e49c9610154.gif)
Меня с самого начала не покидало ощущение того, что где-то я подобную статью уже видел, где-то уже этот вопрос поднимался, но где?! Я так ине смог найти, скорее всего плохо искал (тут, тут, тут), поэтому решил провести собственно расследование и, по возможности, выяснить какие-то интересные моменты.
Хочу уточнить, что под «лучше всего» мы подразумеваем привлечение максимального числа пользователей, которые либо просмотрят (прочитают), либо добавят в закладки, либо прокомментируют пост.
Началось всё с парсинга статей. Благо у хабра есть идентификаторы постов по которым можно спокойно пройтись и собрать информацию:
На скорую руку был написан граббер на Objective-C.
Приятно наблюдать:
![](https://habrastorage.org/r/w1560/storage3/d4a/52e/59e/d4a52e59eea34fe9b76ba2b720713d45.png)
![](https://habrastorage.org/r/w1560/storage3/850/ea2/502/850ea25024b359d1a2f2e0efa6a9c46a.png)
На всё у меня ушло часов 17-19.
Все страницы начиная с индекса 1 по 200000 весят на текущий момент (28 сентября 2013, 20:03):
Теперь необходимо избавиться от всех лишних файлов — это страницы с постами, которые были скрыты или те, которые еще не были созданы.
Параллельно обрабатывать можно каждую страницу, «выдирать» нужные нам данные и записывать их в другой файл (общий).
Из каждой записи в блоге мы будем получать следующую информацию:
Всего статей, которые сейчас находятся в открытом доступе: 115468.
По этой (обновленный вариант) ссылке вы можете скачать файл с данными в следующем формате:
В качестве разделителя выступает запятая. Параметры перечислены в следующем порядке:
Если необходимо, то все файлы могу раздать или передать (скорее всего торрентом, в сжатом виде весит порядка 4 GB). Пишите в ЛС.
Следующее, что мы сделаем, так это приведем даты публикаций к единому формату:
В текущих данных у нас могут встречаться следующие виды дат публикаций:
Для простоты я исключил даты в формате (их буквально пару штук было, потери терпимые):
Наш следующий парсер должен решать две задачи:
Скачать файл в обновленном формате можно по этой ссылке.
Примечание: обрабатываемые данные включают в себя записи начиная с 2006 года по 28 сентября 2013.
Вопрос: В какие часы суток публикуется наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/532/83c/8d6/53283c8d6d8926f7fc811521104d4187.png)
Вопрос: В какие минуты публикуется наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/6dc/4a3/f00/6dc4a3f009e04bf553b88a87dc69bc27.png)
Вопрос: В какие часы и минуты публикуется наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/b1e/207/688/b1e207688552aaaecbdd776c74b93701.png)
Вопрос: В какой день месяца публикуется наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/9a4/8c6/e63/9a48c6e63e3999ee92e933bae28d180c.png)
Вопрос: В какой месяц публикуется наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/53e/f68/af6/53ef68af633c9cfc0a72869b0d3c4ac6.png)
Вопрос: В какой год было опубликовано наибольшее число постов?
![](https://habrastorage.org/r/w1560/storage3/048/898/c2f/048898c2f126bca105967a8135ca8f5c.png)
Здесь, к сожалению, стоит отметить, что 63310 статей было написано до того, как был введен функционал фиксирования кол-ва просмотров статьи, поэтому мы будем работать только с той частью статей, в которых кол-во просмотров уже фиксировалось.
Вопрос: опубликовав пост в какую минуту можно получить максимальное кол-во просмотров?
![](https://habrastorage.org/r/w1560/storage3/ccb/ae7/be4/ccbae7be4b2c5cf6e0d24f50b4c3a36d.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/a4a/b5a/777/a4ab5a7772f3f2c018c38e03392eefcd.png)
Вопрос: в какие часы достигается максимальное кол-во просмотров?
![](https://habrastorage.org/r/w1560/storage3/324/85a/373/32485a37313c7a01085984506d9ad76e.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/e7f/f6a/bad/e7ff6abad65934eaff9a13285d1a807f.png)
Вопрос: в какие дни месяца достигается максимальное кол-во просмотров?
![](https://habrastorage.org/r/w1560/storage3/327/bff/c27/327bffc27001fd11cf8aa4a3523b9a85.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/922/db8/4f4/922db84f45cb27792f260ace36fef06d.png)
Вопрос: опубликованные посты в какие минуты приносят своим владельцам больше всего добавлений в избранное?
![](https://habrastorage.org/r/w1560/storage3/48b/275/85a/48b27585a2b424c45108bdcc9ee0c871.png)
Средние значение:
![](https://habrastorage.org/r/w1560/storage3/ef1/c3a/6f7/ef1c3a6f7505ffffd97a689b074cf432.png)
Вопрос: публикация поста в какой час приносит своему автору большее число добавлений в избранное?
![](https://habrastorage.org/r/w1560/storage3/014/9a7/cd4/0149a7cd44f5381db228073c2f4cc8a3.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/0c1/d42/177/0c1d421776435dbc0fb34ce81cab77c4.png)
Вопрос: в какой день месяца публикация поста принесет автору максимальное кол-во добавлений в избранное?
![](https://habrastorage.org/r/w1560/storage3/4e6/66e/bbb/4e666ebbb4e7951d9156d5bee8fe8f97.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/d65/617/8f0/d656178f0fe31f6614ff47d59806604e.png)
А вот только за 2013 год:
![](https://habrastorage.org/r/w1560/storage3/8bd/43e/9bc/8bd43e9bcf74c8bca0d9fd896e5aa4f1.png)
Вопрос: публикация в какой месяц принесет автору поста максимальное число добавлений в избранное?
На Хабре декабрь прям какой-то месяц счастья и доброты :)
![](https://habrastorage.org/r/w1560/storage3/30f/63c/a58/30f63ca5889e81bac7c68c0e9a80f9e5.png)
Вопрос: публикация поста в какую минуту принесет автору наибольшее число комментариев?
![](https://habrastorage.org/r/w1560/storage3/784/968/807/7849688079710c56550274ca2925063e.png)
Вопрос: публикация поста в какой час принесут автору максимальное кол-во комментариев?
![](https://habrastorage.org/r/w1560/storage3/4da/81b/157/4da81b15788208e1a5597fa42e438943.png)
Средние значения:
![](https://habrastorage.org/r/w1560/storage3/06e/6a5/e56/06e6a5e560025ff9d42ee78b131ac5da.png)
Только за 2013 год:
![](https://habrastorage.org/r/w1560/storage3/80c/108/dc3/80c108dc389b73f1da57ed6f8e814918.png)
Вопрос: публикация поста в какой день месяца принесет автору наибольшее кол-во комментариев?
![](https://habrastorage.org/r/w1560/storage3/d26/2b5/e2d/d262b5e2da7aeb9143b7c6fe7b1c0451.png)
Вопрос: публикация в каком месяце принесет автору наибольше число комментариев?
![](https://habrastorage.org/r/w1560/storage3/071/094/9b0/0710949b0b73a4b1a488231c8fefb2c0.png)
Вопрос: публикация в каком году принесёт автору наибольшее число комментариев?
![](https://habrastorage.org/r/w1560/storage3/a8d/29c/03d/a8d29c03d5fdce1268d1f6e5d5230f6c.png)
![](https://habrastorage.org/r/w1560/storage3/ac7/241/114/ac7241114ce18c0ed42718326055de49.png)
За качество этого графика приношу свои извинения, LibreOffice отказывается обрабатывать такое кол-во данных, а про Numbers молчу.
![](https://habrastorage.org/r/w780q1/storage3/fe7/8aa/32c/fe78aa32c60e1fd33a894a86716c95a2.jpg)
По оси Х — кол-во комментариев, а по оси У — кол-во добавлений в избранное
Кто прикинет, что же изображено на этих графиках?
![](https://habrastorage.org/r/w780q1/storage3/941/a04/13b/941a0413ba3062b8f2fb9fbfe2104625.jpg)
![](https://habrastorage.org/r/w780q1/storage3/667/b14/377/667b14377975000da96eef3c4e5dd1ac.jpg)
![](https://habrastorage.org/r/w780q1/storage3/4a1/966/6c8/4a19666c8a8df3ace05eae210b4f7d74.jpg)
Спасибо за внимание!
Мы с большим нетерпением хотим уже показать Вам, что мы наработали на iOS и Android, но пока, к сожалению, это делать рано…
Перед выходом
Мы задались следующими вопросами:
- В какой день недели лучше всего публиковать пост?
- В какое время (интервал времени) лучше всего публиковать пост?
- В какое время года лучше всего публиковать пост?
![image](https://habrastorage.org/getpro/habr/post_images/5d9/b79/d44/5d9b79d443b9a714b7902e49c9610154.gif)
Вступление
Меня с самого начала не покидало ощущение того, что где-то я подобную статью уже видел, где-то уже этот вопрос поднимался, но где?! Я так и
Хочу уточнить, что под «лучше всего» мы подразумеваем привлечение максимального числа пользователей, которые либо просмотрят (прочитают), либо добавят в закладки, либо прокомментируют пост.
Началось всё с парсинга статей. Благо у хабра есть идентификаторы постов по которым можно спокойно пройтись и собрать информацию:
habrahabr.ru/post[id]/
На скорую руку был написан граббер на Objective-C.
Исходный код граббера
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* getPublishDate(NSString *);
NSString* getPostViewsCount(NSString *);
NSString* getFavCount(NSString *);
NSString* getCommentsCount(NSString *);
NSString* removeTags(NSString *);
int main(int argc, const char * argv[])
{
// freopen("/Users/new/Documents/Development/HabrahabrParser/habrahabr.txt", "w", stdout);
const int MAX = 200000;
for(int i=1; i<=MAX; i++) {
@autoreleasepool {
NSString *url = [NSString stringWithFormat:@"http://habrahabr.ru/post/%d/", i];
NSURL *link = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:link];
NSError *error = nil;
NSData *post = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:&error];
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrPages/%d.txt", i];
[post writeToFile:path atomically:YES];
NSLog(@"[%d / %d]", i, MAX);
}
}
return 0;
}
NSString* removeTags(NSString *matchString) {
if(nil == matchString)
return nil;
NSRegularExpression *tagContent = [NSRegularExpression regularExpressionWithPattern:@">.+<"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString* resultingString;
[tagContent enumerateMatchesInString:matchString
options:0
range:NSMakeRange(0, [matchString length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
resultingString = [matchString substringWithRange:[result range]];
*stop = YES;
}];
return [resultingString substringWithRange:NSMakeRange(1, [resultingString length] - 2)];
}
NSString* getCommentsCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"id=\"comments_count\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *comments;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
comments = [html substringWithRange:[result range]];
*stop = YES;
}];
return comments;
}
NSString* getFavCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"title=\"Количество пользователей, добавивших пост в избранное\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *fav;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
fav = [html substringWithRange:[result range]];
*stop = YES;
}];
return fav;
}
NSString* getPostViewsCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"title=\"Просмотры поста\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *views;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
views = [html substringWithRange:[result range]];
*stop = YES;
}];
return views;
}
NSString* getPublishDate(NSString *html) {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"class=\"published\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *date;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
date = [html substringWithRange:[result range]];
*stop = YES;
}];
return date;
}
Приятно наблюдать:
![](https://habrastorage.org/storage3/d4a/52e/59e/d4a52e59eea34fe9b76ba2b720713d45.png)
![](https://habrastorage.org/storage3/850/ea2/502/850ea25024b359d1a2f2e0efa6a9c46a.png)
На всё у меня ушло часов 17-19.
Все страницы начиная с индекса 1 по 200000 весят на текущий момент (28 сентября 2013, 20:03):
AndrewShmigs-MacBook-Pro:TimeMachine Backup new$ du -sh HabrahabrPages/
18G HabrahabrPages/
Фильтрация
Теперь необходимо избавиться от всех лишних файлов — это страницы с постами, которые были скрыты или те, которые еще не были созданы.
Параллельно обрабатывать можно каждую страницу, «выдирать» нужные нам данные и записывать их в другой файл (общий).
Из каждой записи в блоге мы будем получать следующую информацию:
- Дату публикации
- Кол-во просмотров
- Кол-во добавлений в избранное
- Кол-во комментариев
Исходный код парсера на Objective-C
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* getPublishDate(NSString *);
NSString* getPostViewsCount(NSString *);
NSString* getFavCount(NSString *);
NSString* getCommentsCount(NSString *);
NSString* removeTags(NSString *);
int main(int argc, const char * argv[])
{
FILE *output = fopen("/Volumes/TimeMachine Backup/HabrahabrData.txt", "a");
@autoreleasepool {
const int MAX = 200000;
int totalOk = 0;
for(int i=1; i<=MAX; i++) {
@autoreleasepool {
// NSString *url = [NSString stringWithFormat:@"http://habrahabr.ru/post/%d/", i];
// NSURL *link = [NSURL URLWithString:url];
// NSURLRequest *request = [NSURLRequest requestWithURL:link];
//
// NSError *error = nil;
// NSData *post = [NSURLConnection sendSynchronousRequest:request
// returningResponse:nil
// error:&error];
// NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrPages/%d.txt", i];
// [post writeToFile:path atomically:YES];
//
// NSLog(@"[%d / %d]", i, MAX);
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrPages/%d.txt", i];
NSString *page = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
if(nil == page) continue; // мой косяк с файлами
NSString *publishedAt = removeTags(getPublishDate(page));
NSString *viewsCount = removeTags(getPostViewsCount(page));
NSString *favsCount = removeTags(getFavCount(page));
NSString *commentsCount = removeTags(getCommentsCount(page));
if(nil == publishedAt) {
[[NSFileManager defaultManager] removeItemAtPath:path
error:nil];
continue; // closed post
}
totalOk++;
NSLog(@"%d,%@,%@,%@,%@", i, publishedAt, viewsCount, favsCount, commentsCount);
fprintf(output, "%d,%s,%s,%s,%s\n", i, [publishedAt UTF8String],
[viewsCount UTF8String], [favsCount UTF8String],
[commentsCount UTF8String]);
}
}
NSLog(@"totalOK: %d", totalOk);
fclose(output);
}
return 0;
}
NSString* removeTags(NSString *matchString) {
if(nil == matchString)
return nil;
NSRegularExpression *tagContent = [NSRegularExpression regularExpressionWithPattern:@">.+<"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString* resultingString;
[tagContent enumerateMatchesInString:matchString
options:0
range:NSMakeRange(0, [matchString length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
resultingString = [matchString substringWithRange:[result range]];
*stop = YES;
}];
return [resultingString substringWithRange:NSMakeRange(1, [resultingString length] - 2)];
}
NSString* getCommentsCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"id=\"comments_count\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *comments;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
comments = [html substringWithRange:[result range]];
*stop = YES;
}];
return comments;
}
NSString* getFavCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"title=\"Количество пользователей, добавивших пост в избранное\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *fav;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
fav = [html substringWithRange:[result range]];
*stop = YES;
}];
return fav;
}
NSString* getPostViewsCount(NSString *html) {
if(nil == html)
return nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"title=\"Просмотры поста\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *views;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
views = [html substringWithRange:[result range]];
*stop = YES;
}];
return views;
}
NSString* getPublishDate(NSString *html) {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"class=\"published\">.+</"
options:NSRegularExpressionCaseInsensitive
error:nil];
__block NSString *date;
[regex enumerateMatchesInString:html
options:0
range:NSMakeRange(0, [html length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
date = [html substringWithRange:[result range]];
*stop = YES;
}];
return date;
}
Всего статей, которые сейчас находятся в открытом доступе: 115468.
По этой (обновленный вариант) ссылке вы можете скачать файл с данными в следующем формате:
195428,26 сентября в 19:56,13667,264,37
В качестве разделителя выступает запятая. Параметры перечислены в следующем порядке:
- Идентификатор поста
- Дата публикации
- Кол-во просмотров
- Кол-во добавлений в избранное
- Кол-во комментариев
Если необходимо, то все файлы могу раздать или передать (скорее всего торрентом, в сжатом виде весит порядка 4 GB). Пишите в ЛС.
Следующее, что мы сделаем, так это приведем даты публикаций к единому формату:
TT:TT.DD.MM.YYYY
В текущих данных у нас могут встречаться следующие виды дат публикаций:
13 июля 2006 в 18:23
15 февраля в 05:27
Для простоты я исключил даты в формате (их буквально пару штук было, потери терпимые):
сегодня в 18:23
вчера в 17:44
Наш следующий парсер должен решать две задачи:
- Преобразовывать дату публикации в нужный формат
- Исправить (null) записи в столбце «Закладки» на «0» (null запись в столбце с просмотрами означает, что во время публикации статьи такого функционала еще не было)
Парсер преобразующий даты в нужный формат на Objective-C
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
FILE *output = fopen("/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt", "a");
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
if(0 == [components count])
continue;
NSString *newDateFormat = parseDate(components[1]);
NSString *newFavFormat = parseFav(components[3]);
if(nil == newDateFormat) {
continue;
}
components[1] = newDateFormat;
components[3] = newFavFormat;
NSString *newLine = [components componentsJoinedByString:@","];
NSLog(@"%@", newLine);
fprintf(output, "%s\n", [newLine UTF8String]);
}
}
fclose(output);
return 0;
}
NSString* parseDate(NSString *date) {
NSArray *components = [date componentsSeparatedByString:@" "];
NSUInteger count = [components count];
if(5 == count || 4 == count || 6 == count) {
// 0, 1, 2, 4
NSLog(@"date: %@", date);
NSString *day;
NSString *month = components[1];
if(6 == count) {
day = components[1];
month = components[2];
} else {
day = components[0];
month = components[1];
}
NSString *year;
if(5 == count) {
year = components[2];
} else {
year = @"2013";
}
NSString *time = [components lastObject];
NSArray *months = @[@"января", @"февраля", @"марта", @"апреля", @"мая",
@"июня", @"июля", @"августа", @"сентября", @"октября",
@"ноября", @"декабря"];
NSUInteger index = [months indexOfObject:month] + 1;
return [NSString stringWithFormat:@"%@.%@.%@.%@", time, day, @(index), year];
}
return nil;
}
NSString* parseFav(NSString *fav) {
if([fav isEqualToString:@"(null)"]) {
return @"0";
}
return fav;
}
Скачать файл в обновленном формате можно по этой ссылке.
1,18:23.13.7.2006,(null),4,32
2,00:45.14.7.2006,(null),0,34
По часам и минутам, дням, месяцам и годам
Примечание: обрабатываемые данные включают в себя записи начиная с 2006 года по 28 сентября 2013.
Вопрос: В какие часы суток публикуется наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int hours[24] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *time = [components[1] componentsSeparatedByString:@"."][0];
int hour = (int)[[time componentsSeparatedByString:@":"][0] integerValue];
hours[hour]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/HabrahabrByOurs.txt", "a");
for(int index=0; index<24; index++) {
fprintf(file, "%d, %d\n", index, hours[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/532/83c/8d6/53283c8d6d8926f7fc811521104d4187.png)
Вопрос: В какие минуты публикуется наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int mins[59] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *time = [components[1] componentsSeparatedByString:@"."][0];
int min = (int)[[time componentsSeparatedByString:@":"][1] integerValue];
mins[min]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/HabrahabrByOurs.txt", "a");
for(int index=0; index<60; index++) {
fprintf(file, "%d, %d\n", index, mins[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/6dc/4a3/f00/6dc4a3f009e04bf553b88a87dc69bc27.png)
Вопрос: В какие часы и минуты публикуется наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright © 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int time[1440] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *timeStr = [components[1] componentsSeparatedByString:@"."][0];
int min = (int)[[timeStr componentsSeparatedByString:@":"][1] integerValue];
int hour = (int)[[timeStr componentsSeparatedByString:@":"][0] integerValue];
time[hour*60+min]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", «a»);
for(int index=0; index<1440; index++) {
fprintf(file, "%d, %d\n", index, time[index]);
}
fclose(file);
return 0;
}
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright © 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int time[1440] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *timeStr = [components[1] componentsSeparatedByString:@"."][0];
int min = (int)[[timeStr componentsSeparatedByString:@":"][1] integerValue];
int hour = (int)[[timeStr componentsSeparatedByString:@":"][0] integerValue];
time[hour*60+min]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", «a»);
for(int index=0; index<1440; index++) {
fprintf(file, "%d, %d\n", index, time[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/b1e/207/688/b1e207688552aaaecbdd776c74b93701.png)
Вопрос: В какой день месяца публикуется наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int days[31] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int day = (int)[datetime[1] integerValue];
days[day]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=1; i<32; i++) {
fprintf(output, "%d,%d\n", i, days[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/9a4/8c6/e63/9a48c6e63e3999ee92e933bae28d180c.png)
Вопрос: В какой месяц публикуется наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int months[31] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *month = [components[1] componentsSeparatedByString:@"."][2];
months[(int)[month integerValue]]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
for(int index=1; index<13; index++) {
fprintf(file, "%d, %d\n", index, months[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/53e/f68/af6/53ef68af633c9cfc0a72869b0d3c4ac6.png)
Вопрос: В какой год было опубликовано наибольшее число постов?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int years[2020] = {0};
for(NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@","];
NSString *year = [components[1] componentsSeparatedByString:@"."][3];
years[(int)[year integerValue]]++;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
for(int index=2005; index<2014; index++) {
fprintf(file, "%d, %d\n", index, years[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/048/898/c2f/048898c2f126bca105967a8135ca8f5c.png)
Просмотры
Здесь, к сожалению, стоит отметить, что 63310 статей было написано до того, как был введен функционал фиксирования кол-ва просмотров статьи, поэтому мы будем работать только с той частью статей, в которых кол-во просмотров уже фиксировалось.
Вопрос: опубликовав пост в какую минуту можно получить максимальное кол-во просмотров?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int mins[60] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *views = parts[2];
if([views isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[views integerValue];
int min = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][1] integerValue];
mins[min]+=viewsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 60;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, mins[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/ccb/ae7/be4/ccbae7be4b2c5cf6e0d24f50b4c3a36d.png)
Средние значения:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int mins[60] = {0};
int minsCount[60] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
if([components[2] isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[components[2] integerValue];
mins[min]+=viewsCount;
minsCount[min]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=0; i<60; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/a4a/b5a/777/a4ab5a7772f3f2c018c38e03392eefcd.png)
Вопрос: в какие часы достигается максимальное кол-во просмотров?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int hours[60] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *views = parts[2];
if([views isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[views integerValue];
int hour = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][0] integerValue];
hours[hour]+=viewsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 60;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, hours[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/324/85a/373/32485a37313c7a01085984506d9ad76e.png)
Средние значения:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 24;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
if([components[2] isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[components[2] integerValue];
mins[hour]+=viewsCount;
minsCount[hour]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=0; i<MAX; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/e7f/f6a/bad/e7ff6abad65934eaff9a13285d1a807f.png)
Вопрос: в какие дни месяца достигается максимальное кол-во просмотров?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int days[31] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int day = (int)[datetime[1] integerValue];
if([components[2] isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[components[2] integerValue];
days[day]+=viewsCount;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=1; i<32; i++) {
fprintf(output, "%d,%d\n", i, days[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/327/bff/c27/327bffc27001fd11cf8aa4a3523b9a85.png)
Средние значения:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 32;
const int MIN = 1;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
if([components[2] isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[components[2] integerValue];
mins[day]+=viewsCount;
minsCount[day]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=MIN; i<MAX; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/922/db8/4f4/922db84f45cb27792f260ace36fef06d.png)
Избранное
Вопрос: опубликованные посты в какие минуты приносят своим владельцам больше всего добавлений в избранное?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int mins[60] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *favs = parts[3];
int favsCount = (int)[favs integerValue];
int min = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][1] integerValue];
mins[min]+=favsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 60;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, mins[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/48b/275/85a/48b27585a2b424c45108bdcc9ee0c871.png)
Средние значение:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 60;
const int MIN = 0;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
// if([components[2] isEqualToString:@"(null)"]) continue;
// int viewsCount = (int)[components[2] integerValue];
int favsCount = (int)[components[3] integerValue];
mins[min]+=favsCount;
minsCount[min]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=MIN; i<MAX; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/ef1/c3a/6f7/ef1c3a6f7505ffffd97a689b074cf432.png)
Вопрос: публикация поста в какой час приносит своему автору большее число добавлений в избранное?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int hours[24] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *favs = parts[3];
int favsCount = (int)[favs integerValue];
int hour = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][0] integerValue];
hours[hour]+=favsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 24;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, hours[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/014/9a7/cd4/0149a7cd44f5381db228073c2f4cc8a3.png)
Средние значения:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 24;
const int MIN = 0;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
// if([components[2] isEqualToString:@"(null)"]) continue;
// int viewsCount = (int)[components[2] integerValue];
int favsCount = (int)[components[3] integerValue];
mins[hour]+=favsCount;
minsCount[hour]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=MIN; i<MAX; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/0c1/d42/177/0c1d421776435dbc0fb34ce81cab77c4.png)
Вопрос: в какой день месяца публикация поста принесет автору максимальное кол-во добавлений в избранное?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int days[31] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int day = (int)[datetime[1] integerValue];
int favsCount = (int)[components[3] integerValue];
days[day]+=favsCount;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=1; i<32; i++) {
fprintf(output, "%d,%d\n", i, days[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/4e6/66e/bbb/4e666ebbb4e7951d9156d5bee8fe8f97.png)
Средние значения:
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 32;
const int MIN = 1;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
// if([components[2] isEqualToString:@"(null)"]) continue;
// int viewsCount = (int)[components[2] integerValue];
int favsCount = (int)[components[3] integerValue];
mins[day]+=favsCount;
minsCount[day]++;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=MIN; i<MAX; i++) {
fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/d65/617/8f0/d656178f0fe31f6614ff47d59806604e.png)
А вот только за 2013 год:
![](https://habrastorage.org/storage3/8bd/43e/9bc/8bd43e9bcf74c8bca0d9fd896e5aa4f1.png)
Вопрос: публикация в какой месяц принесет автору поста максимальное число добавлений в избранное?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int months[12] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *favs = parts[3];
int favsCount = (int)[favs integerValue];
int month = (int)[[parts[1] componentsSeparatedByString:@"."][2] integerValue];
months[month]+=favsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 1;
int end = 13;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, months[index]);
}
fclose(file);
return 0;
}
На Хабре декабрь прям какой-то месяц счастья и доброты :)
![](https://habrastorage.org/storage3/30f/63c/a58/30f63ca5889e81bac7c68c0e9a80f9e5.png)
Комментарии
Вопрос: публикация поста в какую минуту принесет автору наибольшее число комментариев?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int mins[60] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *comments = parts[3];
int favsCount = (int)[comments integerValue];
// int mins = (int)[[parts[1] componentsSeparatedByString:@"."][2] integerValue];
int min = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][1] integerValue];
mins[min]+=favsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 60;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, mins[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/784/968/807/7849688079710c56550274ca2925063e.png)
Вопрос: публикация поста в какой час принесут автору максимальное кол-во комментариев?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int hours[24] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *comments = parts[3];
int favsCount = (int)[comments integerValue];
// int mins = (int)[[parts[1] componentsSeparatedByString:@"."][2] integerValue];
int hour = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][0] integerValue];
hours[hour]+=favsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 0;
int end = 24;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, hours[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/4da/81b/157/4da81b15788208e1a5597fa42e438943.png)
Средние значения:
![](https://habrastorage.org/storage3/06e/6a5/e56/06e6a5e560025ff9d42ee78b131ac5da.png)
Только за 2013 год:
![](https://habrastorage.org/storage3/80c/108/dc3/80c108dc389b73f1da57ed6f8e814918.png)
Вопрос: публикация поста в какой день месяца принесет автору наибольшее кол-во комментариев?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int days[31] = {0};
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
int day = (int)[datetime[1] integerValue];
int comments = (int)[components[4] integerValue];
days[day]+=comments;
}
}
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(int i=1; i<32; i++) {
fprintf(output, "%d,%d\n", i, days[i]);
}
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/d26/2b5/e2d/d262b5e2da7aeb9143b7c6fe7b1c0451.png)
Вопрос: публикация в каком месяце принесет автору наибольше число комментариев?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int months[12] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *comments = parts[3];
int commentsCount = (int)[comments integerValue];
int month = (int)[[parts[1] componentsSeparatedByString:@"."][2] integerValue];
// int hour = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][0] integerValue];
months[month]+=commentsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 1;
int end = 13;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, months[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/071/094/9b0/0710949b0b73a4b1a488231c8fefb2c0.png)
Вопрос: публикация в каком году принесёт автору наибольшее число комментариев?
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedDate.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
int years[2020] = {0};
for(NSString *line in lines) {
NSArray *parts = [line componentsSeparatedByString:@","];
NSString *comments = parts[3];
int commentsCount = (int)[comments integerValue];
int year = (int)[[parts[1] componentsSeparatedByString:@"."][3] integerValue];
// int hour = (int)[[[parts[1] componentsSeparatedByString:@"."][0] componentsSeparatedByString:@":"][0] integerValue];
years[year]+=commentsCount;
}
FILE *file = fopen("/Volumes/TimeMachine Backup/RESULTS.txt", "a");
int start = 2005;
int end = 2014;
for(int index=start; index<end; index++) {
fprintf(file, "%d, %d\n", index, years[index]);
}
fclose(file);
return 0;
}
![](https://habrastorage.org/storage3/a8d/29c/03d/a8d29c03d5fdce1268d1f6e5d5230f6c.png)
Зависимость числа комментариев от числа просмотров
Objective-C
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 24;
const int MIN = 0;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
// if(year != 2013) continue;
if([components[2] isEqualToString:@"(null)"]) continue;
int viewsCount = (int)[components[2] integerValue];
// int favsCount = (int)[components[3] integerValue];
int comments = (int)[components[4] integerValue];
// mins[hour]+=comments;
// minsCount[hour]++;
fprintf(output, "%d,%d\n", viewsCount, comments);
}
}
// FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
// for(int i=MIN; i<MAX; i++) {
// fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
// }
fclose(output);
return 0;
}
![](https://habrastorage.org/storage3/ac7/241/114/ac7241114ce18c0ed42718326055de49.png)
Зависимость числа добавлений в избранное от числа комментариев
Objective-C Source Code
//
// main.m
// HabrahabrParser
//
// Created by AndrewShmig on 9/27/13.
// Copyright (c) 2013 AndrewShmig. All rights reserved.
//
#import <Foundation/Foundation.h>
NSString* parseDate(NSString *);
NSString* parseFav(NSString *);
int main(int argc, const char * argv[])
{
NSString *path = [NSString stringWithFormat:@"/Volumes/TimeMachine Backup/HabrahabrDataParsedData.txt"];
NSString *fileContent = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
NSArray *lines = [fileContent componentsSeparatedByString:@"\n"];
const int MAX = 24;
const int MIN = 0;
int mins[MAX] = {0};
int minsCount[MAX] = {0};
FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
for(NSString *line in lines) {
@autoreleasepool {
NSMutableArray *components = [[line componentsSeparatedByString:@","] mutableCopy];
NSArray *datetime = [components[1] componentsSeparatedByString:@"."];
// int hour = (int)[[datetime[0] componentsSeparatedByString:@":"][0] integerValue];
// int min = (int)[[datetime[0] componentsSeparatedByString:@":"][1] integerValue];
// int day = (int)[datetime[1] integerValue];
// int month = (int)[datetime[2] integerValue];
// int year = (int)[datetime[3] integerValue];
// if(year != 2013) continue;
// if([components[2] isEqualToString:@"(null)"]) continue;
// int viewsCount = (int)[components[2] integerValue];
int favsCount = (int)[components[3] integerValue];
int comments = (int)[components[4] integerValue];
// mins[hour]+=comments;
// minsCount[hour]++;
fprintf(output, "%d,%d\n", favsCount, comments);
}
}
// FILE *output = fopen("/Volumes/TimeMachine Backup/RESULT.txt", "a");
// for(int i=MIN; i<MAX; i++) {
// fprintf(output, "%d,%f\n", i, 1.0f * mins[i] / minsCount[i]);
// }
fclose(output);
return 0;
}
MATLAB Source Code
fid = fopen('/Volumes/TimeMachine Backup/RESULT.txt', 'r');
while ~feof(fid)
arr = fscanf(fid,'%d,%d',2);
favs = arr(1);
comments = arr(2);
hold on;
plot(comments, favs, '*b')
end
fclose(fid);
За качество этого графика приношу свои извинения, LibreOffice отказывается обрабатывать такое кол-во данных, а про Numbers молчу.
![](https://habrastorage.org/storage3/fe7/8aa/32c/fe78aa32c60e1fd33a894a86716c95a2.jpg)
По оси Х — кол-во комментариев, а по оси У — кол-во добавлений в избранное
Угадайка
Кто прикинет, что же изображено на этих графиках?
![](https://habrastorage.org/storage3/941/a04/13b/941a0413ba3062b8f2fb9fbfe2104625.jpg)
![](https://habrastorage.org/storage3/667/b14/377/667b14377975000da96eef3c4e5dd1ac.jpg)
![](https://habrastorage.org/storage3/4a1/966/6c8/4a19666c8a8df3ace05eae210b4f7d74.jpg)
В заключение
Спасибо за внимание!
Мы с большим нетерпением хотим уже показать Вам, что мы наработали на iOS и Android, но пока, к сожалению, это делать рано…