Pull to refresh
65
0
Алексей Скобкин @skobkin

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

Send message
В Украине такие столы продает компания Homelift. Они так же, как и ergostol, просто перепродают датские рамы conset. Видео сборки столов можно посмотреть тут.
UFO landed and left these words here
Для начала посмотрим пульс пациента — он мертв. Проект активно не поддерживается уже более двух лет.

1) иногда просто так сериализует массив как хэш-мэпу, лечится кастылями в виде листенеров
2) надо замэпить json на существующий объект — лепим object creator
3) inline — работает только в одну сторону, без возможности задать кастомный префикс. бесполезная фича. В принципе очень много фич работающих наполовину.
4) шаг в право/шаг в лево — пишем свои хэндлеры или листенеры, много лишнего кода, не особо прогнозируется необходимость писать этот код. Много рисков.
5) версионизация API? переименовали пропертю? Пишите свои хэндлеры, мэппингами вы это так просто уже не разрулите.
6) в принципе для тупого CRUD сойдет, но чуть сложнее — и все… приплыли к морю кода. Быстрее руками мэппинги сделать.
7) медленно. У меня были проекты где jms serializer занимал 50% времени генерации респонса.

Лучше брать symfony/serializer. Он в этом плане намного более грамотная штука. Позволяет сделать все то же что и jms serializer но намного более грамотно (за счет выделения процесса нормализации и отделения от сериализации).
А куда сеттеры нужно убрать?

Для начала давайте различать сеттеры, которые сгенерированы вашей IDE или симфоневским генератором, и сеттеры которые реально нужны.


Вот вам простой пример. У вас есть требование "пользователь должен иметь возможность сменить пароль" и у вас появляется метод:


function changePassword(string $password, callable $hasher) : void 
{
     $this->password = $hash($password); // мы никогда не забудем захэшировать пароль
}

А если в рамках требований нужно сменить сразу 4 свойства — мы либо делаем метод с 4-мя аргументами, либо, что вероятнее, уберем эти 4 свойства в отдельный объект-значение (гуглить doctrine embeddable), и будем просто заменять оный.


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


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

В большинстве случае entity доктрины генерируются из бд через консоль автоматически

Вот честно за 5 лет ни разу так не делал. Более того, разработчики доктрины не рекомендуют так делать.


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


То есть если мы работаем с доктриной и представляем сущности как тупую проэкцию рядов таблиц на объекты — вам не нужна доктрина. Вам хватит какого-нибудь active record.


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

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

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

тут нет никакого спора. Когда у вас больше действий в контроллере, у вас нет разделения бизнес логики и презентационной логики, и называется это SmartUI. Вполне себе годный вариант для CRUD-а например, и покрывает он подалвяющее большинство проектов. Это не плохо, просто на более сложных проектах с более сложной логикой вы проиграете. В лучшем случае все закончится нарушением DRY. В худшем — связанность системы будет настолько высока, что сопровождать проект будет болью (как для разработчика, так и для бизнеса)


Вы можете выполнять действия в классе Entity или можете вынести эти функции в модель или репозиторий

Просто приведите формулировку термина "модель". Что это у вас? Модель предметной области? Какая-то другая модель?


Здесь скорее вопрос кому как нравится.

Ну да, и принципы всякие вроде SOLID или GRASP придумали от скуки.

Вы понимаете что я могу ответить также что геттеры и сеттеры придумали не от скуки.

Геттеры придумали в java что бы иметь возможность получать состояние. С ними все хорошо поскольку они не мутируют состояние объектов.


Сеттеры придумали потому что нужно было дать возможность извне менять состояние объектов. При этом мы нарушаем инкапсуляцию но это все же лучше чем публичные свойства и никакого контроля.


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

Культ карго. Люди будут делать так как показали вне зависимости от размеров проекта. Без какого либо понимания что они делают и зачем.


А на счет модели я думал вы знает для чего их придумали.

Понимаете ли, это не имеет значения. Меня интересует ваша интерпритация что бы мы говорили на одном языке. Ибо для меня модель — это модель. А сущность — представляет собой модель бизнес объекта, одного. Сервис представляет модель взаимодействия нескольких несвязанных между собой сущностей (ибо если они связаны они сами разберутся).


В doctrine просто работу с данными можно вынести в repository, а так в модели.

Репозитории это вещи, которые отвечают за хранение. В них может находиться бизнес ограничения вроде "можем ли мы ложить туда эту сущность или нет". Но репозитории НЕ мутируют состояние сущностей. Это просто склад. Склад который меняет состояние объектов там хранящихся — плохой склад.

$blog = Blog::fromArray([
    'title' => 'A day in paradise - A day with Symfony2',
    'description' => 'Lorem ipsum dolor sit d us imperdiet justo scelerisque. Nulla consectetur...',
    'image' => FileReference::local('beach.jpg'),
    'tags' => $this->tags(['symfony', 'php', 'paradise', 'symblog']) // получить референсы на тэги например,
]);

$blogRepository->add($blog); // никаких entity manager-ов.

Вообще удивительно что в вашем примере вы не сами вызываете setId. Ну и в целом фикстуры отстой, фабрики фикстур рулят.

Всем привет. Как один из взломанных, хочу сказать следующее:

Во-первых, почитайте наш сайтик http://mts-slil.info/ и посмотрите там документы/скриншоты/аудио. В них всё-всё-всё.

Во-вторых, описанный метод совершенно не наш. Одновременно были взломаны 3 телефона, которые находились в разных частях Москвы. Я так понимаю, для этой атаки надо быть в непосредственной близости к телефону (ну или глушить его). Если не прав — поправьте. И самое главное, при такой атаке МТС не стал бы затирать логи (раньше техподдержка видела отключение услуг, а теперь нет) и публично адски врать.
если (нужна_работа И есть_навыки) {
    иди_в _1С
}
У меня похожая ситуация, надеюсь кто-то подскажет, что нужно делать. Я пишу клиент для одного сайта, разработкой которого занимается знакомый.

Недавно апдейт моего приложения отклонили с размытой формулировкой про нарушение авторских прав. Заполнил анкету, получил ответ что иконка совпадает с иконкой какого-то неизвестного мне сайта. Я, конечно, удивился, но ничего не поделать, разбираться кто первый придумал иконку 2 года назад совершенно не хотелось. Иконку поменял и попытался выложить апдейт, в результате мое приложение удалено из гугл плея со словами "Violation of the impersonation or deceptive behavior provisions of the Content Policy".

Отсюда вопрос, что им ещё могло не понравиться (например, совпадение названия клиента и сайта для которого он пишется) и какие документы им ещё нужно приложить? Максимум, что у меня сейчас есть — скачанная с сайта копия Creative Commons на material icons и устное разрешение автора сайта на использование символики

Пока ничего не предпринимаю, так как не знаю возможную реакцию гугла на повторные запросы аппеляции.
Вопрос цены и качества во все времена был достаточно многогранен. Можно в очередной раз поговорить про технический контроль перед выкладкой каждого шаблона, про пожизненную бесплатную техподдержку, про стоковые фотографии поставляемые с шаблоном, про бесплатные постоянные обновления функционала по некоторым продуктам, про регулярные акции, которые позволяют покупать шаблоны за сопоставимые с нашими коллегами деньги и про многое другое, но мы бы просто хотели предложить Вам вот что. Например, Wordpress темы. Мы отдадим Вам шаблон TemplateMonster и оплатим любую тему из коллекции ThemeForest. Вы разберете их на составляющие части, сравните комплектации продуктов, проведёте тесты и результаты сможете изложить в большой развернутой статье, для всех читателей Хабрахабр. Нам кажется это будет не только жутко интересно, но и максимально честным ответом на вопрос про цену и качество.
Вот пример моего конфига с которым ssllabs.com дает A+
listen                      443 ssl spdy;
ssl                         on;
ssl_protocols               TLSv1.2 TLSv1.1 TLSv1;
ssl_session_cache           shared:SSL:20m;
ssl_session_timeout         10m;
ssl_ciphers                 'EECDH+ECDSA+AESGCM:AES128+EECDH:AES128+EDH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA:!ADH';
ssl_prefer_server_ciphers   on;

resolver                    8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout            10s;
add_header                  X-Frame-Options             "DENY";
add_header                  X-Content-Type-Options      "nosniff";
add_header                  Strict-Transport-Security   "max-age=31536000";
add_header                  Public-Key-Pins 'pin-sha256="[SOME_BASE64]"; max-age=5184000;';  #[SOME_BASE64] надо выставлять свое, гуглить как считать Public-Key-Pins
ssl_stapling            on;
ssl_trusted_certificate /etc/nginx/ssl/[SITE]/trustchain.pem;
ssl_certificate         /etc/nginx/ssl/[SITE]/server.crt;
ssl_certificate_key     /etc/nginx/ssl/[SITE]/server.key;
ssl_dhparam             /etc/nginx/ssl/[SITE]/dh.pem;        #openssl dhparam 2048 -out dh.pem
Каждый программист на javascript должен написать свою реализацию классов. ©

Dojo — dojotoolkit.org/reference-guide/dojo/declare.html#dojo-declare
Sencha (ExtJS) — www.rogerwilco.ru/2011/04/sencha-extjs.html
qooxdoo — qooxdoo.org/documentation/0.7/oo_feature_summary
MooTools — www.phpeveryday.com/articles/MooTools-Basic-Creating-Classes-MooTools-P919.html
Prototype — www.prototypejs.org/learn/class-inheritance
AtomJS — github.com/theshock/atomjs/blob/master/Docs/Class/Class.md
JSClass — jsclass.jcoglan.com/classes.html
code.google.com/p/jsclassextend/
github.com/jcoglan/js.class
Cobra — justin.harmonize.fm/index.php/2009/01/cobra-a-little-javascript-class-library/
github.com/JustinTulloss/cobra
The $class Library- www.uselesspickles.com/class_library/
Classy — classy.pocoo.org/
YUI 3 — www.yuiblog.com/blog/2010/01/06/inheritance-patterns-in-yui-3/
Coffee-Script — jashkenas.github.com/coffee-script/#classes
JavascriptClasses — code.google.com/p/javascript-classes/
AJS — amix.dk/blog/post/19038
jsFace — github.com/tannhu/jsface
JsOOP — jsoop.codeplex.com/
joot — code.google.com/p/joot/wiki/API
oopsjs — code.google.com/p/oopsjs/
Objs — github.com/tekool/objs/wiki
oorja — maxpert.github.com/oorja/
objx — code.google.com/p/objx/wiki/OClass
jsclassextend — code.google.com/p/jsclassextend/
prolificjs — code.google.com/p/prolificjs/wiki/OOP
objectize — code.google.com/p/objectize/

code.google.com/p/core-framework/wiki/Inheritance
code.google.com/p/sfjsoo/
code.google.com/p/jslproject/
code.google.com/p/magic-classes/wiki/MagicClassesOverview

github.com/ded/klass
github.com/jiem/my-class
github.com/kilhage/class.js
github.com/Jakobo/Sslac
github.com/BonsaiDen/neko.js
github.com/finscn/GT-Class
github.com/deadlyicon/klass.js
github.com/neuromantic/CodeJS
github.com/cj/js-oo
github.com/darthapo/klass.js
github.com/nemisj/zet.js
github.com/k33g/species
github.com/benekastah/JS-Class
github.com/tobeytailor/def.js
github.com/rstrobl/squeakyJS
github.com/shinyplasticbag/MojoClass
github.com/firejune/class
github.com/gcoguiec/jquery-class
github.com/daffl/JS.Class
github.com/pavelz/class.js
github.com/zerodogg/jqsimple-class
github.com/bnoguchi/class-js
github.com/arian/Klass
github.com/kuwabarahiroshi/joo
github.com/iamleppert/SimpleClass
github.com/aenoa/Noode.js
github.com/stomlinson/SuperClass
github.com/jzimmek/klazz
github.com/kbjr/class.js
github.com/jhnns/node.class
github.com/borysf/declare/blob/master/declare.js
github.com/ShadowCloud/BF-Class
github.com/pic-o/jsClass
github.com/rosamez/jquery.klass
github.com/yuki-kimoto/javascript-Class_Simple
github.com/yaksnrainbows/jarb
github.com/thirashima/UnderClass
github.com/arahaya/package.js
github.com/arieh/Class.def
github.com/bogdan-dumitru/jsClass
github.com/pomke/pomke.js
github.com/sgolasch/jClassify
github.com/kbjr/Classy
github.com/cthackers/jClass
github.com/davidjbeveridge/Clasico
github.com/edave64/protojazz
github.com/mrac/solid.js
github.com/benekastah/Classy
github.com/damianmr/JSMiniClass
github.com/benekastah/classesWithCash
github.com/dialog/Resig-Class
github.com/mpodriezov/OJS
github.com/dtinth/twcs.js
github.com/percyhanna/js-class
github.com/jalopez/SimpleClassJS
github.com/jhamlet/proteus
github.com/petebrowne/classify
github.com/TdroL/Classy.js
github.com/azendal/neon
github.com/aulizko/Alan-Point-JavaScript-Library/tree/master/src/oop
Основное в конфиге:

shared_buffers — дать половину оперативки. Потюнить в системе файловый кэш, чтобы уменьшить шанс двойного кэширования.
work_mem = 64MB (поставить для начала) и смотреть за созданием temp-файлов. Если они есть — увеличивать
temp_buffers = 32MB
maintenance_work_mem = 2GB
max_stack_depth = 4MB

В системе (FreeBSD):
# /boot/loader.conf:
kern.ipc.semmns=1024
kern.ipc.semmni=256

# /etc/sysctl.conf:
kern.ipc.shm_use_phys=1
kern.ipc.shmall=8605532
kern.ipc.shmmax=35248259072 # если памяти 64 гига и мы хотим половину дать постгресу.

+ пускать всех только через pgbouncer.
— В общем-то, для начала этого хватит чтобы система уже быстро работала на больших объемах данных.
Если будет проседать дисковый i/o, нужно смотреть в сторону:

synchronous_commit = off
checkpoint_timeout
checkpoint_completion_target
(размазываем чекпоинты по времени)
Написал челу правду-матку. Прости Хабр, но я правду написал. Меня зовут Юрий Изотов и я инвалид, разработка — мой единственный хлеб. Без гитхаба я не могу нормально работать и учиться. Этот чел все сотрет конечно но вот скрин. Я его сюда спецом кладу типа не поминайте лихом если что он сделает или что либо еще произойдет. Извиняюсь перед администрацией Хабра за возможно какие-то нарушения но пусть люди знают что программисты говорят в лицо ЭТИМ кто они такие.

image
У меня на 14.04 прекрасно работает вот эта штука в PHPStorm: https://github.com/zheludkovm/LinuxJavaFixes
Раз такое дело и все хотят продолжения, попробую всё расписать по порядку, не забыть бы чего.
Первая моя работа была в лаборатории компьютерной графики. Чтобы попасть туда мне понадобились знания аналитической геометрии, линейной алгебры и математического анализа. Ну и конечно знания 3D pipeline, поскольку пришлось всё визуализировать вручную без помощи Direct3D или OpenGL. Однако попав туда, я очень здорово пролетел, так как отдел переформировали в железячный, мы писали драйвера для протоколов и высокоуровневый функционал для взаимодействия с интерфейсом этих драйверов. Тогда я и познал .NET 1.1 и 2.0 (как только вышел) в деталях, выучил C#, научился маршаллить C/C++ интерфейсы в менеджед библиотеки. Было интересно, но числился я тогда студентом и получал соответственно.
Математическая статистика, теория вероятностей и, главное, численные методы — первая моя серьёзная работа на ныне норвежскую компанию, кроме текучки типа запилить доверительные интервалы при вычислении некоторого прогноза, мне тогда доверили (а зря, студенту-то) оптимизировать расчёт стоимости рекламной компании. Моей задачей была оптимизация функции стоимости рекламы в N-мерном пространстве, где каждое измерение — стоимость по определённому рекламному носителю по заданной целевой аудитории. В ряде случаев получалась дробно-рациональная функция от N переменных и кроме как численными методами оптимизации такое не решается. В университете ЧМ были моим коньком, вместе со знанием 3D я рисовал решения университетских задач, визуализируя решения в 3D по времени в виде анимации. Столкнувшись с реальными проблемами при решении реальной задачи: сложная область определения, поиск решения на границе, множественный поиск и параллельные вычисления (из-за попадания в локальные минимумы) я понял КАК МАЛО Я ЗНАЮ после первых 4-х курсов и то, что университетские задачки дают общее представление о том как решать, но в жизни всё намного сложнее. Оптимизатор получился довольно неплохой, но предыдущая реализация была лучше, поэтому мою работу тогда забраковали. Опыт был горький, но весьма полезный, я усвоил не только ряд новых методов, но и то, что не стоит бросаться и бить себя пяткой в грудь «да я смогу!» если ты вчерашний студент и не понимаешь мастерства коллеги, который убил кучу времени на предыдущую реализацию, на её оптимизацию, он работал с этим продуктом в этой компании много лет и наверняка у него были причины гордиться своей работой.
Следующая работа была с CAD-системой, в 3D с геометрией, линейной алгеброй, немного дифурами и матанищем, по сути всё сводилось к движению резца по кромке детали, в результате резец что-то вырезал, не ломался и изготавливалась некоторая заготовка на автоматизированном станке. Работа была интересная, в 3D как и мечталось, но начисто убивало всё желание копание в багах старших коллег, которые скидывали все задания «найди утечку» и «найди выход за границы массива» в наш местный филиал. В результате было минимум геометрии и максимум шаманства с помечанием памяти.
Позже пригодилась даже физика, переменный ток с напряжением нужно было визуализировать. Здесь геометрия была уже двумерной, и оттачивалось мастерство моё как разработчика, ибо прошивка кастомного устройства замера элекроэнергии должно было крайне экономно расходовать любые ресурсы. Зато на стороне PC-интерфейса можно было разгуляться. Был даже проект с обёрткой C API нашей обёртки в C# .NET для отображения, благо опыт уже был.
На облачную платформу, где я сейчас работаю, пригласили внезапно. Компания лидер в нашем городе, решения интересные, то чем я занимаюсь активно оперирует мат.статистикой, сильно завязана на взаимодействие между C++ и Python (собственно я автор этой связки), ядро написано на C++, всё проходит через него. Геометрии и 3D минимум, однако зачастую требуются самые разнообразные знания, поскольку роль у меня сейчас руководящая и спектр задач довольно широк. Здесь лучше бы знать абсолютно всё, включая весь курс математики, не говоря уже о целом спектре технологий, которые я просто физически не успеваю изучить и знакомлюсь с ними разведкой боем, впрочем тут уже появляется чутьё фарватера, а вот с математикой сложнее, её либо знаешь, либо нет.
Docker. Оберните все это в контейнер, неспешно поднимите новый, потушите старый и даунтайм будет минимален.

Information

Rating
Does not participate
Location
Архангельск, Архангельская обл., Россия
Date of birth
Registered
Activity