• Что такое вселенная?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Вселенная — четырехмерный (как минимум) объект, обладающий метрикой пространства-времени.
    Большой взрыв — самая ранняя по времени точка Вселенной. «До него» ничего и нигде существовать не могло, потому более ранних точек пространства-времени не существует.
    Вероятно, Вселенная бесконечна и «плоская», т.е. её геометрия евклидова — с хорошей точностью. Она более-менее однородно заполнена материей (в масштабах метагалактик, т.е. сотен мегапарсеков), и её масса бесконечна.
    Вложено ли пространство-время Вселенной в какое-нибудь пространство большей размерности — неизвестно. Есть теория «мембран», которая предполагает, что да. Но лучше считать, что нет(с).
    Говорить о «пространстве вокруг Вселенной» нельзя — она заполняет всё пространство. Расширение идёт не за счет движения — просто увеличивается расстояние между точками (обычно приводят пример надувающегося воздушного шарика, но надо учесть, что кроме поверхности этого шарика ничего нет — а все точки этой поверхности неподвижны). Так что вопрос «в какую сторону расширяется» смысла тоже не имеет. Просто расширяется.
    Другие перемещения есть. Например, местная группа галактик движется относительно реликтового излучения со скоростью 300 (или 600?) км/сек. Существует ли «более инертная» система отсчета, чем реликтовое излучение — пока неизвестно.
    В своём пространстве-времени Вселенная одна, и столкнуться ей не с кем. Другие Вселенные с нашей информационно не связаны. «Белых дыр», которые могли бы служить «выходами» порталов между Вселенными, пока не обнаружено, а что находится по ту сторону чёрных дыр — тоже неизвестно. Известно только, что оно в бесконечно далеком (по нашим часам) будущем.
    В теории мембран Вселенные столкнуться могут. Возможно, в результате таких столкновений и происходят события, видимые как «большой взрыв». Но это надо изучать подробнее.
    Ответ написан
    2 комментария
  • Предсказание будущего?

    nayjest
    @nayjest
    A future fantasy is no more than vain hope
    With wishful minds for which we grope
    I’d rather improve my current scope
    To an upward trend from a downward slope
    (Omar Khayyam)
    Ответ написан
    Комментировать
  • Посоветуйте конвертер из DJVU в PDF

    IronNem
    @IronNem
    DJView
    Отлично конвертирует в PDF (Export as ...). При экспорте лучше включить все компрессии — файл будет меньше.
    Юзаю для конверта для заливки в Kindle.
    Ответ написан
    Комментировать
  • Быстрый старт в мире систем управления версиями?

    @Stepuk
    Ответ написан
    Комментировать
  • Уделяет ли хабра-сообщество время на выбор/поиск обоин для рабочего стола?

    MiXei4
    @MiXei4
    Спасибо Бумбуруму :) — habrahabr.ru/company/asus/blog/110873/#comment_3532988
    С тех пор не менял её.
    Ответ написан
    Комментировать
  • Чьи портреты должны висеть в кабинете информатики?

    @parilov
    + отдельную секцию с портретами разработчиков компьютерных игр. Начиная с Пажитнова, Кармака и Сида Мейера.
    Ответ написан
    Комментировать
  • Солнечные батареи для ноутбука

    1) посмотрите в продуктах oyama-energy.ru/ — очень качественно
    2) не забывайте о способах экономии заряда ноута — lifehacker.ru/2010/05/26/17-sposobov-uvelichit-vremja-raboty-batarei-noutbuka/
    3) кроме солнца есть и другие варианты — www.instructables.com/id/Camping-Wind-Turbine/
    Ответ написан
    1 комментарий
  • Почему хабр отказался от %username%.habrahabr.ru

    @lesha_penguin
    Все равно никто ничего не скажет. Поэтому мои предположения:

    1) Снижение нагрузки на DNS.
    за: на каждое обращение к профилю юзера выполняется лишний ресолвинг. вносит задержки. лишняя нагрузка на сеть.
    против: новость «как DNS лег под хабрэффектом» хорошо опубликовать первого апреля.

    2) >9000 виртуальных хостов сильно огорчили сервер.
    за: очень возможно, особенно если они были «брутально» прописаны в конфиге апача.
    против: сильно сомневаюсь что оно так. Сотни-то хостинговых кампаний предлагают услуги виртуального хостинга, когда и поболее доменов висит на одном сервере, и чем хабр отличается? Да и высоконагруженные проекты с кучей поддоменов: тоже есть хорошие примеры, ЖеЖешечка например, так же, работает себе, и ничего!

    3) Виртуальные поддомены вначале планировались для чего-то еще, типа возможности для хабраюзеров создать свой мини-сайт на хабре. Но потом решили так не делать. А сейчас просто «выпилили нахрен столетний рудимент» во время очередной итерации рефакторинга.
    за: иногда код следует перебирать и архитектурно. куча заведомо мертвого кода в проекте — путь в никуда, как жизнь в городе-призраке!
    против: только зачем? если рудимент не мешает, то святой принцип: работает-не трогай!

    4) Поддомены *.habrahabr.ru хотят дать компаниям под корпоративные блоги (посолидней как-то ведь), а юзеров просто передвинут /users/username/.
    за: очень даже возможно. Маркетингово совершенно нелогично когда «компания» имеет какую-то «домашнюю страничку» /companies/thecompany/ а «юзер» получает целый «домен».
    против: а компаниям на это пофиг, у каждой из них есть свой корпоративный сайт.

    5) Поддомены *.habrahabr.ru хотят отдать под тематические блоги. Каждая тематика-свой поддомен.
    за: да, вообще-то логично! более логичнее, чем для юзеров!
    против: а смысл?

    6) Распределение нагрузки за счет наращивания количества обслуживающих серверов.
    за: если определенные юзерские данные были связаны с определенными серверами, то логично.
    против: все равно непонятно, если запрос проходит через rewrite то пофиг что домен что кусок пути.

    7) Юзеры стали злоупотреблять пиаристыми поддоменами username.habrahabr.ru.
    за: а что, *.habrahabr.ru — возможно попробовать как инструмент для раскрутки.
    против: «малокалиберно» слишком. тянет на материал для новости на первое апреля.

    8) Выкатывание какой-то принципиально новой фишки, где поддомен будет только мешать.
    за: неизвестно что это за фишка, может поддомены и сильно будет мешать!
    против: а неизвестно что это за фишка, может поддомены и не будут мешать;)

    9) Хабр собирается выкатить пачкой сразу кучу хабра-сервисов. Логичное предположение, если ХабраСторадж — только начало, а завта планируется уже ХабраБлекджек.
    за: habrastorage.habrahabr.ru для Хабрастораджа более правильно, чем постоянный риск «фишинг-батхертов» вида ha6past0rage.ru. Да и проще с одной кукой авторизации в одном домене.
    против: ну, а если какой-то проект предусматирвает «столь тесную интеграцию с хабром», то почему бы не habrahabr.ru/projectname/?
    Ответ написан
    Комментировать
  • Создание Garbage Collector-а

    @lesha_penguin
    Отвечая на вопрос, хочу поделиться одним хорошо себя зарекомендовавшим решением. Извиняюсь что для комментария «много букв», ибо только что хотел написать это как топик, но увы, у меня кармы пока нема…

    Представим что у нас есть очень-очень хитрая структура данных, элементами которой являются куча (возможно даже разнородных) объектов содержащие кучу ссылок на другие объекты этой структуры. Например, хитрый граф с циклами и прочими радостями. Само собой, наша реальная программа кроме этого хитрого графа, работает еще с кучей прочих объектов, в том числе, например, другие, не менее хитрые графы, на которые тоже нужна память, и вообще-то немало.

    Вроде бы «задача для школьников» написал структуры данных со всеми полями для вершин и ребер графа, а дальше вроде все просто, «все как по учебнику» — выделяй для них память из кучи с помощью malloc/new и проставляй указатели.

    Проблема возникает когда мы, поработали с данным графом и он нам больше не нужен. Кажущаяся простая задача «взять и освободить память для всех объектов», т.е. для каждого объекта вызвать соответствующий free/delete причем один один и только один раз, на деле оказывается не просто сложной а в общем случае NP-сложной. Т.е. вся предыдущая работа работа с этим хитрым графом может показаться «цветочками» по сравнению с попыткой найти в каком же порядке обойти элементы чтобы никого не забыть (ибо иначе утечка памяти) и вызвать освобождение каждого элемента только один раз (ибо при двойном освобождении мы нарушим логику других потоков нашей программы).

    По сравнению с внезапно свалившейся на нас проблемой идея использовать разные хитрые алгоритмы автоматического управления памятью, подсчета ссылок, сборки мусора и т.д. уже не кажутся для нас настолько уж бредовой идеей. Только в тупую прикрутить какую-нибудь библиотеку сборки мусора тоже оказыватся не всегда легко удается, ведь не все алгоритмы сбора мусора и подсчета ссылок корректно работают с циклическими ссылками.

    Однако давайте посмотрим в корень проблемы. Проблему сложности поэлементного освобождения как таковую порождает само поэлементное выделение обьектов из динамической памяти (кучи). Кстати, это в добавок ко всем остальным проблемам динамической памяти таким как фрагментация, замедление операций выделения/освобождения когда динамическая память представляет собой кашу из сотен тысяч фрагментов разного размера вперемешку с свободными элементами тоже разного размера (а именно такую адскую кашу представляет собой динамическая память у любителей STL).

    Решение может быть простым и изящным — аллокатор памяти без поэлементного освобождения. Звучит сложно, но реализация проста.

    Основой нашего аллокатора памяти служит чанк. Размер чанка может быть любым, главное чтобы он был больше максимального размера объекта. Идеальный вариант- зная (приблизительно) сколько нам нужно мы выбираем размер чанка. Если структура нашего графа заняла больше — ничего страшного, выделим еще один чанк.

    Сам чанк имеет следующую структуру:

    struct _alloc_pool_mem_chunk{ // чанк пула-аллокатора без поэлементного освобождения
      size_t size;  // размер данных чанка
      size_t curr;  // текущее заполнение чанка
      struct _alloc_pool_mem_chunk*next; // указатель на следующий чанк нашего пула
      uint8_t data[0]; // данные чанка
      };
    


    Выделение памяти из такого чанка элементарно:
    static void *memchunk_alloc_from_chunk(struct _alloc_pool_mem_chunk*ch,size_t s){
      if(!ch||!s){return 0;} // простая проверка
      if( (ch->size-ch->curr) < s){return 0;} // у нас в чанке свободно (ch->size-ch->curr) байт
      void *rv=&ch->data[ch->curr];
      ch->curr+=s; // сдвигаем на s байт
       return rv;
      }
    


    Если в чанке нет места для объекта, мы просто добавляем еще онин чанк:

    static struct _alloc_pool_mem_chunk *memchunk_add_chunk(struct _alloc_pool_mem_chunk **chp,size_t chunk_size){
      struct _alloc_pool_mem_chunk*ch=malloc(sizeof(struct  _alloc_pool_mem_chunk)+chunk_size);  // выделяем чанк 
      if(!ch){return 0;}
      ch->curr=0;
      ch->size=chunk_size;
      ch->next=*chp; // сцепляем чанки в связный список
      *chp=ср;
      return ch;
      }
    


    Вся процедура выделения памяти из такого аллокатора в простейшем виде:

    void *memchunk_alloc(struct _alloc_pool_mem_chunk **chp,size_t s,size_t chunk_size){
     void *rv; 
     static struct _alloc_pool_mem_chunk *ch=*chp;
     if((rv=memchunk_alloc_from_chunk(ch,s))){return rv;} // выделяем из текущего чанка
     if(!(ch=memchunk_add_chunk(chp,chunk_size))){return 0;} // не удалось добавить чанк-облом
     rv=memchunk_alloc_from_chunk(ch,s);  // выделаем из нового чанка
     return rv;
      }
    


    Функция освобождения всего пула-просто обходим все чанки:

    void memchunk_free_all(struct _alloc_pool_mem_chunk **chp){
      struct _alloc_pool_mem_chunk *ch=*chp;
      while(ch){
         struct _alloc_pool_mem_chunk *chn=ch->next;
         free(ch);
         ch=chn;
         }
      }
    


    Достоинства:
    • Чрезвычайная простота реализации. Даже школьник способен с первого раза за несколько минут написать безошибочно такой аллокатор. Кстати код выше я не копипастил а просто набрал по памяти (из ошибок могут быть очепятки).
    • Низкий overhead. всего 12/24 байта (x86/x86_64) на чанк.
    • Не фрагментирует память. Существенное достоинство, особенно когда элементов сотни тысяч.
    • Выделение элемента работает быстрее, в разы быстрее чем malloc/new. (Выделение памяти для элемента из чанка 3 строки). Освобождение элемента — вообще nop!
    • Если нам вдруг захочется threadsafe — мы легко получим всего лишь заменив запись ch->curr+=s на cmpxchg и добавив какой-нибудь легковесный примитив типа spinlockа на добавление чанка.
    • У нас свой быстрый и легковесный garbage collector с коммандой «освободи все». Пройти по (NB: небольшому) списку чанков — это не считать ссылки в миллионах объектов.
    • Да, контроль занятой памяти нашей хитрой структурой. Мы всегда можем быстро сказать, что например этот граф занимает 3.5Mb, просто пробежавшись по чанкам.
    • Проверенно лично мною на десятке highload-проектов.


    Недостатки:
    • А они бывают только в тех случаях, если этот аллокатор использовать для непредусмотренных целей:)


    P.S.: Желаю всем хабраюзерам приятных экспериментов.
    Ответ написан
    5 комментариев
  • Помогите найти Opera 9.8

    Vas3K
    @Vas3K
    По заявлениям разработчиков, некоторые сайты плохо обрабатывали двузначные версии Opera и творили много плохого. Поэтому для 10.х и 11.х решили сделать 9.80 в юзерагенте.
    Ответ написан
    Комментировать