Pull to refresh
47
0
Kirill Yegorov @coh

Пользователь

Send message
Кстати, верно подмечено выше, вопреки общепринятому представлению GPL, Sencha трактует этот момент в свою пользу как передачу, стоит ли в случае чего с ними судиться стоит 100 раз подумать.
Все верно сказано. Правда есть у них одна расплывчатая оговорка:
In some cases, you can transfer your license to the third party,
в заметке для Consultants and Software Integrators
Sencha начали жадничать и закручивать гайки, увеличивать стоимость лицензии. Становится накладно иметь дело с их продуктами в форме Commercial License. Про OEM лицензию маленькие стартапы теперь вовсе могут забыть. Печально, все так хорошо начиналось, на 3,4 верси можно было купить лицензию за $300-$400 без поддержки на одного разработчика.
Клиенты заказчика пользуются услугой по сети это больше похоже на SaaS в данном случае:
providing access to use your software over a network (like in SaaS) is not considered distribution

Это не считается распространением в GPLv3.
А вот AGPL накладывает ограничение и на SaaS
Но там нет ничего выше джуниорского уровня.

Вы ошибаетесь, там достаточно много сложных вопросов.
Сдавал тест на 5.3, попались вопросы на безопасность,
были вопросы на неочевидные особенности языка (очень много!),
были вопросы по SQL,XML
были вопросы по тонкостям наследования, late static binding и прочее.
Не уверен как сейчас, в то время тест был очень сложен для middle не то что junior
Ну вот опять одно и то же, никому ненужные холивары.
Подавляющее большинство сайтов не имеют 100кк записей.

А если имеют вполне доросли до TokuDb storage engine, даже если нет, то
pt-online-schema-change или habrahabr.ru/post/121129 (2011 год!!!)

Я говорю о том, что вроде как в мире OpenSource не принято поливать грязью.
По меньше продуктового евангелизма, побольше конкретики.

Эта новая эпопея PG vs MySql выглядит очень странно, если не вспомнить про бизнес интересы российских софтверных компаний интеграторов/автоматизаторов. Ничего не имею против Олега Царева, Postgres Professional, 404, altLinux и прочего бизнеса, даже очень за! И болеею за вас душой! Приятно осознавать, что отечественные компании научились зарабатывать на свободном ПО. Но весьма странно, когда человек выходит на конференции PG и рассказывает про недостатки MySQL, тут гордость и патреотизм уходят…

Ваши аргументы вида mysql обрезает строки и вообще позволяет творить “мракобесие” (включение strict режима снимает эту напряженность), тоже вызывают недоумение, как и бенчмарки на дефолтных настройках у других авторов. Да создатели задумали “дружелюбное” поведение, кто-то скажет добро, кто-то зло. Однако, это решается настройками.

И статья вроде была про миграции, а опять MySql во всем виноват…
Никто же не говорит, что С/C++ “невообразимое варварство”, которое ведет к утечкам памяти.

MySQL создана для веба. Будь то мелкие сайты, которые используют 10% ее возможностей или большие грамотно спроектированных ресурсы, отмасштабированные горизонтально, которые не редко используют только 10% возможностей SQL и СУБД. Именно там, где рядом стоят сервера очередей и nosql, где каждая система выполняют ту задачу, для которой она разработана.

Зачем поливать грязью конкурента, если можно сделать элегантный финт и сказать, что PG лучше подойдет для монсторуозной монолитной системы которая не была расчитана на большой конкурентный поток данных, для увеличения производительности 1С, для удешевления прикладных систем и банковского ПО, для сложного и объемного документооборота, для хранения большого объема неразделяемых данных, чего угодно, но у Postgre web’е нет совершенно никаких решающих преимуществ, а для среднестатистических сайтов вообще без разницы какая СУБД ( главное чтобы разработчки были с ней знакомы).

Самый простой способ — закидать камнями. Пара success story про особенности автоматизации сложных бизнес процессов даст намного больше чем 10ток статей и выступлений из разряда mysql “злосчастное подобие СУБД”.

Расскажите кому и в каком случае стоит задуматься о миграции. Мне и самому очень интересна pg, российские дороботки в виде разграничания прав доступа на уровне строки, все что угодно, больше конкретики, меньше пузомерок.

Простой пример рассказа “Ваш старенький форум поддержки уже не справляется с наплывом посетителей, данные жалко, MySQL трещит по швам, дорабатывать сайт некому? «Тру» репликация PG вас спасет. Мы расскажем Вам как быстрее мигрировать”

Извините, если слишком резко, накипело.
Пруфов было достаточно выше.
Аналогично можно выпустить проект с описанием СуперМегаФреймворк/Антивирус/OS
и кодом:
<?php echo 'helloworld';

Дальше апеллировать, это открытый проект присылайте патчи и недостающий функционал!

Компонент миграции только в планах, или уже можно использовать?
Что вам помешало допилить автоматическое создание таблиц в БД и синхронизацию структуры?
Это просто бизнес, ничего личного. www.nixp.ru/news/13138.html
Например так выглядит поисковый запрос для поиска детали по номеру:
http://api.demo.abcp.ru/search/articles/?userlogin=username&userpsw=md5pass&number=01089&brand=Febi


Смущает, что пароль (в данном случае токен, с известным слабым хэш алгоритмом) передается в открытом виде через http…

Из документации:
http://tecdoc.api.abcp.ru/manufacturers?userlogin=USER_LOGIN&userpsw=USER_PSW&userkey=USER_KEY


userlogin Имя пользователя в системе
userpsw md5-хэш пароля пользователя в системе
userkey Ключ для доступа к api

Непонятно зачем светить передавать пароль пользователя в системе, почему недостаточно ключа доступа к API?
Тащить весь html не целесообразно, значительно быстрее запрашивать только данные, отрисовывать и кэшировать их на стороне клиента. На эту проблему натолкнулись разработчики мобильного приложения html5 facebook, после чего заявили что native намного шустрее. На что им намекнули создатели ExtJs
www.theregister.co.uk/2012/09/14/facebook_html_5_vs_native_apps/
www.sencha.com/blog/the-making-of-fastbook-an-html5-love-story
Если вы к тому что не нужно впадать в крайности я с вами полностью согласен.

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

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

Приходилось встречаться с легаси проектами где отсутствовал кэш шаблонов как класс (кэш того, что возвращает Temlate или шаблонизатор) и это был ацкий ад. БЫл случай данные забирались из memcached, а дальша начиналась череда рендеринга (кстати шаблонизатором), соотношение времени исполнения было 10% на днные 90% на шаблоны (очень много шаблонов веселых и разных).

С другой стороны есть проекты где и шаблонов-то как таковых нет, вопрос вовсе не стоит. Об этом мы уже говорили в этой ветке.

Было утверждение, что шаблонизатор незначительно сокращает время обработки, оно опровергнуто. При этом я не призывал повсеместно от чего-то отказываться или использовать только 1 вариант и не вешал ярлыков. Это альтернатива для крикливых троллей комментаторов с чсв > 9000.

Прежде всего прошу прощения, что заставил вас ждать и провел тесты всего 3х решений.
И так результаты тестирования на другой машине Php 5.6 + OpCache + nginx +php-fpm за 30с нагрузки


Native PHP 0.0010359287261963 s (1 просмотр)
Профиль AB2
ab2 -t30 -c10 -n200000 -l test.ru:81/test.php
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, www.zeustech.net/
Licensed to The Apache Software Foundation, www.apache.org/

Benchmarking test.ru (be patient)
Completed 20000 requests
Completed 40000 requests
Completed 60000 requests
Completed 80000 requests
Completed 100000 requests
Completed 120000 requests
Completed 140000 requests
Finished 152586 requests

Server Software: nginx/1.7.9
Server Hostname: test.ru
Server Port: 81

Document Path: /test.php
Document Length: Variable

Concurrency Level: 10
Time taken for tests: 30.000 seconds
Complete requests: 152586
Failed requests: 0
Total transferred: 3696740048 bytes
HTML transferred: 3668664224 bytes
Requests per second: 5086.16 [#/sec] (mean)
Time per request: 1.966 [ms] (mean)
Time per request: 0.197 [ms] (mean, across all concurrent requests)
Transfer rate: 120335.61 [Kbytes/sec] received

Connection Times (ms)
min mean[±sd] median max
Connect: 0 0 0.0 0 0
Processing: 1 2 1.2 2 32
Waiting: 1 2 1.2 1 32
Total: 1 2 1.2 2 32

Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 2
80% 2
90% 3
95% 4
98% 6
99% 7
100% 32 (longest request)

код
test.php
ob_start();
$t = microtime (true);

$records = array ();
for($i = 0; $i < 500; $i ++) {
	$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
}

include_once './Template.php';

$template = new Template();
echo $template->render('./phpTemplate.php' , array('records'=>$records));

echo microtime ( true ) - $t . '.s' . "\n";

echo ob_get_clean();


Template.php
<?php
class Template
{
  public $data = array();
  
  public function render($path , $data){
    $this->data = $data;
    ob_start();
    include $path;
    return ob_get_clean();
  }
  
  public function get($key){
      return $this->data[$key];
  }
}


phpTemplate.php
<!DOCTYPE html>
<html>
<head>
<title>My Webpage</title>
</head>
<body>
	<h1>My Webpage</h1>
	<table>
	<?php
		foreach ( $this->get('records') as $item )
			echo '<tr><td>' , $item['id'] , '</td><td>' , $item['name'] , '</td><td>' , $item['value'] , '</td></tr>';
	?>
     </table>
</body>
</html>




Phalcon + Volt 0.004223108291626 s(1 просмотр)
Профиль AB2
ab2 -t30 -c10 -n200000 -l test.ru:81/testvolt.php
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, www.zeustech.net/
Licensed to The Apache Software Foundation, www.apache.org/

Benchmarking test.ru (be patient)
Completed 20000 requests
Completed 40000 requests
Completed 60000 requests
Completed 80000 requests
Completed 100000 requests
Finished 107060 requests

Server Software: nginx/1.7.9
Server Hostname: test.ru
Server Port: 81

Document Path: /testvolt.php
Document Length: Variable

Concurrency Level: 10
Time taken for tests: 30.000 seconds
Complete requests: 107060
Failed requests: 0
Total transferred: 3990651615 bytes
HTML transferred: 3970952575 bytes
Requests per second: 3568.66 [#/sec] (mean)
Time per request: 2.802 [ms] (mean)
Time per request: 0.280 [ms] (mean, across all concurrent requests)
Transfer rate: 129903.94 [Kbytes/sec] received

Connection Times (ms)
min mean[±sd] median max
Connect: 0 0 0.0 0 0
Processing: 1 3 1.6 2 33
Waiting: 1 3 1.6 2 33
Total: 1 3 1.6 2 33

Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 3
80% 3
90% 5
95% 6
98% 8
99% 10
100% 33 (longest request)

код
testvolt.php
<?php
try {
    $t = microtime(true);
    //Register an autoloader
    $loader = new \Phalcon\Loader();
    $loader->registerDirs(array(
        './controllers/',
        '../app/models/'
    ))->register();

    //Create a DI
    $di = new Phalcon\DI\FactoryDefault();

    //Setting up the view component
    $di->set('view', function(){
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('./volt/');	
	$view->registerEngines(array(
	    ".phtml" => 'Phalcon\Mvc\View\Engine\Volt'
	));	
        return $view;
    });

    //Handle the request
    $application = new \Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();
    echo microtime(true) - $t.'.s';

} catch(\Phalcon\Exception $e) {
     echo "PhalconException: ", $e->getMessage();
}

Controller
<?php
class IndexController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {
	$records = array ();
	for($i = 0; $i < 500; $i ++) {
		$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
	}
        $this->view->setVar("records", $records);
    }
} 

Template
<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <h1>My Webpage</h1>
        <table>
        {% for item in records %}
            <tr><td>{{ item['id'] }}</td><td> {{ item['name'] }} </td> <td> {{ item['value'] }} </td></tr>
        {% endfor %}
        </table>
    </body>
</html> 



Twig 0.022145986557007 s (1 просмотр)

Профиль AB2
ab2 -t30 -c10 -n200000 -l test.ru:81/testTwig.php
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, www.zeustech.net/
Licensed to The Apache Software Foundation, www.apache.org/

Benchmarking test.ru (be patient)
Finished 11407 requests

Server Software: nginx/1.7.9
Server Hostname: test.ru
Server Port: 81

Document Path: /testTwig.php
Document Length: Variable

Concurrency Level: 10
Time taken for tests: 30.003 seconds
Complete requests: 11407
Failed requests: 0
Total transferred: 425183302 bytes
HTML transferred: 423084414 bytes
Requests per second: 380.20 [#/sec] (mean)
Time per request: 26.302 [ms] (mean)
Time per request: 2.630 [ms] (mean, across all concurrent requests)
Transfer rate: 13839.37 [Kbytes/sec] received

Connection Times (ms)
min mean[±sd] median max
Connect: 0 0 0.0 0 0
Processing: 11 26 9.8 22 100
Waiting: 11 26 9.8 22 100
Total: 11 26 9.8 22 100

Percentage of the requests served within a certain time (ms)
50% 22
66% 26
75% 30
80% 33
90% 40
95% 46
98% 55
99% 61
100% 100 (longest request)

код
testTwig.php
<?php
$t = microtime(true);

$records = array ();
for($i = 0; $i < 500; $i ++) {
	$records [] = array ('id' => $i , 'name' => 'Name' , 'value'=>'Value');
}

require_once './Twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem('./TwigTpl');
$twig = new Twig_Environment($loader, array(
		'cache' => './TwigCache',
));

$template = $twig->loadTemplate('index.html');

echo $template->render(array(
	'records'=>$records
));

echo microtime(true) - $t.'.s';

index.html
<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <h1>My Webpage</h1>
        <table>
        {% for item in records %}
            <tr><td>{{ item.id }}</td><td> {{ item.name }} </td> <td> {{ item.value }} </td></tr>
        {% endfor %}
        </table>
    </body>
</html> 




Результаты по количеству обработанных запросов за 30с:

1. Native PHP: 152 586 запросов
2. Phalcone + Volt (152586 — 107060): — 45 526 не успел
3. Twig (152586 — 11407): — 141 179 не успел

Приличные цифры за 30 то секунд.
Всем неверящим предлагаю проверить самостоятельно.

На этом вопрос исчерпан.
Второе был юмор.
Заявлено: «Кто не использует шаблонизатор тот говнокодер» безотносительно задачи. Попытался убедить человека, что не нужно впадать в крайности. Так же было заявлено, что шаблонизатор незначительно влияет на производительнось, потом правда оказалось, что это должен быть особенный «тру» шаблонизатор на С.
Дабы не давать повода для продолжения.40% взялось из нагрузочного тестирования.
И так мы имеем 2 «ТРУ» шаблонизатора для избранных, забываем про шаред хостинги и хостинги с отсутствием прав на установку ПО. Расширения наше все, придется для сайта визитки виртуалку клиенту заказать.

Но вот незадача Blitz не захотел компилироваться по 5.6 64bit с похожей проблемой toster.ru/q/17633
Ну да ничего, можно списать на кривизну рук, головы или ног, ведь чтобы удостоиться права использовать чудо инженерии нужно с бубном немного побегать. Не все так страшно, любитель найдется.

Volt 0.0016 s на одном запуске. Всего на 40% медленнее. Как это мало или много. Я бы не сказал, что незнечительно. Признаю, это не так катастрофично, как с Twig. Псле махинаций с установкой модуля phalcon производительность стенда слегка просела, кстати на эти же 40%. Думаю можно подшаманить, чтобы разница сократилась до 30%, но расширение вносит свой вклад в утяжеление PHP.

Volt идет в поставке Phalcon, тесно связан с ним, использовать отдельно нет смысла, зачем нам загруженный в память Phalcon, легче сразу писать на нем, но это не всегда это приемлемо.

Дьявол кроется в деталях. Открываем кэш шаблона Volt
<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <h1>My Webpage</h1>
        <table>
        <?php foreach ($records as $item) { ?>
            <tr><td><?php echo $item['id']; ?></td><td> <?php echo $item['name']; ?> </td></tr>
        <?php } ?>
        </table>
    </body>
</html> 


Боже мой что это? Адовъ говнокод! :)

Мы гонялись за собственным хвостом, только нам на шею присел сел лишний пассажир который хочет есть и не дает хозяйничать. Спрашивается зачем баласт? Ах да, чтобы верстальщику было удобно, но вот незадача у меня нет верстальщика исключительно под html. Идти нанимать? Скорее всего мне очень повезло повезло, вокруг люди умеют и программировать и верстать, интересуеются, развиваются.

Вот такая вот занимательная история о потерянном времени исполнения.

PS Жаль, ожидал интересной реализации кэширования шаблонов volt.
Ох и точно my Fault.
Значит Twig уже в топке. Сейчас посмотрим blitz

Information

Rating
Does not participate
Location
Россия
Registered
Activity