Тестирование консольной бета-версии

Coordinator
Sep 26, 2013 at 6:18 PM
Edited Sep 27, 2013 at 4:04 PM
Очень нужны люди, которые могли-бы протестировать консольную бету TinyOPDS на Windows (как обычное приложение, и как сервис), и, в особенности, на Linux: под "линухом" без X, с чистой командной строки и только с минимальным mono (mono-runtime).

Еще было-бы интересно, чтобы кто-нибудь попробовал "поднять" консольный TinyOPDS непосредственно на роутере (работающем на linux-based прошивке), или на NAS-е. Тут потребуются знания, чуть повыше, чем у простого пользователя; возможно, потребуется собрать последнюю версию mono-runtime под дивайс. Но, как мне кажется, это будет весьма интересно.

Итак, консольные версии TinyOPDS для Windows и Linux

ссылка на фолдер на dropbox-е

Отличие версии под Linux: я убрал reference на System.ServiceProcess (думаю, что под Linux он не нужен). Впрочем, на тестовой Ubuntu (правда, с monodevelop и вообще с mono*) работают обе версии.

Что не работает (под Linux-ом): экспериментальная возможность web-доступа (т.е. как обычный сайт); эта "фича" в процессе разработки (благо, нашелся разработчик) и, думаю, появится в релизе 1.2

Консольная версия использует user.config файл настроек от GUI-шной версии; опции достаточно прозрачны, поэтому я не буду их подробно расписывать. Изменить опции можно как через GUI, либо в простом текстовом редакторе. Если что-то непонятно - спрашивайте.

Опции командной строки TinyOPDSConsole:

install - install and run TinyOPDS service (Windows only)
uninstall - uninstall TinyOPDS service (Windows only)
start - start service
stop - stop service (Windows only)
scan - scan book directory
encred usr pwd - encode credentials

Все достаточно просто, остановлюсь лишь на последней команде, encred (__en__code __cred__dentials). Если у вас вообще нет доступа к GUI приложению, с помощью этой команды вы можете сгенерировать закодированную в AES-128 строку, содержащую логины.
Пример команды: TinyOPDSConsole.exe encred sens mypassword guest guestpass
В результате выполнения команды будет сгенерирована строка примерно такого вида:
EAAAAB8+fhmfil2d+0azVEMt2udg/N0f8m0Obwf957llI0Gn4zrB36+Jd7uVCKye7f7NwmE8ueas857l2EZztyBf3bw=
Ее нужно поместить в файл user.config, в setting Credentials
<setting name="Credentials" serializeAs="String">EAAAAB8+fhmfil2d+0azVEMt2udg/N0f8m0Obwf957llI0Gn4zrB36+Jd7uVCKye7f7NwmE8ueas857l2EZztyBf3bw=</setting>
Sep 27, 2013 at 12:03 AM
Edited Sep 27, 2013 at 12:06 AM
Готов принять участие тестировании Linux версии. Смогу провести тестирование под Debian, возможно если пакетную базу устройства еще можно обновить удасться использовать домашний NAS от WD.
Coordinator
Sep 27, 2013 at 2:13 AM
Отлично! Если не очень сложно, нельзя другие дистрибутивы в "виртуалке" опробовать (хотя-бы, с LiveCD)? У меня, к сожалению, катастрофически не хватает времени на все это :( Интересует именно возможность запуска "из коробки" с минимальным апдейтом (только mono-runtime, 5M, вроде).

Под NAS-ом будет непросто; во-первых, может просто не быть mono-runtime под него (не уверен на счет возможности собрать самому - надо arm tolchain ставить, куча мороки). Во-вторых, может "не подняться" из-за небольшого количества памяти... В общем, нужно тестировать.

Позднее (уже завтра, скорее всего - сегодня просто устал жутко) выложу exe-шники и краткую инструкцию. Пока можно скачать GUI релиз и создать базу.
Sep 27, 2013 at 9:46 AM
под windows я думаю смогу... взял nas протестировать с windows server
на qnap не получится (( 2 дня гуглил но так и не получилось у меня собрать mono под arm проц
могу под виртуалку чонибуть поставить и потестить на linux
Coordinator
Sep 27, 2013 at 3:50 PM
Edited Sep 27, 2013 at 3:52 PM
kobraru wrote:
под windows я думаю смогу... взял nas протестировать с windows server
на qnap не получится (( 2 дня гуглил но так и не получилось у меня собрать mono под arm проц
могу под виртуалку чонибуть поставить и потестить на linux
Спасибо!

На счет arm: не пробовал сделать по инструкции вот отсюда? http://www.mono-project.com/Mono:ARM Правда, нам, похоже, нужен mono версии 2 или выше...

Что очень нужно: определить минимальные требования для запуска под Linux/Ux. Чего хочется добиться: работы под mono-runtime (крохотный пакет, но по идее его должно хватить).
Coordinator
Oct 1, 2013 at 4:00 PM
Господа, если кто уже опробовал, и есть, что сказать - не стесняйтесь, please! :)
Oct 1, 2013 at 7:08 PM
Edited Oct 1, 2013 at 7:10 PM
В винде вываливает эксепшн если формат даты\времени не соотв. формату в настройках (я про дату последней проверки обновлений), что очень печально.. еще бы HowTo по командам продублировать по /? (да и вообще параметры правильнее писать в таком формате, ИМХО)
Coordinator
Oct 1, 2013 at 7:51 PM
Exception пофикшу, а уж формат даты - будьте любезны, соблюдайте такой, какой есть :) Спасибо за репорт! (хотя консольное приложение не занимается проверкой последней версии).

На счет "/?" - с чего-бы это "правильнее"? ;) В linux, например, принят другой формат -h (или --help). OK, изменю, чтобы при любых нераспознанных параметрах вываливался help - думаю, всех устроит.
Oct 1, 2013 at 9:08 PM
Edited Oct 1, 2013 at 9:09 PM
SeNS wrote:
Exception пофикшу, а уж формат даты - будьте любезны, соблюдайте такой, какой есть :) Спасибо за репорт! (хотя консольное приложение не занимается проверкой последней версии).
может оно не занимается (потрошки не смотрел), но строку конфига обрабатывает
<setting name="LastCheck" serializeAs="String">22.09.2013 00:00:00</setting>
и в зависимости от настроек системы (как правило это касается региональных настроек, например, США и Россия) ожидает на входе разный формат даты.. и если в конфиге для USA формат 01/10/13 00:00:00 валиден, то для России нет, надо 01.10.13 00:00:00.. результат - эксепшн
Уж простите, но менять настройку системы только что бы запустить программу считаю в корне не верным подходом.
Думаю тут надо преобразовывать дату\время через cultureinfo как-то так:
CultureInfo us = new CultureInfo("en-US");
string shortUsDateFormatString = us.DateTimeFormat.ShortDatePattern;
string shortUsTimeFormatString = us.DateTimeFormat.ShortTimePattern;
На счет "/?" - с чего-бы это "правильнее"? ;) В linux, например, принят другой формат -h (или --help). OK, изменю, чтобы при любых нераспознанных параметрах вываливался help - думаю, всех устроит.
Да.. хэлп думаю самый правильный вариант.
насчет правильности я имел ввиду для винды, т.к. это устоявшийся за многие годы формат cli.. для *nix, конечно, формат аргументов обычно идет -- или -
Coordinator
Oct 1, 2013 at 10:03 PM
Edited Oct 1, 2013 at 10:05 PM
Там все немного сложнее; падало оно вот тут (в CustomSettingsProvider.cs), о DateTime речи не идет
foreach (SettingsProperty setting in collection)
{
        SettingsPropertyValue value = new SettingsPropertyValue(setting);
        value.IsDirty = false;

         //need the type of the value for the strong typing
         var t = Type.GetType(setting.PropertyType.FullName);

         if (SettingsDictionary.ContainsKey(setting.Name))
         {
              value.SerializedValue = SettingsDictionary[setting.Name].value;
              value.PropertyValue = Convert.ChangeType(SettingsDictionary[setting.Name].value, t);   <<<< вот тут падало
         }
         else //use defaults in the case where there are no settings yet
         {
              value.SerializedValue = setting.DefaultValue;
              value.PropertyValue = Convert.ChangeType(setting.DefaultValue, t);
         }

         values.Add(value);
}
Я поставил там try/catch (уже в транке), сейчас перестало падать. Фиксить по другому не надо - эта settings внутренняя, для GUI, а GUI запишет правильно. Т.е. упасть оно могло только с user.config с другой локали.

Немного позднее (доделаю каталог "New books") перевыложу пофикшенные приложения (линк будет тот-же)
Oct 3, 2013 at 9:30 AM
Edited Oct 3, 2013 at 11:02 AM
Nas с Windows Home Server 2011
Проц Intel Arom 230 / 1.6GHz
Оперативки 2 гига
процесс каталога во время работы занимает где-то 450 метров
во время скана 200-500 мегабайт

D:\opds>TinyOPDSConsole.exe SCAN
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Scan started: 02:48:25, elapsed: 08:47:25, rate: 422 books/min, found fb2: 61762, epub: 0, skipped: 148415, dups: 9392, invalid: 3228, total
D:\opds>TinyOPDSConsole.exe SCAN invalid: 3, total: 1437

не я может что не так сделал, но сканировать около двухсот тысяч книг 8 часов по мне это слишком
и в лог пишется тока доступ информация по web
в настройках указанно
<setting name= LogLevel" serializeAs="String">0</setting>
<setting name= SaveLogToDisk" serializeAs="String">True</setting>
И не понятно логика работы сканера...
я установил TinyOPDSConsole.exe в виде сервиса
далее запускаю сканирование после скана мне нужно сделать рестарт сервису TinyOPDSConsole.exe иначе отсканированное не появится в каталоге opds

и самое не понятное я добавил в каталог с книжниками архив с новыми книгами логично предположить что нужно запустить TinyOPDSConsole.exe scan
я предполагаю что он просканирует каталог и добавит новые в базу
а он удаляет старую и начинает сканить весь каталог заново.

при такой прожорливости даже думать не стоит поставить его на слабенький nas с Marvel 800 с 512 мегабайтами памяти
Coordinator
Oct 3, 2013 at 2:17 PM
kobraru , это даже не бета, а экспериментальная версия с кучей ошибок! (я уже пофиксил большую часть известных, чуть попозже выложу новую версию для новых тестов).

Также, сканирование - далеко не самая важная функция (можно сделать на десктопе, а потом просто "подсунуть" базу). Уже предусмотрен режим сниженного потребления памяти (аннотации книг не грузятся в RAM), в этом режиме TinyOPDS с базой библиотеки Траума занимает всего 190M в памяти - вполне подъемно даже для 512 MB NAS-а.
Кроме того, поскольку база "портабельная", я думаю выкладывать готовые базы для всех основных раздач (сжатые, базы занимают совсем мало места).

Можно немного подробнее от твоем NAS? Это самосборный или фабричный дивайс, что за производитель/модель? Заработало "из коробки" или пришлось доустанавливать .NET 4 client profile?

Сегодня, если выберу время, выложу (на то-же место) новую сборку консоли/GUI. НО! Это не официальная бета и не пре-релиз - просто сборка из trunk-а.
Oct 3, 2013 at 2:52 PM
Есть желание использовать консольную версию на RaspberryPi. На ней крутится Raspbian (на основе Debian) без иксов.
  1. В фолдере Linux на dropbox-е находится exe-файл. Где можно скачать линуховые исходники?
  2. Для того, чтобы иметь возможность компилировать что-либо на RaspberryPi требуется изрядно морочиться установкой софта, необходимого для компиляции. Может быть есть смысл готовить бинарники для разных систем?
  3. И вопрос не в тему. А как быть тем у кого макось? Есть ли смысл пробовать собирать это при помощи софта из портов?
Coordinator
Oct 3, 2013 at 3:44 PM
3348735,
  1. Сорцы можно скачать тут-же :) https://tinyopds.codeplex.com/SourceControl/latest "Линуксовых" исходников, как таковых, нет - это CLR, .NET код. Под Linux для консольной версии нужен только (по идее, жду, когда кто-нибудь проверит!) пакет mono-runtime.
  2. Отдельный бинарник, скорее всего, будет не нужен (сейчас - это я просто экспериментирую), один и тот-же exe будет работать везде. Mono же (вот тут нужна кросс-компиляция) для разных платформ собирать я не буду, нет такой цели у проекта.
  3. Под макосью я не пробовал (не заводится OSX на гипервизоре Hyper-V, а VirtualBox и VMWare конфликтуют с Hyper-V), но, по идее, MacOS прекрасно поддерживается Mono (см. http://www.go-mono.com/mono-downloads/download.html), так что должно работать.
Oct 3, 2013 at 4:07 PM
Команда apt-cache search mono-runtime дала такой результат.

mono-runtime - Mono runtime
mono-runtime-dbg - Mono runtime, debugging symbols
mono-runtime-sgen - Mono runtime - SGen (experimental)

mono-runtime стал без компиляции.

Попытка запустить софтинку дала следующий выхлоп:

Missing method .ctor in assembly /user/TinyOPDS/TinyOPDSConsole.exe, type System.Runtime.CompilerServices.ExtensionAttribute
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a000012

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Подскажите, как правильно запускать?
Coordinator
Oct 3, 2013 at 4:45 PM
Подожди чуток, сегодня (возможно, нашим вечером) выложу версию консольного приложения, собранную непосредственно под Linux.

TinyOPDS работает на .NET 4.0 client profile, нужна версия Mono не ниже 2.10.8 (см. http://www.mono-project.com/Compatibility )

Ошибка же эта означает, что не найдена базовая assembly System.Core версии 4.0

P.S. Pls, не устанавливай mono-develop - мне интересно проверить именно минимальные требования. Кстати, AFAIK, на RaspberryPi ARM-овский процессор стоит... Это делает запуск в минимальной конфигурации вдвойне инересным :) Да, еще - сканирование на RaspberryPi будет довольно медленным, поэтому лучше будет сосканировать базу на desktop-е, а потом перенести на Pi.
Oct 3, 2013 at 4:51 PM
ОК, жду. Версия Mono подходит: Unpacking mono-runtime (from .../mono-runtime_2.10.8.1-5_armhf.deb) ...

%)
Coordinator
Oct 3, 2013 at 6:24 PM
Edited Oct 3, 2013 at 6:25 PM
OK, выложил только что собранные версии из транка (на старое место). Версия в папке Linux собрана под Ubuntu, через mono-develop.

В консоли пофикшены баги, упомянутые в этом топике (но наверняка есть много других). Сейчас база, созданная под Windows, должна работать и под Linux (не проверял).

Вывод сканера под Mono/Linux переделан через ANSI Esc последовательности: почему-то позиционирование курсора не работает через класс Console именно под Linux. Для уменьшения непроизводительного кода, информация обновляется через каждые 10 книг.

Да, кроме сканера, еще желательно протестировать основную функциональность (отдачу книг через OPDS). На каталог "New books" пока внимания не обращаем (вообще, я не тестировал еще изменения; надеюсь, что ничего не сломал).
Oct 3, 2013 at 6:54 PM
Попытка запустить TinyOPDSConsole.exe приводит к сообщению: The entry point method could not be loaded.

После изменения пути к библиотеке в конфиге результат идентичен.
В папке, которая прописана в конфиге, находится два zip-архива.
На папку, где находится TinyOPDSConsole.exe, атрибуты 777, такие же и на папку, где находятся архивы.
Coordinator
Oct 3, 2013 at 7:17 PM
OK, я, похоже, собрал как сервис, а не как консольное приложение (для этого в проекте есть специальная конфигурация "Mono"). Попробуй сейчас. Не заведется - будем разбираться дальше...
Oct 3, 2013 at 8:06 PM
Edited Oct 3, 2013 at 8:16 PM
Ошибка, почти такая как в предпредыдущем варианте. Разница такая.

в первом варианте:
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a000012


в третьем варианте:
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a0002f7

По идее, если второй собран как сервис, то он будет воспринимать scan, start и т.д.
Ответ на оба ключа: The entry point method could not be loaded.
Coordinator
Oct 3, 2013 at 8:48 PM
Edited Oct 3, 2013 at 8:48 PM
Нет, start/stop работают только для windows, для linux в этом нет нужды.

Поясни, что значит, как в " предпредыдущем варианте"? Т.е.
Missing method .ctor in assembly /user/TinyOPDS/TinyOPDSConsole.exe, type System.Runtime.CompilerServices.ExtensionAttribute 
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a000012 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. 
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. 
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 
Приведи, пожалуйста, точно, что выводится на консоль.

P.S. Что еще можно попробовать сделать:
  • собрать mono для Pi из сорцов
  • попробовать установить mono-develop
Oct 3, 2013 at 8:57 PM
В предпредыдущем было так.
Missing method .ctor in assembly /user/TinyOPDS/TinyOPDSConsole.exe, type System.Runtime.CompilerServices.ExtensionAttribute
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a000012

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
А в последнем так.
Missing method .ctor in assembly /user/TinyOPDS/TinyOPDSConsole.exe, type System.Runtime.CompilerServices.ExtensionAttribute
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a0002f7

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Отличия во второй строке. Утро вечера мудренее.
Coordinator
Oct 3, 2013 at 9:10 PM
Оно у тебя ругается, что отсутствует System.Core (основная сборка .NET). Попробуй, пока не ушел спать (а у меня-то день ;) - я собрал и выложил hello.exe (должна напечатать "Hello, world"), лежит в том-же каталоге на дропбоксе.
Oct 3, 2013 at 9:16 PM
./hello.exe
Hello World!

Всё норм.
Oct 3, 2013 at 9:28 PM
Missing method .ctor in assembly /user/TinyOPDS/TinyOPDSConsole.exe, type System.Runtime.CompilerServices.ExtensionAttribute
Can't find custom attr constructor image: /user/TinyOPDS/TinyOPDSConsole.exe mtoken: 0x0a0002f7

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies.
File name: 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Слил все dll и новую версию, всё в одной папке. Результат прежний.
Coordinator
Oct 3, 2013 at 9:31 PM
OK, тестирую сейчас на свежей Ubuntu. С mono-runtime не завелась, с monodevelop - завелась.
Попробуй сначала сделать так: sudo apt-get install libmono-system*
Если не выйдет, тогда: sudo apt-get install monodevelop

Я понимаю, что 12MB mono-runtime это не 118MB monodevelop, но тоже не фатально (и даже не страшно).
Oct 3, 2013 at 9:38 PM
Достаточно sudo apt-get install libmono-system*
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Use: TinyOPDSConsole.exe [command], where [command] is 

     start       - start service
     scan        - scan book directory
     encred usr pwd  - encode credentials

For more info please visit https://tinyopds.codeplex.com
Поздравляю!
Oct 3, 2013 at 9:50 PM
Edited Oct 3, 2013 at 9:51 PM
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Scanning directory /user/library
rate: 63 books/min, found fb2: 294, epub: 0, skipped: 0, dups: 2, invalid: 205, total: 501
Как отсканирует всё, законнекчусь, но это уже завтра.
Сканировать объемный архив действительно лучше на более быстром устройстве, чем ReapberryPi.
Coordinator
Oct 3, 2013 at 9:54 PM
Достаточно sudo apt-get install libmono-system*
Отлично, пойдет в FAQ! Кстати, проверь еще версию из папки "windows" - думаю, тоже будет работать прекрасно (несмотря на "сервисность"). Правда, нужно еще протестировать во всех режимах (т.е. еще как сервер).

Не заметил, сколько занимают libmono-system*? Думаю, что вполне приемлимо. Но - самое главное - завелось отлично на ARM процессоре!
Oct 3, 2013 at 9:56 PM
Edited Oct 3, 2013 at 9:56 PM
Законнектиться к серверу сходу не получилось. Ошибка OPDS. Продолжу завтра.

Относительно места и пакетов ниже.
The following NEW packages will be installed:
  fontconfig-config libcairo2 libexif12 libfontconfig1 libfreetype6 libgdiplus libgif4 libjpeg8 libmono-accessibility4.0-cil libmono-corlib2.0-cil
  libmono-data-tds2.0-cil libmono-data-tds4.0-cil libmono-i18n-west2.0-cil libmono-ldap2.0-cil libmono-ldap4.0-cil libmono-messaging2.0-cil
  libmono-messaging4.0-cil libmono-posix2.0-cil libmono-posix4.0-cil libmono-security2.0-cil libmono-sharpzip2.84-cil libmono-sqlite2.0-cil
  libmono-sqlite4.0-cil libmono-system-componentmodel-composition4.0-cil libmono-system-componentmodel-dataannotations4.0-cil
  libmono-system-configuration-install4.0-cil libmono-system-core4.0-cil libmono-system-data-datasetextensions4.0-cil
  libmono-system-data-linq2.0-cil libmono-system-data-linq4.0-cil libmono-system-data-services-client4.0-cil libmono-system-data-services4.0-cil
  libmono-system-data2.0-cil libmono-system-data4.0-cil libmono-system-design4.0-cil libmono-system-drawing-design4.0-cil
  libmono-system-drawing4.0-cil libmono-system-dynamic4.0-cil libmono-system-enterpriseservices4.0-cil libmono-system-identitymodel-selectors4.0-cil
  libmono-system-identitymodel4.0-cil libmono-system-ldap2.0-cil libmono-system-ldap4.0-cil libmono-system-management4.0-cil
  libmono-system-messaging2.0-cil libmono-system-messaging4.0-cil libmono-system-net4.0-cil libmono-system-numerics4.0-cil
  libmono-system-runtime-caching4.0-cil libmono-system-runtime-durableinstancing4.0-cil libmono-system-runtime-serialization-formatters-soap4.0-cil
  libmono-system-runtime-serialization4.0-cil libmono-system-runtime2.0-cil libmono-system-runtime4.0-cil
  libmono-system-servicemodel-discovery4.0-cil libmono-system-servicemodel-routing4.0-cil libmono-system-servicemodel-web4.0-cil
  libmono-system-servicemodel4.0-cil libmono-system-serviceprocess4.0-cil libmono-system-transactions4.0-cil libmono-system-web-abstractions4.0-cil
  libmono-system-web-applicationservices4.0-cil libmono-system-web-dynamicdata4.0-cil libmono-system-web-extensions-design4.0-cil
  libmono-system-web-extensions4.0-cil libmono-system-web-mvc1.0-cil libmono-system-web-mvc2.0-cil libmono-system-web-routing4.0-cil
  libmono-system-web-services4.0-cil libmono-system-web2.0-cil libmono-system-web4.0-cil libmono-system-windows-forms-datavisualization4.0-cil
  libmono-system-windows-forms4.0-cil libmono-system-xaml4.0-cil libmono-system-xml-linq4.0-cil libmono-system2.0-cil libmono-wcf3.0-cil
  libmono-web4.0-cil libmono-webbrowser4.0-cil libmono2.0-cil libpixman-1-0 libtiff4 libxcb-render0 libxcb-shm0 libxrender1 ttf-dejavu-core
0 upgraded, 86 newly installed, 0 to remove and 1 not upgraded.
Need to get 17.2 MB of archives.
After this operation, 43.1 MB of additional disk space will be used.
Oct 4, 2013 at 10:17 AM
Edited Oct 4, 2013 at 12:11 PM
Из 501 книги доступно только 294. Почему в разряд invalid было отнесено 205 книг мне не ясно. В логе сервера есть ошибки.
01/550817/0506 23:45:09.4549780 E   FileScanner Book.Parse() exception Out of memory on file: /user/library/f.fb2-183066-183652.zip@183549.fb2
01/550817/0506 23:45:11.7880990 E   FileScanner Book.Parse() exception Encoding name 'windows-1251' not supported
Далее.

С ключом start работает нормально.

Версия из папки Windows работает под линуксом также как и линуксовая. Различий я не заметил. Работает без dll-файлов, которые в папке linux.

Есть, так сказать, пожелания.

Как мне кажется, маловаты иконки книг.
Можно добавить в FAQ инфо, как прописывать сервис в автостарт.
Coordinator
Oct 4, 2013 at 5:37 PM
Edited Oct 4, 2013 at 7:02 PM
Out of memory и Encoding name 'windows-1251' not supported означают, что сканировать лучше на Windows :) Я, правда, при тестировании под десктопной Ubunt-ой не сталкивался, но там установлен monodevelop (кстати, на счет windows-1251 - возможно, просто не нашлось нужной assembly, или русская кодировка в системе не установлена; есть смысл поэкспериментировать с этим, потому, что 1251, к сожалению, частенько встречается в fb2. Говорил я когда-то Грибову - делай ТОЛЬКО UTF8, но он был слишком занят созданием литреза).

Сегодня соберу очередную версию (чуть пофиксить код нужно, да протестировать), было-бы интересно, если бы ты смог опробовать ее в "боевой обстановке", т.е. создать через десктоп полную базу флибусты/либрусека/траума (на Pi сканировать не надо!), и попытаться ей пользоваться через OPDS (т.е. сервер на RaspberryPi, а клиент - телефон там или таблетка).

На счет документации: согласен на 100%, но фатально не хватает на это времени :( Проекту нужен хороший document writer: технически подкованный, обладающий (более-менее) доходчивым слогом, и могущий объяснять доступно вещи и на уровне неискушенных пользователей, и для "продвинутых" юзеров. Нет желания подключиться к проекту в этой роли? Только хочу сразу сказать: это - работа, и не оплачиваемая, к сожалению (все делается на энтузиазме ради абстрактного "блага для всех" :) ).
Oct 4, 2013 at 8:34 PM
У меня из локалей в Raspbian только UTF-8. Без "su -" русские буквы по ssh не показывает.

Сейчас начал сканировать архивы флибусты из-под Windows. Отсканирую и потестирую на EBookDroid.

Относительно документации -- благодарю за предложение и принимаю. Можно действовать, ибо абстрактное общее благо -- наше всё :)
Coordinator
Oct 4, 2013 at 9:12 PM
Edited Oct 4, 2013 at 9:12 PM
Отлично - добавил тебя в команду редактором! Welcome on board!

Теперь тебе должно быть доступно создание и редактирование страниц.

Давай, наверное, по конкретным вопросам перейдем в личку (но отладку консоли продолжим обсуждать тут)? Со мной всегда можно связаться через google talk на sens.boston at gmail dot com (есть еще куча всяких мессенджеров, но этот наиболее используемый и есть на всех PC/дивайсах).
Coordinator
Oct 5, 2013 at 2:49 AM
Edited Oct 5, 2013 at 3:58 AM
Выложил новую версию консоли и GUI, протестировал под Ubuntu с базой, созданной под Windows - все работает, в том числе, даже web-интерфейс (из-за ошибки в Mono, не работало до этого под Linux).

P.S. Я тут подумал немного: если все-таки потребуется "урезать" требования к RAM, то можно будет попробовать интегрировать какой-нибудь "настоящий" database server, типа SQLite (он поддерживается и под Mono). Благо, сейчас в команде есть второй разработчик с опытом работы с C# (пока он занимается web-частью). Быстро и сразу это не обещаю, но перспектива есть. Работа с данными достаточно хорошо абстрагирована в проекте, и, по сути, нужно переписать лишь один класс.
Oct 5, 2013 at 1:16 PM
Edited Oct 5, 2013 at 1:40 PM
00/735146/0001 15:07:12.6692940 I   Program     HTTP server started
00/735146/0001 15:07:15.6242280 E   BackgroundWorker    Load books exception Out of memory
00/735146/0001 15:07:15.7829090 I   BackgroundWorker    Database load time = 00:00:06.9029440, 0 book records loaded
Размер базы 191Мб, всего памяти в наличии 192Мб, свободной 130Мб.
Coordinator
Oct 5, 2013 at 3:50 PM
Edited Oct 5, 2013 at 4:15 PM
А почему база такая большая получилась? У меня флибуста 107M, Траум 138M.

OK, давай попробуем включить профиль "low memory" (не будем грузить в RAM book descriptions). В user.setting измени: <setting name="LowMemoryProfile" serializeAs="String">True</setting>

Кстати, какая у тебя версия Pi - A или B? Т.е. сколько RAM - 256 или 512? Вот еще что вычитал:
The Memory Split
On the RaspberryPI, GPU (video) and system memory are shared. That means if your RPi has 512mb of RAM, some of that RAM will be reserved to use as video memory. Since my RPi doesn’t use the GUI, I set my GPU memory to be 16MB. If you are using a GUI, you may want to go with 64, 128, or even 256MB of GPU ram.
Edit /boot/config.txt and add the following line at the bottom of the file:
gpu_mem=16
Oct 5, 2013 at 4:42 PM
RPi model B only 256 MB RAM, gpu_mem=16 в /boot/config.txt добавило памяти до 232Mb, но <setting name="LowMemoryProfile" serializeAs="String">True</setting> не помогло.
00/735146/0001 18:35:12.9241780 E   BackgroundWorker    Load books exception Out of memory
00/735146/0001 18:35:13.291910  I   BackgroundWorker    Database load time = 00:00:06.9932870, 0 book records loaded
База большая -- архивы с начала по август 2013 с дельтой либрусека.
Coordinator
Oct 6, 2013 at 3:41 AM
Заказал 512 MB модель Pi (благо, "смешные" деньги), проверю на следующей неделе.
Oct 6, 2013 at 10:01 AM
Сканирование под OS X завершилось не корректно. Из 335440 книг было отсканировано 247856 и TinyOPDSConsole.exe завис. Данные из конца лога ниже. Нечто подобное произошло и с гуишной версией под Windows, только зависла она где-то на 50000 раньше. База после зависания в обоих случаях имеет примерно один размер: 195699104.
10/06/2013 00:53:30.6   E   ZipScanner  exception Cannot read that as a ZipFile
10/06/2013 00:53:30.8   E   ZipScanner  exception Argument is out of range.
Parameter name: index
10/06/2013 00:53:35.8   E   ZipScanner  exception Object reference not set to an instance of an object
10/06/2013 00:53:38.4   I   Program     Directory scanner completed
10/06/2013 00:53:45.4   I   Program     Database save time = 00:00:06.6433850, 247856 book records written to disk
Oct 6, 2013 at 11:11 AM
Edited Oct 6, 2013 at 11:11 AM
SeNS

Прошу прощения за тормоза, что-то меня перед отпуском основательно работой накрыло. :)

В lxc контейнере под Debian 7 заводится без проблем (достаточно поставить libmono-system*), каких-либо ограничений для контейнера я не делал.
При сканировании большое количество файлов попадает в invalid, в лог следующее:
10.06.2013 20:56:15.4   E       ZipScanner      Book.Parse() exception Encoding name 'windows-1251' not supported
Parameter name: name on file: /mnt/fb2.Flibusta.Net/d.fb2-172703-173908.zip@172703.fb2
10.06.2013 20:56:15.4   E       ZipScanner      Book.Parse() exception Encoding name 'windows-1251' not supported
Parameter name: name on file: /mnt/fb2.Flibusta.Net/d.fb2-172703-173908.zip@172704.fb2
10.06.2013 20:56:15.4   E       ZipScanner      Book.Parse() exception Encoding name 'windows-1251' not supported
Parameter name: name on file: /mnt/fb2.Flibusta.Net/d.fb2-172703-173908.zip@172705.fb2
Coordinator
Oct 6, 2013 at 2:39 PM
Edited Oct 6, 2013 at 2:44 PM
3348735, видимо, либо zip-файл поврежден, либо в некорректном формате. Больше сказать не могу; нужно, наверное, добавить в лог вывод имени zip-файла.

Shupikov, очевидно, что не хватает системной локали "windows-1251". Упомянутый тобою архив прекрасно сканируется у меня под Ubuntu (находит, естественно, 5 ошибочных книг и 30 дупликатов, но это так и есть).
Как именно установить под Debian локаль 1251 - не подскажу, я не эксперт по линухам.

Да, когда пофиксишь - напиши, pls, как именно ты пофиксил, надо будет в FAQ добавить.
Oct 6, 2013 at 3:25 PM
Привет!!! Ух-ты, ух-ты сколько изменений!!! Ща спецом 13-ю убунту поставлю сервером и попробую. Заодно есть длиннковый нас-323. Но как к нему приступить хз пока.
Oct 6, 2013 at 8:54 PM
В системе локаль с таким именем есть.
root@tinyodps:~# export LANG=windows-1251
root@tinyodps:~# locale | grep 'LANG'
LANG=windows-1251
LANGUAGE=
root@tinyodps:~# date
Пнд Окт  7 06:42:38 VLAT 2013
В Debian для генерации для добавления локали достаточно выполнить:
dpkg-reconfigure locales и выбрать необходимые.
Поскольку локаль с именем windows-1251 в системе отсутствует, необходимо описать её в /etc/locale.alias
windows-1251    ru_RU.CP1251
Coordinator
Oct 6, 2013 at 9:24 PM
С установленной локалью нормально отсканировал?
Oct 6, 2013 at 11:27 PM
SeNS wrote:
С установленной локалью нормально отсканировал?
Нет, проблема сохранилась.
Не опишешь парой предложений, что конкретно происходит в момент появления этой ошибки? Попробую провести более глубокие изыскания.
Oct 6, 2013 at 11:36 PM
Edited Oct 6, 2013 at 11:39 PM
Paguro_rus wrote:
Привет!!! Ух-ты, ух-ты сколько изменений!!! Ща спецом 13-ю убунту поставлю сервером и попробую. Заодно есть длиннковый нас-323. Но как к нему приступить хз пока.
Если речь о D-Link DNS-323, то с нынешней реализацией имхо даже пытаться не стоит -- не взлетит. Малый объем оперативной памяти + оооочень медленный проц. На более свежих моделях шанс есть, но скоростью обработки не обрадует.
Думаю в случае с NAS и прочими SOC-подобными, следует дождаться реализации механизма работы с внешней СУБД, что должно снизить требования к объемам RAM.

Логично использовать для запуска приложения внешний сервер, используя NAS по прямому назначению -- в качестве устройства хранения, примонтировав его к FS сервера (cifs/smb, nfs...).
Coordinator
Oct 7, 2013 at 2:05 AM
Edited Oct 7, 2013 at 5:53 AM
Скорее всего, вот тут: https://tinyopds.codeplex.com/SourceControl/latest#trunk/TinyOPDS/Parsers/fb2Parser.cs , в процедуре Parse(), в этой части кода:
                // Project Mono has a bug: Xdocument.Load() can't detect encoding
                string encoding = string.Empty;
                if (Utils.IsLinux)
                {
                    using (StreamReader sr = new StreamReader(stream))
                    {
                        encoding = sr.ReadLine();
                        int idx = encoding.ToLower().IndexOf("encoding=\"");
                        if (idx > 0)
                        {
                            encoding = encoding.Substring(idx + 10);
                            encoding = encoding.Substring(0, encoding.IndexOf('"'));
                            stream.Position = 0;
                            using (StreamReader esr = new StreamReader(stream, Encoding.GetEncoding(encoding)))
                            {
                                string xmlStr = esr.ReadToEnd();
                                try
                                {
                                    xml = XDocument.Parse(xmlStr, LoadOptions.PreserveWhitespace);
                                }
                                catch (Exception e)
                                {
                                    if (e.Message.IndexOf("nbsp", StringComparison.InvariantCultureIgnoreCase) > 0)
                                    {
                                        xmlStr = xmlStr.Replace("&nbsp;", "&#160;").Replace("&NBSP;", "&#160;");
                                        xml = XDocument.Parse(xmlStr, LoadOptions.PreserveWhitespace);
                                    }
                                    else if (e.Message.IndexOf("is an invalid character", StringComparison.InvariantCultureIgnoreCase) > 0)
                                    {
                                        xml = XDocument.Parse(this.SanitizeXmlString(xmlStr), LoadOptions.PreserveWhitespace);
                                    }
                                    else throw e;
                                }
                            }
                        }
                    }
                }
Можно попробовать установить monodevelop, и глянуть непосредственно под отладчиком в GUI (только под консолью, GUI из-за другого бага в Mono не "заводится").

Я бы с удовольствием пофиксил, но сам не могу воспроизвести - у меня сканирует без ошибок (правда, установлен именно пакет monodevelop, со средой разработки).

P.S. Что еще пришло в голову: возможно, дело в отсутствии какого-то дополнительного assembly. Попробуй установить monodevelop и посмотри, заработает или нет. Если заработает, то нужно попытаться вычленить, чего именно не хватает для windows-1251...
Oct 7, 2013 at 2:13 AM
Логично использовать для запуска приложения внешний сервер, используя NAS по прямому назначению -- в качестве устройства хранения, примонтировав его к FS сервера (cifs/smb, nfs...).
Ну сейчас так и есть.
Oct 7, 2013 at 7:11 AM
Edited Oct 7, 2013 at 8:24 AM
Я бы с удовольствием пофиксил, но сам не могу воспроизвести - у меня сканирует без ошибок (правда, установлен именно пакет monodevelop, со средой разработки).
Я без проблем могу предоставить root доступ. ;)
P.S. Что еще пришло в голову: возможно, дело в отсутствии какого-то дополнительного assembly. Попробуй установить monodevelop и посмотри, заработает или нет. Если заработает, то нужно попытаться вычленить, чего именно не хватает для windows-1251...
Видимо ваши предположения верны. Установка monodelop помогла. На данный момент из 20к просканнированных файлов invalid меньше 100.

Насколько точен механизм определения дубликатов? М.б. рассмотреть возможность реализации режима очистки коллекции от дубликатов?
Coordinator
Oct 7, 2013 at 2:12 PM
Edited Oct 7, 2013 at 4:09 PM
Было-бы неплохо, если-бы кто-нибудь вычислил, какого именно пакета не хватает для локали windows-1251. Ставить весь monodevelop особого смысла нет - никто ведь не собирается заниматься разработкой :) Попробую найти тулзу; если у кого-то есть возможности самому повозиться - было-бы здорово.

(update) Вот че нагуглил:
Дополнительные кодировки находятся в отдельной библиотеке. Ставятся следующей командой:
aptitude -t lenny-backports install libmono-i18n2.0-cil
Никто не попробует? Ну, т.е. на системе без Mono сделать и запустить сканирование
sudo apt-get install mono-runtime libmono-system* libmono-i18n2.0-cil



Касательно дублей: в дубли заносятся различные версии документа (т.е. одинаковый ID и версия, меньше уже добавленной). Наверное, слово "дубль" тут не очень уместно, но, как писал Марк Твен, "скорее требует пояснений, нежели извинений" :) C целью предотвращения неверного определения дублей, при совпадении ID (зачастую создатели документов присваивают один и тот-же ID разным книгам; говорил я когда-то Грибову - нужен только GUID! но он уже был занят литрезом и забил на формат), ID генерируется новый.

Посмотреть исходник можно тут: (функция public static bool Add(Book book)) https://tinyopds.codeplex.com/SourceControl/latest#trunk/TinyOPDS/Data/Library.cs
Oct 7, 2013 at 7:26 PM
Edited Oct 7, 2013 at 7:30 PM
Никто не попробует? Ну, т.е. на системе без Mono сделать и запустить сканирование
sudo apt-get install mono-runtime libmono-system* libmono-i18n2.0-cil
Я попробую, у меня специально для этого есть "чистый контейнер".
говорил я когда-то Грибову - нужен только GUID
Не уверен, что GUID полностью избавил бы от дублей. Но это можно в FB3 попроравить. ;)

Еще есть вопрос, относительно конвертации в epub. В user.config присутствует опция:
<setting name="ConvertorPath" serializeAs="String">C:\Program Files (x86)\FB2ePub</setting>
Для Linux мне удалось найти только один конвертор fb2toepub, что необходимо для его адаптации?
Мб предусмотреть в конфиге дополнительный "setting name", что-нибудь вроде "ConvertorOption"?
Coordinator
Oct 7, 2013 at 7:40 PM
Edited Oct 7, 2013 at 7:44 PM
На счет "очистки от дублей": я не хочу добавлять в TinyOPDS какие-либо функции управления коллекцией книг и "ведения библиотеки". Основной принцип - доступ к данным осуществляется read-only, т.е. "не навреди". Вдобавок, полным-полно программ, "интеллектуальных" и не очень, в которых есть эта функциональность.

Что можно сделать: если есть в том нужда, то я могу расширить вывод информации в лог (но, по моему, и сейчас выводится с избытком, как говорится, grep в помощь :) ).

P.S. К сожалению, правка дублей полностью в автоматическом режиме невозможна, без ручной работы не обойтись... С другой стороны, если бы хотя-бы 10% болтунов-завсегдатаев (т.е. "пейратов" sic!) флибусты уделили хотя-бы 10% времени, затраченного на публикацию фоток "котегов", флейма, ругани и пустопорожней болтовни на правку книг, с проблемой дублей можно было-бы покончить за неделю...
Oct 7, 2013 at 7:42 PM
SeNS wrote:
На счет "очистки от дублей": я не хочу добавлять в TinyOPDS какие-либо функции управления коллекцией книг и "ведения библиотеки". Основной принцип - доступ к данным осуществляется read-only, т.е. "не навреди". Вдобавок, полным-полно программ, "интеллектуальных" и не очень, в которых есть эта функциональность.
Твой проект, твои правила. :)
P.S. К сожалению, правка дублей полностью в автоматическом режиме невозможна, без ручной работы не обойтись... С другой стороны, если бы хотя-бы 10% болтунов-завсегдатаев (т.е. "пейратов" sic!) флибусты уделили хотя-бы 10% времени, затраченного на публикацию фоток "котегов", флейма, ругани и пустопорожней болтовни на правку книг, с проблемой дублей можно было-бы покончить за неделю...
Там могут, факт! :)
Coordinator
Oct 7, 2013 at 7:43 PM
GUID - однозначно бы помог (но, естественно, при отсутствии copy&paste из предыдущей книги :)). Кстати, родилась хорошая мысль - попрошу Энди прикрутить на флибусту автоматическую генерацию нового GUID-а при добавлении книги, и замену им текущего <id> книги (если, конечно, это не новая версия).

По конвертации: программка из FAQ прилично работает (см. https://tinyopds.codeplex.com/wikipage?title=%D0%90%20%D0%BA%D0%B0%D0%BA...&referringTitle=Documentation )
Oct 7, 2013 at 7:49 PM
SeNS wrote:
По конвертации: программка из FAQ прилично работает (см. https://tinyopds.codeplex.com/wikipage?title=%D0%90%20%D0%BA%D0%B0%D0%BA...&referringTitle=Documentation )
Ахах, теперь я узнал, что у проекта есть FAQ. :\
Осталось дождаться, когда веб-интерфейс станет полностью функционален. У меня Х-ы только на рабочем ноуте, но там OpenBSD.
Oct 7, 2013 at 7:53 PM
Никто не попробует? Ну, т.е. на системе без Mono сделать и запустить сканирование
sudo apt-get install mono-runtime libmono-system* libmono-i18n2.0-cil
Помогла установка пакета libmono-i18n-other4.0-cil
Coordinator
Oct 7, 2013 at 8:14 PM
Shupikov wrote:
Помогла установка пакета libmono-i18n-other4.0-cil
Спасибо! Камрады редакторы, вам на заметку - это нужно в FAQ!
Coordinator
Oct 7, 2013 at 8:23 PM
Edited Oct 7, 2013 at 8:23 PM
Shupikov wrote:
У меня Х-ы только на рабочем ноуте, но там OpenBSD.
Кстати, mono должно работать и под BSD http://www.mono-project.com/Mono:BSD
Будет минут... часок :) - попробуй ;)
Oct 7, 2013 at 8:27 PM
SeNS wrote:
Кстати, mono должно работать и под BSD http://www.mono-project.com/Mono:BSD
Будет минут... часок :) - попробуй ;)
Под опёнком попробую, просто носить на ноуте полный срез библиотеки, как-то избыточно. :)
Coordinator
Oct 12, 2013 at 3:35 AM
Пришел сегодня RaspberryPi, 512 MB model B rev 2. TinyOPDS с базой от флибусты запустился, и даже заработал, но...

К сожалению, нужно признать, что при текущей архитектуре программа на RPi практически не работоспособна :( TinyOPDS работает, но на пределе размеров RAM, и чрезвычайно медленно. База данных грузится в память 2 минуты - вместо 2-3 секунд на PC... LINQ запросы к данным отрабатываются чрезвычайно медленно. Не знаю, в чем тут дело: в нехватке хипа (память забита под завязку), в особенностях реализации Mono, или же в особенностях архитектуры ARM процессоров.

Постараюсь "по свободе" прояснить этот вопрос: возможна-ли вообще эффективная работа с базой из нескольких таблиц, размером 150000-200000 записей, на RaspberryPi. Если кто сможет найти информацию по этому вопросу - постите в этот тред ссылки.
Coordinator
Oct 16, 2013 at 5:08 PM
Успел уже пожалеть, что купил Raspberry Pi, а не Cubeboard https://store.iotllc.com/product.php?productid=17&cat=2&page=2 . Обошлось бы чуть дороже, но производительность и фич - в разы выше... Сдать, что-ли, этот Pi?..
Oct 17, 2013 at 5:59 PM
Запускается, успешно просканирована библиотека флибусты, но не дает скачать ни одну книгу. В логе пишет следующее:
10.17.2013 22:51:44.7   E   OPDSServer  file /media/160/fb2.Flibusta.Net/fb2-183066-183652.zip@183501.fb2, exception Operation is not valid due to the current state of the object
10.17.2013 22:51:44.7   E   OPDSServer  file /media/160/fb2.Flibusta.Net/fb2-314958-318554.zip@315528.fb2, exception Operation is not valid due to the current state of the object
10.17.2013 22:51:44.7   I   OPDSServer  HTTP GET request from 192.168.1.39: /opds/cover/6ec723e6-b82e-4a85-9129-8def10b30654.jpeg
10.17.2013 22:51:44.7   E   OPDSServer  file /media/160/fb2.Flibusta.Net/fb2-263214-266671.zip@266030.fb2, exception Operation is not valid due to the current state of the object
10.17.2013 22:52:13.1   I   OPDSServer  HTTP GET request from 192.168.1.39: /opds/newtitle
10.17.2013 22:52:16.4   I   OPDSServer  HTTP GET request from 192.168.1.39: /opds/435c3187-1e82-4ef9-a5d1-25a68a38c237/Frid_Ameli_A_dedushka_v_kostyume%3F.fb2.zip
10.17.2013 22:52:16.4   E   HttpProcessor   FB2 file exception Operation is not valid due to the current state of the object
и так далее...
Coordinator
Oct 17, 2013 at 9:27 PM
Это что-то новенькое, раньше такой ошибки я не видел. Какой именно Linux, это ошибка возникает даже после перезапуска сервера/программы? Консоль или GUI?
Oct 18, 2013 at 8:28 AM
Это Ubuntu-server 12.04 LTS. Консольная версия (GUI там нет, поэтому и сканирование и работа только через командную строку). Может быть причина в том, что библиотека на внешнем жестком диске с не очень быстрым откликом (подключен по usb 2.0)? Просто больше причин я не представляю :). Перезапуск программы никак не помогает. Сервер не перезапускал.
Coordinator
Oct 18, 2013 at 1:48 PM
Похоже, что исключение возникает при любой попытке доступа к файлу. Нужно еще раз проверить, читаются-ли эти файлы.
Я могу добавить stack trace к выводу в лог, но вряд-ли это сильно поможет...

Что можно попробовать: перенести пару-тройку zip-ов на локальный диск, в /home/user , изменить путь к библиотеке (чтобы получить новое название), переименовать базу и попробовать прочитать из локальных файлов (для простоты, через web интерфейс).
Oct 29, 2013 at 5:10 PM
Перенес всю библиотеку в домашний каталог. Все файлы читаются (в смысле, через ssh я их могу открыть и копировать). Ошибка не исчезла (пробую с последней версией программы). Что еще можно поделать?
Coordinator
Oct 29, 2013 at 5:44 PM
Edited Oct 29, 2013 at 5:45 PM
Могу только предположить, что имя базы не соответствует физическому пути расположения файлов.

Что можно попробовать сделать: запустить TinyOPDSConsole.exe encpath /home/user/mylib (только нужно поэкспериментировать с последним слешем - нужен он или не нужен), переименовать базу в соответствии с выводом и попробовать еще раз.

P.S. Под десктопной Ubuntu программа 100% работоспособна, проверено лично мной.
Nov 7, 2013 at 10:46 AM
Synology NAS , Есть базовый пакет Mono, который показывает что он : JIT compiler version 2.11.1 ((no/426188e Wed Aug 29 11:04:56 CST 2012)
Copyright (C) 2002-2012 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com

При запуске консольной версии выдает следующую ошибку :
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for TinyOPDS.Data.Library ---> System.DllNotFoundException: libMonoPosixHelper.so
at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)
at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode,bool,bool)
at System.IO.Compression.GZipStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen) [0x00000] in <filename unknown>:0
at System.IO.Compression.GZipStream..ctor (System.IO.Stream compressedStream, CompressionMode mode) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.IO.Compression.GZipStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode)
at TinyOPDS.Data.Library..cctor () [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at TinyOPDSConsole.Program.ScanFolder () [0x00000] in <filename unknown>:0
at TinyOPDSConsole.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

Это лечится ?
Coordinator
Nov 7, 2013 at 2:02 PM
Боюсь, что со стороны TinyOPDS - никак :( Попробуй погуглить и поискать более полную сборку mono, или же собрать самому.
Nov 11, 2013 at 12:20 AM
Я готов принять участие в тестировании консольной версии.У меня стоит Ubuntu server 12.04 на HP Micro G7 N54L NHP. база книг flibusta fb2&usr на одном из внутренних жестких дисков.По результатам отпишусь
Nov 11, 2013 at 1:02 AM
Edited Nov 11, 2013 at 1:24 AM
Итак на команду sudo apt-get install libmono-system получил ответ что такой пакет не найден. поставил mono-develop
В итоге запустив в консоли получил следующее
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Use: TinyOPDSConsole.exe [command], where [command] is
 start       - start service
 scan        - scan book directory
 encred usr pwd  - encode credentials
For more info please visit https://tinyopds.codeplex.com
на команду TinyOPDSConsole.exe start выдает TinyOPDSConsole.exe command not found.
пробовал немного по другому в TinyOPDSConsole.exe [start] ответ тот же command not found
Coordinator
Nov 11, 2013 at 2:58 AM
victorDAN, под Linux нужно чуть по другому стартовать, вообще-то :) mono ./TinyOPDSConsole.exe start

P.S. Руки все никак не дойдут довести manual, а редактор начал работу, да забросил пока... Вообще, последовательность такова:
  • редактируем файл настроек под свои нужды
  • запускаем mono ./TinyOPDSConsole.exe scan (для создания базы)
  • вот теперь уже можно mono ./TinyOPDSConsole.exe start
Nov 13, 2013 at 6:52 AM
Добрый день!
Интересует работа tinyOPDS на NAS Synology DS410j, чуть выше читал, буду пробовать.
А сейчас хотел сообщить о найденной ошибке в процессе эксплуатации версий 1.1-1.2 (включая консольную) под Win.
  1. Префикс web чем-то заполнен (например "wb"). При настройке сервера с префиксом OPDS: opds, перестает работать поиск у клиента каталога (ebook search, ios), прямо кричит "Ошибка поиска каталога"... похоже просто недоступен opds-opensearch.xml
    Если префикс поменять на другое, не: "o", "op", "opd", "opds", то все работает...
  2. Префикс web пуст, а префикс OPDS не: "o", "op", "opd", "opds" (например "lb")... то вроде поиск работает (доступен opds-opensearch.xml), только ничего не ищет.
Надеюсь понятно объяснил методику выявления ошибки :)
Спасибо.
Nov 14, 2013 at 12:10 AM
Доброе утро!
Тестирование tinyOPDS консольная версия.
Служба установлена (тип запуска: автоматически), запущена, вроде все работает. Перезагружаем компьютер под Win7 (лицензионный, без всяких ломалок).
В системных событиях:
Служба "TinyOPDS service" перешла в состояние Остановлена
В логах tinyOPDS ничего нет.

Запускаем службу руками... все работает.
Спасибо.
Coordinator
Nov 14, 2013 at 2:09 PM
Edited Nov 14, 2013 at 2:12 PM
gfifg , спасибо за сообщения и найденные ошибки! Постараюсь разобраться, как найду время.

P.S. Единственно, с перезапуском после перезагрузки непросто будет отладить :(
Coordinator
Nov 14, 2013 at 2:10 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.
Coordinator
Nov 14, 2013 at 2:11 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.
Nov 14, 2013 at 6:31 PM
Edited Nov 14, 2013 at 6:33 PM
Система Ubuntu Linux 12.04.2 (Server LTS)
Ядро Linux 3.2.0-45-generic on x86_64
Процессор AMD Athlon(tm) II X2 4450e Processor, 2 cores (2,8ГГц, 1 Мб кеш)
Память DDR3, 4ГБ, PC3-10600, 1333МГц

Система установлена на карту CompactFlash 16GB 133x, подключенную через CF-IDE адаптер. Оффлайн версия известной библиотеки (только fb2) лежит на терабайтнике WD "зеленой" серии (65 zip-архивов общим объемом около 95 Гб).

Установка mono и необходимых модулей
 sudo apt-get install mono-runtime
 sudo apt-get install libmono-system* libmono-i18n2.0-cil
 sudo apt-get install libmono-i18n-other4.0-cil
Запуск сканирования
 mono ./tinyopds/TinyOPDSConsole.exe scan
TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Scanning directory /mnt/fileshare/Book/_Lib.rus.ec - Официальная/lib.rus.ec/
bnas@unas:~$  06:33:09, rate: 687 books/min, found fb2: 253072, epub: 0, skipped: 0, dups: 13148, invalid: 3937, total: 270157
При сканированиии использовалось в основном одно ядро, памяти было использовано до 64% (около 2,4 Гб).
Не менее 1,5 часов из общих шести с половиной было потрачено на операции записи:
11/14/2013 18:33:55.9   I       Program         Database save time = 00:00:27.3925070, 251500 book records written to disk
11/14/2013 18:35:21.6   I       Program         Database save time = 00:00:33.1805820, 252000 book records written to disk
11/14/2013 18:36:56.4   I       Program         Database save time = 00:00:30.4229840, 252500 book records written to disk
11/14/2013 18:38:21.1   I       Program         Database save time = 00:00:24.1923050, 253000 book records written to disk
11/14/2013 18:38:50.8   I       Program         Database save time = 00:00:22.2306730, 253072 book records written to disk
По 20-30 секунд на каждые 500 книг из 250 000... Перебор ;) То есть, было бы полезно иметь возможность в конфигурационном файле указывать количество обработанных книг, после которого происходит сохранение. Их увеличение до 1 000 уменьшило бы время на запись почти в два раза, имхо.

В логе много ошибок вида The object was used after being disposed
11/14/2013 18:28:54.6   E       ZipScanner      Book.Parse() exception The object was used after being disposed. on file: /mnt/fileshare/Book/_Lib.rus.ec - Официальная/lib.rus.ec/fb2-453300-458899.zip@454037.fb2
С чем связаны - не понятно.

Практически все или даже все invalid'ные книги пришлись на первые архивы.

Общее количество книг совпало с тем, что указано в свойствах коллекции в MyHomeLib.

Запуск сервера
 mono ./tinyopds/TinyOPDSConsole.exe start
Запуск и подключенеи из локальной сети (без авторизации) без проблем:
11/14/2013 20:55:26.1   I   Program     Loaded 20918 authors aliases from /home/bnas/tinyopds/a_aliases.txt
11/14/2013 20:55:26.2   I   Program     HTTP server started 
11/14/2013 20:55:32.5   I   Library     Database load time = 00:00:06.3864540, 253072 book records loaded
11/14/2013 20:58:03.3   I   OPDSServer  HTTP GET request from 192.168.0.121: /opds
При попытке скачать книгу
11/14/2013 21:36:06.0   I   OPDSServer  HTTP GET request from 192.168.0.126: /opds/thumbnail/83e82b0a-d331-4869-8fe9-28783a3ec497.jpeg
11/14/2013 21:36:06.0   E   OPDSServer  file /mnt/fileshare/Book/_Lib.rus.ec - Официальная/lib.rus.ec/2-400000-405999.zip@401352.fb2, exception Operation is not valid due to the current state of the object
Во-первых, обложка не показывается. Проверено на FBReader и EBookDroid.
Во-вторых, книга не скачивается. Неправильно указывается имя файла архива. Должно быть: fb2-400000-405999.zip.
При сканировании пути файлов были правильные. На примере инвалидного файла:
E   ZipScanner  Book.Parse() exception expected '>' (3E) but found '-' (2D)  Line 2163, position 5. on file: /mnt/fileshare/Book/_Lib.rus.ec - Официальная/lib.rus.ec/fb2-000024-030559.zip@2397.fb2
Еще из пожеланий: сделать вывод информации о критических ошибках при сканировании или даже прерывать сканирование с ошибкой.
Создал папку с программой с рутовыми правами, а запустил сканирование - с пользовательскими. Хорошо, что практически одновременно в соседнем терминале tail -f на лог натравил:
11/14/2013 12:00:38.2   E   Program     Save books exception Access to the path "/home/bnas/tinyopds/19e0fb44-170e-538b-acb3-b6cc3a26acfb.db" is denied.
11/14/2013 12:00:38.2   I   Program     Database save time = 00:00:00.0001800, 0 book records written to disk
а то бы о том, что лоханулся с правами, и программа молотила впустую, узнал бы только через шесть с хвостом часов =)
Coordinator
Nov 15, 2013 at 3:46 AM
Сорри, сейчас голова забита совсем другим, пока до проекта руки не доходят (такова, к сожалению, судьба многих fun-project-ов, разрабатываемых на энтузиазме). Замечу, однако, что что-то медленно у всех у вас сканирование происходит :) (см. мои скриншоты из топика ниже)

Касательно неверных файлов и "обложка не показывается": у меня все показывалось (на виртуальной Ubuntu, и даже на RaspberryPi - но в этом случае очень медленно). В чем плюс mono - работает под Linux практически как под Windows (но, правда, без учета прав - ну, да мне нет дела до этого, это responsibility пользователя). Проверял на Android-овском FBReader-е (от камрада Геометра), и на паре iOS приложений (был тогда iPad под рукой) - все работает, как часики.

Касательно медленной записи: посмотри мои скриншоты. Самое смешное, что у меня система, по большому счету, вполне "бюждетная" (за исключением SSD Pro версии). Да, я не пытался тестировать с медленным диском, подключенным через USB-2 китайским кабелем - грешен... Мой 3-х террабайтный USB диск на рабочем сервере/плеере подключен по USB-3 (а на самом enclosure 512 "метров" кэша, если не ошибаюсь).
Coordinator
Nov 15, 2013 at 3:50 AM
Edited Nov 15, 2013 at 6:06 AM
Но, "по любасу" - огромное "спасибо" за подробный отчет и тестирование! Посмотрю, как будет время, что можно сделать (если что, wishes можно добавлять в issues, чтобы я не забыл).

Единственно, Linux для меня - не основная система (сейчас использую только для фирмвари робота, на Rpi). Вообще, поддержка Linux-а стала возможной благодаря блестящей работе команды Mono. У меня Linux первоприоритетным никогда не будет, сорри...
Nov 15, 2013 at 6:53 AM
SeNS wrote:
Сорри, сейчас голова забита совсем другим, пока до проекта руки не доходят (такова, к сожалению, судьба многих fun-project-ов, разрабатываемых на энтузиазме).
Вообще не вопрос. Успехов вам в делах! Причины возникновения ошибки и возможность избавления от неё и сам поищу.
Дело похоже не в правах - владельцем каталога с библиотекой является тот же пользователь, от которого запускается tinyopds. Но попробую поиграть с путями: сделать их не такими длинными, без русских букв...
Замечу, однако, что что-то медленно у всех у вас сканирование происходит :) (см. мои скриншоты из топика ниже)
Процессор далеко не топовый, винт - из серии медленных, но бесшумных и, вроде бы, больше ориентированных на хранение данных. Так что шесть часов на сканирование 270 тысяч книг для меня вполне нормально и приемлимо.
Касательно неверных файлов и "обложка не показывается": у меня все показывалось (на виртуальной Ubuntu, и даже на RaspberryPi - но в этом случае очень медленно).
Про неверные файлы вы уже писали - это не по стандарту оформленые книги из начальных этапов создания библиотеки. Насчет них даже и заморачиваться не стоит. С обложками какие-то непонятки - будем разбираться.
Касательно медленной записи: посмотри мои скриншоты.
У меня запись идет вообще на карту Compact Flash, так что о высокой скорости я и не думал =) Просто предложил сделать вариант с возможностью увеличения "шага" сохранения. На мой взгляд, это уменьшило бы число операций записи и, соответственно, уменьшило бы время, которое на них тратится, что было бы полезно на машинах с медленными подсистемами хранения информации.

Вам огромное спасибо за проделанную работу!
offtopic
Сам с Linux практически не работаю. Один раз на работе помог решить задачу по быстрой и прозрачной для пользователей организации защиты серверов, доступных из вне. А дома серверок крутится: принт, сканер, медиа, видеонаблюдение, торрент, файлопомойка. Только доступ к библиотеки был с ББ: загружаешься в винде, и из MHL перекидываешь на электронную читалку или на планшет-телефон на андроиде. Надоел этот обходной путь, начал искать что-нибудь вроде MHL для андроида, а нашел ваш проект. За который очень вам благодарен.
Nov 15, 2013 at 8:36 AM
Edited Nov 15, 2013 at 8:40 AM
bnas wrote:
Успехов вам в делах! Причины возникновения ошибки и возможность избавления от неё и сам поищу.
И если найдете - дайте знать сюда, пожалуйста. У меня точно такие симптомы на аналогичной системе.
Nov 15, 2013 at 2:57 PM
dionix wrote:
дайте знать сюда
Запутался в экспериментах, поэтому просто опишу вариант, который заработал.
В первый раз сканировал, указав полный путь к базе (много-много букв, русские в том числе) с завершающим /.
То есть вот так:
/mnt/fileshare/bla-bla-bla/бла-бла-бла/bla-bla-bla/

Сейчас создал символьную ссылку на каталог с файлами библиотеки, разместил её в /opt, в конфигурационном файле указал без последнего слеша, вот так:
/opt/lib

Сканирование прошло с теми же ошибками, на тех же файлах, но появились обложки, и книги стали отдаваться без проблем.
Что именно помогло - более короткий путь или отсутствие последнего слеша - сказать не могу.
Coordinator
Nov 15, 2013 at 8:58 PM
bnas , проверь, пожалуйста, у себя на счет слеша (помоги мне). Базу пересканировать НЕ НАДО - все пути в базе относительные. Нужно только изменить путь к базе в файле user.config (переменная <setting name="LibraryPath" serializeAs="String">E:\мой_путь_к_базе</setting> )
Nov 18, 2013 at 7:58 AM
При простом изменении в конфигурационном файле
<setting name="LibraryPath" serializeAs="String">/opt/lib.rus.ec</setting>
на
<setting name="LibraryPath" serializeAs="String">/opt/lib.rus.ec/</setting>
В логе получаем
11/18/2013 11:14:08.9   I   Program     Loaded 20918 authors aliases from /home/bnas/tinyopds/a_aliases.txt
11/18/2013 11:14:08.9   I   Library     Database load time = 00:00:00.0001070, 0 book records loaded
11/18/2013 11:14:09.1   I   Program     HTTP server started
Переименовываем файл базы
mono ./tinyopds/TinyOPDSConsole.exe encpath /opt/lib.rus.ec/ выдаёт 863bb0d6-f30f-51ee-92c8-833e26ccfc69.db
Переименовываем файл, в конфиге ставим /opt/lib.rus.ec/
В логе
11/18/2013 11:20:42.8   I   Program     Loaded 20918 authors aliases from /home/bnas/tinyopds/a_aliases.txt
11/18/2013 11:20:42.9   I   Program     HTTP server started
11/18/2013 11:20:49.1   I   Library     Database load time = 00:00:06.2941810, 253072 book records loaded
11/18/2013 11:21:01.8   I   OPDSServer  HTTP GET request from 192.168.0.103: /
11/18/2013 11:21:29.6   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds/newdate
11/18/2013 11:21:56.6   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds/6d2f8059-d4c1-5105-9879-a8652ba24c31/Abbaszade_Gusejjn_Cvety_polevye.fb2.zip
11/18/2013 11:21:56.6   E   HttpProcessor   FB2 file exception Operation is not valid due to the current state of the object 
Ошибка при скачивании книги.
Возвращаем всё как было:
  • имя файла базы 007d2b07-0be1-5878-97d4-fe9ceee6203b.db
  • в конфиге /opt/lib.rus.ec
    В логе
11/18/2013 11:37:15.5   I   Program     Loaded 20918 authors aliases from /home/bnas/tinyopds/a_aliases.txt
11/18/2013 11:37:15.7   I   Program     HTTP server started
11/18/2013 11:37:21.8   I   Library     Database load time = 00:00:06.1986230, 253072 book records loaded
11/18/2013 11:37:26.3   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds
11/18/2013 11:37:33.3   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds/newdate
11/18/2013 11:38:05.5   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds/6d2f8059-d4c1-5105-9879-a8652ba24c31/Abbaszade_Gusejjn_Cvety_polevye.fb2.zip 
И книга скачивается.
Если есть еще идеи как и что можно проверить - напишите, попробую. Хотя похоже на то, что последний слеш под Linux лишний - с ним сбиваются пути на моменте "выдачи" книги.

Дополнение.
Создал еще одну символьную ссылку /opt/lib. Базу не пересканировал.
Вариант:
  • в конфиге /opt/lib
  • имя файла базы e06b9f23-9c3d-5ebd-96a4-0cbaa1c7c055.db
    работает.
Вариант
  • в конфиге /opt/lib/
  • имя файла базы 6ccd8000-52ee-5809-a4ef-6308354c3b80.db
    не работает.
То есть, имхо, даже вариант с полным изменением пути к каталогу библиотеки остаётся работоспособным, но только в том случае, когда нет завершающего слеша.
Nov 18, 2013 at 2:06 PM
Я может не все подробно прочитал, потому что только сегодня увидел про эту штуку, но все-таки не совсем понятно...
Для всяких NAS ясное дело все очень будет тормозить, если для индексации перелопачивать все архивы - все-таки мощности не те. А ставить в качестве сервера многим, как мне кажется, было бы удобно именно на нечто маленькое и неприхотливое в уголке, типа роутерос с подсулюченным HDD или NAS и т.п.
Но ведь в архиве идет еще готовый индекс "librusec_local_fb2.inpx" - нельзя его как-то использовать сразу?

Заранее прошу прощения, если не во всем разобрался сходу.
Nov 18, 2013 at 4:46 PM
Думаю, можно использовать уже отсканированную базу другого пользователя, в случае если библиотеки совпадают.
Надо будет только в конфигурационном файле указать путь к библиотеки, и переименовать базу другого пользователя под свой путь (имя получается командой encpath).
Еще думаю, что у нас с вами одна и та же библиотека - у моей librusec_local_fb2.inpx размером 11 097 088 байт.
Если есть желание попробовать, то могу завтра выложить свою базу данных на Я.Диск.
Coordinator
Nov 18, 2013 at 5:27 PM
bnas , попробуй обновленную версию (из дропбокса, в первом посте этой дискуссии) - должно, по идее, решить issue со слешем на конце.

Касательно баз: у меня была идея выкладывать базы для основных раздач на этом сайте (благо, зазипованные они занимают не так много места). Что удерживает меня: отсутствие времени, во-первых, и во-вторых, теоретически возможный наезд копирастов в виде литреза (не охота начинать свару с Микрософт и доказывать, что "я не слон"). Пока TinyOPDS абсолютно легитимен, никаким "пиратским" контентом тут и "не пахнет".
Coordinator
Nov 18, 2013 at 5:31 PM
eaa wrote:
Для всяких NAS ясное дело все очень будет тормозить, если для индексации перелопачивать все архивы - все-таки мощности не те.
eaa, я боюсь, что с текущей архитектурой на NAS-ах оно будет тормозить даже при раздаче. Поскольку в программе не используется движок базы данных, все операции происходят в RAM, оперативной памяти, которой требуется много (по меркам embedded devices). Так и задумывалось изначально. Чтобы программа успешно работала на NAS/Raspberry Pi/старых компьютерах с маленьким ОЗУ, нужно переписать всю работу с базой. Это не так, чтобы невозможно или очень сложно, но все-же требует времени. Скажу прямо, в первоочередных задачах у меня это не числится, сорри.
Coordinator
Nov 18, 2013 at 5:34 PM
Edited Nov 18, 2013 at 6:34 PM
Да, в плане оффтопика: лично я использую PC based безвентиляторный домашний сервер. Этот PC используется и как video player, и как сервер для всевозможных задач (file server, SQL server, Subversion server, GIT server, torrent client). "Кушает" в месяц, конечно, поболее, чем ARM-based дивайсы, но весьма терпимо - как 100-ваттная лампочка (если что, переходит в low power mode).
Nov 19, 2013 at 5:38 AM
bnas wrote:
Еще думаю, что у нас с вами одна и та же библиотека - у моей librusec_local_fb2.inpx размером 11 097 088 байт.
Если есть желание попробовать, то могу завтра выложить свою базу данных на Я.Диск.
Забавно, но отличается на пару байт ;) 11097082
Таки наверно все-же одинаковая, по крайней мере у меня последнее, что было.
Желание попробовать есть, правда есть дикие сомнения насчет Mono, но если оно-таки заводится у других - вдруг повезет.
А вцелом мне почему-то думается, что если в NAS есть стандартный апач, то обертку хоть на PHP приделать можно для отдачи данных.
По крайней мере сейчас у меня завелась связка апач+mysql, не летает конечно, но свое дело делает.
Nov 19, 2013 at 5:51 AM
Edited Nov 19, 2013 at 5:58 AM
bnas wrote:
Если есть еще идеи как и что Можно проверить - напишите, попробую. Хотя похоже на то, что последний слеш под Linux лишний - с ниМ сбиваются пути на МоМенте "выдачи" книги.
СМущает, что какие-то слэши Могут быть лишниМи... Насколько я пониМаю, по стандарту таМ хоть 10 слэшей подряд писать - путь должен воприниМаться одинаково. Очень странно, что иМя файла базы зависит от пути - т.е. по логике пути "/opt/xxx", "/opt/xxx/", "/opt/xxx////" одинаковые, а иМя файла оказывается разныМ, что вносит путаницу.

ВобщеМ-то, если путь задается в конфиге, почеМу бы иМя файла базы тоже таМ же не задавать? Тогда даже Можно не хэшированное иМя делать, а писать что-то осМысленное и даже сиМпатишное :)

PS. как-то странно режиМ Edit на форуМе работает - все буквы "М" Маленькие заМеняет на "м", пришлось ручкаМи написать большие
Nov 19, 2013 at 7:37 AM
Edited Nov 19, 2013 at 7:52 AM
SeNS wrote:
bnas , попробуй обновленную версию (из дропбокса, в первом посте этой дискуссии) - должно, по идее, решить issue со слешем на конце.
Попробовал с новым файлом, md5
acb6f71e2d938cf9fc27508410d63cda *TinyOPDSConsole.exe
Результат тот же
Вариант:
в конфиге /opt/lib
имя файла базы e06b9f23-9c3d-5ebd-96a4-0cbaa1c7c055.db
работает.
Вариант
в конфиге /opt/lib/
имя файла базы 6ccd8000-52ee-5809-a4ef-6308354c3b80.db
не работает.
11/19/2013 11:17:54.5   I   OPDSServer  HTTP GET request from 192.168.0.103: /opds/6d2f8059-d4c1-5105-9879-a8652ba24c31/Abbaszade_Gusejjn_Cvety_polevye.fb2.zip
11/19/2013 11:17:54.5   E   HttpProcessor   FB2 file exception Operation is not valid due to the current state of the object 
PS Ссылка на базу данных сканирования библиотеки ("ххх от 4 ноября 2013 года") http://yadi.sk/d/Y7aGPLkoCvh6i

Замечание. Случайно ввел адрес
http://192.168.0.124:8080////opds/cover/5241940a-e7bc-5d4d-afd0-e74b1882d57f.jpeg
и выяснилось, что и новая версия, и прошлая обрабатывают такие запросы, не обращая внимания на количество слешей между номером порта и opds.

Еще замечание. Только сейчас заметил, что в категорию "Новые книги" попадают все книги. Так как датой добавления в библиотеку ставится дата и время прочтения информации о книге из базы при старте сервера :(
Coordinator
Nov 19, 2013 at 3:56 PM
eaa, не могу "навскидку" вспомнить, зачем я так сделал (относительно имени базы). Вероятно, именно для того, чтобы не называть вручную "осмысленно", и не перезаписывать отсканированную базу, если "прошляпил" с именем/файлом настроек.

Касательно количества слешей - для Windows, UNC-путей, это действительно все равно. Для Linux, AFAIK, нет.

На счет букв "м" не замечал - Google Chrome, IE - все работает правильно.

bnas, со слешами еще поработаю, постараюсь выкроить время (благо, это мелочь).

Относительно новых файлов: считается разница между текущей датой и временем добавления книги в базу, старт сервера не имеет к этому никакого отношения. Каталог "новые книги", все-же, нужно будет переделать, по образцу флибусты. Главное - найти время для этого.
Nov 19, 2013 at 6:06 PM
SeNS wrote:
eaa, не могу "навскидку" вспомнить, зачем я так сделал (относительно имени базы). Вероятно, именно для того, чтобы не называть вручную "осмысленно", и не перезаписывать отсканированную базу, если "прошляпил" с именем/файлом настроек.

Касательно количества слешей - для Windows, UNC-путей, это действительно все равно. Для Linux, AFAIK, нет.
Для линукса тоже было всегда все равно.
Но! Если имя файла считается от пути, т.е. по сути от строки, то с точки зрения алгоритма хэширования строки отличаются, если в них разное количество слэшей. Т.е. операционке пофиг на сам путь, а имя файла разное выходит, потому что это разные строки.
На счет букв "м" не замечал - Google Chrome, IE - все работает правильно.
Да, похоже вчера глюк был - сегодня все нормально отображается.

И вот как это ставить на NAS - инструкция есть после всех экспериментов, следы которых описаны на форуме?
Если есть - дайте рецепт :)
А то и самому экспериментировать неохота, а с другой сторону могу протестировать с нуля готовый алгоритм установки и либо подтвердить, что все ОК, либо потом начать описывать свои проблемы, если таковые будут.
Nov 19, 2013 at 7:07 PM
Вот что я имел в виду про путаницу с путями и именами файлов:

TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Library name for the path "/home/eaa/tmp/tynyopds" is: 689e6723-efe6-5528-8b08-9728ed959c73.db

TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Library name for the path "/home/eaa/tmp/tynyopds/" is: 93e3c0a2-07d1-5ecf-9252-a5b72afc2783.db

TinyOPDS console, version 1.2 , copyright (c) 2013 SeNSSoFT
Library name for the path "/home/eaa/tmp/tynyopds////" is: 0ef43612-c60f-5f0e-b4fe-8bc7c9a83fd6.db
Coordinator
Nov 19, 2013 at 11:06 PM
Никакой путаницы не будет - я добавлю (может быть, даже сегодня вечером) патч, который будет нормализовать пути.

Инструкции по установке на NAS от меня нет и не предвидится, по причине отсутствия оного :) Если ты поэкспериментируешь, установишь и напишешь инструкцию - честь тебе и хвала. А нет - так и тоже ничего ;)

Вкратце: если у тебя Linux based NAS, то нужен mono (ставь сразу mono-develop). Если Atom/x86 - нужен стандартный .NET 4.0. Только учти - если памяти меньше 1/2 гигабайт, или ARM CPU, то "ворочаться" будет крайне медленно.
Coordinator
Nov 20, 2013 at 2:36 AM
Исправил, теперь слэши не должны влиять. Новая сборка - на дропбоксе (ссылка в стартовом посте)
Dec 5, 2013 at 7:31 AM
Или я что-то сделал не так, или с выдачей Новых книг действительно не всё правильно.
Вышло обновление библиотеки.
Остановил TinyOPDS.
Сделал TinyOPDSConsole.exe scan. Имеющиеся в базе книги были проигнорированны, новые - добавлены.
Запустил TinyOPDSConsole.exe start.
Home OPDS server
running on TinyOPDS server version 1.2
        
Новые книги (по дате добавления)
4 декабря 2013 г. 18:12
255714 новых книг, упорядоченных по дате

Новые книги (в алфавитном порядке)
4 декабря 2013 г. 18:12
255714 новых книг, упорядоченных по алфавиту

По авторам
4 декабря 2013 г. 18:12
255714 книг от 66379 авторов

По сериям
4 декабря 2013 г. 18:12
255714 книг в 16606 сериях

По жанрам
4 декабря 2013 г. 18:12
Книги, сгруппированные по жанрам
То есть, общее количество книг увеличилось примерно на 2 700, но новыми считаются все книги, входящие в библиотеку.
Coordinator
Dec 5, 2013 at 2:20 PM
Edited Dec 5, 2013 at 4:11 PM
Это странно, нужно проверить (именно на консольной версии я не проверял). Возможно, баг...

[UPDATE] Проверил код: к сожалению, это действительно логический баг у меня - при сканировании заменяется дата даже у уже существующей книги. Это я обязательно исправлю.

Но... Вовсе не обязательно было запускать сканирование заново: достаточно настроить опцию Watcher-а (слежение за фолдером библиотеки, <setting name="WatchLibrary" serializeAs="String">True</setting>), и книги будут добавлены автоматически, даже во время работы с опцией start.
Coordinator
Dec 5, 2013 at 4:12 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.
Coordinator
Dec 5, 2013 at 4:47 PM
Поторопился я с ответом и открытием bug-а. Только что перепроверил (благо, это быстро) на GUI и консольной версиях, все работает так, как и должно.
Добавил 20 epub-ов к тестовой либрусечной базе; после сканирования и запуска, в "новых книгах" только эти 20 книг (оригинальная база была создана довольно давно).

Попробуй изменить период, за который книги считаются "новыми". Это опция <setting name="NewBooksPeriod" serializeAs="String">0</setting> , 0 соответствует одной неделе, 1 - двум неделям, 2 - трем, 3 - месяцу, 4 - полутора месяцам, 5 - двум месяцам, 6 - трем месяцам.
Dec 7, 2013 at 8:20 PM
Edited Dec 7, 2013 at 9:10 PM
Огромное спасибо за версию под Linux.
И спасибо всем кто решил проблему со скачиванием... Сам бы никогда не до думался.
Dec 20, 2013 at 11:25 AM
Edited Dec 20, 2013 at 11:26 AM
А в какой момент книги, найденные Watcher'ом, записываются в файл базы?
Ситуация:
  • в каталог библиотеки добавился новый архив;
  • TinyOPDS "заметил" это добавление, просканировал книги, они отразились в новых;
  • несколько дней всё работало; затем несколько дней не обращался к библиотеке (сервер продолжал работать без перезагрузок); вчера, при попытке подключения, узнал, что процесс TinyOPDS не запущен (в причинах этого пока не разобрался, в логах TinyOPDS ничего по этому поводу нет);
  • запустил TinyOPDS;
  • в базе только те книги, которые были добавлены при "ручном" сканировании; книг, добавленных Watcher'ом, нет; заново архивы, добавленные после "ручного" сканирования, Watcher "заметил" только после их перещения из каталога и возвращения обратно.
Feb 25, 2014 at 3:30 PM
Появился проект SimpleOPDS как раз удобный для использования в Linux.
сайт: www.sopds.ru.
Работает вроде неплохо.
Coordinator
Feb 25, 2014 at 4:44 PM
Это, конечно, хорошо, только непонятно, зачем это рекламировать тут? Ну, и на счет "simple" - если эта инструкция не отпугнет, то можно назвать simple :)
Feb 25, 2014 at 5:25 PM
Да, вообще то конечно насчет simple Вы правы. И про рекламирование я как-то не подумал, простите. У Вас отличная программа, давно ей пользуюсь, по удобству и быстроте ей нету равных. Просто на моем NAS под Linux эта вроде нормально пошла. Просто подумал может кому-нибудь здесь пригодится.
Coordinator
Feb 25, 2014 at 7:20 PM
Edited Feb 25, 2014 at 7:23 PM
TinyOPDS под Linux-ом тоже нормально работает, за одним исключением: в силу архитектуры требует много (для embedded систем) RAM. Надо-бы переписать через какой-нибудь embedded движок базы данных, но нет "натхнэння" и мотивации сейчас (у меня все крутится non-stop на домашнем сервере без проблем, NAS особо не нужен - хотя мой роутер, например, позволяет шарить USB диски).

P.S. Но лично меня, как старого фаната "ибукостроения" и энтузиаста OPDS, новость радует. Чем больше бесплатных программ и решений - тем лучше.
Mar 30, 2014 at 11:04 PM
Edited Mar 30, 2014 at 11:21 PM
Забрал с Dropbox текущие (последние) файлы програMMы..
Под Win7 64bit програMMа запустилась, сканирование прошло быстро, читалкаM каталог виден, книжки в читалки загружаются..

Запустил консольную версию на QNAP NAS TS-269 (установил mono v2.11 из репозитория, конвертер в epub скачал по ссылке из FAQ, доустановил недостоющее для коMпиляции на NAS (Optware IPKG) и откоMпилировал конвертер)
Однако книжки и броузеры "не видят" opds на NASе...
Стал сравнивать генерящийся виндовой и линуксовой версией ответы сервера (документ xml) и обнаружил, что линуксовая (консольная) версия генерит ДВЕ строчки с определениеM форMата XML.
Если "скорMить" броузераM сохраненный в файл ответ сервера , то на "виндовый" файл броузеры не ругаются и открывают его как норMальный XML..
Однако на файл "линуксово-консольный" все броузеры дружно ругаются на "вторая строка сиMвол 3" - таM идет вторичное открытие определения XML..

Сильно подозреваю, что если убрать эту строчку, то и читалки и броузеры сMогут норMально работать с "консольно-линуксовой" версией програMMы..

Вот так отвечает виндовая версия (фрагMент шапки):
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/terms/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:opds="http://opds-spec.org/2010/catalog">
  <id>tag:root</id>
  <title>Home OPDS server</title>
  <subtitle>running on TinyOPDS server version 2.0</subtitle>
  <updated>2014-03-30T21:23:14.9140665Z</updated>
  <icon>/favicon.ico</icon>
А вот так отвечает у Mеня консольно-линуксовая версия (вторая строка вызывает ошибку в броузерах)
<?xml version="1.0" encoding="utf-8"?>
<?xml xmlns="http://www.w3.org/2005/Atom" version="1.0" encoding="utf-16"?>
<feed xmlns:dc="http://purl.org/dc/terms/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:opds="http://opds-spec.org/2010/catalog">
  <id>tag:root</id>
  <title>Home OPDS server</title>
  <subtitle>running on TinyOPDS server version 1.2</subtitle>
  <updated>2014-03-30T21:23:31.377697Z</updated>
  <icon>/favicon.ico</icon>
  ......
PS
По непонятныM Mне причинаM, русская Mаленькая буква "M" (вот она - "м" ) в тексте данного сообщения заMеняется численныM юникодовскиM значениеM.. В данноM тексте я использовал латинскую заглавную букву "M" - она отображается корректно..
Что делать?
Coordinator
Mar 31, 2014 at 2:31 AM
Хмм, это весьма странно: консольная версия использует тот-же самый код, что и GUI-шная (одни и те-же файлы серверной части), поэтому xml output не должен, по идее, отличаться (разве что в Mono что-то намудрили). Я тестировал консольную версию на Ubuntu, все работало в точности, как и под Windows. Может, имеет смысл попробовать собрать mono из сорцов?
Mar 31, 2014 at 7:00 AM
На NASе не все так просто со сборкой (все же усеченный линукс). Посмотрю что там может быть с mono..
У меня есть рабочая версия Ubuntu 13.10 - ставить на нее "штатно" opds я бы не хотел, но с целью эксперимента я пожалуй сегодня рискну запустить TinyOPDS.
Посмотрю что генерит он на юбунте.. Правда у меня нет с собой читалок (андроидных) чтобы проверить работоспособность "в лоб", но на уровне генеримого XML я пожалуй смогу посмотреть разницу, если она будет.

С другой стороны, mono уж точно не должен вмешиваться (на уровне генерации выходного потока (его содержимого) на сокет или аналогичного) в работу бинарника..
Да и текст второй строки более чем осмысленный, хотя появляется "utf-16", что мне не очень понятно, откуда он вылез..
У вас есть возможность посмотреть, что генерит консольная версия сервера в других средах (другие линуксы, в винде и пр.)? Это упростило бы диагностику.

Кстати, не поблагодарил вас за проделанную работу, а сразу "вылил на голову проблемы" :) .. Прошу пардону.

У вас получился весьма хороший и более чем удобный сервер, может есть еще какие-то шероховатости, но безусловно это достойный продукт.
Спасибо вам.
Coordinator
Mar 31, 2014 at 2:03 PM
Edited Mar 31, 2014 at 2:06 PM
Проверил на Ubuntu версию из dropbox-а (пересобрал с изменением номера assembly до 2.0), xml выдача абсолютно нормальная, такая-же, как и под windows (соответственно, все работает).
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/terms/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:opds="http://opds-spec.org/2010/catalog">
  <id>tag:root</id>
  <title>Home OPDS server</title>
  <subtitle>running on TinyOPDS server version 2.0</subtitle>
  <updated>2014-03-31T13:00:35.159238Z</updated>
  <icon>/favicon.ico</icon>
  <link href="/opds-opensearch.xml" rel="search" type="application/opensearchdescription+xml" />
  <link href="/opds/search?searchTerm={searchTerms}" rel="search" type="application/atom+xml" />
  <link href="/opds" rel="start" type="application/atom+xml" />
  <link href="/opds" rel="self" type="application/atom+xml" />
  <entry>
    <updated>2014-03-31T13:00:35.604627Z</updated>
    <id>tag:root:authors</id>
    <title type="text">По авторам</title>
    <content type="text">230126 книг от 56828 авторов</content>
    <link href="/opds/authorsindex" type="application/atom+xml;profile=opds-catalog" />
  </entry>
  <entry>
    <updated>2014-03-31T13:00:36.930375Z</updated>
    <id>tag:root:sequences</id>
    <title type="text">По сериям</title>
    <content type="text">230126 книг в 13984 сериях</content>
    <link href="/opds/sequencesindex" type="application/atom+xml;profile=opds-catalog" />
  </entry>
  <entry>
    <updated>2014-03-31T13:00:37.1955Z</updated>
    <id>tag:root:genre</id>
    <title type="text">По жанрам</title>
    <content type="text">Книги, сгруппированные по жанрам</content>
    <link href="/opds/genres" type="application/atom+xml;profile=opds-catalog" />
  </entry>
</feed>
Смотри (давай на "ты", мне так более привычно), кто у тебя фильтрует твой порт/трафик, на предмет добавления новой строки в xml...

P.S. Да, а "спасибо", как говорят на 4pda.ru, "лучше говорить повышением репутации", то-бишь ревью и оценкой релиза на главной странице проекта :)
Mar 31, 2014 at 2:37 PM
Edited Mar 31, 2014 at 2:46 PM
На Ubuntu я поставил (из репозиториев) mono-runtime - это оказалось недостаточно.. Доустановил библиотеки apt-get install libmono-system* - приложение стартонуло без проблем (при сканировании возникли проблемы с "windows-1251" - решать их не стал, ибо преследовалась другая цель)..
Собрал под ubutu`ой конвертор в epub и прописал его в конфиге..
В результате у меня тоже приложение стартонуло без проблем и на выходе давало только одну строчку с <?xml ... и даже в броузере отработался некий web-интрефейс :)
Т.е. всеже проблема у меня локальная, на уровне моего конкретного NAS и конкретного релиза mono..

Пытаюсь собрать из сырцов mono 3.0.3 (и даже нашел готовый .qpkg файл с данным релизом mono под NAS моего типа, но штатный пакет не устанавливается (с диагностикой причин там не очень хорошо, поэтому пока неясно почему не идет установка) ), а сборка из сырцов пока дает много ошибок и массу неудовлетворенных зависимостей (не все зависимости удовлетворяются пакетами из штатных репозиториев, что напрягает).. "Рушить" NAS очень не хочется - там почти 8 Тб инфы и отстроенные набор софта.. Хочется как-то "аккуратненько" поставить данный TinyOPDS не "сломав" существующий софт и не порушив существующие зависимости..
Как вариант, попробую посмотреть, кто покушается на вывод под "штатной" версией mono 2.11 (сборка от 27 февраля 2014) - может удастся настроить все это под "штатную" mono.
NAS у меня приличный, на базе x86 архитектуры с 3 ГБ оперативной памяти, поэтому данный OPDS сервер должен откровенно "летать" на таком железе..

SeNS, а ты как-то выкладывал тестовый файлик с "Hello world".. Он у тебя сохранился? Хочу на нем поэкспериментировать с выводом потока.

PS на 4pda я с 2006 года, но здесь впервые и поэтому "систему ценностей" еще не освоил :) - исправлюсь.
Coordinator
Mar 31, 2014 at 2:48 PM
Edited Mar 31, 2014 at 2:54 PM
vagvag, я порекомендую для начала попробовать изменить порт, и "суффикс" выдачи xml - может, это какая-нибудь "англичанка гадит", то-бишь встроенная баннерорезка или т.п.

На счет "Hello world" немного не понял, не припомню (я выкладывал крохотную утилиту, показывающую сетевые интерфейсы); если что-то выкладывал (обычно я на свой дропбокс бросаю), значит, там и лежит - места у меня много, а чисткой заняться лень...

P.S. В принципе, сегодня вечерком (нашим, EST) могу сделать для тебя тестовую утилитку, создающую XML и печатающую его на stdout - посмотрим, как отрабатывается на твоем mono создание документа через new XDocument(
Mar 31, 2014 at 4:02 PM
Утилитка упоминалась в сообщении "3348735, Oct 3, 2013 at 8:16 PM" - это почти в самом верху данного топика..
На дропбоксе (если речь идет об этом https://www.dropbox.com/sh/7bdoinns0te2vwd/jjOI2U5wu7 ) ее нет.
За генерирующую XML утилитку буду признателен - можно будет "отполовинить" проблему - понять на каком этапе появляется второй заголовок.

Порт я менял неоднократно - "суффикс" не менял (это что? В настройках вижу только префиксы рутпрефикс и хттппрефикс)..
Менял также и язык ru на en - никакого положительного эффекта (кроме реального изменения языка в выводимом тексте)..
Банерорезолок и пр. у меня нет, да и проверял я на разных устройствах, включая и реальный андроидный ридер (и не один). Могу зайти телнетом на порт сервера, но это вряд ли что изменит. Скорее всего проблема на стороне "mono-сервера". Попробую поискать. Хотя эмбедед линукс - это далеко не тоже самое, что нормальный *nix или ubuntu (не все средства диагностики/отладки/конфигурирования доступны).
Coordinator
Mar 31, 2014 at 4:24 PM
А, понял. Hello world тебе эта не нужна - у тебя-то все запускается и работает, только вот лишняя строка в xml непонятно откуда появляется. Попробую на ланче сделать (там дел на минуту) тестовую программку, и сюда выложу - stay tuned...
Coordinator
Mar 31, 2014 at 5:47 PM
Так, кажется, я нашел, "где собака порылась" :) Похоже, проблема именно в деталях имплементации XDocument в Mono.
Переделал обе версии; сейчас, по идее, должно работать правильно - обнови из дропбокса и протестируй, пожалуйста. Если под Linux-ом заработает, проверь также под Windows, не закрался-ли баг...
Mar 31, 2014 at 8:09 PM
Вы спасли мой мозг от вскипания :)
Лишняя строка в заголовке пропала.
Отображение библиотеки заработало совершенно корректно! И читалки видят книжки (признают указанный им адрес как OPDS сервер), и в броузерах винды корректно отображается библиотека..

Скачивание пока не работает (404 ошибка), но с этим я думаю разберусь (проверю настройки путей, права доступа, конверторы, посмотрю логи и пр.)
Mar 31, 2014 at 8:27 PM
Edited Mar 31, 2014 at 8:41 PM
Скачивание тоже работает. Это я был виноват - база и фактически имеющиеся файлы не совпадали.. Базу удалил, пересканировал книжки по факту и все заработало (чего и следовало ожидать).

У меня в конфиге поле LastCheck не обновляется (стоит дата 10 марта)..
Несколько вопросов/запросов :)
Как можно запускать сервер (я о консольной версии под линуксом) демоном? Как потом этим демоном управлять (старт/стоп/рестарт)?
Если я залогинюсь на NAS (ssh), запущу mono TinyOPDSConsole.exe start и закрою соединение (порву), то единственно как я могу потом прибить процесс это только kill`нуть его, что наверное не хорошо.. Да еще и "вычислить" процесс нужно..
Т.е. пока в таком виде работать с консольной версией сервера под линуксом немного не удобно.. Может у тебя будут мысли как это реализовать более грамотно?
Coordinator
Mar 31, 2014 at 9:09 PM
Edited Mar 31, 2014 at 9:34 PM
Ну, "демоном" можно запускать не только вручную, вообще-то ;) Прописать в любой конфигурационный файл, обрабатываемый линухом по старту, а в конце добавить волшебный символ & (кстати, таким макаром и вручную будет работать, AFAIR) ;) Впрочем, это уже не по tinyopds вопрос, а по линуху вообще, а тут я не эксперт.
Старты/стопы/рестарты под линухами делается элементарно с помощью шелл-скриптов и широкого спектра команд. Прибивать kill-ом вполне себе можно, mono/.net позаботятся о файлах/памяти.
Поскольку поддержка консольной версии под Linux не является приоритетной для меня, ничего делать с ней в ближайшее время я не планирую, так что порекомендую все-же подучить шелл-скрипты.

P.S. Что я сделаю (скорее всего, вечерком): "подкручу" немного performance issue - сейчас запрос по авторам очень долго работает (просчитывает для каждой группы авторов количество книг по каждому автору, поэтому при больших группах отрабатывает долго).

[UPDATE] Это оказалось даже проще, чем я планировал ;) Новая версия, с сильно убыстрившимся выводом каталога авторов с числом книг (особенно заметно через HTML, когда порог стоит большой, >500) лежит в дропбоксе.
Mar 31, 2014 at 9:45 PM
Со скриптами у меня более менее прилично (в том числе и запуском демонов на разные уровнии), поэтому если "mono _что-то.exe" ведет себя как бинарник и не боится kill`а (у меня ко всему, что имеет расширение .exe несколько иное отношение :) чем к тому что скомпилирована под *nix) то проблем я не вижу.. Т.е. я правильно понял, что если посылать процессу сигнал TERM (или более "мягкий"), то спарка mono ххх.exe корректно закроет файлы (логи, базы и пр.), сбросит дескрипторы и корректно освободит память?..
Если это действительно так, то я не буду "брать в голову" "виндовые корни" и буду относится к такой спарке более спокойно.
Просто и mono и тем более "виндовый екзешник" под шелом для меня в новинку (узнал и о том и о другом несколько дней назад) и отношусь я к ним несколько насторожено с перевесом в сторону "виндовости" :)
Coordinator
Mar 31, 2014 at 10:38 PM
В каком-то смысле, этот "виндовый экзешник" гораздо более (или, по крайней мере, не менее) "линуксово-нативный", чем какой-нить там python или java. Т.е. есть нативный mono, который интерпретирует пи-код внутри сборки (собственно, все PE заголовки, таблицы ссылок там для .NET-овских сборок не нужны, это просто wrapper, так как в windows исполняемость определяется достаточно тупо, просто по расширению).

Единственная проблема при "прибитии" может быть, если ты динамически (через TinyOPDS + UPnP) пробрасываешь порт на роутере - порт при "смерти" не закроется, а обработчика ux-овых сигналов в коде нет. Во всем остальном программа полностью portable & safe, никаких открытых файлов не держит (все сидит в RAM: отсюда, с одной стороны, завышенные требования к памяти, но с другой - простота работы и безопасность.

Да, по большому счету, нужно было дизайнить приложение с web-интерфейсом - не было-бы проблемы с UI. Но уже поздно, да и неискушенных пользователей web интерфейс мог бы отпугнуть (а так - маленькая привычная "windows" программка).
Mar 31, 2014 at 11:03 PM
Edited Mar 31, 2014 at 11:17 PM
А как происходит работа с файлом лога при появлении события, нуждающегося в логировании и при завершении работы сервера?
Не будет ли происходить потеря записи о завершении работы или о событии при неожиданном kill?

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

UPD:
посмотрел сейчас у себя на NASe - там kill практически не обрезанный и как результат с большим набором посылаемых сигналов (по умолчанию kill шлет процессу сигнал TERM, но можно указать какой именно сигнал послать убиваемому процессу). Т.е. есть с чем по экспериментировать..
kill -l показывает список поддерживаемых сигналов. Вот список сигналов с моего NASa
# kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMIN+4 RTMIN+5 RTMIN+6 RTMIN+7 RTMIN+8 RTMIN+9 RTMIN+10 RTMIN+11 RTMIN+12 RTMIN+13 RTMIN+14 RTMIN+15 RTMAX-14 RTMAX-13 RTMAX-12 RTMAX-11 RTMAX-10 RTMAX-9 RTMAX-8 RTMAX-7 RTMAX-6 RTMAX-5 RTMAX-4 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX
Coordinator
Mar 31, 2014 at 11:29 PM
Можешь попробовать сгененрировать сигнал Ctrl+C чем-нибудь, по Ctrl+C должен выйти штатно. См. вот тут https://tinyopds.codeplex.com/SourceControl/latest#trunk/TinyOPDSConsole/Program.cs
Mar 31, 2014 at 11:54 PM
Edited Apr 1, 2014 at 12:00 AM
посмотрю (ctrl+c посылает сигнал INT, т.е. сигнал номер 2, но видимо обрабатывается он иначе). Пока обнаружил, что фоновый (запущенный в фоне, читай почти как демон) скан не убивается 15 сигналом (TERM) (т.е. классический kill PID), но мгновенно гибнет под напором сигнала 9 (KILL) kill -9 PID при этом лог обрывается (не фиксируется завершение программы)..
Не убивается сигналами 2(INT), 3 (QUIT), 6 (ABRT), 19 (STOP), 30 (PWR), 31 (SYS)...
Кстати, неожиданно для себя запустил ДВА фоновых процесс сканирования библиотеки.. Вот теперь сижу и думаю, как они там с одним и тем же файлом базы уживались..
Coordinator
Apr 1, 2014 at 12:21 AM
В принципе, могу добавить обработку linux-овых сигналов, как на stackoverflow рекомендуют: http://stackoverflow.com/questions/6546509/detect-when-console-application-is-closing-killed
Да, два экземпляра консоли запустить действительно можно, я проверку забыл добавить (есть только в GUI-овой версии). А нужна такая проверка? Кто-то наоборот радовался, что можно запустить две разных копии, и раздавать две разных базы.
Apr 1, 2014 at 6:51 AM
На счет двух и более экземпляров консоли.. Вопрос конечно интересный, с одной стороны действительно если баз две или более, то для каждой базы можно запустить свой процесс, НО если процесс ресурсоемкий, то два и более процесса сканирования могут не на много ускорить общий процесс сканирования (суммарная скорость).. С другой стороны (меня это больше волнует) - что будет если два и более процессов будут обрабатывать одну и туже базу (один и тот же файл базы)?? Базе от этого не поплохеет? Если база индексированная (с уникальным полем), то безусловно она "сломается".. В остальных случаях - не понятно тоже (вам виднее, поскольку и структуру и алгоритм обработки писали вы и вам проще будет предположить, что может произойти)..

Про линуксовые сигналы - идея хорошая. Все же лучше, если есть такая возможность, останавливать программы штатно, скидывая буфера в файл, освобождая дискрипторы, и передавая управления штатным деструкторам..
Apr 1, 2014 at 11:45 AM
В последней версии заработал поиск в eBook Search (iOS)!
Coordinator
Apr 1, 2014 at 2:20 PM
Edited Apr 1, 2014 at 2:45 PM
vagvag, нужно все-же исходить из принципа "разумной достаточности", а именно, что человек, запускающий консольное приложение под linux, должен понимать, что, как и зачем он делает (а не только два раза мышкой кликнуть; от "кликальщиков" же защита есть :) Базе не поплохеет, потому, что это не база, по сути, а просто дисковый дамп набора записей, но пользы от этого (когда две программы перезаписывают один и тот-же файл) не будет.

Касательно линуксовых сигналов: я подумал, и решил, что не хочу использовать что-то mono-специфическое; к сожалению, под "чистым" .NET кросплатформенные interprocess communications далеко не тривиальная штука, совсем просто не сделать (это для штатного завершения программы). То, что работает под Windows, не работает под mono, и наоборот.

Я думаю, с практической точки зрения, нет большого смысла в этом. Создай скриптик, проверяющий наличие в памяти процесса mono, и перезапускай TinyOPDS в случае его отсутствия. Добавь этот скрипт в cron, и будет тебе "щасте" :)

[UPDATE] Или посмотри выше по топику, есть линк на более "классическое" решение со стандартной базой и сервером, Simple OPDS - возможно, тебя под linux-ом оно больше устроит.

alexls, вот и хорошо. Только iOS тут ни при чем: поиск и ранее работал правильно. Я фиксил баг/фичу конкретной сборки mono, ведущей себя не стандартно по сравнению с эталонным .NET (притом, что "свежие" релизы mono такой проблемы не имеют - см. выше по топику).
Apr 1, 2014 at 9:37 PM
Simple OPDS я пробовал - это реально далеко не "симпл" :) и технически хуже портируется на нестандартные "линуксы".
С kill`ом я понял - буду "грохать" процесс девяткой не взирая на возможные последствия (надеюсь их не будет)..
Что касается мутизапуска, то на уровне скрипта я могу без проблем не только проверять имеется ли в запущенных процессах mono TinyOPDSConcole.exe но и сравнивать пути запуска и если процесс в памяти запущен по другому пути (т.е. это почти на 100% означает, что такой процесс работает с другой "базой" ) то запускать новый (еще один), а если пути идентичны, то выдавать классическое эхо "процесс уже запущен, для перезапуска используйте script restart" Для кила, чтобы убить именно требуемый (если в памяти крутится более одного процесса) анализировать или путь запуска запроса на килл или предупреджать и выводить список процессов с путями, с вариантами "убийства" конкретного - т.е. диалоговый режим.. В ряде случаев он может быть неудобным ибо требует взаимодействия с пользователем, что не всегда хорошо..
Возможно будет проще переименовать экзешник (для второго процесса) и тупо считать их разными именно по имени экзешника (ps позволяет получить и эти данные)..
В любом случае, лично мне мультизапуск не нужен..

Не совсем понял мысль про cron - зачем стартовать что либо "серверного" уровня по крону? И что делать если до следующего "автозапуска" еще много времени, а пользовать сервер нужно "сейчас".. Что делать, если вы остановили процесс для настройки/отладки/модификации, а он в это время "вдруг" сам запустился, да еще и с ненастроенными параметрами.. В общем, идея с кроном мне очень не нравится. Есть масса иных совершенно нормальных способов сделать с запуск процесса при старте системы с возможностью мануального управления (старт/стоп/рестарт/удалить базу).

Про эту часть работы не переживайте - я не вижу пока в ней затруднений для реализации "под себя"..
Coordinator
Apr 1, 2014 at 10:07 PM
Про крон это я так написал (другого под линухом не знаю просто) - "я не настоящий сварщик, я просто маску нашел" :) Теоретически, тебе может понадобиться периодически его "прибивать" и перезапускать (по ощущениям, есть небольшой memory leak, но нет ни ресурсов, ни времени его отловить), чтобы "почистить" занимаемую RAM. Но, практически, у меня на домашнем сервере он работает non-stop неделями, перегружаясь только вместе с Windows после апдейтов.

База (теоретически, опять-таки) может "запороться" при kill -9 в том случае, если в данный конкретный момент происходит запись на диск (например, после добавления новых книг). Но, если мы имеем дело со сравнительно статичной библиотекой (архив либрусека/флибусты) с ежемесячными апдейтами, то риск не так уж и высок.

Да, про сканирование: пути в базе относительные (притом программа знает, под какой OS она ранится, и умеет конвертировать слеши в путях при надобности), поэтому, если не хочется долго ждать, можно сканировать на рабочей workstation, а потом просто скопировать и переименовать базу (по хэшу реального пути). Плюс - ее можно бекапить (жмется очень сильно); новые книги будут досканированы за считанные минуты.

Надеюсь, ты отпишешься по опыту реальной эксплуатации на NAS-е под Linux-ом; может, даже статейку в How-to накатаешь? ;)
Apr 1, 2014 at 10:51 PM
Если есть утечки и они анализируемые (т.е. например увеличивается занятая процессом память ), то тогда действительно можно кроном, раз..два в сутки сверять объем занимаемой процессом памяти и при достижении неких порогов - перезапустить процесс.

По скан на РС я читал (я прочитал практически все темы+фак на данном ресурсе), но думаю мне это не особо актуально, т.к. NAS у меня немножко не домашний :) Процессор Dual Core Intel Atom 2.13 ГГц и 3 ГБ ОЗУ - http://qnap.ru/ts-269-pro .. На таком железе сканирование идет как на средней руки РС. Да и крутится он круглосуточно, поэтому даже если начальный скан вдруг займет 10..20 часов, то я этого не замечу.. Есть в хозяйстве и старенький "домашний" http://qnap.ru/ts-119 TS-119 в нем действительно слабенькое железо Процессор Marvell 6281 1,2 ГГц и 512 Мбайт ОЗУ... Для такого железа ваши предложения могут оказаться полезными, но если честно, то мне не очень хочется запускаться и экспериментировать на этом железе, поскольку преследую вполне практические цели :) , а не "лабораторные работы".

У вас есть возможность оперативно понять "запоролась" база или нет? Может "внешняя" утилита проверки базы? Если есть, то опять же скриптом запуска/стопа я могу делать бэкап базы перед килом с последующим анализом при следующем старте и при необходимости подменой "битой" базы на бэкап копию. Скриптами это делается не столь сложно..
Coordinator
Apr 1, 2014 at 11:21 PM
Контроля базы нет, как такового, поскольку это не база, а просто сериализованные данные. Если произойдет исключение при загрузке, пойдет запись в лог. Бэкап-то делать можно, только как ты обнаружишь, что добавление не идет в текущий момент? Лучше постараться все-же рестартовать пореже. Ты поиграйся неделю-другую - может, и не будет нужды рестартовать.

А NAS у тебя неплохой, да; для дома, я-бы сказал, даже немного overkill :) Но лично я остановился на безвентиляторном домашнем сервере-плеере, все all-in-one. А те $10-15, что он в месяц электричества скушает - да и Бог с ними. Зато все работает, как говорится, с полпинка, ни с чем проблем нет и напильником пилить ничего не нужно.
Apr 1, 2014 at 11:57 PM
Edited Apr 2, 2014 at 12:02 AM
Медиасервер у меня тоже есть безвентиляторный c сильно урезанным линуксом (NAS ts-119 тоже кстати безвентиляторный) и с более чем приличной видео/кодеко/процесорной частью (при выборе медиасервера/плеера я в первую очередь делал акцент на видео плату для 3D FullHD), но для файловых (не медиа) операций я все же предпочитаю использовать NAS (у них вообще нет видео адаптера) тем более что у него подняты несколько DLNA серверов, IpTV рекордер и прочие подобные сервиса, в какой то степени заменяющие или дополняющий медиасервер/плеер.. Но речь не о том.
У меня есть конкретные задачи/желания и я сейчас с вашей помощью :) их пытаюсь удовлетворить. Писать HowTo для данного случая может не совсем корректно - он не очень "народный".. TS-119 (и его более новые верссии 119P, 119P+) более "народные" - в них линух идентичный, но платформа там марвеловская, а не интеловская и в этом могут возникнуть некоторые отличия/нюансы..

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

С другой стороны, может я слишком сильно переживаю/перестраховываюсь и в практическом пользовании ничего подобного не понадобится.. Может просто делать ротационный бэкап на 5..10 помежуточных копий и этого будет "за глаза" и без всяких анализов/проверок и пр.

Давай я все же сначала сделаю что-то практическое, а уже потом можно будет и пообсуждать, а при необходимости и поискать пути решения проблем. Сейчас пока особо нечего обсуждать. В процессе предыдущего общения я уяснил для себе некоторые моменты и чуть поближе узнал mono и на мой взгляд теперь у меня уже возникла более менее понятная "база знаний" по данному продукту, достаточная для перехода от слов к делу (по мере появления времени, сил и желания).
Coordinator
Apr 2, 2014 at 12:36 PM
Давай я все же сначала сделаю что-то практическое, а уже потом можно будет и пообсуждать
Хорошая идея, только делать особо ничего не надо - запусти да книжки качай :) Не думаю, что ты свой NAS часто перезапускаешь...
Apr 2, 2014 at 12:56 PM
только делать особо ничего не надо - запусти да книжки качай :)
Это уже давно сделано :) Только вот "килить" приходится в ручную, совершив предварительно ряд операций для выявления PIDa.

Просто хочется все это "окультурить" и "обуниверсалить", сделать удобным (я о запуске/остановке/перезагрузке/запуске сканирования - если запускать процесс сервисом/демоном, то доступ к процессу практически теряется и в таком случае полноценный контроль над процессом просто необходим ) в пользовании, а заодно сделать "защиту от дурака".
Если запускать из под консоли и оставлять консоль открытой, то безусловно "делать больше ничего не надо" (до тех пор пока консоль по каким-то причинам не схлопнулась и вы в опять потеряете контроль над процессом).
NAS у меня обычно перезагружается крайне редко.
Apr 6, 2014 at 7:38 PM
Edited Apr 7, 2014 at 7:32 AM
В консольной версии (последняя из доступных на сегодня) TinyOPDSConcole.exe запущенной на NAS из под mono в режиме сканирования существует приличная утечка памяти или сам процесс так реализован, что память не периодически не освобождается.
При запуске тестового сканирования (библиотека состоит из .zip архивов тысячников, в зипах исключительно fb2 файлы, общее количество fb2 около 400 тыс) первые 20..40 минут сканирование (с целью не потерять интерактивность сессии запускаю из под screen ) происходит оперативно и база пополняется на 25..30 тыс записей, после этого происходит лавинообразное снижение скорости сканирования вплоть до 10 (не тысяч, а штук) книжек за 6..12 часов.
Процесс "откушивает" 50...55% оперативной памяти (у меня ее 3 Гб), процессор занимается на 99.9% (отведенных под процесс ядер/потоков), системных страниц памяти (размером 1К) отводит под себя до 1660М ... Т.е. "сжирается" практически вся доступная память, включая ее кэш..
В логах ничего специфического нет.
Процесс на Ctrl+c не реагирует (обновления информации в консоли процесса тоже нет). При kill данного процесса в логах новых записей об остановке сканирования не появляется (обрыв логирования). При перезапуске сканирования, можно "досканировать" еще 5..10 тысяч книг (пропуск уже отсканированных, имеющихся в базе происходит пошустрее, как только переходит на добавление новых книг вновь начинаются "затыки")..

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

Сканирование той же библиотеки (не консольной версией, в виндовс) происходит без проблем (4500..5000 книг в минуту), отбросов и дублей - такое же количество (если оценивать те зипы, что были отсканированы консольной версией на линуксовом NASе). База, перенесенная с отсканированной в WIN версии на NAS (с соответствующим переименованием) запускается и работает корректно, книжки отдает (выгружает в читалки)..

Для справки (чтобы было понятнее окружающим) про особенности работы приложения под NAS aми..
NAS - аппарат, не имеющий видеоадаптера, не имеющий возможности подключить к нему монитор, мышь, клавиатуру - т.е. запустить процесс с не прерывной сессией (клавиатурный терминал) возможности нет. (Это можно сделать в "настольных" линукс системах, к которым можно подключить клавиатуру и монитор непосредственно - такую сессию "оборвать" уже не получится и запущенные в ней процессы могут жить "вечно" )

Т.о. подключение к NAS обычно возможно только по сети терминалом через ssh (это как минимум отличает NASы от настольных линукс систем). Для тех кто не очень знаком с линуксами и терминалами напомню - если вы подключаетесь к серверу по сети терминалом и запускаете в bash e какие либо процессы, то по завершении сессии/обрыве связи все запущенные в этой сессии процессы (даже если их оставлять работать в фоне) будут убиты. Т.е. если запустить сканирование, а после этого порвется связь/закроется терминал - процесс сканирования будет убит. Повторное подключении откроет новую, независимую сессию.
Для таких случаев существует утилита screen . Если запустить в терминале screen а уже в ней запускать что-либо, то при обрыве связи / закрытии сессии всегда можно будет вернуться к запущенной под screen `ом сессии, так как будто связь не прерывалась. Это можно сделать даже с другого компьютера.

Запуск данного приложения возможен и от имени системы (не через терминал), но приложение TinyOPDSConcole.exe реализовано как интерактивное (выводит на экран, ждет команд с клавиатуры - т.е. рассчитано на взаимодействие с пользователем) и запуск в таком режиме (демоном) хоть и возможен, но при этом полностью теряется контроль над приложением (не видно того, что оно выводит и нет возможности послать ему команды с клавиатуры.. Вывод программы приходится отправлять или на /dev/NULL или в файл, а "убивать" приложении приходится "аварийно/принудительно" с помощью kill )

Таким образом из разумно корректных остается практически единственная возможность запуска приложения в консоли под screen (это можно сделать и автоматически, при загрузке системы, например).

Таким образом можно рекомендовать следующую строку (ее можно исполнить как через удаленную терминальную сессию, так и локально, автозапуском. screen может работать демоном, поэтому с "демонизацией" запуска вообще нет проблем)
screen -S Tiny mono /путь/к/файлу/TinyOPDSConcole.exe start (или scan)
Запуск демоном (в свернутом виде) используйте
screen -dmS Tiny mono /путь/к/файлу/TinyOPDSConcole.exe start (или scan)
Посмотреть список запущенных сессий можно
screen -ls
В ответ вы получите список сессий и их статус (подключен к ним кто-то или нет)
В любой момент и из любого места подключиться к освобожденной сессии вы можете командой
screen -r имя-сессии-из предыдущего-списка
Если сессия уже занята (т.е. есть терминал, который управляет этой сессией в данный момент), то к ней все равно можно подключиться. При этом в обоих терминалах будет происходить один и тот же вывод на экран и управлять процессами можно из обоих терминалов (будет реакция на клавиатуры обоих сессий). Некий аналог :) тимвьювера или ремоут администратора.
Команда на подключение к занятой сессии
screen -x имя-сессии-из предыдущего-списка

Подробностей по работе со screen в сети огромное множество - рекомендую поиском найти описание в том стиле, который вам будет наиболее понятен.
Посмотрите, например это http://help.ubuntu.ru/wiki/screen или это http://housecomputer.ru/programs/screen/screen.html и еще можно почитать изложение по теме на вполне простом языке вот здесь http://boombick.org/blog/posts/22
Не пренебрегайте man screen и screen --help
Apr 7, 2014 at 11:39 AM
SeNS wrote:
alexls, вот и хорошо. Только iOS тут ни при чем: поиск и ранее работал правильно. Я фиксил баг/фичу конкретной сборки mono, ведущей себя не стандартно по сравнению с эталонным .NET (притом, что "свежие" релизы mono такой проблемы не имеют - см. выше по топику).
Использую GUI версию. Во всех предыдущих поиск не работал. Сейчас работает в eBook Search. В KyBook reader и андроидных читалках не работает.
Coordinator
Apr 7, 2014 at 3:09 PM
Ну, что значит "в андроидных читалках не работает"? В одной из самых популярных андроидных читалок - FBReader-е - отлично работает! (просто я сам этой читалкой пользуюсь). Еще проверял в других популярных, тоже все работало (не думаю, что сломалось что-то, но перепроверю сегодня).
Coordinator
Apr 7, 2014 at 3:12 PM
vagvag, до внесения последнего изменения утечки не было? Мне это важно знать, чтобы фиксить...
Как я писал ранее, основной код GUI и консоли не отличается вообще (используются одни и те-же файлы), есть лишь небольшие отличия под Linux. Можешь проверить консоль при сканировании из-под Windows, будет-ли утечка?
Apr 7, 2014 at 8:08 PM
Edited Apr 7, 2014 at 8:22 PM
Запустил на сканирование туже тестовую библиотеку. Использовал TinyOPDSConsole.exe последней версии (на которой запускал тот же процесс под *никсом).
Win7 Rus Prof 64-бит, лицензия со всеми последними обновлениями.
ОЗУ - 16 Гб, процессор Intel Core i7-2700K @ 3.5GHz

Скорость сканирования несколько ниже чем на GUI версии 3000 книг/минуту против 4500..5000
Среднетипичная загрузка ОЗУ: в начале сканирования - 300..350 Мб, ближе к завершению - 650..850 Мб. Зафиксированное пиковое потребление памяти - 1 300 768 Кб
Загрузка процессора - 8...12 %
Из 8 видимых ядер - загружаются 4 (причем одно ядро на 60..70%, остальные три по 10..20% ). 4 оставшихся ядра полностью разгружены (нагрузка 1..2%, эпизодическая). Система распределяет данное приложение на 7 потоков.
Отсканировано около - 309 тыс (281 тыс - внесены в базу, 20 тыс дублей, 8 тыс - ошибочных).
Процесс дошел до конца без особых осложнений. Продолжительность сканирования была около 1 часа 55 минут.


PS Сравнил базы полученные в GUI и в консольной версии (сканировалась одна и та же тестовая библиотека) :
288652 книг в GUI и 281315 в консольной версии - разница в 7300 книг. Т.е. все же между версиями есть какая-то разница..
Coordinator
Apr 7, 2014 at 11:21 PM
Спасибо за тестирование!

На счет утечки памяти: "текёть", похоже, только под Mono; возможно, дело в особенностях реализации garbage collector-а ("сборщика мусора" aka менеджера памяти) в Mono. Пофиксить это я вряд-ли смогу, так что тут не обещаю (но еще покручу чуток под профайлером под Visual Studio).

Вот разница в количестве книг в базе меня настораживает... Не должно оно так быть (посмотри тут, на сайте, сорцы консоли - там, за исключением основного модуля, весь код просто в виде ссылок на GUI-шный проект, т.е. код сканирования 100% одинаковый). Не могло так получиться, что у тебя автоматом апдейт докачался в базу? Попробуй пересканировать через GUI той-же версии (из dropbox-а), я, по-моему, пересобрал и перевыложил обе версии.
Если что, напишу маленькую утилиту для сравнения баз, чтобы понять, какие книжки не добавились - это сильно облегчит тестирование.
Apr 8, 2014 at 7:37 AM
Файлы библиотеки у меня статичные (ничего туда само не докачивается, не обновляется и пр.), поэтому есть полная гарантия того что и GUI и консольная версии работали с одним и тем же исходником. Файл конфигурации тоже использовался один и тот же (программы запускались из разных папок, чтобы "базы не перетерались").
Версии программ (обеих) я использовал последние (в дропбоксе они 7-ми дневной давности, скачивал я их 4 дня назад. Т.е. с тех пор изменений не было).

По разнице в количестве книг (бОльшее количество дублей в консольной версии) возможно (это "мои мысли вслух") могло сыграть роль то, что у "вин" и "дос" окружения возможно различное отношение к некоторым "служебным" символам, которые могут встречаться в названиях.. Т.е. (хоть данный пример может быть не корректен, но я хочу пояснить идею) например для "вин" буквы "е" и "ё" разные, для "дос" это одна и таже буква "е".. Или "вин" различает регистр букв, а "дос" нет - т.е. название "Вася Пупкин идет в лес" и "Вася пупкин идет в лес" - для вин это две разных книги, а для "дос" например одна..
Понятно, что "дос" - это тоже сильно условный DOS, но тем не менее у него точно есть отличия от "вин" среды..

Если вы напишите "компаратор" баз с выводом названия книг входящих в одну базу, но не входящих в другую - то можно будет попытаться понять в чем именно возникла разница/проблема.
Coordinator
Apr 8, 2014 at 2:31 PM
vagvag, понимаешь, нет "доса" уже давно; консольное приложение отличается от GUI-шного только... наличием GUI. Что могло случиться - какая-то часть записей не попала в базу. Сегодня вечерком постараюсь набросать утилитку для сравнения баз, а также запущу (днем) тестовое сканирование из GUI и консоли.
Apr 8, 2014 at 5:44 PM
DOS - как дисковой операционной системы, в виндос действительно давно нет :) , тем не менее - есть консольный интерпретатор команд DOS ( cmd.exe ) работающий в несколько иной среде нежели shell самой винды, "запускающий" файлы с расширением .exe и иже с ними. Интерпретатор команд DOS cmd.exe в сообщении выше я "жаргонно" называл "дос" (в кавычках).

В своем "отчете" выше я не указал, что запускал консольной приложение из под интерпретатора cmd (я так работаю со всеми приложениями "командной строки").
Можно конечно попробовать запускать консольный OPDS из "Пуск -> выполнить" (или Пуск -> найти программы и файлы ) если в этом есть смысл..

Готов запустить ваш "компаратор", когда он будет готов - может анализ "отброшенных" (точнее - причисленных к "дублям") файлов/книг натолкнет на какие-то полезные мысли.
Coordinator
Apr 8, 2014 at 8:48 PM
Все немного не так :) На самом деле, CLR "программы" - это assmeblies, "сборки". Работают и управляются средой .NET (подробнее можешь погуглить, там много деталей); но environment для консольных и GUI программ абсолютно идентичен.

Я "грешу" на механизм сброса данных на диск: запись выполняется (для оптимизации) при добавлении 500 книжек (а не одной). Да, еще обнаружил разницу в коде: в консольной версии, при сканировании, каждую тысячу книжек я вызываю принудительную сборку "мусора", чего в GUI нет по каким-то причинам.

Сейчас у меня идет эксперимент, досканировалась GUI и теперь сканируется консоль. По окончании сравню базы и буду думать.
Coordinator
Apr 8, 2014 at 10:30 PM
Edited Apr 8, 2014 at 10:35 PM
Вот мои результаты: https://www.dropbox.com/sh/jcnrdhknl1exy15/lnRecW860Y
Как видно, общее количество найденных книг одинаковое; разница лишь в количестве дубликатов и ошибочных книг.
             Total           Dups         Invalid        Found
GUI:         281102          13700          1150         266252
Console:     281102          13696          3660         263746
Консольная версия по каким-то причинам нашла больше ошибочных книг. Это уже кое-что, осталось выяснить, что это за книги и пофиксить.
Apr 9, 2014 at 7:22 PM
Очень хорошо, что вам удалось повторить "ошибку" - так обычно легче отлаживать программу.
У вас уже есть какие-нибудь "наработки" по данному вопросу?
Coordinator
Apr 9, 2014 at 7:33 PM
"Накропал" маленькую программку, сравнивающую базы (лежит в фолдере на дропбоксе), получил список файлов. Теперь можно протрассировать сканер на конкретных книгах, и понять, почему поведение консоли отличается от GUI (может, вечерком погляжу).
Apr 9, 2014 at 7:52 PM
Edited Apr 9, 2014 at 8:02 PM
Запустил. Результат работы отправил в файл.. Посмотрю.
Спасибо.

PS что именно выводит программа? Только разницу без привязке к какой базе это есть?
результат
CompareDatabases.exe gui.db concole.db >result1.txt
и
CompareDatabases.exe concole.db gui.db>result2.txt
идентичен.

Как узнать в какой из баз есть книга. Или дефакто считаем, в только в консольной версии "недостает" книг и исключаем ситуацию, в которой некая книга есть в консоле но нет в гуи?

Попробую погонять обе версии на сканирование на одном архиве-тысячнике..
Может потом из него вычленю десяток книг, который видны и там и там, и которые видны только в gui.
Coordinator
Apr 9, 2014 at 7:57 PM
Нашел и пофиксил ошибку (даже не свою, что интересно ;), подробности в патче, новые версии на дропбоксе (сейчас должны сканировать с одинаковым результатом). Еще добавил принудительную сборку мусора для GUI приложения.

P.S. Потом, если "будет натхнэння", поиграюсь с профайлером и попробую отловить утечку памяти, как при сканировании, так и при работе сервера (тоже есть немного; не страшно, но лучше избежать). А вообще, конечно, нужно какую-нибудь embedded SQL базу прикрутить будет, но пока на это времени нет.
Apr 9, 2014 at 8:18 PM
Edited Apr 14, 2014 at 7:37 AM
В логах консоли на "недобавляемую" книгу идут такие записи:
04.09.2014 23:11:50.1   E   ZipScanner  Book.Parse() exception Значение не может быть неопределенным.
Имя параметра: stream on file: E:\Lib\xxxxxxxxx\4\1-1009.zip@Aaron_&_Kumar_Senthil_Vnetelesnyj_opyt.fb2
сейчас проверю новую версию :)

PS - новая версия консоли "скушала" ранее некушаемые книги :)
Вроде все нормально.
Coordinator
Apr 10, 2014 at 3:56 PM
Edited Apr 10, 2014 at 3:57 PM
Попробовал повозиться с оптимизацией RAM: "фиг вам, изба индейцев", ничего особо не поделаешь - у строк в .NET-е огромный overhead :( Это тебе не ASCIIZ строки, к сожалению.

Почитал также о вариантах с embedded SQL (, тоже радости не очень много:
  • слишком сильной экономии памяти не получится;
  • портабельность сильно осложнится
Правда, нашел проект, который внушает некоторые надежды: https://code.google.com/p/csharp-sqlite/
Apr 10, 2014 at 6:20 PM
На мой взгляд, оптимизировать потребление (я не об утечке) памяти для GUI версии скорее всего особой нужды нет - GUI версия запускается на машинах, у которых обычно памяти много (они исходно работают с графическим интерфейсом) В такой ситуации плюс-минус пол гигабайта памяти скорее всего будут не ощутимы для пользователя и его системы..
В консольной версии, которую ряд пользователей все же рассматривает для работы на NASах, медиасерверах и прочих "железках", работающих дома круглосуточно - каждый килобайт ОЗУ может быть критичным, поскольку подобные "железки" не блещут ресурсами.
Опять же, подобные "железки" практически всегда базируются на embeded linux. Из всего это вытекает, чтобы было бы очень неплохо сделать консольную версию "заточенную" под *nix системы с ограниченными ресурсами (ОЗУ и ЦПУ).
Я прекрасно понимаю, что это дополнительный труд и новое направление (ответвление) и что на это обычно не хватает ни сил, ни времени, ни "запалу".. Но все же может быть когда-нибудь.. А? :)

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

Как говорится, IMHO
Coordinator
Apr 10, 2014 at 6:58 PM
На счет ускорения - это вполне возможно; LINQ (это SQL-подобное расширение языка C#) запросы на arm-ах обрабатываются уж больно долго (по моему опыту с Rasperry Pi).

Но вот с "килобайтами" ОЗУ пользователям не повезло: база в 250-300 тысячей записей, в которых куча уникальных строк (названия, аннотации) просто не может физически уложиться в "килобайты" (или даже в десятки мегабайт).

В общем, как выберу время, попробую с managed портом SQLite: просто конвертирую текущую базу в SQL формат (благо, DBA для этого не нужен - примеров SQL баз как раз на основе библиотек полным-полно, а можно и структуру флибусты-либрусека взять), и посмотрю размер занимаемой памяти плюс скорость выполнения запросов/работы вообще при работе на RPi. Если что, поставлю тогда в roadmap на версию 3.0 :) (дай-то Бог 2.0 добить официально! Не зочу пока релизить с текущим убогим http доступом, а мой друг-дизайнер никак не выберет время :(
Jun 2, 2014 at 12:24 AM
Что то у меня под убунтой консольная версия стала отваливаться периодически и ошибки в логе сыплет
06.02.2014 03:17:17.4   E   ---     Fatal exception: An exception was thrown by the type initializer for System.Drawing.GDIPlus
Stack trace:   at System.Drawing.Image.InitFromStream (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream, Boolean useIcm) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (System.IO.Stream)
  at FB2Library.Elements.BinaryItem.DetectContentType (FB2Library.Elements.ContentTypeEnum& contentType, System.Byte[] BinaryData) [0x00000] in <filename unknown>:0 
06.02.2014 03:17:17.4   E   ---     Fatal exception: An exception was thrown by the type initializer for System.Drawing.GDIPlus
Stack trace:   at System.Drawing.Image.InitFromStream (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream, Boolean useIcm) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (System.IO.Stream)
  at FB2Library.Elements.BinaryItem.DetectContentType (FB2Library.Elements.ContentTypeEnum& contentType, System.Byte[] BinaryData) [0x00000] in <filename unknown>:0 
06.02.2014 03:17:17.4   E   ---     Fatal exception: An exception was thrown by the type initializer for System.Drawing.GDIPlus
Stack trace:   at System.Drawing.Image.InitFromStream (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream, Boolean useIcm) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (System.IO.Stream)
  at FB2Library.Elements.BinaryItem.DetectContentType (FB2Library.Elements.ContentTypeEnum& contentType, System.Byte[] BinaryData) [0x00000] in <filename unknown>:0 
А графическая вообще перестала запускаться.
Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: /usr/local/lib/libgdiplus.so
  at (wrapper managed-to-native) System.Drawing.GDIPlus:GdiplusStartup (ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
  at System.Drawing.GDIPlus..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Drawing.Graphics.FromHdcInternal (IntPtr hdc) [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0 
  at TinyOPDS.Program.Main () [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.XplatUI ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: /usr/local/lib/libgdiplus.so
  at (wrapper managed-to-native) System.Drawing.GDIPlus:GdiplusStartup (ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
  at System.Drawing.GDIPlus..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Drawing.Graphics.FromHdcInternal (IntPtr hdc) [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11.SetDisplay (IntPtr display_handle) [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11..ctor () [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUIX11.GetInstance () [0x00000] in <filename unknown>:0 
  at System.Windows.Forms.XplatUI..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Windows.Forms.Application.EnableVisualStyles () [0x00000] in <filename unknown>:0 
  at TinyOPDS.Program.Main () [0x00000] in <filename unknown>:0 
Может из-за того что обновился на ubuntu 14.4 ? Что-то можно с этим поделать?
Coordinator
Jun 9, 2014 at 3:06 PM
Скорее всего, из-за этого. Что можно поделать - не знаю, если честно, не эксперт по линухам. Можно попытаться пересобрать и установить последнюю версию Mono из транка, или взять какой-нибудь уже собранный nighties.

P.S. Сейчас, к сожалению, на проект абсолютно нет времени, хотя есть хорошие задумки и наработки по переходу на SQLite :(
Nov 1, 2014 at 2:54 PM
Никаких обновлений не проводилось?
Coordinator
Nov 16, 2014 at 1:30 AM
К сожалению, нет.

У меня нет стимула - программа прекрасно работает на моем домашнем сервере, и улучшения работы я добьюсь, если только заменю медленный 2-х терабайтный USB2 стораж на что-то побыстрее (но нет желания, если честно). Поскольку экономить на домашнем сервере ($15/month на электричество) я не собираюсь, то лично меня все устраивает (т.е. работа на RaspberryPi для меня не критична - мне проще выбросить RPi в мусорное ведро, или оставить его как есть, в виде "недоробота" с веб-камерой).

Конечно, нужно-бы переписать серверную часть, ну, и работу с данными (благо, уже сделал кое-что в этом направлении, и получил неплохие результаты на RaspberryPi), но - зачем? Нет стимула...

Если найдется энтузиаст-программист, жалеющий поработать на проекте - милости просим, дайте только мне знать, буду рад включить такого человека в команду. Но, как показывает мой опыт, это вряд-ли возможно: те, кто может что-то писать, предпочитают писать свое, а те, кто просто хочет стать "разработчиком" (особенно, на популярном проекте), как правило, ниже обсуждаемого уровня, толку с них, как с козла молока...
Nov 25, 2014 at 2:59 PM
Edited Nov 27, 2014 at 8:31 PM
Доброго времени суток
Запустил на NAS4FREE, в джейле, снаружи вижу по 8080 порту как бы каталог, но когда запускаю сканирование - грит Scanning directory U:\sens\medias
user.config лежит рядом с ехе файлом
Где мне править ?
Так, с конфигом разобрался, слепой, не туда путь вписал. Теперь слкдующая проблкма - не показывает картинку и не дает скачать файл.
Dec 12, 2014 at 9:42 AM
В консольной версии есть bugs при работе с unc paths. UI версия работает правильно, а консольная вылетает при сканировании и выдачи файла из zip, потому что .Нет хочет unc paths в виде "\\MyServer\MyShare", а код SanitizePathName убирает первые backslashes (и по видимому так же записывает в БД).
Если поменять SanitizePathName на
public static string SanitizePathName(this string pathName)
        {
            if (Utils.IsLinux)
            {
                while (pathName.IndexOf("\\\\") >= 0) pathName = pathName.Replace("\\\\", "\\");
            }

            while (pathName.IndexOf("//") >= 0) pathName = pathName.Replace("//", "/");
            if ((pathName.EndsWith("\\") || pathName.EndsWith("/")) && (pathName.Length > 2)) pathName = pathName.Remove(pathName.Length-1);
            return pathName;
        }
фактически отменив преобразовывание path,
и поменять код выдачи файла из zip в HandleGETRequest(HttpProcessor processor):
ZipFile zipFile = new ZipFile(pathParts[0])
ZipEntry entry = zipFile.Entries.First(e => e.FileName.Contains(pathParts[1]));
Если создание zipfile поменять на
ZipFile zipFile = new ZipFile(@"\\" + pathParts[0])
то работает нормально.
UI версия работает нормально и без этих изменений (я не проверял используются ли там теже модули или нет).