Как это сделано – парсинг статей как в Getpocket, Вконтакте, Readability

Для меня всегда было некоей магией то, как Getpocket, Readability и Вконтакте парсят ссылки на страницы и предлагают готовые статьи к просмотру без рекламы, сайдбаров и меню. При этом они практически никогда не ошибаются. А недавно подобная задача назрела и в нашем проекте, и я решил копнуть поглубже. Сразу скажу, что это «белый» парсинг, вебмастеры сами добровольно пользуются нашим сервисом.

В идеальном мире вся информация на страницах должна быть семантически размечена. Умные люди придумали много полезных штук типа Microdata, OpenGraph, тэги Article, Nav …etc, но полагаться на сознательность вебмастеров в плане семантики я бы не спешил. Достаточно самим посмотреть код страниц популярных сайтов. Open Graph кстати самый востребованный формат, всем хочется красиво выглядеть в соц. сетях

Вычленение заголовка статьи и картинки остается за рамками моего поста, так как заголовок обычно берется из title или og, а картинка если она не берется из og:image – это отдельный рассказ.

Переходим к самому интересному – вычленению тела статьи.
Оказывается, есть вполне себе научные paper’ы посвященные этой проблеме (в том числе от сотрудников Гугла). Есть даже соревнование CleanEval с набором тестовых страниц из которых надо извлечь данные, и алгоритмы соревнуются в том кто сделает это точнее.

Выделяются следующие подходы:

  • Извлечение данных пользуясь только html документом (DOM и текстовый уровень). Именно эту технику мы обсудим ниже
  • Извлечение данных используя отрендеренный документ с помощью computer vision. Это очень точный алгоритм, но и самый сложный и прожорливый. Посмотреть как работает можно например вот здесь: www.diffbot.com/ (проект ребят из Стэнфорда).
  • Извлечение данных на уровне сайта целиком, сравнивая однотипные страницы и находя различия между ними (различающиеся блоки это по сути и есть нужный контент). Этим занимаются большие поисковики.

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

Парсить будем страницу http://habrahabr.ru/post/198982/

Список кандидатов на то чтобы стать статьей

Берем все элементы разметки структуры страницы (для простоты — div) и текст который в них содержится (если он есть). Наша задача получить плоский список DIV элемент –> текст в нем

Например блок меню на Хабре:

Дает нам элемент содержащий текст «посты q&a события хабы компании»

При наличии вложенных div элементов, их содержание отбрасывается. Дочерние div будут обработаны в свою очередь. Пример:

Мы получим два элемента, в одном текст ©habrahabr.ru, а во втором Служба поддержки Мобильная версия

Мы предполагаем что в 21 веке элементы которые семантически предназначены для разметки структуры (div), не используют для разметки параграфов в тексте, и это на топ 100 новостных сайтов действительно так.

В итоге из дерева у нас получается плоский набор:

И так, у нас есть набор в котором надо классифицировать статью. Далее, с помощью различных довольно простых алгоритмов каждому элементу мы будем понижать или повышать коэффициент вероятности наличия в нем статьи.

DOM дерево мы не выкидываем, оно нам понадобится в алгоритмах.

Находим повторяющиеся паттерны.

Во всех элементах DOM дерева мы находим элементы с повторяющимися паттернами в атрибутах (class, id..). Например если приглядится к комментариям:

Становится понятно, что такое повторяющийся паттерн:

  • Одинаковый набор классов у элементов
  • Одинаковая текстовая подстрока в id

Все эти элементы и их «детишек» мы пессимизируем, то есть ставим некоторый понижающий коэффициент в зависимости от количества найденных повторений.
Когда я говорю про «детишек» я имею ввиду, что все вложенные элементы (включая те которые попали в наш набор для классификации) получат пессимизацию. Вот, например, элемент с текстом комментария тоже попадает под раздачу:

Соотношение ссылок и обычного текста в элементе.

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

Соотношение элементов разметки текста к тексту

Чем больше в блоке всякой разметки (списки, переносы, span…), тем меньше шанс, что это статья. Например, реклама вероятно уважаемой SEO компании, не очень похожа на статью, так как целиком представляет собой список. Чем ниже значение соотношения разметки к тексту тем лучше.

Количество точек (предложений) в тексте.

Здесь мы уже почти заползли на территорию численной лингвистики. Дело в том, что в заголовках и меню точки практически не ставятся. А вот в теле статьи их много.
Если какие-то меню и списки новых материалов на сайте еще пролезли через предыдущие фильтры, то можно добить подсчетом точек. Не очень-то их много в блоке лучшее:

Чем больше точек, тем лучше, и мы повышаем шансы данному элементу на получения гордого звания статьи

Количество блоков с текстом примерено одинаковой длины

Много блоков с текстом примерно одной длины это плохой признак, особенно если текст короткий. Мы такие блоки пессимизируем. Идея хорошо сработает на подобной верстке:

В примере не Хабр, так как данный алгоритм лучше работает на более строгих сетках. На комментариях на Хабре сработает к примеру не очень хорошо.

Длина текста в элементе

Здесь прямая зависимость – чем длиннее текст в элементе, тем больше шансов на то, что это статья.

Причем вклад этого параметра в итоговую оценку элемента очень существенен. 90% случаев парсинга статьи можно решить одним этим методом. Все предыдущие изыскания поднимут этот шанс до 95%, но при этом скушают львиную долю процессорного времени.

Однако представьте: комментарий размером с саму статью. Если просто определять статью по длине текста случится конфуз. Но есть высокий шанс, что предыдущие алгоритмы немного подрежут крылья нашему комментатору-графоману, так как элемент будут пессимизирован за повторяющийся паттерн в id или классе.

Или еще один случай — увесистое выпадающее меню сделанное с применением <ul><li>. Вроде текста много, но мы то видим что там все в разметке и ссылках.

Итоговый результат

Зная базовые подходы, мы можем реализовать алгоритмы и подобрать вручную или машинным обучением необходимые веса/коэфициенты. В итоге мы получаем список кандидатов, каждый из которых получил свои плюсы и минусы:

Выводы

Современные подходы и алгоритмы позволяют по одному только тексту страницы добиться качества распознания статьи около 95%.
Однако есть ярко выраженные случаи когда алгоритм не сработает. К примеру есть статья на 300 слов, к ней один комментарий на 350 слов, и внизу сайта в футере написан SEO текст на 400 слов.

Повышение качества достигается учетом «оформления» текста (смотрим еще и CSS), рендериногом страницы (тяжелый алгоритм) или сравнением нескольких однотипных страниц с сайта.

Некоторые использованные материалы

Christian Kohlschütter, Peter Fankhauser, Wolfgang Nejdl
Boilerplate Detection using Shallow Text Features

J. Gibson, B. Wellner, and S. Lubar.
Adaptive web-page content identication.

Hung-Yu Kao, Jan-Ming Ho
WISDOM: Web Intrapage Informative Structure
Mining Based on Document Object Model

Готовые алгоритмы для вашего языка можно найти по запросам «boilerplate algorithm», «readability algorithm „

ссылка на оригинал статьи http://habrahabr.ru/company/mailru/blog/200394/

Как работает первый в мире Bitcoin-обменник

image

Открывшийся в Ванкувере в этот вторник (как и обещалось ранее) Bitcoin-обменник оказался довольно популярным: в первый же день терминал совершил 81 операцию с общим денежным оборотом в 10 000$. При этом любопытно то, что примерно треть из этих восьмидесяти человек впервые имели дело с криптовалютой: образно говоря, пришли посмотреть, что это такое.

Условия работы обменника таковы, что приватность всё-таки потенциально может пострадать: для выполнения операций аппарат требует сканирования ладони; также он умеет сканировать QR-код кошелька с экрана смартфона. Дневной лимит составляет 3000 канадских долларов — ограничение связано с местным законодательством по противодействию отмыванию денег. Обмен внесённых сумм в биткойны выполняется на канадской бирже VirtEx, кроме того, при делании, можно получить чек.

Видео работы интерфейса обменника под катом.

[Источник]

ссылка на оригинал статьи http://habrahabr.ru/post/200390/

My Opera закрывается в марте 2014

Когда форумы поддержки My Opera были впервые запущены в 2001 году, они быстро стали важным местом для встречи с вами, нашими пользователями. Мы так много и полезно общались с вами, что решили сделать из форумов и сообщества нечто большее. И в 2006 году у нас родилась глупая, но забавная идея:

А что если запустить наши форумы на стероидах?
Давайте сделаем сайт, где можно публиковать записи в блоге,
делиться фотографиями и добавлять добавлять друзей.

В то время не было достаточно хороших сервисов для того, что мы хотели. Поэтому мы решили создать его сами.

Мы увидели, что сервис My Opera вырос из форумов в домашний сайт для активного сообщества. Идея дать вам место для блога с фотками превратилась для нас в интересный и очень большой дополнительный проект. Мы наблюдали с годами, как социальные сети и блог-платформы растут налево и направо и предлагают всё больше интересных возможностей, гораздо больше, чем мы могли бы поддерживать. Эти возможности были их прямым бизнесом. Вы конечно знаете все эти платформы и наверняка их используете.

Взрывное развитие таких сайтов и количество ресурсов, необходимых на поддержание нашго собственного, изменило наш взгляд на My Opera. Это была длинная и очень интересная история, но мы верим, что для ваших блогов есть гораздо лучшие места и поэтому мы приняли решение закрыть My Opera 1 марта 2014 года.

Наши форумы перезжают на blogs.opera.com, пока их четыре: Новости, Десктоп, Мобильные, Безопасность.

Это случится через 5 месяцев — мы хотим дать вам достаточно времени на то, чтобы переехать на новый сервис и подумать, что сделать с существующими записями. Чтобы сделать этот переезд как можно удобнее, мы создали два инструмента, которые помогут вам сохранить ваши записи и фотографии. Вы можете сделать это в два простых шага:

  1. Экспортировать ваш блог — вы сможете перенести получившееся на WordPress, Squarespace, Typepad, Movable Type, Drupal и многие других блог-платформы.
  2. Сохранить всё его содержимое — читайте подробнее по ссылке.

Найти новый дом для вашего блога может быть непросто. Мы рекомендуем вам две статьи на Lifehacker:

Мы приготовили некоторые ответы на вопросы по My Opera и процедуре закрытия, которые могут у вас возникнуть:

Что случиться с моей почтой на My Opera?

Как и весь сервис, почта My Opera тоже будет закрыта. Мы советуем вам зарегистрировать на другом почтовом сервисе и сохранить все нужные письма. Также будет хорошей идеей настроить автоответчик My Opera в ответ на письма, который расскажет вашим контактам о новом адресе. Некоторые почтовые сервисы: Наши друзья FastMail, Яндекс.Почта, Mail.Ru, Gmail, Outlook, Yahoo! Mail и многие другие.

Что будет с веб-интерфейсом Opera Link?

Он будет доступен на link.opera.com. Просто войдите с помощью вашего логина на My Opera и вы получите доступ ко всему синхронизированному содержимому.

Затронет ли это другие сервисы Opera, вроде addons.opera.com?

Нет, вы по-прежнему сможете использовать ваш логин на My Opera для доступа к расширениям и комментариям.

Что случится с комментариями в моём блоге на My Opera?

Комментарии будут экспортированы вместе с записями в блоге.

Что случится со старыми комментариями в блогах Opera?

Наши новые блоги на blogs.opera.com используют систему комментирования Disqus, куда не импортировать старые комментарии, поэтому старые комментарии останутся на My Opera.

Что будет с форумами?

Форумы переедут на домен opera.com. Самые важные топики переедут на новые форумы и вы сможете продолжить обсуждения с помощью вашего логина My Opera. Другими словами: ваш логин My Opera станет новым логином Opera, который вы сможете использовать для всех наших сервисов и продуктов.

Спасибо, что были с нами все эти годы. Давайте продолжим общение на blogs.opera.com, а также в Google+, Твитере и Фейсбуке.

ссылка на оригинал статьи http://habrahabr.ru/company/opera/blog/200388/

Создание модуля под Drupal 7. Часть 2

Предисловие

В первой части я показал как создавать модуль под Drupal 7. И как я и обещал, теперь покажу как добавлять к модулям js-файлы (использовать в них jQuery) и как осуществляется его локализация.

Добавление js-файлов

Для начала создадим в папке с модулем любой js-файл. Я назвал его main.js.

Далее добавляем в файл rss_feeds.info строку:

scripts[] = main.js

В своем модуле я использовал jQuery. В main.js я реализую функции для кнопки «Вверх». Для того, чтобы не было конфликтов, необходимо написать следующее:

(function ($) {  })(jQuery); 

И в этой конструкции пишем код:

$.fn.extend({         topMouseover: function(self) {             this.on('mouseover',function() {                 self.opacity.stop().animate({opacity:"1"},300);                 self.button.stop().animate({opacity:"1"},300);             });         },         topMouseout: function(self) {             this.on('mouseout',function() {                 self.opacity.stop().animate({opacity:"0"},300);                 self.button.stop().animate({opacity:"0.4"},300);             });         },         wScroll: function(g) {             if(g == 0) this.removeClass("no-count");             if(!this.hasClass("no-count")){                 if(g > 500 && this.is(":hidden")){                     this.addClass("visible");                     this.css("cursor","pointer");                     this.fadeIn(500);                     this.click(function(){                         $("body, html").animate({scrollTop:0},600);                         this.fadeOut(300);                         this.addClass("no-count");                     });                 }                 if(g < 200 && this.hasClass("visible")){                     this.removeClass("visible");                     this.fadeOut(300);                 }             }else{                 this.unbind("click");             }         }     });      function toTopBtn(toTop, opacity, btn) {         this.toTopBtn = $(toTop);         this.opacity = $(opacity);         this.button = $(btn);         this.windowScroll();         this._init();         return this;     }      toTopBtn.prototype = {         _init: function () {             var self = this;             this.toTopBtn.topMouseover(self);             this.toTopBtn.topMouseout(self);         },         windowScroll: function() {             var g = $(window).scrollTop();             this.toTopBtn.wScroll(g);         }     }     $(document).ready(function() {         upButton = new toTopBtn(".toTopWrapper",".toTopOpacity",".toTopBtn");          $(window).scroll(function(){             upButton.windowScroll();         });     }); 

Но по умолчанию в Drupal 7 идет jQuery 1.4.4. Функция .on() в ней не реализована. Для обновления jQuery скачайте модуль Query Update. В нем все интуитивно понятно. В настройках выбираем нужную версию (я выбрал 1.8).

Для того, чтобы кнопка отображалась, изменяем файл rssfeeds_content.tpl.php:

<div class="toTopWrapper"> 	<div class="toTopOpacity"></div> 	<div class="toTopPanel" title="Up"> 		<div class="toTopBtn"> 			<span class="arrow">↑</span> <span class="label">up</span> 		</div> 	</div> </div> <br><br> <?php foreach ($items->channel->item as $item): ?> 	<span class="title"><a href="<?php echo $item->link; ?>"><?php echo $item->title; ?></a></span><br><br> 	<?php echo $item->description; ?><br><br><?php echo $item->pubDate; ?> 	<hr><br><br> <?php endforeach; ?> 

… и добавляем стили в main.css:

/* "TO UP" BUTTON */  .toTopWrapper { 	position:fixed; 	top:0; 	bottom:0; 	left:0; 	width:7%; 	display:none; 	background-color: #87ceeb; 	opacity: 0.3; }  .toTopOpacity { 	position:fixed; 	top:0; 	bottom:0; 	left:0; 	width:7%; 	background-color: #87ceeb; 	opacity: 0.1; } .toTopWrapper .toTopPanel { 	width:100%; 	height:100%; 	font-size:13px; 	color: black; 	padding-top:10px; 	position:relative; } .toTopWrapper .toTopBtn { 	text-align:left; 	line-height:15px; 	margin-left: 30%; 	font-family:tahoma,arial,verdana,sans-serif; 	font-weight:bold; 	opacity: 0.2; } .toTopWrapper .toTopBtn .arrow{ 	font-size:14px; 	font-weight:bold; 	vertical-align:middle; }  /* END OF "TO UP" BUTTON */ 

Теперь на странице отображения контента RSS-ленты будет появляться кнопка «Вверх».

Локализация модуля

Все переводы модуля хранятся в папке translations и состоят как минимум из двух файлов — modulename.pot (это шаблон перевода) и modulename.po (непосредственно сам перевод).

Чтобы генерировать эти файлы используется модуль Translation Template Extractor. Скачиваем и устанавливаем этот модуль. Теперь переходи на страницу admin/config/regional/translate и выбираем вкладку EXTRACT. Выбираем наш модуль и нажимаем Extract:

Получаем файл шаблона rss_feeds.pot, и сохраняем его в папку модуля translations.

Потом проделываем все то же, только ставим переключатель на Template file for Russian translations и ставим галочку на Include translations. Сохраняем полученный перевод rss_feeds.ru.po в эту же папку.

Теперь остается только открыть .po-файл и вписать туда свои переводы. Теперь при установке модуля перевод будет автоматически импортироваться.

Заключение

На этом я закончу написание статей на тему разработки модулей под Drupal. Получившийся модуль показывает очень маленькие возможности Drupal’a, поэтому остается много того, что стоит узнать. Надеюсь эти статьи кому-нибудь помогут в начале пути изучения Drupal.

Спасибо за внимание!

ссылка на оригинал статьи http://habrahabr.ru/post/200382/

Переходим на Fusion Drive (Mac OS X Mavericks)

В статье Переходим на Fusion Drive я изложил способы, которые связаны с потерей информации на подопытных дисках. К счастью недавно появилась возможность этого избежать.

Свою предыдущую статью про Fusion Drive я закончил несколько грустным замечанием о невозможности создания FD налету, без необходимости переноса данных с дисков. Нельзя было и манипулировать дисками (добавлять и удалять) в созданном FD. К счастью ситуация изменилась в Mac OS X Mavericks. Спасибо инженерам Apple.

Использованное железо и софт:

  • Mac OS X 10.9.0
  • виртуальный диск 40Gb (системный диск)
  • виртуальный диск 5Gb (диск которым присоединим к созданному FD)

Все операции я проделал на виртуальной машине, т.к. реальные давно работают с FD.
Перед началом конвертирования диска убедитесь в наличие резервной копии системы!

Система до модернизации

bash-3.2# diskutil list /dev/disk0    #:                       TYPE NAME                    SIZE       IDENTIFIER    0:      GUID_partition_scheme                        *42.9 GB    disk0    1:                        EFI EFI                     209.7 MB   disk0s1    2:                  Apple_HFS Macintosh HD            42.6 GB    disk0s2 

Подготовим существующий раздел диска disk0s2 для FD.

bash-3.2# diskutil cs convert disk0s2 Started CoreStorage operation on disk0s2 Macintosh HD Resizing disk to fit Core Storage headers Creating Core Storage Logical Volume Group Attempting to unmount disk0s2 Switching disk0s2 to Core Storage Couldn't unmount disk0s2; converted volume won't appear until it's unmounted Core Storage LVG UUID: 59142646-86FC-4E01-983F-43E167B23D45 Core Storage PV UUID: 6EF1FB47-1953-45D0-976A-4B99A5809C10 Core Storage LV UUID: 29DC7C2D-3D59-4029-AE68-25404CD45D7A Finished CoreStorage operation on disk0s2 Macintosh HD 

Система сообщает, что диск конвертирован, но появится после размонтирования. Проверяем новую конфигурацию:

# diskutil cs list CoreStorage logical volume groups (1 found) | +-- Logical Volume Group 59142646-86FC-4E01-983F-43E167B23D45     =========================================================     Name:         Macintosh HD     Status:       Offline     Size:         0 B (0 B)     Free Space:   -none-     |     +-< Physical Volume 6EF1FB47-1953-45D0-976A-4B99A5809C10         ----------------------------------------------------         Index:    0         Disk:     disk0s2         Status:   Checking         Size:     42605699072 B (42.6 GB)  

Перезагружаемся и попутно добавляем виртуальный диск 5Гб для расширения дискового пространства.

# diskutil cs list CoreStorage logical volume groups (1 found) | +-- Logical Volume Group 59142646-86FC-4E01-983F-43E167B23D45     =========================================================     Name:         Macintosh HD     Status:       Online     Size:         42605699072 B (42.6 GB)     Free Space:   16777216 B (16.8 MB)     |     +-< Physical Volume 6EF1FB47-1953-45D0-976A-4B99A5809C10     |   ----------------------------------------------------     |   Index:    0     |   Disk:     disk1s2     |   Status:   Online     |   Size:     42605699072 B (42.6 GB)     |     +-> Logical Volume Family 6F8A2C40-860F-411A-B4D0-9BA2380504FB         ----------------------------------------------------------         Encryption Status:       Unlocked         Encryption Type:         None         Conversion Status:       NoConversion         Conversion Direction:    -none-         Has Encrypted Extents:   No         Fully Secure:            No         Passphrase Required:     No         |         +-> Logical Volume 29DC7C2D-3D59-4029-AE68-25404CD45D7A             ---------------------------------------------------             Disk:                  disk2             Status:                Online             Size (Total):          42270150656 B (42.3 GB)             Conversion Progress:   -none-             Revertible:            Yes (no decryption required)             LV Name:               Macintosh HD             Volume Name:           Macintosh HD             Content Hint:          Apple_HFS 

Видим, что система активировала FD диск и использует его. Добавленный виртуальный диск получил имя disk0, сконвертированный диск — disk1, объединённый диск FD — disk2.

# diskutil list /dev/disk0    #:                       TYPE NAME                    SIZE       IDENTIFIER    0:                                                   *5.4 GB     disk0 /dev/disk1    #:                       TYPE NAME                    SIZE       IDENTIFIER    0:      GUID_partition_scheme                        *42.9 GB    disk1    1:                        EFI EFI                     209.7 MB   disk1s1    2:          Apple_CoreStorage                         42.6 GB    disk1s2    3:                 Apple_Boot Boot OS X               134.2 MB   disk1s3 /dev/disk2    #:                       TYPE NAME                    SIZE       IDENTIFIER    0:                  Apple_HFS Macintosh HD           *42.3 GB    disk2 

Смотрим параметры запуска недокументированной команды

# diskutil cs addDisk Usage:  diskutil coreStorage addDisk lvgUUID NewMemberDeviceName Add a new physical volume to a CoreStorage logical volume group. Ownership of the affected disks is required. Example: diskutil coreStorage addDisk          11111111-2222-3333-4444-555555555555 disk4s2 

Запускаем команду добавления диска disk0 в LVG 59142646-86FC-4E01-983F-43E167B23D45

bash-3.2# diskutil cs adddisk 59142646-86FC-4E01-983F-43E167B23D45 disk0 Started CoreStorage operation on disk0 Unmounting disk0 Repartitioning disk0 Unmounting disk Creating the partition map Rediscovering disk0 Adding disk0s2 to Logical Volume Group Switching disk0s2 to Core Storage Waiting for Logical Volume Group to come back online Core Storage PV UUID: 4C255180-5FDD-4BF8-8CAD-EFA5F1B5C0B8 Finished CoreStorage operation on disk0 

Проверяем что получилось

# diskutil cs list CoreStorage logical volume groups (1 found) | +-- Logical Volume Group 59142646-86FC-4E01-983F-43E167B23D45     =========================================================     Name:         Macintosh HD     Status:       Online     Size:         47630434304 B (47.6 GB)     Free Space:   4756291584 B (4.8 GB)     |     +-< Physical Volume 6EF1FB47-1953-45D0-976A-4B99A5809C10     |   ----------------------------------------------------     |   Index:    0     |   Disk:     disk1s2     |   Status:   Online     |   Size:     42605699072 B (42.6 GB)     |     +-< Physical Volume 4C255180-5FDD-4BF8-8CAD-EFA5F1B5C0B8     |   ----------------------------------------------------     |   Index:    1     |   Disk:     disk0s2     |   Status:   Online     |   Size:     5024735232 B (5.0 GB)     |     +-> Logical Volume Family 6F8A2C40-860F-411A-B4D0-9BA2380504FB         ----------------------------------------------------------         Encryption Status:       Unlocked         Encryption Type:         None         Conversion Status:       NoConversion         Conversion Direction:    -none-         Has Encrypted Extents:   No         Fully Secure:            No         Passphrase Required:     No         |         +-> Logical Volume 29DC7C2D-3D59-4029-AE68-25404CD45D7A             ---------------------------------------------------             Disk:                  disk2             Status:                Online             Size (Total):          42270150656 B (42.3 GB)             Conversion Progress:   -none-             Revertible:            No             LV Name:               Macintosh HD             Volume Name:           Macintosh HD             Content Hint:          Apple_HFS 

Обратите внимание, что теперь у нас в группе томов два физических тома (Physical Volume), но система пока использует только первый и есть 5Гб свободного пространства.
Теперь необходимо расширить Logical Volume 29DC7C2D-3D59-4029-AE68-25404CD45D7A до максимально возможного размера Size: 47630434304 B (47.6 GB).

Теоретически должна работать команда

bash-3.2# diskutil cs resizevolume  29DC7C2D-3D59-4029-AE68-25404CD45D7A  47630434304B 

В моем случае выдавалась ошибка о недостаточном свободном пространстве. Я перевёл 47630434304B в килобайты и запустил

bash-3.2# diskutil cs resizevolume 29DC7C2D-3D59-4029-AE68-25404CD45D7A 46514096k The Core Storage Logical Volume UUID is 29DC7C2D-3D59-4029-AE68-25404CD45D7A Started CoreStorage operation Checking file system ... Growing Logical Volume Resizing Core Storage Logical Volume structures Resized Core Storage Logical Volume to 46514094080 bytes Growing file system Finished CoreStorage operation 

При тестировании на другой виртуальной машине всё работало когда указывал размер в байтах и диск создался максимально возможного размера. Видимо дело в размере дисков. Можно пытаться запускать команду постепенно уменьшая размер в байтах или как сделал я.

Итог

# diskutil cs list CoreStorage logical volume groups (1 found) | +-- Logical Volume Group 59142646-86FC-4E01-983F-43E167B23D45     =========================================================     Name:         Macintosh HD     Status:       Online     Size:         47630434304 B (47.6 GB)     Free Space:   512348160 B (512.3 MB)     |     +-< Physical Volume 6EF1FB47-1953-45D0-976A-4B99A5809C10     |   ----------------------------------------------------     |   Index:    0     |   Disk:     disk1s2     |   Status:   Online     |   Size:     42605699072 B (42.6 GB)     |     +-< Physical Volume 4C255180-5FDD-4BF8-8CAD-EFA5F1B5C0B8     |   ----------------------------------------------------     |   Index:    1     |   Disk:     disk0s2     |   Status:   Online     |   Size:     5024735232 B (5.0 GB)     |     +-> Logical Volume Family 6F8A2C40-860F-411A-B4D0-9BA2380504FB         ----------------------------------------------------------         Encryption Status:       Unlocked         Encryption Type:         None         Conversion Status:       NoConversion         Conversion Direction:    -none-         Has Encrypted Extents:   No         Fully Secure:            No         Passphrase Required:     No         |         +-> Logical Volume 29DC7C2D-3D59-4029-AE68-25404CD45D7A             ---------------------------------------------------             Disk:                  disk2             Status:                Online             Size (Total):          46514094080 B (46.5 GB)             Conversion Progress:   -none-             Revertible:            No             LV Name:               Macintosh HD             Volume Name:           Macintosh HD             Content Hint:          Apple_HFS 

Всем успешного перехода на Fusion Drive!

ссылка на оригинал статьи http://habrahabr.ru/post/200362/