Я в отъезде, вернусь 12-13 сентября

- Posted in Uncategorized by

Я в отъезде, вернусь приблизительно 12-13 сентября.

Буду почти без средств связи, так что ответить скорей всего не будет возможности.

UPD. Вернулся 20/09, в инбоксе больше 400 писем, постараюсь разобрать за пару дней.

Amazon AWS анонсировала "холодильник" для дешевого хранения больших объемов

- Posted in Uncategorized by

Несколько дней назад Amazon AWS (Amazon Web Services) анонсировала новый сервис Amazon Glacier (glacier - ледник).

Сервис нацелен на дешёвое (1 цент за гигабайт в месяц) хранение больших объёмов данных, доступ к которым нужен редко: архивы документов, проектов, оригиналы фото и видео. Насмотрелись, сложили и потом месяцами (а то и годами) не пользуемся.

Помимо стоимости хранения есть ещё цена за трафик, но тоже мизерная: первый гигабайт в месяц бесплатен, до 10 терабайт в месяц - 12 центов за гигабайт. Но это если вы скачиваете сохраненные там данные. Закачать их туда - бесплатное удовольствие. Ну и ещё там есть какая-то мелочь за запросы (5 центов за 1000 запросов на закачивание и скачивание).

Удачная удаленно-сетевая альтернатива покупке запасных HDD для бекапных целей, как мне кажется. Резервные копии важных данных надо хранить, как известно, в физически удаленных местах. И этот запасной "диск в сети" - весьма дешевая альтернатива получается.

Прикинем примерно по финансам...

HDD: около 70$, 5 лет, 160 GB

Стоимость гигабайта на HDD сейчас колеблется в районе 20-25 центов за гигабайт - это я смотрел диски объёмами 160-500 GB. Самыми дешевыми оказались терабайтные (1000 GB - цена около 80$, 8 центов за гигабайт). Смотрел новые исправные на Aukro.ua. Может в магазинах и дороже, но если и так, то вряд ли намного.

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

Я для бекапов купил в 2007 или 2008 году 160-гигабайтный винт (в ноутбуке у меня тогда было вообще всего 20 гигабайт), который активно использовал для бекапов проектов, фото, книг, статей и т.п. Активно - первый год, может два. Потом начал сохранять там интересные "долгосрочные" фильмы, которыми в итоге и забился весь объём. Позже стали появляться облачные сервисы и проекты в основном туда перекочевали - в интернет-облака по 2-5 бесплатных гигабайт - если хранить проекты и документы, без фото, музыки, видео и фильмов, то места требуется не так уж много.

AWS: 5 лет, 160 GB - до 96$

Сейчас 2012. Про этот диск я вспоминаю редко - практически им не пользуюсь. Покупал я его долларов за 70. Сейчас такие около 40 стоят, если не ошибаюсь. Допустим, 5 лет: это 60 месяцев. Примерно 1.16$ в месяц. Если хранить тот же объём на Amazon Glacier, 160 гигабайт будут стоить 1.6$ в месяц, около $20 в год. 1.6 x 60 месяцев = 96$ за 5 лет.

Выводы и нюансы

Да, чуть дороже получается. Некоторые ещё могут сказать, что с учетом того, что диски дешевеют, их можно чаще менять и наращивать объем примерно за ту же цену. Всё это примерно так, согласен. Но откровенно говоря, дешевле будет подождать 3-4 года и купить тот же объём в 2 раза дешевле, чем заниматься регулярно перепродажей на вторичном рынке и терять на этом.

С другой стороны - я там буду хранить многое, но оно долго не будет дотягивать до 160 гиг. Например, вряд ли я буду там складировать фильмы. Хотя может и буду, кто знает. Дёшево ведь получается. Поэтому цена за 5 лет будет меньше и расти постепенно. Например, если ориентироваться на предыдущий опыт: до 160 диск у меня будет неспешно заполняться пару лет. Ну может год. То есть 10-20 месяцев объём там будет значительно меньше 160 гигабайт. Если, разумеется, вы не обильный фотограф или любитель снимать всю свою жизнь на видео. Там наверное другая история.

В общем, для более-менее обычных условий мне разница в цене кажется несущественной. А вариант - очень интересным.

Ссылки

Как переименовать фото в соответствии с датой-временем файла или съёмки

- Posted in Uncategorized by

Для фотографий (из EXIF или даты файла)

Фотографии отличаются от "просто файлов" тем, что у них может быть внутри дополнительная информация - EXIF. Для переименования всех фотографий в текущей папке из невразумительных имен IMAGE01234.jpg во что-то наподобие 2012-08-12-235516.jpg делаем так:

#!/bin/bash
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}

jhead -n ищет данные сначала в EXIF, и если этой информации там нет, то берет за основу дату-время файла.

Файлы любых других типов (по дате файла)

Для любых других файлов (логов и так далее) используем ls -l (приведенному скрипту надо указать имя файла):

#!/bin/bash
mv "$file" `ls -l "$1" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg

Если файлов много, то то же самое в цикле

#!/bin/bash
for file in *.jpg *.jpeg *.JPG *.JPEG; do
    mv "$file" `ls -l "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg
done

Мой текущий ~/bin/dts полностью

#!/bin/bash
## Rename all known media files to their DTS (date/time stamp)
## ATTN: renames ALL files in current directory, no backups or ability to restore old filename
## <hr /><hr />-- JPEG <hr /><hr /><hr />--
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}
## <hr /><hr />-- PNG  <hr /><hr /><hr />--
for file in *.png *.PNG; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.png
done
## <hr /><hr />-- 3GP <hr /><hr /><hr />--
for file in *.3gp; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.3gp
done

Немцы выложили законы на гитхаб для мержей и пулл&#45;реквестов

- Posted in Uncategorized by

@vessi at Juick:

*Германия *вин *git немцы выложили законы на гитхаб. Можно делать пулл-реквесты, после одобрения бундестагом они будут смержены.

https://github.com/bundestag/gesetze

German Federal Laws and Regulations This Git repository contains all German federal laws and regulations in Markdown format. The source is the XML version of the laws from www.gesetze-im-internet.de.

Opencart: картинка товара в истории заказов покупателя

- Posted in Uncategorized by
oc153.image-account-order-information_.png

При просмотре истории заказов зарегистрированный покупатель теперь сможет видеть фото товаров. Фото товара используется текущее (т.е. может не совпадать с тем, которое было на момент покупки).

Делалось на текущей версии Opencart из репозитория (т.е. 1531+, commit:a023998).

На 1541 тоже работает.

Кто хочет видеть меньшие размеры фотографий, вместо предложенных config_image_category_width может использовать config_image_additional_width. Некоторые "за" и "против" можно увидеть в комментариях.

commit 8914dee796792b5662cd40638829fd52e4664289
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Aug 6 08:11:06 2012 +0300
    Product image on account/order/info page
diff --git a/upload/catalog/controller/account/order.php b/upload/catalog/controller/account/order.php
index 41dd890..016b996 100644
--- a/upload/catalog/controller/account/order.php
+++ b/upload/catalog/controller/account/order.php
@@ -306,7 +306,8 @@ class ControllerAccountOrder extends Controller {
            $this->data['shipping_method'] = $order_info['shipping_method'];
            
            $this->data['products'] = array();
-           
+           $this->load->model('tool/image');
+
            $products = $this->model_account_order->getOrderProducts($this->request->get['order_id']);
 
            foreach ($products as $product) {
@@ -327,8 +328,15 @@ class ControllerAccountOrder extends Controller {
                    );                  
                }
 
+               if (empty($product['image'])) {
+                   $thumb = '';
+               } else {
+                   $thumb = $this->model_tool_image->resize($product['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height'));
+               }
+
                $this->data['products'][] = array(
                    'name'     => $product['name'],
+                   'thumb'    => $thumb,
                    'model'    => $product['model'],
                    'option'   => $option_data,
                    'quantity' => $product['quantity'],
diff --git a/upload/catalog/model/account/order.php b/upload/catalog/model/account/order.php
index 605c1ff..e26012f 100644
--- a/upload/catalog/model/account/order.php
+++ b/upload/catalog/model/account/order.php
@@ -116,7 +116,7 @@ class ModelAccountOrder extends Model {
    }
    
    public function getOrderProducts($order_id) {
-       $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'");
+       $query = $this->db->query("SELECT op.*, p.image FROM `" . DB_PREFIX . "order_product` op LEFT JOIN `" . DB_PREFIX . "product` p ON (p.product_id = op.product_id) WHERE order_id = '" . (int)$order_id . "'");
    
        return $query->rows;
    }
diff --git a/upload/catalog/view/theme/default/stylesheet/stylesheet.css b/upload/catalog/view/theme/default/stylesheet/stylesheet.css
index e0084eb..1110151 100644
--- a/upload/catalog/view/theme/default/stylesheet/stylesheet.css
+++ b/upload/catalog/view/theme/default/stylesheet/stylesheet.css
@@ -508,6 +508,11 @@ table.list .center {
    text-align: center;
    padding: 7px;
 }
+table.list .left > img
+{
+   float: left;
+}
+
 table.radio {
    width: 100%;
    border-collapse: collapse;
diff --git a/upload/catalog/view/theme/default/template/account/order_info.tpl b/upload/catalog/view/theme/default/template/account/order_info.tpl
index c94aa0c..e9843be 100644
--- a/upload/catalog/view/theme/default/template/account/order_info.tpl
+++ b/upload/catalog/view/theme/default/template/account/order_info.tpl
@@ -62,11 +62,14 @@
     <tbody>
       <?php foreach ($products as $product) { ?>
       <tr>
-        <td class="left"><?php echo $product['name']; ?>
+        <td class="left">
+          <img src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" />
+          <?php echo $product['name']; ?>
           <?php foreach ($product['option'] as $option) { ?>
           
            <small> - <?php echo $option['name']; ?>: <?php echo $option['value']; ?></small>
-          <?php } ?></td>
+          <?php } ?>
+        </td>
         <td class="left"><?php echo $product['model']; ?></td>
         <td class="right"><?php echo $product['quantity']; ?></td>
         <td class="right"><?php echo $product['price']; ?></td>

Измененные файлы текущей версии Опенкарт (1.5.3.xyz). Как всегда, рекомендую не заменять, а сравнивать со своими (WinMerge.org, TotalCommander, Meld и т.п.):