вторник, 31 июля 2012 г.

git



**** update in dev *****

git stash save
git checkout master
git pull
git checkout dev
git stash pop
***************

insufficient permission

При следующих ошибках:
  • bash-3.2$ git commit -am 'foo' error: insufficient permission for adding an object to repository database .git/objects error: Error building trees
  • error: insufficient permission for adding an object to repository database ./objects fatal: failed to write object error: unpack failed: unpack-objects abnormal exit
нужно сделать:
1. simple permissions error (sudo chown hatim:hatim .git -R fixed it)
2. ssh to server
cd repository.git sudo chmod -R g+ws * sudo chgrp -R mygroup * git repo-config core.sharedRepository true and the try to push origin master again
Если не помогло:

Как вариант можно пересоздать связь с удаленным репозиторием:
git remote rm origin - удаляем старую связь
git remote add origin git@server:repo.git - создаем новую связь

суббота, 28 июля 2012 г.

Java script библиотеки генерации графиков и диаграмм (amCharts, Highcharts, Raphaeljs, ...)

 У меня была задача выбрать java script библиотеку для генерации графиков и диаграмм в любом браузере и на любой операционной системе, в том числе iOS.

Существуют решения, позволяющие в браузерах использовать SVG для визуализации графики, а в Internet Explorer рисовать с помощью VML.

Сравнительные характеристики

amCharts
Highcharts
http://www.highcharts.com/stock/demo/
Google Chart
Raphaeljs
http://raphaeljs.com/analytics.html
Flot jQuery
Elycharts
http://elycharts.com/examples
ОС, браузеры IE  6.0 +
Firefox
Chrome
Safari
 Opera
iOS (iPad, iPhone, iPod Touch)
Android Honeycomb
IE  6.0 +
Firefox 2.0 +
Chrome 1.0 +
Safari 4.0 +
Opera 9.0 +
iOS (Safari)3.0 +
Android Browser2.0 +
Older IE
iPhones, iPads (баги)
Android
and other
IE  6.0+
Firefox 3.0+
Chrome 5.0+
 Safari 3.0+
Opera 9.5+
iOS (Safari)
Android Browser
IE  6.0+
Firefox 2.x+
Safari 3.0+
Opera 9.5+ Konqueror 4.x+
iOS
IE  6.0+
Firefox 3.0+
Chrome
 Safari 3.0+
Opera 9.5+
frameworks + + + +
Совмещение диаграмм + только          
JavaScript Charts
Только highcharts + +
Масштабирование по х, у + только          
JavaScript Charts
Только highcharts +/? ?
Вывод точек с описанием + + + +
Разбиение по временным отрезкам + + - - -
Использует js frameworks - Опционально:  jQuery, Mootools , Prototype - jQuery jQuery jQuery
Импорт данных JS, CSV, XML JS,  опционально: JSON , CSV, XML JS,  JSON , Chart Tools Datasource protocol, JSON , CSV, XML, … JS,  теоретически: JSON , CSV, XML JS JS,  теоретически: JSON , CSV, XML
Клиенты Microsoft, Cisco, NASA, Motorola, Siemens Yandex,  IBM, NASA, Siemens, EMC, Sony Весь мир ? ?
Стоимость 61 500 р.
Charts – 22 500 р
23 000 -  130 000 р.
Highcharts – 12 600 – 60 000 р
free free free free
Лицензия + OEM license
http://shop.highsoft.com/highstock.html#faq
API Google
https://developers.google.com/terms/
Licensed under the MIT http://raphaeljs.com/license.html - MIT
Особенности Изменение графиков в реальном времени Вариант генерации на стороне клиента с помощью JSили на стороне Google и возврат картинки. Изменение графиков в реальном времени
Впечатление Большая функциональность. В iOSпроблемы у справлением скролов Проработанный, развивающийся корпоративный продукт. Но есть баги с прорисовкой в IE 6. Быстро работает. Очень много документации. Настораживает переменчивость в политике Google Поддерживается одним разработчиком Можно использовать для вывода без разбиения по периодам Сомнительный

Функционал

amCharts
Highcharts
amCharts
Highstock
amCharts
сводная
Highcharts
сводная
Highcharts
JavaScript Charts
Highcharts
JavaScript Stock Chart
Линия с кнопками временных периодов
-
+
+
+
-
+
Линия со строкой  временного периода
+
+
+
+
+
+
Несколько линейных графиков с выводом инф в одном всплывающем окне
+
-
+
+
+
+
Диаграмма пирог
+
-
+
+
+
-
Диаграмма 3Д пирог
+
-
+
-
-
-
Диаграмма столбцы вертикальные / горизонтальные
+
-?
+
+
+
+/-
Диаграмма пирог и столбец с углублением
-
-
-
-/+
-/+
-
Совмещение диаграмм
+
-?
+
+
+
-
Масштабирование по х, у
+
-
+
+
+
+
Вывод произвольных точек с описанием
+
+
+
+
+
+?
Диаграмма пузырьками
+
-
+
-
-
-

Скорость генерации графика

Браузер
amCharts
line (ms)
amCharts
column (ms)
Highcharts
line (ms)
Highcharts
column (ms)
firefox 438.537, 91553 вызовов 101.633, 4398 вызовов 1.27, 47 вызовов 222.974, 30136 вызовов
chrome 349 78 1 131
IE9 2539 640 1 5
IE8 1689 415 1 286
IE7 194059 330 10 630
IE6 235298 431 10 631
Opera 12 1785 472 1 550
Opera 11 3000 90 1 61
Android 4370 113 7 53
iOS 5212 188 16 553

пятница, 13 июля 2012 г.

Прототипирование интерфейсов

create wireframes, mockups or UI concepts, prototypes depending
Как то мне понадобилось подобрать сервис для легкого создание макета интерфейса сайта для использования в техническом задании. Одним из критериев была работа во всех браузерах. Выбирал среди следующих:

Создаем счетчик для размещения на других сайтах

Создаем счетчик для размещения на других сайтах


На странице пользователя:

<script src="//domain/gc.js" type="text/javascript"></script>
<script type="text/javascript">
    try { var gluCounter11111111111 = new Glu.Counter(11111111111); } catch(e){}
</script>
<noscript>
    <a href="http://domain/click/11111111111" target="_blank">
        <img src="//domain/counters/11111111111.png" alt="" />
    </a>
</noscript>

Тег <script type="text/javascript"> используется дважды для того что бы инициализация класса во втором теге произошла только после того как подгрузится файл с удаленного сервера.

Содержимое файла gc.js:

document.write("<a href='http://domain/click' target='_blank'><img src='http://domain/counters/11111111111.png?"+Math.random()+"' alt='' /><\/a>")


Пивот (PIVOT) – это разворот таблицы


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

Описание принципа здесь http://easy4web.ru/?p=1099

По сути мы столбцы переносим в колонки.
В чем задача? Она схожа с обсуждаемым недавно здесь вопросом http://sqlinfo.ru/forum/viewtopic.php?id=4252 + небольшое отличие
Есть упрощенно такая структура таблиц (каталог товаров, с делением по характеристикам):

CREATE TABLE categories (category_id, ... );
CREATE TABLE products (product_id, category_id,...);
CREATE TABLE properties (property_id, ...);
CREATE TABLE products2properties  (category_id, property_id);
CREATE TABLE properties_values (product_id, property_id, value);
 
products2properties   - моя таблица. Нужна потому что товары из разных категории имеют разный набор характеристик на всю категорию.

Необходимо вывести первые 10 товаров с их характеристиками + сортировка и поиск по любой характеристики.

Решение SELECT .. SELECT ...SELECT конечно же не приемлемо. Решать это средствами PHP накладно.

Давайте вместе подумаем как сделать оптимально!

Решение 1:
http://stackoverflow.com/questions/6498 … lue-schema
Средствами PHP собираем запрос из кучи JOIN.
Я думаю сервер от такого рухнит.

Решение 2:
что то умное предлагаю здесь но я не понимаю сленга)
http://bb.ct.kz/topic/189790-sql-vivest … p__7088923
Цитата того что понимаю:
Если столбцов количество неизвестно то только динамик скул...
Приблизительный алгоритм...
1. Получаем параметры...
2. Создаем запрос...
3. тут можно или представление создать или временную таблицу...
4. если временная таблица... заполняем данными...
5. с клиента пишем select * from vwView(ttTable)

Как вариант... тот же самый пайвотинг инсерт...
Решение 3:
То которое я сейчас рассматриваю...
http://www.orafaq.com/forum/m/30557/684 … #msg_30557
Проблема что оно вроде для ОРАКЛа т.к. у  меня выдает ошибку на название команд.

SQL> CREATE OR REPLACE PACKAGE pkg
  2  IS
  3      TYPE t_rc IS REF CURSOR;
  4  END pkg;
  5  /

Package created.

SQL> CREATE OR REPLACE PROCEDURE dynamic_pivot (rc IN OUT pkg.t_rc)
  2  IS
  3      l_count     NUMBER;
  4      l_sql       VARCHAR2(32000);
  5  BEGIN
  6      SELECT   MAX(COUNT(*))
  7      INTO     l_count
  8      FROM     b
  9      GROUP BY b.id;
 10
 11      l_sql := 'SELECT x.id, x.a_name';
 12
 13      FOR i IN 1..l_count LOOP
 14          l_sql := l_sql
 15                   || ',MAX(DECODE(x.rn,'
 16                   || TO_CHAR(i)
 17                   || ',x.b_value)) val'
 18                   || TO_CHAR(i);
 19      END LOOP;
 20      l_sql := l_sql
 21               || ' FROM (SELECT a.id, a.name a_name'
 22               || ',b.value b_value'
 23               || ',ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY NULL) rn'
 24               || ' FROM a, b WHERE a.id = b.id) x GROUP BY x.id, x.a_name'
 25               || ' ORDER BY x.id';
 26      OPEN rc FOR l_sql;
 27  END dynamic_pivot;
 28  /

Procedure created.

SQL> VARIABLE my_rc REFCURSOR
SQL> EXEC dynamic_pivot(:my_rc);

PL/SQL procedure successfully completed.

SQL> PRINT :my_rc

        ID A_NAM VAL1  VAL2  VAL3  VAL4  VAL5  VAL6  VAL7
---------- ----- ----- ----- ----- ----- ----- ----- -----
       100 test  val1  val2
       101 hello aloha hi    wave  smile hey   hola  g'day



Временный итог:
Думаю может сделать процедуру для Мускула как в решении 3. Повесить триггер на изменение таблиц товаров что бы дергал эту процедуру пересчета (в идеале только того товара/категории которая изменилась). Процедура будет создавать таблицу Х удобную для простой выборки.

Ваше мнение? Как это всё написать? Я ни триггеры ни процедуры ни разу не писал....


Информация по теме:
http://ru.w3support.net/index.php?db=so&id=778079
http://www.sql.ru/faq/faq_topic.aspx?fid=210
http://forums.mysql.com/read.php?98,7000,7000
http://dev.mysql.com/tech-resources/art … rsion.html
http://en.wikibooks.org/wiki/MySQL/Pivot_table