Opencart, GNU GPL и модули

- Posted in Uncategorized by

Opencart использует лицензию GNU GPL v3. Это одна из наиболее жёстких лицензий, накладывающая ограничения на закрытие исходного кода как производных программ, так и расширений (модулей, плагинов).

Ниже несколько цитат из GNU GPL FAQ, касающихся лицензирования и условий распространения модулей и расширений GPL-программ.

Если я добавляю модуль к программе под GPL, требуется ли от меня использование GPL в качестве лицензии для моего модуля? (#GPLModuleLicense)
В GPL сказано, что комбинированная программа в целом должна выпускаться под GPL. Так что ваш модуль должен быть доступен для использования на условиях GPL.

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

Если программа, выпущенная под GPL, пользуется внешними модулями, каковы требования к лицензиям модуля? (#GPLAndPlugins)
Это зависит от того, как программа задействует свои внешние модули. Если программа пользуется для этого вызовами fork или exec, то модули — это отдельные программы, так что лицензия главной программы не предъявляет к ним никаких требований.

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

Как предельный может рассматриваться случай, когда программа динамически компонуется с модулями, но сообщение между ними ограничивается вызовом “главной” функции модуля с некоторыми аргументами и ожиданием, когда произойдет возврат из функции.

Является ли нарушением GPL распространение несвободного драйвера, предназначенного для компоновки с ядром Linux? (#NonfreeDriverKernelLinux)
Linux (ядро операционной системы GNU/Linux) распространяется по GNU GPL версии 2. Является ли нарушением GPL распространение несвободного драйвера, предназначенного для компоновки с Linux?

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

Каждый соразработчик Linux, который является правообладателем существенной части программ, может требовать соблюдения GPL, и мы призываем каждого из них к действиям против тех, кто распространяет несвободные драйверы Linux.

Если в лицензии для модуля М есть требование, несовместимое с GPL, но требование действует, только когда М распространяется сам по себе, а не когда он включается в более крупную программу, делает ли это лицензию несовместимой с GPL? Могу я комбинировать или связывать М с программой под GPL? (#GPLIncompatibleAlone)
Если программа П выпускается под GPL, это значит, что любая и каждая часть ее может использоваться по GPL. Если вы включаете модуль М и выпускаете комбинированную программу П+М под GPL, это значит, что любая часть П+М может использоваться по GPL. М — одна из частей П+М. Таким образом, выпуск П+М под GPL означает, что М может использоваться по GPL. Иначе говоря, пользователь, получивший П+М по GPL, может удалить П, так что М останется под GPL.

Если лицензия модуля М разрешает вам давать такое разрешение, то она совместима с GPL. В противном случае она не совместима с GPL.

Если в лицензии М недвусмысленно сказано, что вы должны совершать определенные действия (несовместимые с GPL), когда вы распространяете модуль М сам по себе, то это не позволяет вам распространять М по GPL. Отсюда следует, что и П+М по GPL вам выпускать нельзя. Таким образом, вам нельзя связывать или комбинировать П с М.

Вернулся

- Posted in Uncategorized by

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

Отсутствую с 20 до конца сентября

- Posted in Uncategorized by

С 20-го августа буду отсутствовать. Без средств связи, так что отвечать не смогу.

Вернусь в конце сентября.

Opencart (admin): сортировка товаров по колонке с изображениями

- Posted in Uncategorized by

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

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

commit d19311b80b518c7b076b459985486d7d0c2190db
Author: Ruslan Brest <rb@labtodo.com>
Date:   Wed Aug 14 14:14:18 2013 +0300
    admin: add sort by "image" column (to quick access to products without images)
diff --git a/upload/admin/controller/catalog/product.php b/upload/admin/controller/catalog/product.php
index b867b0d..55cd8fc 100644
--- a/upload/admin/controller/catalog/product.php
+++ b/upload/admin/controller/catalog/product.php
@@ -450,6 +450,7 @@ class ControllerCatalogProduct extends Controller {
            $url .= '&page=' . $this->request->get['page'];
        }
                    
+       $this->data['sort_image'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&sort=p.image' . $url, 'SSL');
        $this->data['sort_name'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&sort=pd.name' . $url, 'SSL');
        $this->data['sort_model'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&sort=p.model' . $url, 'SSL');
        $this->data['sort_price'] = $this->url->link('catalog/product', 'token=' . $this->session->data['token'] . '&sort=p.price' . $url, 'SSL');
diff --git a/upload/admin/model/catalog/product.php b/upload/admin/model/catalog/product.php
index 9a3589e..991c868 100644
--- a/upload/admin/model/catalog/product.php
+++ b/upload/admin/model/catalog/product.php
@@ -346,6 +346,7 @@ class ModelCatalogProduct extends Model {
        $sql .= " GROUP BY p.product_id";
                    
        $sort_data = array(
+           'p.image',
            'pd.name',
            'p.model',
            'p.price',
diff --git a/upload/admin/view/template/catalog/product_list.tpl b/upload/admin/view/template/catalog/product_list.tpl
index 75cddd6..2b8aa81 100644
--- a/upload/admin/view/template/catalog/product_list.tpl
+++ b/upload/admin/view/template/catalog/product_list.tpl
@@ -29,7 +29,12 @@
           <thead>
             <tr>
               <td width="1" class="center"><input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', this.checked);" /></td>
-              <td class="center"><?php echo $column_image; ?></td>
+
+              <?php $html_class_order = 'class="' . strtolower($order) . '"'; ?>
+
+              <td class="center">
+                <a href="<?php echo $sort_image; ?>" <?php echo ($sort == 'p.image') ? $html_class_order : '' ?>><?php echo $column_image; ?></a>
+              </td>
               <td class="left"><?php if ($sort == 'pd.name') { ?>
                 <a href="<?php echo $sort_name; ?>" class="<?php echo strtolower($order); ?>"><?php echo $column_name; ?></a>
                 <?php } else { ?>

[FWD] Сравнение производительности четырёх JS-библиотек

- Posted in Webdev by

Сравнение производительности четырёх JS-библиотек: native Javascript, Google Closure, jQuery, ExtJS.

Результаты там наглядные и поразительные. jQuery оказывается заметным тормозом.

См. также:

На графике по горизонтали - количество операций за миллисекунду. Чем длиннее, тем быстрее работа:

Сравнение производительности четырёх JS-библиотек</a>: native Javascript, Google Closure, jQuery, ExtJS

Обсудить

Создатель PrestaShop: встреча во Львове 26 июля 2013 года

- Posted in Uncategorized by

Создатель PrestaShop Бруно Левек 26-го июля 2013 года прилетает в Украину, где проведет во Львове встречу с разработчиками, представителями веб-студий, фрилансерами.

Формат встречи — закрытый семинар. Участие абсолютно бесплатное, но чтобы получить приглашение, вам нужно пройти предварительную регистрацию и заполнить простую форму.

Если посетить встречу нет возможности, но накипели какие-то важные и неотложные вопросы, то вы можете их задать с помощью этой же формы.

PhantomJS - утилита для тестирования дизайна на разных экранах

- Posted in Webdev by

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

Базируется на движке WebKit. Технически - это обычный броузер, но без интерфейса пользователя. Результаты рендеринга страницы и Javascript можно записать в виде картинки.

Testing your responsive design with PhantomJS.

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

Что нас ждёт в Opencart 2.0

- Posted in Uncategorized by

Конца разработке Opencart 2.0 пока ещё не видно, но сейчас уже можно выделить основные нововведения и готовиться к изменениям.

<

p>Что нас ждёт в новой версии Опенкарт?

  • HTML5,
  • адаптивный дизайн (Twitter Bootstrap),
  • наведение красоты и использование шрифтов с иконками (Font Awesome) вместо мелкой графики,
  • добавление полей в форму регистрации из админки (не видел, не знаю, о чём речь),
  • а также "встроенный vqmod": новые пункты меню "Extension installer" и "Modifications" в меню расширений.

Также 10 июня было сказано, что Paypal и Amazon заплатили за внесение каких-то новых фишек, но на гитхаб это пока не выложено. Делается какой-то другой компанией и будет объединено позже.

UPD: это оказались:

Самое заметное - это изменение внешнего вида. Админка более-менее близка к завершению. Стало лучше? Да. Изменилось ли что-то кардинально? Нет. По большей части - косметические изменения. Серьёзного изменения вёрстки в админке не произошло, на маленьких экранах всё по-старому. Сейчас автор продолжает работу над обзорной страницей (Dashboard).

В админке пока ещё поломаны:

  • файловый менеджер и загрузка картинок;
  • раздел "Sales / Marketing / Marketing".

Остальное по части внешнего вида любой желающий, в принципе, может и сам посмотреть, взяв версию в репозитории.

В каталоге на момент написания не работали категории.

Версия jQuery обновлена до 2.0. Что означает отказ от поддержки старых броузеров: в частности, MSIE 6/7/8.

Разел "Sales" (продажи) подвергся реструктуризации: сейчас он разделён на две секции, Sales и Marketing. В маркетинг выделены партнерская программа, купоны, email-рассылки клиентам и партнерам магазина. Обе эти части представлены на Dashboard (стартовой странице админки), куда вынесены основные параметры по продажам и активности, быстро информирующие владельца магазина о происходящем.

Opencart 2.0 new default front-end template (responsive)
Даниэль где-то говорил, что тема по умолчанию в магазине тоже будет адаптивной (responsive), вроде бы уже где-то сделано, но в репозиторий пока он это не выкладывал.

Вот демо нового шаблона OC 2.0: http://oc2.opencartdemo.com/

Демо-данные слегка мигрировали в другие подпапки, поэтому в зависимости от того, новая установка или обновление старой, часть изображений товаров может пропасть. Речь о демо-данных. Возможно, при установке с нуля всё будет окей.

Что за функции "Extensions / Extension installer" и "Extensions / Modifications" -- я не разбирался и информации пока нигде не видел (точнее, не искал). Интересно было бы узнать об этом заранее, конечно, так как эти нововведения могут отразиться на разработчиках расширений. Насколько понимаю, это аналог VQmod, но не сам VQmod.

На этом пока всё. Обновлю пост, если узнаю что-то более конкретное про новые фичи.

А вам про них что-то известно?

Если кто-то разбирался, чем грозит "новый VQmod" и как будет работать механизм установки расширений и модификаций -- дайте знать.

<

p>См. также:

  • Opencart v1.5.6 released, 2013-07-25. Внезапно выпущена версия 1.5.6 вместо 2.0 - это то ли 1551 + Openbay + Amazon Payments + Paypal (новые и обновленные старые), то ли всё, что есть на данный момент (переделки интерфейса) + эти платежные модули. Я не смотрел ещё v156.

Opencart CE (Community Edition)

- Posted in Uncategorized by

Давно я ожидал появления альтернативной версии репозитория Опенкарт с более адекватным ведением дел. Вообще-то думал, что он чуть раньше появится. Но чтобы его объявили прям в "новостях и анонсах" на форуме -- не ожидал. Смело :) Я думал, будет как-то менее заметно и в одном из репо десятка-другого активных разработчиков и комиттеров, разочаровавшихся в политике DK. Респект rph :)

Вообще-то в какой-то момент, когда Qphoria начал бранчи в гитхабе изучать, я поверил, что не всё потеряно. Но потом опять началось, ДК ничуть не изменился. Workflow в гитхабе также остался прежним.

В общем, на днях (21 июня) пара квалифицированных разработчиков (rph /opencarthelp/ и AddCreative как минимум) объявили о рождении "community edition" форка (ответвления от основного репозитория Opencart). Судя по списку планируемых вопросов -- с этими людьми "кашу сварить" можно. И скорее даже нужно. Очень надеюсь, что там дело пойдёт намного лучше по части совместной разработки.

Основной упор Opencart CE собирается делать на немного измененном цикле жизни версий Опенкарт: поддержке отдельных веток для устаревающих версий и внесению исправлений обнаруженных ошибок не только в главную текущую ветку разработки, но и в ветки более старых версий.

Чтобы было чуть более понятно, надо пояснить, как сейчас ведутся дела.

Дальше я буду оперировать понятиями, привычными для Git.

  • По-хорошему, обычно принято, чтобы в главной ветке (`master` или `trunk`) находилась стабильная версия проекта. Которую любой разработчик или пользователь может взять и смело выгрузить на production server и быть уверенным, что работает со стабильной и проверенной версией продукта.
  • В девелоперской ветке ведётся основная работа: там расположена текущая, самая свежая, но необязательно стабильная, версия. Там могут быть ошибки и вообще содом и гоморра. Это не для конечных пользователей. Когда там всё устаканивается и протестировано, изменения из `dev` ветки вливаются в `master` и выпускается новый релиз.
  • Если версии рассматриваются просто как вехи в истории, которые в будущем не исправляются, а предполагается работа с последней, наиболее свежей версией -- достаточно просто помечать их тегами. Тег в гите - это просто закладка с именем.
  • Если надо версии сопровождать какое-то время -- они должны выделяться в отдельные ветки. Тогда при обнаружении и исправлении каких-то ошибок надо внести исправления во все поддерживаемые ветки (версии), где эта ошибка присутствует.

Вот вкратце и всё. Можно ещё упомянуть, что гораздо разумнее работу в `dev`-ветке также вести в отдельных ветках (небольших, временных, с префиксами `feat-` и `fix-`). Во-первых, это способно избавить ветку от мусора и мешанины при активной работе (особенно командной, но и при работе в одиночку это справедливо) и сделать историю гораздо более понятной. Во-вторых, фикс, находящийся в отдельной ветке, можно легко и просто применить к множеству ветвей с версиями. Без выколупывания diff-ов, patch-ей и ручной работы.

В Опенкарт (главном репозитории):

  • вся разработка ведётся в единственной ветке. То есть по факту это девелоперская, "грязная" ветка;
  • релизы никак не помечаются тегами, что очень сильно затрудняет обнаружение конкретной версии в истории. По сути, обнаружить место релиза нереально, если только не успел сам отметить в своем репозитории момент выпуска новой версии. Или по каким-то косвенным признакам и комментариям, может по дате;
  • не устанавливаются никакие связи с багтрекером (вернее, issue tracker-ом), про "smart commit messages" DK тоже не в курсе и продолжает постить в историю сплошной поток изменений. Понять, где именно был пофиксен какой-то баг?... А вот фигвам. Поди найди через полгода или даже через неделю, что было сделано для исправления ошибки, отчет о которой читаешь.

В новом репо (Opencart CE) версии будут выделяться в самостоятельные ветки и сопровождаться в будущем силами сообщества. То есть теперь гораздо больше шансов, что версия 1531 (например) получит все возможные исправления и не надо будет обновляться до 1551 (которая со своими новыми фичами никак вас не волнует, поскольку ничего нужного вам там не появилось).

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

Будем следить за развитием событий!

Links

Набор стильных плоских иконок для LibreOffice

- Posted in Uncategorized by

via Try The New LibreOffice Flat Icon Set ~ Web Upd8: Ubuntu / Linux blog

Скриншоты: https://wiki.documentfoundation.org/Design/Whiteboards/Flat_icon_set#Snapshots

Github: https://github.com/libodesign/flat-icons

sudo apt-get install libreoffice-style-crystal
cd /tmp && wget https://github.com/hotice/myfiles/raw/master/images_flat.zip
sudo cp images_flat.zip /usr/share/libreoffice/share/config/images_crystal.zip

From the LibreOffice menu select Tools > Options , then under LibreOffice > View > Icon size and style , set the icon theme to "Crystal"

89% взрослых украинцев пользуются мобильной связью, 12,6% — мобильным Интернетом

- Posted in Uncategorized by

7 июня 2013 г., 10:45

http://ko.com.ua/89_vzroslyh_ukraincev_polzuyutsya_mobilnoj_svyazyu_12_6_mobilnym_internetom_77307

Согласно данным исследования GfK Ukraine рынка телекоммуникационных услуг, в I квартале 2013 г. доля пользователей мобильной связи достигло 89% населения Украины старше 16 лет. Это на 3% выше показателя за аналогичный период 2012 г.

Наиболее значительно выросло число пользователей мобильной связи в городах с населением до 50 тыс. жителей: на 4,3% до 91,2%. Кроме этого, значительно увеличилась доля пользователей в возрастной группе старше 60 лет (+5,5%, до 69,4%). В начале года в среднем абоненты тратили на услуги мобильной связи 45 грн, что превышает средний уровень затрат годом ранее на 4 грн.

Всего мобильным Интернетом пользуются 12,6% украинцев, по сравнению с 10% в аналогичном квартале 2012 г. 10,2% при этом пользуются мобильным Интернетом на экране мобильного телефона или смартфона (6,9% годом ранее).

Мужчины несколько активнее используют свои телефоны для выхода в Интернет (12,5% против 8,3% женщин). Молодежь в возрасте 16-19 лет являются наиболее активными пользователями (37,7%). Наибольший рост демонстрируют возрастные группы 16-19 и 20-29 лет. Быстрее всего росли группы пользователей мобильным Интернетом на экране телефонов в селах и маленьких городах с населением до 50 тыс., где проводное подключение к Интернету намного менее доступно.

Фото из космоса - астронавт Karen Nyberg

- Posted in Uncategorized by

В Pinterest у неё много интересных альбомов: виды Земли, волосы в космосе и другие.

Twitter: @AstroKarenN

via SLON: Твит дня: вид заката на МКС

Яндекс.Деньги + Skrill

- Posted in Uncategorized by

Яндекс.Деньги договорились о сотрудничестве с интегратором платежных сервисов Skrill. С его помощью любой зарубежный интернет-магазин может быстро и без лишних хлопот подключить Яндекс.Деньги.

Skrill – один из крупнейших платёжных интеграторов, поддерживающий около 100 способов приема платежей. Сейчас услугами Skrill пользуются 140 тысяч интернет-магазинов со всего мира. Теперь все они могут работать и с Яндекс.Деньгами.

  • В 2012 году россияне потратили на покупки в зарубежных интернет-магазинах около $700 млн.
  • В 2013 году, согласно прогнозам, эта сумма возрастет до $1,3 млрд, а к 2015-му может достичь $3 млрд.

До сих пор пользователи «Яндекс.Денег» могли расплачиваться за покупки в интернет-магазинах России, Украины, Казахстана и Белоруссии, а также платить в Skype и Facebook.

См. также:

Skrill

Skrill – один из крупнейших международных интеграторов, который предлагает клиентам более 100 способов приема платежей. Через Skrill интернет-магазины могут подключать себе разные платежные системы, не адаптируя свой сайт под каждую из них. Сейчас услугами Skrill пользуются 140 тысяч интернет-магазинов со всего мира.

Яндекс.Деньги

По данным TNS за март 2013 года, Яндекс.Деньги – самый известный сейчас российский платежный сервис: о нем знают 84% россиян, а 17% хотя бы раз в полгода совершают оплату Яндекс.Деньгами. К сервису подключено более 20 тысяч интернет-магазинов из России, Украины, Казахстана и Беларуси. Теперь к нему могут присоединиться магазины всего мира.

Яндекс.Деньги — крупнейший сервис электронных платежей в рунете, который предлагает простые безопасные способы оплаты товаров и услуг. К началу 2013 года на сервисе было зарегистрировано более 13 млн счетов. Каждый день в Яндекс.Деньгах открывается более 9000 новых счетов и проводится более 120 000 операций. Оплату Яндекс.Деньгами принимают более 20000 интернет-магазинов.

Что даёт установка минимальной цены расширений продавцам и покупателям

- Posted in Uncategorized by

На опенкартфоруме возникла тема-предложение по оптимизации процесса продаж в каталоге шаблонов, инициированная продавцами шаблонов. Цель благая, но основой предложения является:

  • установка нижней планки (минимальной цены шаблонов);
  • и кол-во продаж за определенный период.

Ни слова про рейтинг почему-то, хотя в теме сразу же появились логичные напоминания об этом. По крайней мере, на этот счёт можно быть спокойным.

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

Меня это рассмешило. И вот почему.

Во-первых -- с чего бы это? Если у меня есть товар по копейке, а его надо продавать не меньше, чем за рубль, чтобы тебя пустили на базар -- я буду его по рублю продавать. Или по рубь пятьдесят: после того, как наклею на него шильдик "самое лучшее качество по беспрецедентно низкой цене". В общем, дистанцируюсь от соседей. Зачем что-то делать для реального повышения качества?

Во-вторых -- давайте пока останемся в шкуре "посредственного дизайнера, жаждущего легких денег". И подумаем, глядя на алгоритм, что надо, чтобы остаться в топе листинга при прочих неизменных условиях? Бинго! Всего-то купить у себя своих же шаблонов 5-10 раз за месяц. А там, смотришь, и ещё кто-то купит. Что теряем? 15% комиссии. При шаблонах по 100 рублей - 15 руб * 10 продаж = 150 руб. В месяц. Остановит меня это от накруток? Если в перспективе - сотня тысяч просмотров в месяц, кто-то да купит. Нет, конечно, не остановит. Буду в топе при любых раскладах. И скорей всего даже выше дорогих и качественных шаблонов автора этого предложения.

Ввод нижней планки вроде бы ставит всех в похожие условия: "дешёвкам" по идее должно стать невыгодно, а "правильным" - легче повышать цену за качество. Проверим теорию цифрами? Проверим. Минимальная цена 500 руб - затраты "накрутчика" в 5 раз больше. Но всё равно остаётся достаточно 1-2 продаж, чтобы накрутка окупилась. Всё, что надо сделать недобросовестным - не сильно выделяться на фоне более качественных работ.

Теперь перейдём к более интересному

В-третьих -- вообще-то автор волен выставлять любую цену за свою работу. И единственный его судья в деле надо/не надо, дёшево/дорого - рынок и покупатели. Допустим, понадобился мне стандартный шаблон, но в розовых тонах. Я могу и сам перекрасить кнопки, бекграунды, бордеры, заняться поиском и тестированием. Потрачу на это час, может два. Хотя глядя на озвученный план из трёх шагов неопытный разработчик скажет, что на это потребуется минут пять, от силы десять.

Короче, каждый сам волен думать и сопоставлять свои затраты и стоимость аутсорса (покупки готового решения). Думаю, это всем очевидно, если хоть на минутку задуматься. Потратить своё время на перекрашивание кнопок в розовый с градиентом, плюс тестирование и проверку с допиливаниями -- или взять готовый шаблон без изысков. Просто тупо перекрашенный, за 3$ (100 руб). Так что любая работа может найти своего покупателя. И не обязательно покупатель - обманутый идиот, которого надо защищать.

И напоследок - самое интересное. Факты и опыт

Мой опыт основывается на расширениях Опенкарт, бесплатных и платных. Число скачиваний которых измеряется сотнями и тысячами. Некоторые - десятками тысяч. Площадка, где они продаются и раздаются бесплатно, как раз имеет ограничение, нижнюю планку на цену расширений: 10$.

Что это даёт покупателям и продавцам? Отвлечёмся пока от технических причин.

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

Продавец не может легко и просто выставить "donation-версию" своей работы рядом с бесплатной.

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

Скажем, я бы с удовольствием раздавал свой перевод как бесплатно, так и за доллар. Как это принято в гугл-плее, апп-сторе и альтернативных мобильных маркетах. Хочешь поддержать автора материально - дай копейку. И платящему несложно, и есть надежда, что автору наберется на пропитание и развитие.

Причём это очень серьёзный минус. И (барабанная дробь!) как для продавцов, так и для покупателей. Увы.

Потому что вот что получается: продавцу рано или поздно надо есть. И он пойдёт искать себе пропитание. А куда пойдёт? В сторону своих бесплатных расширений он будет смотреть в последнюю очередь. На сторону, в общем, пойдёт, вдаль от вас. И повернется избушка к вам задом, а не передом.

Я вот поработал над переводом, который нужен был мне лично, и дал его сообществу. Написал пару несложных на мой взгляд расширений, за которые 10$ баксов просить странно (была бы возможность - выставил по 1-3$, не больше) - а они хлоп, и оказывается, нужны сотням людей делают их счастливыми, и скачиваний уже 2.5 тысячи. И за 1$ вместо бесплатного люди были бы не менее счастливыми, т.к. ценность решения для них гораздо выше озвученной цены. Я тоже, и это дало бы мне стимул и возможность поддерживать это направление.

Интересно ли мне развивать и поддерживать переводы под новые версии? Версии, которыми я вообще не пользуюсь, но о которых меня просят то справа, то слева, то напоминают - чего задерживаешься? Пытаюсь, поддерживаю, но скажу честно - неинтересно. Что-то мне предлагают сделать в бесплатном модуле доставки - а мне как-то не до него. Мне есть надо, семью кормить, жильё оплачивать. Мне эти предложения "а давайте вы сделаете ещё вот так" -- как крики клоуну с трибун "а прыгни ещё раз вот так". Сами прыгайте.

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

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

Вот такая экономика отношений в мире бесплатного и опенсорсного.

Новая Opera Mobile теряет пользователей

- Posted in Mobile Gadgets by

Opera/Android new engine fail (2013-05) Интересно, много ли лояльных пользователей потеряет Опера благодаря вчерашнему/сегодняшнему обновлению Android-приложения?

До сегодняшнего дня они тестировали новую версию (новый движок, новый интерфейс) как отдельное приложение: Opera Browser Beta. Она была гораздо более тормозной, многие фичи не работали, и так далее и тому подобное. Новый интерфейс лично мне симпатичен. Но тормоза и потребление памяти устройства -- это кошмар какой-то.

Скажите "до свидания" высокой скорости работы

Сегодня произошло обновление и старая версия приложения (Opera Mobile) отныне обновлена. Скажите до свидания высокой скорости работы: теперь этот броузер тормозит так, как и представить себе нельзя было. У меня на "HTC Wildfire S" лаги при попытках прокрутить страницу достигают иногда 10-20 секунд. Обновленная версия ведёт себя чуть лучше беты, но по-прежнему осталось чудовищным разочарованием.

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

Шрифт по умолчанию стал Serif-ом. Кошмар на мою голову. Я ненавижу засечки, а сменить на что-то Sans-подобное возможности нет.

При экспорте куда-то в другие приложения (share) пропал заголовок страницы, теперь приложениям передаётся только URL. Можно проверить в GTask. Ужас. Я пользовался этим десятки раз в день, чтобы передать на десктоп название страницы + ссылку для более удобного прочтения.

Потребление памяти программой увеличилось в несколько раз: и приложение в памяти стало занимать гораздо больше, и кеш с application data стали расти очень быстрыми темпами. Для меня это очень заметный момент, обновился утром, просмотрел почту (буквально 2-3 сайтами попользовался, больше терпения не хватило из-за тормозов везде и на всём, плюс пары падений на m.mail.ru... позорище!) - и кеш пришлось чистить то ли раз, то ли уже дважды.

В общем, ежедневный и обильно используемый инструмент теперь стал глючным и ООООООЧЕНЬ тормозящим.

Альтернатива: Dolphin Browser

Теперь нет никакой причины продолжать пользоваться мобильной Оперой :( У меня осталась сохранённая версия предыдущей Opera Mobile (которая была очень быстрая и прекрасно работала). Возможно, откачусь на неё. Но скорей всего, раз такие дела -- сбегу к ближайшему конкуренту, Dolphin или Dolphin Mini.

У него была масса приятнейших и крошечных плагинов, благодаря которому Dolphin умел:

  • прикидываться хоть мобильным, хоть десктопным броузером,
  • печатать-сохранять страницы в PDF (да-да, и размер этого плагина крошечный!),
  • сканировать штрих-коды.

И что-то ещё наверняка, но это то, что мне нужно было. По-моему, он даже умел, в отличие от Оперы, фон переключать между светлым и темным, что очень помогает читать в темноте. В общем, преимуществ у него сейчас стал миллион. Раньше оставил всё же одну только Оперу, когда свободное место поприжало: высокая скорость рендеринга страниц у неё была заметна невооружённым взглядом. Достаточно было активно попользоваться несколько дней любым броузером, а затем попробовать Оперу.

Не чините то, что прекрасно работает

Не чините то, что прекрасно работает. Больше и добавить нечего.

Немного статистики

  • 2013-05-22 13:25. Оценок "1" на гуглоплее сейчас 21'689, "2" - 9'152 (30.5 тыс очень недовольны), на "троечку" приложение оценивает 22356 человек. Это те, кто лоялен, недоволен, но ещё надеется на изменения к лучшему. "5" звёдочек - 251'948 людей.

    Что ж, посмотрим, что будет через 3-7 дней, когда больше людей обновятся, напробуются и выскажутся. Ровный график уже просел - масса народу отказывается и удаляет приложение. Сегодня-завтра скорей всего и я к ним присоединюсь. Пока пытаюсь пользоваться этим тормозилищем.

    Вечером того же дня, когда телефона у меня стало гораздо больше, чем компьютера - понял, что не осиливаю ждать непонятно чего по каждому движению. Снёс новую Оперу, поставил Dolphin.

  • 2013-05-23 09:57. Что ж, количество "колов" увеличилось за день на 3 тысячи (24'654), двойки и тройки - на том же уровне. То есть растёт количество тех, кто оказался резко недоволен изменениями. Но маркетинг работает, новые пользователи прибывают: пятёрок тоже стало больше (255'385). Общее количество закачек вчера было 361 тыс, сегодня 370 тыс.

  • 2013-05-26 22:36. "1" +6k (30'954), "2" +2k (11 тыс). "5" +5k (260.6 тыс). Общее кол-во 386.7 тыс. Кстати, очень странно, но в гуглплее теперь значится, что Опера несовместима с моим девайсом (HTC Wildfire S). То ли вычеркнули его из-за большого кол-ва негативных отзывов владельцев данных аппаратов, то ли непонятно что. График установок приложения выглядит, как и предполагалось: неуклонный спад. Выкарабкаются, думаю - но за счёт того, что Оперу бросят все давние пользователи, а понаедут новые, кто не подозревает, насколько быстрее она работала много лет на старом движке.

  • Opera/Android new engine fail (2013-05) 2013-05-29 07:50. Заметил появление Opera Browser Classic. Судя по всему - вчера появилась. Сейчас около 3 тыс пользователей, оценки все хорошие. Думаю, это старая добрая Опера, которую вернули к жизни на гуглоплее. Становится понятней и ход конём: Opera Browser сделана несовместимой со старыми устройствами -- это уменьшит в будущем кол-во недовольного экспиренса (на более новых ОС и железе дела скорей всего получше и нет таких тормозов), а для старых девайсов вернули обычную Оперу под новым названием. "1" +2k (32'164), "2" 11 тыс. "5" +2k (262.3 тыс). Общее кол-во 391 тыс. В общем, тенденция та же самая, но немного замедляется. Оно и понятно: основная масса уже успела отреагировать и "проголосовать ногами".

См. также

  • Desktop Opera switches to WebKit By Craig Grannell on May 28, 2013. Пишут, что Opera Next уже выкатила версию на новом движке. Посмотрим-посмотрим :) Надеюсь, на десктопе у них получится гораздо лучше. Уж очень не хочется альтернативу искать. Ага, не посмотрим: пока доступны только Windows и Mac версии.

Opencart: вывод производителей в своём порядке вместо алфавитного

- Posted in Uncategorized by

Для тех, кто хочет выводить страницу производителей (брендов) в своём порядке, а не в алфавитном, Сегодняшний рецепт. Надо изменить файл catalog/controller/product/manufacturer.php.

Ищем строку #33:

$results = $this->model_catalog_manufacturer->getManufacturers();

её надо заменить на

$results = $this->model_catalog_manufacturer->getManufacturers(
    array('sort' => 'sort_order', 'order'=>'ASC')
    );

и чуть ниже - часть

foreach ($results as $result) {
    if (is_numeric(utf8_substr($result['name'], 0, 1))) {
        $key = '0 - 9';
    } else {
        $key = utf8_substr(utf8_strtoupper($result['name']), 0, 1);
    }

изменить на:

foreach ($results as $result) {
    /*
    if (is_numeric(utf8_substr($result['name'], 0, 1))) {
        $key = '0 - 9';
    } else {
        $key = utf8_substr(utf8_strtoupper($result['name']), 0, 1);
    }
    */
    $key = $this->language->get('button_view');

То же самое в виде diff-файла

diff --git a/upload/catalog/controller/product/manufacturer.php b/upload/catalog/controller/product/manufacturer.php
index 3b0b701..1071612 100644
--- a/upload/catalog/controller/product/manufacturer.php
+++ b/upload/catalog/controller/product/manufacturer.php
@@ -30,14 +30,19 @@ class ControllerProductManufacturer extends Controller {
 
        $this->data['categories'] = array();
 
-       $results = $this->model_catalog_manufacturer->getManufacturers();
+       $results = $this->model_catalog_manufacturer->getManufacturers(
+           array('sort' => 'sort_order', 'order'=>'ASC')
+           );
 
        foreach ($results as $result) {
+           /*
            if (is_numeric(utf8_substr($result['name'], 0, 1))) {
                $key = '0 - 9';
            } else {
                $key = utf8_substr(utf8_strtoupper($result['name']), 0, 1);
            }
+           */
+           $key = $this->language->get('button_view');
 
            if (!isset($this->data['categories'][$key])) {
                $this->data['categories'][$key]['name'] = $key;

Проверялось на версии Opencart 2.0.

Opencart: иконки в breadcrumbs

- Posted in Uncategorized by

Как изменить символ "»" на собственную иконку?

Opencart 2.0

Для этого в файле catalog/view/theme/default/stylesheet/stylesheet.css

надо найти

.breadcrumb li + li:before {
    content: '»';
    padding: 0px 5px 0px 5px;
}

и заменить на что-то наподобие:

.breadcrumb li + li:before {
    content: url('../image/success.png');
    padding: 0px 5px 0px 5px;
}

Второй способ - использовать специальные шрифты с иконками.

Opencart 1.5.x (возможно, и 1.4.x тоже)

Для более ранних версий Opencart (вплоть до 1.5.5.1) надо изменить текст `text_separator` в языковых файлах:

$_['text_separator'] = '<img src="image/flags/ua.png" height="42" width="42"/>';

Искать в `catalog/language/english/english.php`, `catalog/language/russian/russian.php` и т.п.

Lubuntu and touchpad: horisontal scrolling, disable touchpad when typing

- Posted in Uncategorized by

Наконец дошли руки починить пару давно мешающих проблем с тачпадом (Lubuntu @ Asus 1015BX).

Первая: почему-то отключен горизонтальный скроллинг. Включаем оба варианта (прокрутка по кромке тачпада и двумя пальцами):

synclient HorizEdgeScroll=1 HorizTwoFingerScroll=1

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

syndaemon -t -k -i 2 -d

Что означают параметры:

  • -i 2 -- устанавливает время задержки в 2 секунды (сколько ждать после последнего нажатия на клавиши перед тем, как снова включить тачпад);
  • -t -- не запрещать движения мыши при наборе текста, а только нажатия (клики) и скроллинг;
  • -k -- игнорировать клавиши-модификаторы при мониторинге активности клавиатуры (таким образом, разрешаем действия наподобие Ctrl+Click);
  • -d -- стартовать как служба (daemon), в фоне.

Вот и всё. Места, куда можно поместить эти команды для автостарта:

  • ~/.profile
  • Lubuntu: /etc/xdg/lxsession/Lubuntu/autostart

На Asus 1015BX также не работает Fn+F3 (выкл/вкл тачпад). Надо бы ещё сообразить, как на эту клавишу прицепить обработку пары простых команд synclient TouchpadOff=1 и synclient TouchpadOff=0. Хотя мне это уже и не надо -- прекрасно работает автоматическое отключение и включение тачпада.

Selfoss RSS reader: первые впечатления

- Posted in Uncategorized by

Итак, впечатления первых суток использования Selfoss как возможной замены TT-RSS (Tiny Tiny RSS).

Pros:

  • интерфейс приятней и лаконичней
    • читать фиды мне легче и удобней здесь, а не в TTRSS
    • адаптивная верстка и появление нескольких колонок на широком экране - супер!
    • мобильная версия тоже понравилась, хотя пока только глянул краем глаза.
    • клавиатурная навигация удобна (пробел, влево-вправо, Ctrl-M - отметить всё как прочитанное)
  • весит меньше (примерно 8.6 MB против 19.3 MB у TTRSS). Может и мелочь, но кому-то может быть и пригодится информация. Тут есть одно "но": через некоторое время кеш и иконки могут наплодиться и в Selfoss, так что посмотрим. Хотя сейчас почти весь этот объём -- и так кеш: 5MB с хвостиком
  • более удобный для меня способ редактирования фидов и разбрасывания по категориям/папкам/тегам. Здесь подход как в Google Reader: тег = категория, их можно редактировать прямо в текстовом поле, без всяких выскакивающих окошек. Все фиды редактируются на одной странице, что облегчает их поиск (Ctrl-F)
  • фид может принадлежать нескольким категориям. Например, я предпочитаю фиды раскладывать по смысловым группам, а некоторые - включать дополнительно в TODO/Priority папки, которые у меня находятся сверху и имеют цифровое обозначение по приоритету (01, 02, 03). При появлении в них записей я первым делом на них реагирую. Есть время - остальное читаю, по категориям.

Cons:

  • минимальные требования: PHP 5.3. Я на одном из серверов переключил, но на другом это вообще недоступно, и там сейчас 5.2.17
  • проблема с импортом OPML и обновлениями. Сначала пришлось поправить конфиги PHP (через .htaccess оказалось достаточно), потом обнаружилось, что OPML от TTRSS не импортируется (импортировал OPML из Google Reader, но теперь надо вручную проверить список фидов: в TTRSS добавлялось штук 5-10 новых. Плюс я их немного по-другому отсортировал. Однозначно ручная проверка нужна)
  • обновляется всё одним махом, упираемся в таймаут при большом кол-ве фидов (не на всех серверах можно увеличить время выполнения скриптов). В TTRSS это сделано надёжней. Почему бы не обновлять по одному фиду, когда на него кликаешь? И сразу увидишь новое (в нужное время, пока свободен и читаешь), и может уменьшить нагрузку на общий скрипт обновления (если он проверяет фиды с учётом времени последнего обновления)
  • частые несмертельные ошибки, не пойму, с чем связанные. Выскакивают в JS окошке. Может связаны с невозможностью обновить некоторые устаревшие и мертвые фиды. (В TTRSS никаких ошибок вообще ни разу не видел). Обычно достаточно повторить попытку. Буду ещё изучать, в чём причина, но неприятно удивлён. Не ожидал такого от приятного и профессионально выглядящего продукта. Очень раздражают. UPD: проблема решилась переключением с PHP 5.3 на 5.4
  • не вижу способа быстро добавлять фиды в Selfoss через букмарклет. Нашёл такой Feature Request. Похоже, готового решения пока нет.
  • похоже, нельзя поставить некоторые фиды на паузу и временно их не обновлять. Но легко решить, поместив их дополнительно в категорию/тег "помечать прочитанным не глядя"

Предварительный вывод.

Личные ощущения: несмотря на обильно выскакивающее alert-окно с сообщением об ошибке, мне Selfoss очень нравится. Будет время - попытаюсь найти источник проблемы, но пока просто повторяю неудавшуюся операцию обновления фидов.

UPD: проблема решилась переключением версии PHP: с 5.3 на 5.4

Shaarli: добавил поддержку Markdown

- Posted in Uncategorized by

прикрутил поддержку Markdown в описаниях. Это оказалось чуть ли не пятиминутным делом. Готовые библиотеки скачиваются на счёт "раз-два", а несколько мест, где происходит обработка описаний при выводе на экран, позаимствовал из готового пулл-реквеста в Github-репозиторий Shaarli (PR#63). Их там всего 3-4, так что всё, что оставалось сделать - просто изменить подключаемые библиотеки и поменять вызовы на `Markdown()`.

Меня интересовало решение для PHP 5.2, а не 5.3 и выше - на сервере, где лежит мой сайт, версию PHP выбрать нельзя. Там 5.2.17. Кого интересует PHP 5.3+, см. оригинальный пулл-реквест. Там и более свежая Markdown библиотека используется. Которая, кстати, в будущем останется одна (начиная с 2014 года).

Также задумался о том, что неплохо было бы мульти-юзер версию иметь на примете. У нас с парой человек как-то возникало несколько раз желание использовать делишес для сбора ссылок в отдельных проектах или компаниях. Букмарклетами ссылки добавлять в хранилище легко и просто, а тегами они прекрасно быстро сортируются. И не нужны никакие вики: туда сначала надо зайти, найти, куда вписать, открыть редактор, найти там место, скопировать и оформить ссылку. Понятное дело, что на это хватает только самых упёртых. Сравните с кликом по кнопке в тулбаре и вписыванием нескольких тегов для категоризации. Всё остальное происходит само.

Итак, недолгий гуглёж показал, что ближайшая альтернатива, на которую я буду смотреть -- Scuttle (multiuser Delicious-clone, PHP, MySQL). Остальные (не только на PHP) -- см. tags: delicious + alternative. Но мне они менее интересны в силу разных причин.

Shaarli &#45; асоциальный Delicious

- Posted in Uncategorized by

https://github.com/sebsauvage/Shaarli

Shaarli - The personal, minimalist, super-fast, no-database delicious clone. By sebsauvage.net. Shaarli is a minimalist delicious clone you can install on your own website. It is designed to be personal (single-user), fast and handy.

В общем, для тех, кому нравится идея Делишеса как быстрого сборника ссылок с заметками, но при этом совершенно не интересует его социальная составляющая -- на первый взгляд вполне себе вариант. Вблизи ещё "будем посмотреть", только что обнаружил. Может кто знает плюсоминусы и готов посоветовать что-то более удобное/надежное - you are welcome.

Нынешний делишес меня задалбывает периодическими отказами (в самый неподходящий момент вдруг не могу букмарклетом добавить ссылку), неполным бекапом, очень сильно тормозящим новым сайтом (превед, обильные JS c AJAX-ами, я вас ненавижу). Да и неудобный этот их новый сайт. Ещё и RSS нет. И как они предлагают следить за интересующими обновлениями? На сайт заходить? Как фейсбук? Странные люди. Ни туда, ни туда я в итоге вообще не захожу.

В локальную вики сохранять - вариант, пользуюсь единым хранилищем. Это по-прежнему WikidPаd. Но сейчас иногда экспериментирую (WikidPad тяжеловесен и чаще я не его запускаю, а текстовым редактором быстро в вики-файлах ковыряюсь - и для добавлений, и для поисков) и предпочитаю линки дублировать в оба места: как в делишес, так и в вики. Потому что помнятся ещё времена, когда делишесом несколько человек с пересекающимися интересами пользовались, и это приносило свои плоды.

И мне ещё очень хочется в WikidPad-е поддержку Markdown, а её готовой нет. А мне не настолько хочется, чтобы всё бросать и этой задачкой заниматься. Поэтому иногда появляются мысли сбежать к `gitit` или ZimWiki, как вариант. ZimWiki, конечно, странный вариант для миграции с WikidPad на него, но чем чёрт не шутит? Пользуюсь иногда для мелких вики по проектам, думаю пока.

UPD 2013-04-28. У Делишеса заработал экспорт (пару дней был недоступен), забрал все ссылки, импортировал в Shaarli. Кстати, ровная юбилейная цифра получилась: 4000 links у меня сейчас. 1265 тегов в tag cloud.

  • Полёт нормальный, никаких тормозов.
  • Файл со всеми закладками теперь 600k вместо 3k.
  • Делишесом последние несколько дней я вообще не смог пользоваться: после загрузки страницы её даже листать скроллером -- большая проблема. В общем, не понимаю я ни их верстальщика, ни вектора развития.

Прощай, Делишес.

Кстати, по поводу цифр и объёмов: пользоваться Делишесом я начал в декабре 2005. Так что в среднем где-то 571 линк в году: пара линков в день.

UPD2: лёгкие тормоза ощущаются только при автоподсказке вводимых тегов. Но это отключаемо при желании, насколько помню настройки. Я лично хорошо помню свои теги и ассоциации, поэтому быстрее их ввожу, подсказки чисто декоративную роль играют.

UPD3: ах, да: http://rb.labtodo.com/links/.

UPD 2013-07-01. Несколько напрягает способ хранения ссылок: в одну строку и зашифровано. Внутри там массив кажется (деталей не помню), но в файле хранится в зашифрованном виде в целях безопасности: чтобы даже в случае упёртого файла ваши линки остались вашими. Но я не знаю, кому как, а у меня приватных линков там -- всего 220 из более чем 4 тысяч (4221), и это с 2005 года. В которые повторно почти и не заглядываю никогда, как практика показывает. Так что половина из них уже скорей всего устарела. Кому нужны эти "секреты"?

Все линки хранятся в одном файле, а внтури этого файла - в виде одной строки. 685 килобайт. Длина одной строки. В день в среднем добавляется пару ссылок. Большая часть из которых редактируется несколько раз, т.к. Shaarli удобно использовать как микроблог и записную книжку. Как я уже сказал чуть выше - меня эта строка длиной в полмегабайта всё больше беспокоит. Предпочёл бы что-то более более распределенное по файловой системе. Во избежание.

Это ещё одна причина, которая рано или поздно всё же заставит меня пристальней смотреть в сторону альтернатив: поддержка нескольких пользователей, плюс более гуманные способы работы/хранения при больших количествах закладок.

Opencart: генераторы sitemap.xml (Google Sitemap) и YML (Yandex.Market) для большого количества товаров

- Posted in Uncategorized by

Решения, рассчитанные на большое количество товаров:

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

Главные проблемы стандартного генератора sitemap.xml, в котором по традиции всё делается в лоб и без оптимизаций:

  • из базы выбираются сразу все товары. На этом этапе при большом их количестве проблемы могут возникнуть как у сервера баз данных, так и с местом на временном разделе;
  • всё это передаётся PHP и в памяти формируется одна большая строка, содержащая весь XML. Только в конце она записывается в файл. На этом шаге тоже вполне можно упереться в ограничение доступной памяти;
  • а заодно можно легко упереться и в ограничение на время выполнения скрипта (по умолчанию обычно 30 секунд). И некоторые хостинги запрещают это время увеличивать (как раз для борьбы с ресурсоемкими и неоптимизированными скриптами). Впрочем, вряд ли магазин со 100 тысячами товаров будет пользоваться шаред хостингом. Но проблемы возникают и на более мелких количествах - порядка 20-30 тысяч. Хотя может даже и раньше (см. пост Yoda в блоге, первая ссылка - там речь о том, что уже и на 3000 бывают проблемы на некоторых серверах);
  • у гугла есть какие-то ограничения на размер файла sitemap.xml или максимальное количество позиций в нём.

Бекап Opencart сайта &#45; checklist

- Posted in Uncategorized by

Сайт обычно располагается в папке `public_html`.

  1. Папки `admin`, `catalog`, `download`, `system`, а также файлы `.htaccess`, `config.php`, `humans.txt`, `robots.txt`, `yandex_*.txt` -- это всё движок магазина. Те, кто использует VQmod, должны добавить к списку ещё папку `vqmod`.
    • файлы с точкой впереди - системные/скрытые. Поэтому их может быть не видно и надо включить в настройках FTP-клиента опцию их показа. `.htaccess` очень важен для работы сайта. Если у него есть расширение (.TXT или любое другое) - значит он сервером не используется (отключен). В этом случае не будут работать SEO URL;
    • в указанных папках есть 2 "лишние", их нежелательно включать в бекап: `system/cache`, `system/logs`. Это кешированные файлы и лог ошибок. Они нужны для работы и диагностики, но хранить их - смысла мало. Особенно если они большого объёма;
    • если вы пользуетесь VQmod-ом: папку `vqmod/logs` желательно исключить из бекапа. Папку 'vqmod/vqcache' можно бекапить, а можно и нет. Самое ценное здесь - содержимое `vqmod/xml`. Остальное несложно восстановить.
  2. Вторая важная часть сайта - картинки/фото.
  3. Они находятся в папке `image` (`public_html/image`). Оригиналы картинок - в папке `image/data`. Это самое ценное. Остальное несложно восстановить.

    • Что здесь бекапить: всю папку `image` за исключением `image/cache`
    • `image/cache` очень объемная. Эти файлы генерируются сайтом на лету при просмотре сайта. Ссылки на них могут использоваться в `sitemap.xml`.

  4. Третья критически важная часть сайта - база данных магазина. Её через FTP не скопируешь. Её надо бекапить либо Adminer-ом, либо phpMyAdmin (обычно есть в панели управления хостинга).

SafePatch - альтернатива vQmod

- Posted in Webdev by

Идея патчей и vQmod совершенно одинаковая. И в одном, и другом случае файл с изменениями накладывается на некую известную основу. И если эта основа изменилась -- и патч, и vQmod могут "поломаться": не смогут внести изменения, если не найдут точного соответствия, необходимого для внесения правок.

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

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

К тому же vQmod - рантайм решение. То есть работает при каждом запросе к серверу. Конечно, многое решается кешированием. Но я из тех разработчиков, которые не совсем понимают, зачем нужно вводить лишнее звено, если то же самое делается без дополнительных костылей (а технологии внесения и убирания этих изменений существуют уже лет 40 и протестированы не одним поколением программистов -- я говорю об утилитах patch и diff).

Причём убрать изменения так же просто, как и наложить патч.

Применить изменения к коду: git apply fix-some-problem.diff или patch -p1 fix.diff

Убрать изменения: git apply -R fix-some-problem.diff или patch -R fix.diff

И где здесь сложная часть? Это ничуть не сложнее удаления VQmod файла. При использовании vQmod надо управляться с набором XML файлов. При использовании стандартного подхода -- с набором DIFF файлов. Невелика разница. А преимущества серьёзные.

И вот совсем недавно, в поисках PHP-реализации утилиты patch или автоматического конвертера DIFF в vQmod XML, я наткнулся на замечательный вариант: утилиту SafePatch.

http://code.google.com/p/safepatch/

UPD: в связи с закрытием Google Code проект переместился на Github: progerxp/safepatch.

Если кратко и своими словами -- это "менеджер пакетов" (расширений). Но в отличие от vQmod (runtime) он эти изменения вносит непосредственно в исходный код (как и patch). При этом понимает формат VQmod и может использовать эти файлы тоже.

Так что те, кто интересуется вопросом - встречайте. По-моему, хороший инструмент. Это не совсем то, что я искал, но отличное готовое решение проблемы.

See also:

На чём пользователи читают почту

- Posted in Uncategorized by

Всё больше почты читается на мобильных устройствах.

По статистике компании Ecwid, 65% их рассылок читается на айфонах, около 16% - на андроиде. Остальные платформы (десктоп и веб-клиенты) идут дальше с существенным отрывом.

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

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

  • включают весь текст письма в ответ. Это жутко неудобно на маленьком экране. Или вы думаете, что ваш собеседник успеет всё забыть, пока вы пишете ответ? Совет: включайте только небольшую часть в квотинг, 1-2 строчки. Если вы отвечаете на большое письмо со множеством затрагиваемых тем. Это позволит собеседнику восстановить контекст беседы. Остальное он и так помнит, если речь не идёт о службе поддержки с несколькими десятками обращений в день;
  • не отделяет абзацы пустой строкой. Отличить, где начался ответ, а где ещё конец отквоченной фразы, крайне сложно - на эти поиски уходит в несколько раз больше времени. На десктопе это часто разукрашивается, поэтому граница заметна, в мобильных почтовых клиентах обычно есть только текст. Помните об этом;
  • пытается обсудить 10 тем в одном письме. Письмо становится огромным (то, что на десктопе занимает всего один экран - на мобильном надо пролистать раз 20, а то и больше), на него становится крайне сложно ответить сразу с телефона (попробуйте с этой горой поработать, пытаясь отрезать часть или листая туда-сюда в попытках вспомнить всё, на что надо ответить). Совет: напишите лучше 10 мелких писем. Одно письмо - одна проблема (тема);
  • включают километры подписей и приветствий. Особенно длинными подписями страдают те, кто что-то продаёт - вы наверняка видели подписи по 5-6 строк. Может иногда они и нужны, но поверьте - обычно всех контактов достаточно в первом письме. Во всех следующих вполне достаточно 1-2 строк подписи. Всякие приветствия я вообще никогда не читаю и всегда пролистываю, не глядя - места они на экране мобильного занимают много, а смысловой нагрузки в них никакой. Когда в день приходит по 50-60 писем, все эти излишки только мешают. Это раньше, когда письма были бумажными и шли неделями, витиеватые вступления были логичны. Сейчас же, когда человек контактирует ежедневно с десятками людей, а почта ходит со скоростью света, идеальный вариант - когда письмо сразу начинается с сути. Открыл - и ничего не мешает.

via Петр Диденко: На чём читают почту от вас?

См. также

https://twitter.com/qetzalcoatl/status/317287448646410240

Email Client Popularity (September 2012)

Mobile email now in the lead Earlier this year, our friends at Return Path predicted that mobile was to surpass web and desktop client usage by July, 2012. We found that this event happened as early as February, when mobile overtook webmail client usage. In April, desktop clients lost their top spot - and mobile has shown no signs of slowing down since. In the following graph, you can see how mobile market share has increased since we last updated our report in May, 2011, while desktop and web client market share has continued its shallow decline.

Киевстар: объем мобильного интернет-трафика за 2012 г. увеличился на 54%

По данным компании «Киевстар», за последний год количество смартфонов в сети оператора выросло почти вдвое. Как результат, объем мобильного интернет-трафика за 2012 г. увеличился на 54%. Для повышения пропускной способности сети и стабильности работы сервисов компания в прошлом году инвестировала в общей сложности 1.8 млрд грн (8 грн = 1$ USD) в развитие инфраструктуры сети. За 2012 г. было построено дополнительно 800 км волоконно-оптических линий связи. Теперь сеть «Киевстар» имеет общую протяженность более 44 тыс. км, из которых около 21,5 тыс. км – магистральных ВОЛС.

Мигрировал с Google Reader на Tiny Tiny RSS. А с него &#45; на Selfoss

- Posted in Uncategorized by

Мигрировал с Google Reader на Tiny Tiny RSS.

Своё, под боком (более управляемое), выглядит лучше. Чего-то особенного, чтобы переживать и голосовать за выживание именно за Google Reader, у меня не было. Мне нужен веб-ридер, по возможности способный быть мелким и быстрым (без обилия DHTML, AJAX, JS).

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

UPD: ещё есть Selfoss: http://selfoss.aditu.de/. Через несколько месяцев использования TT-RSS понял, что Selfoss для меня удобнее, так с ним и остался.

Opencart 1.5.5 (admin): показ SEO Keyword в списке категорий

- Posted in Uncategorized by

Добавляется колонка на странице категорий в админ-части:

Для предыдущий версий - см. список связанных статей внизу.

commit 078537f3d45ecbf7908169e55251243c463ac593
Author: Ruslan Brest <rb@labtodo.com>
Date:   Tue Mar 5 14:42:44 2013 +0200
    [+] Opencart 1.5.5 (admin): показ SEO Keyword в списке категорий
diff --git a/public_html/admin/controller/catalog/category.php b/public_html/admin/controller/catalog/category.php
index d82776a..32a02a4 100644
--- a/public_html/admin/controller/catalog/category.php
+++ b/public_html/admin/controller/catalog/category.php
@@ -157,6 +157,7 @@ class ControllerCatalogCategory extends Controller {
            $this->data['categories'][] = array(
                'category_id' => $result['category_id'],
                'name'        => $result['name'],
+               'keyword'     => $result['keyword'],
                'sort_order'  => $result['sort_order'],
                'selected'    => isset($this->request->post['selected']) && in_array($result['category_id'], $this->request->post['selected']),
                'action'      => $action
@@ -168,6 +169,7 @@ class ControllerCatalogCategory extends Controller {
        $this->data['text_no_results'] = $this->language->get('text_no_results');
 
        $this->data['column_name'] = $this->language->get('column_name');
+       $this->data['column_seo_keyword'] = $this->language->get('column_seo_keyword');
        $this->data['column_sort_order'] = $this->language->get('column_sort_order');
        $this->data['column_action'] = $this->language->get('column_action');
 
diff --git a/public_html/admin/language/english/catalog/category.php b/public_html/admin/language/english/catalog/category.php
index 7c26ba9..bbec2cd 100644
--- a/public_html/admin/language/english/catalog/category.php
+++ b/public_html/admin/language/english/catalog/category.php
@@ -11,6 +11,7 @@ $_['text_clear']             = 'Clear';
 
 // Column
 $_['column_name']            = 'Category Name';
+$_['column_seo_keyword']     = 'SEO Keyword';
 $_['column_sort_order']      = 'Sort Order';
 $_['column_action']          = 'Action';
 
diff --git a/public_html/admin/model/catalog/category.php b/public_html/admin/model/catalog/category.php
index a90b74c..021cbb9 100644
--- a/public_html/admin/model/catalog/category.php
+++ b/public_html/admin/model/catalog/category.php
@@ -205,7 +205,14 @@ class ModelCatalogCategory extends Model {
    } 
    
    public function getCategories($data) {
-       $sql = "SELECT cp.category_id AS category_id, GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR ' > ') AS name, c.parent_id, c.sort_order FROM " . DB_PREFIX . "category_path cp LEFT JOIN " . DB_PREFIX . "category c ON (cp.path_id = c.category_id) LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (c.category_id = cd1.category_id) LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id) WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id') . "' AND cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";
+       $sql = "SELECT cp.category_id AS category_id, GROUP_CONCAT(cd1.name ORDER BY cp.level SEPARATOR ' > ') AS name, c.parent_id, c.sort_order, ua.keyword";
+       $sql .= " FROM " . DB_PREFIX . "category_path cp";
+       $sql .= " LEFT JOIN " . DB_PREFIX . "category c ON (cp.path_id = c.category_id)";
+       $sql .= " LEFT JOIN " . DB_PREFIX . "url_alias ua ON (ua.query = CONCAT('category_id=', cp.category_id))";
+       $sql .= " LEFT JOIN " . DB_PREFIX . "category_description cd1 ON (c.category_id = cd1.category_id)";
+       $sql .= " LEFT JOIN " . DB_PREFIX . "category_description cd2 ON (cp.category_id = cd2.category_id)";
+       $sql .= " WHERE cd1.language_id = '" . (int)$this->config->get('config_language_id')
+           . "' AND cd2.language_id = '" . (int)$this->config->get('config_language_id') . "'";
        
        if (!empty($data['filter_name'])) {
            $sql .= " AND cd2.name LIKE '%" . $this->db->escape($data['filter_name']) . "%'";
diff --git a/public_html/admin/view/template/catalog/category_list.tpl b/public_html/admin/view/template/catalog/category_list.tpl
index 45ca090..0e37f56 100644
--- a/public_html/admin/view/template/catalog/category_list.tpl
+++ b/public_html/admin/view/template/catalog/category_list.tpl
@@ -23,6 +23,7 @@
             <tr>
               <td width="1" style="text-align: center;"><input type="checkbox" onclick="$('input[name*=\'selected\']').attr('checked', this.checked);" /></td>
               <td class="left"><?php echo $column_name; ?></td>
+              <td class="left"><?php echo $column_seo_keyword; ?></td>
               <td class="right"><?php echo $column_sort_order; ?></td>
               <td class="right"><?php echo $column_action; ?></td>
             </tr>
@@ -37,6 +38,7 @@
                 <input type="checkbox" name="selected[]" value="<?php echo $category['category_id']; ?>" />
                 <?php } ?></td>
               <td class="left"><?php echo $category['name']; ?></td>
+              <td class="left"><?php echo $category['keyword']; ?></td>
               <td class="right"><?php echo $category['sort_order']; ?></td>
               <td class="right"><?php foreach ($category['action'] as $action) { ?>
                 <a href="<?php echo $action['href']; ?>"><?php echo $action['text']; ?></a>
@@ -45,7 +47,7 @@
             <?php } ?>
             <?php } else { ?>
             <tr>
-              <td class="center" colspan="4"><?php echo $text_no_results; ?></td>
+              <td class="center" colspan="5"><?php echo $text_no_results; ?></td>
             </tr>
             <?php } ?>
           </tbody>

Файлы для скачивания:

Opencart 1.5.5 (admin): показ SEO Keyword в списке категорий

  • diff - для автоматического или ручного переноса изменений;
  • папка со всеми измененными файлами - для тех, кому удобней сравнивать и переносить изменения инструментами вроде WinMerge, Beyond Compare, Meld;
  • xml - для тех, кто пользуется vqMod.

Сравнение языковых файлов Opencart

- Posted in Uncategorized by

При поиске различий в языковых файлах Opencart огромную неприятность доставляет то, что утилиты наподобие DIFF оказываются почти бесполезны. Они сравнивают файлы построчно, а поскольку приходится сравнивать английский файл с русским, то 99% строк разные из-за перевода. И найти в этих условиях новые и удаленные переменные в файлах локализации оказывается очень сложно и муторно. Графические аналоги подобных программ тоже не очень-то помогают, даже если способны подсвечивать разницу внутри одной строки: в глазах рябит, строки длинные, и после проверки пары каталогов эта рутинная и фактически ручная визуальная проверка просто выматывает.

Но у линукс-пользователей есть способ существенно облегчить себе задачу поиска различий, сравнивая лишь часть строк из двух файлов!

В файлах локализации неизменной для русской и английской версии остается левая часть строк до знака '='. Их и будем сравнивать. На помощь утилите diff приходит утилита cut:

#!/bin/bash
diff -b <(cut -d'=' -f1 -s $1) <(cut -d'=' -f1 -s $2)

Указав этой утилитке имена двух файлов, получим краткий список отсутствующих и появившихся языковых переменных. Это то, чего мне долго не хватало!

Спасительная команда cut -d'=' -f1 -s setting.php выводит только первую часть строки (-f1), разделенной знаком '='. А diff сравнивает две этих "первых колонки" из обеих файлов, оставляя нам только разницу.

Про Quickcheckout 151x и новые версии Opencart

- Posted in Uncategorized by

Я всё никак не найду времени написать статью о том, почему QC не развивается и не поддерживаются новые версии Опенкарт. Заготовки (в ответах людям) периодически появляются, но времени сесть и оформить это, чтобы объяснить сразу всем и сразу - не находится.

Там такая ситуация.

  1. Начиная с 1.5.2 началась бурная перестройка в этой части Опенкарт - что-то связанное с налогами, плюс прочие изменения. Это означает, что модуль надо переделывать тщательно и полностью. Тонкостей налогообложения других стран не знаю, поэтому надо все изменения переносить, заново укорачивать и проверять: проблема в том, что когда я его делал, не нашёл другого способа, кроме как продублировать функционал оформления заказа, и его уже модифицировать. Способа использовать код OC, а не его копию, я не нашёл.
  2. Основной идеей Quickcheckout (QC) был полный отказ от всей адресно-географической информации. А с ней как раз расчет налогов и связан. Представьте: берём стандартный процесс и отрезаем от него половину. Вот это и есть QC. В итоге меня позже уговорили добавить к этому огрызку способы оплаты. Но ограничение-то никуда не делось - возвращать поддержку адресов и гео-зон означает возврат этого всего и в интерфейс, и во внутренности. Это, опять же, полная переделка того, что было.

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

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

Потом уже появились альтернативы - и по той же цене, и даже бесплатные варианты. Сейчас, при наличии полноценных альтернатив и активной поддержке новых версий (simpleopencart.com например) писать ещё один такой же модуль-одностраничник и заниматься его поддержкой мне кажется странным - можно просто пользоваться готовым (Simple) для новых версий Опенкарт.

Поэтому если переделывать QC - получится полный аналог Simple, как ни крути. Потому что в старом виде (с обрезанной поддержкой адресной части) его развивать нет смысла (слишком много проблем возникает). И по цене они окажутся одинаковыми, и по внешнему виду, и по функционалу скорей всего (с минимальными отличиями).

А если так, то возникает вопрос - зачем? Если уже есть готовое решение.