[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]

 [ Скрыть форму ]
Имя
Не поднимать тред 
Тема
Сообщение
Капча Капча
Пароль
Файл
Вернуться к
  • Публикация сообщения означает согласие с условиями предоставления сервиса
  • В сообщениях можно использовать разметку wakabamark
  • На данной доске отображаются исходные имена файлов!
  • Разрешенные типы файлов: text, video, code, image, pdf, flash, vector, music, archive
  • Тред перестает подниматься после 500 сообщений.
  • Треды с числом ответов более 100 не могут быть удалены.
  • Старые треды перемещаются в архив после 40 страницы.

No.36161 Ответ [Открыть тред]
Файл: 125860969610249.jpg
Jpg, 39.86 KB, 300×100 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
125860969610249.jpg
Доска посвящена созданию программ и всему, что с ним связано. Для обсуждения готовых программ, железа, устройств есть доска >>/lor/

Простые реквесты для ньюфагов >>28288
Помощь начинающим >>44688 (новый)
Оффициальный™ Лунного Сахара тред >>43581

Языки программирования:
Haskell >>35693
Lisp >>29402
Assembler >>32929
C++ >>43511
Java >>46281
C# и .Net >>27510
Perl >>37854
Python >>46029
Доска посвящена созданию программ и всему, что с ним связано. Для обсуждения готовых программ, железа, устройств есть доска >>/lor/

Простые реквесты для ньюфагов >>28288
Помощь начинающим >>44688 (новый)
Оффициальный™ Лунного Сахара тред >>43581

Языки программирования:
Haskell >>35693
Lisp >>29402
Assembler >>32929
C++ >>43511
Java >>46281
C# и .Net >>27510
Perl >>37854
Python >>46029
PHP >>23225
JavaScript >>40541
Pascal/Delphi >>37645

Фреймворки и библиотеки:
Ruby on Rails >>31319
Qt >>31597

Инструменты:
Vim >>33881
Emacs >>36714
Системы контроля версий >>28005

Прочие технологии:
SQL >>29820

Информатика:
Стеганография >>35350

"Кафедра сайтостроя": тред тут в /s >>31137 и тред в /u >>u/104773
Game Development тред тут >>39943 "Кафедра гейм-девелопмента" в /u: >>u/60525
Сообщение слишком длинное. Полная версия. Post was modified last time at 2016-09-25 12:06:13


No.27510 Ответ [Открыть тред]
Файл: 200px-NET_h_rgb_2...
Png, 17.12 KB, 200×49
edit Find source with google Find source with iqdb
200px-NET_h_rgb_2.png
Файл: 371px-C_sharp.svg...
Png, 6.26 KB, 371×254
edit Find source with google Find source with iqdb
371px-C_sharp.svg.png

Здесь будет ветка обсуждения .net и C#.
И сразу вопрос: какой встроенный класс в C# реализует массив с обращением по индексу за О(1), в котором при этом можно было бы добовлять в конец элементы(аналог vector из С++), и какой соответственно реализует связный список с вставкой элемента в середину и начало и удалением элемента за О(1)(аналог list в С++).
427 posts are omitted, из них 62 с файлами. Развернуть тред.
>> No.47607 Ответ
>>47605
Так что ли?
for (int k = 0; k < 4; k++)
{
if (list[i + k][j].Text != String.Empty ||
list[i][j + k].Text != String.Empty ||
list[i + k][j + k].Text != String.Empty ||
list[i + k][j - k].Text != String.Empty)
)
...
}
Хотя не, не так. Анончик, ну помоги, меня уже тошнит целый месяц смотреть на это.
>> No.47608 Ответ
Привет дотнет-анон. Снова я на связи. У меня депрессия. Знаю, что это не /рф, но все же прошу помочь. Ищу работу. Учу С-шарп давно и как мне кажется уже могу быть джуном. Понятное дело, что еще учить и учить. Но трабла в том, что никто даже не приглашает на собеседование. Я уже даже сконцентрировался на ASP core MVC и всем, что с ним связано, но все равно никто не интересуется. Читаю книгу по МВС Фримена, изучал МВС по нескольким видеокурсам. Учил первый ангуляр, сейчас учу второй...
В целом я понимаю в чем причина: я старпочти 30 лет и у меня нет профильного образования.экономист фу бля фу нахуй
Но неужели нет возможности найти хоть и херовенькую работу? Неужели всем нужны студенты с опытом работы, знающие дотнет на зубок?

Скажите хоть что-то хорошее, руки опускаются.
>> No.47609 Ответ
>>47608
upwork.com
>> No.47610 Ответ
>>47607
string ijText = list[i][j].Text;
String.IsNullOrEmpty(ijText);
>>47605
Плохо?
>> No.47611 Ответ
>>47609
Спасиб, анон. Я думал про фриланс, но боюсь что по незнанке быстро испорчу себе репутацию и потом все пропало. Не подскажешь с чего лучше начать и каких глупостей лучше не делать?
>> No.47612 Ответ
>>47611
Заполни профиль - скиллы, био, вся хуйня. Поставь низкий рейт для начала и лезь на нравящиеся проекты, ничего сложного там нет.
>> No.47614 Ответ
Файл: tumblr_inline_mr2ng7x3IR1qz4rgp.gif
Gif, 592.85 KB, 500×281 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
tumblr_inline_mr2ng7x3IR1qz4rgp.gif
Преподаватель тут дал 300 вопросов теории, из них на 16 не могу найти ответы. http://telegra.ph/S-05-21 вот ссылочка

Пример вопроса:
Ключевое слово this
a) Описывает виртуальную функцию
b) Верных ответов нет
c) Требует предварительного объявления
d) Объявляет указатель на базовый класс
e) Не требует объявлений

Анон, пожалуйста, помоги, всего 16 штук. Завтра утром уже сдавать надо экзамен.
>> No.47620 Ответ
>>47614
LOL. Ты хоть что-то учил?
>> No.47623 Ответ
Файл: 577089_original.jpg
Jpg, 282.78 KB, 1500×925 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
577089_original.jpg
Привет, Анон.

Моя задача — сделать программу для общения с железкой через последовательный порт. Платформа — C#, четвертая версия (это постановка задачи, а не прихоть).

Я посылаю сообщения в объект serialPort, у которого есть обработчик события "что-то пришло" и член класса, содержащий число готовых к считыванию байт.

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

Можно было бы сделать это с помощью async и await, но это для чуть более поздних версий дотнета, в четверке их нет.
Что можешь посоветовать?
>> No.47629 Ответ
>>47623
async & await это же вроде всего лишь синтаксический сахар. И без них можна справиться.


No.46762 Ответ [Открыть тред]
Файл: prev1955.jpg
Jpg, 22.66 KB, 590×442 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
prev1955.jpg
Тред помощи начинающим свой долгий и тернистый путь в дебри программирования. А также необузданных оленей, код-мартышек, выбора ЯП и иных платиновых вещей.
Но в первую очередь всё-таки помощи новичкам. Всё, чтобы зашедший сюда в первый раз мог почувствовать себя как дома.
Главное - без фанатизма.

Предыдущий: >>44688
401 posts are omitted, из них 71 с файлами. Развернуть тред.
>> No.47597 Ответ
>>47579
Как выяснилось, терминал, в котором запускается программа использует UTF-8, так что и плюсик мне нужен тоже utf-8. Или терминал, умеющий в ASCII. Как я понимаю.

>>47595
Ясно.

Решение с массивами, похоже мне тоже не пожходит. Видимо, предется использовать int для храненния данных, а при выводе ему сопоставлять символы как строки.
>> No.47598 Ответ
>>47597
ASCII - подмножество UTF-8 для обратной совместимости.
>> No.47599 Ответ
>>47598
Действительно. Очепятолся, когда проверял, по этому вывелось не то.
>> No.47615 Ответ
А C есть динамические массивы указателей? Ведь для них мне нужен malloc(sizeof(указатель)). И я не понимаю, как это сделать.
>> No.47619 Ответ
дабля

>>47615
Для этого существуют указатели на указатели (и указатели на указател на указатели и т.д). У тебя должно быть что-то вроде:
int **ptrArr = NULL; // указатель на указатели
If(!(ptrArr = (int звездочказвездочка)malloc(sizeof(intзвездочка)звездочкаPTR_AMOUNT)))
actionsiferror();
Поздравляю, получился двумерный массив с элементами типа int.
>> No.47621 Ответ
>>47619
Двухмерный массив можно и иначе сделать, двойной указатель необязателен
>> No.47622 Ответ
Файл: 14703377321350.jpg
Jpg, 71.86 KB, 720×975 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
14703377321350.jpg
Что нужно знать джуниару быдлокодеру? Может есть полезные книжки? Являюсь первокурсотой, скоро лето, вероятно появится время на совершенствование своих скиллов хакермена.
>> No.47624 Ответ
Нужно заполнить массив 8х8 нулями и единицами так, чтобы нулей было ровно в 2 раза больше. Подскажите алгоритм, язык неважен (C#, C++, Pascal)...
>> No.47625 Ответ
>>47624
Количество ячеек должно делиться на 3, а оно не делится. Заполнить 8х8 ячеек так нельзя.
>> No.47627 Ответ
Файл: Clipboard01.png
Png, 10.14 KB, 719×214 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Clipboard01.png
>>47624
Да бля!..


No.29402 Ответ [Открыть тред]
Файл: serial_experiments_lain-14377.jpg
Jpg, 405.57 KB, 1600×1200 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
serial_experiments_lain-14377.jpg
Был удивлён, пролистав за десяток страниц, и не найдя здесь подобного трэда.
Решил начать учить язык богов. С чего начать - книги и мануалы, теория и практика (желательно на русском), в чём лучше писать (под винду и под никсы), советы, распространённые ошибки, всё сюда. Лисп-нить иди.
269 posts are omitted, из них 45 с файлами. Развернуть тред.
>> No.46071 Ответ
>>46021
#lisp на FreeNode.
>> No.46083 Ответ
>>46045
Что на счёт clojure?
>> No.46100 Ответ
>>46071
Спасибо, доброанон
>>46045
Было про кложуру. Это не лисп, это что-то другое
>> No.46101 Ответ
>>46100
Это диалект лиспа.
>> No.46102 Ответ
>>46101
Н-но кложура используется грязными веб-макаками, это никак не может быть что-то близкое к божественному лиспу!!
>> No.46527 Ответ
Файл: 1475686838161.png
Png, 2.06 KB, 300×20 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1475686838161.png
>>46102
Если человек решился писать на кложуре, да еще и сам, особенно в вебе, то это значит что человек стремится к просветлению.
>> No.47537 Ответ
Есть ли в Racket аналоги функций ord и chr (получить код символа, получить символ по коду)?
>> No.47555 Ответ
>> No.47602 Ответ
Доброаноны, почему кложура считается диалектом лиспа?
Только из-за синтаксиса завязанного на скобочки?
Ну так у той же жабы синтаксис завязан на фигурные скобочки и точки с запятой, прямо как у си. Но никто же не говорит, что жаба -- диалект сей.
>> No.47613 Ответ
>>47602
http://alexott.net/ru/clojure/clojure-intro/#sec2

> От Lisp'а Clojure "унаследовал" макросы, мультиметоды и интерактивный стиль разработки, а JVM дает переносимость и доступ к большому набору библиотек, созданных для этой платформы.

И далее отличия: http://alexott.net/ru/clojure/clojure-intro/#sec3

> Только из-за синтаксиса завязанного на скобочки?
Я бы не назвал кложуру лисподиалектом. По синтаксису ЯП оценивет совсем зелень, про скобочки — толстозелень.


No.43511 Ответ [Открыть тред]
Файл: 599716131.png
Png, 77.78 KB, 317×372 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
599716131.png
Предыдущий тред: >>39226
263 posts are omitted, из них 13 с файлами. Развернуть тред.
>> No.47288 Ответ
>>47287
Так оператор "new", он же просто-напросто вызывает функцию "malloc()", и только-то.
А в ней не предусмотрено хранение длины (прав доступа и других полезных данных), т.е. в этой части C++ всё как в 60-70 годы.
>> No.47290 Ответ
>>47288
> и только-то
И вызывает конструктор.
>> No.47291 Ответ
>>47285
> У меня задача из разряда числодробилок. Вектор будет работать чуть-чуть, но медленнее.
Не будет.
"Преждевременная оптимизация - корень всех зол".
Сперва воспользуйся профайлером, потом оптимизируй.

> Как лучше всего создать динамический трёхмерный массив?
Как динамический одномерный.
>> No.47301 Ответ
>>47291
> Как динамический одномерный.
Но тогда при доступе к каждому элементу будет выполняться две операции целочисленного умножения и ещё минимум 2 операции сложения. Не слишком ли высоки издержки?
>> No.47302 Ответ
>>47301
> Не слишком ли высоки издержки?
Чтобы узнать, высоки издержки или нет, ты должен использовать "профайлер" (profiler) - инструмент, который определяет, сколько именно времени твоя программа тратит на вычисление каждой конкретной функции. Если профайлер покажет тебе, что на функцию доступа к трехмерному массиву программа затрачиват 50% времени от всего времени своей работы (или даже 10%) - тогда, конечно, эти издержки высоки и хранение массива нужно будет оптимизировать.
На практике, даже в совершенно числодробильных задачах доступ к массиву будет занимать ничтожную долю времени (<<1%). Поэтому можно уверенно считать, что издержки пренебрежимо малы, до тех пор, пока не доказано обратное.
>> No.47303 Ответ
>>47301
Нет, эти издержки настолько малы, что на современных архитектурах процессоров они даже могут вообще не появиться из-за тонкостей работы кешей и конвееров. Попытка подрезать пару таких операций тут и там вообще не гарантирует хоть какого-то даже очень малого ускорения, может даже стать рандомно медленнее. Это всё работает гораздо сложнее чем просто "послдовательность операций, каждая из которых ест сколько-то времени"
>> No.47434 Ответ
>> No.47569 Ответ
суп анон , у меня проблемка с stdin, пытаюсь читать из него при помощи fread из потока читается только когда наберается количество запрашивамых байт, после чего запрашиваю еще в цикле , опять же freadом , вопрос, как определить конец ввода в потоке, есть ли у него какой буфер?
>> No.47601 Ответ
>>47569
http://cppstudio.com/post/1641/

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

P.S. Всегда твой анонимус.
>> No.47606 Ответ
Создаю объект:
angle = new ModelAngle();
fprintf(stderr, "angle = %X\n", angle);

В его конструкторе:
ModelAngle::ModelAngle()
{
fprintf(stderr, "ModelAngle = %X\n", this);
}

И что ж я вижу?
ModelAngle = 1F31160
angle = 1F31180

Ну и при удалении:
Создаю объект:
angle = new ModelAngle();
fprintf(stderr, "angle = %X\n", angle);

В его конструкторе:
ModelAngle::ModelAngle()
{
fprintf(stderr, "ModelAngle = %X\n", this);
}

И что ж я вижу?
ModelAngle = 1F31160
angle = 1F31180

Ну и при удалении:
Error in `./a.out': double free or corruption (out): 0x0000000001f31180

Почему адреса не совпадают?
Сообщение слишком длинное. Полная версия.


No.45655 Ответ [Открыть тред]
Файл: 55d9d2d94e26ed284c66e048c455590f.jpeg
Jpeg, 39.99 KB, 600×427 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
55d9d2d94e26ed284c66e048c455590f.jpeg
Чем больше я работаю кодером, тем больше меня всё разочаровывает. Я наплакал небольшое полотно, пусть тут повисит, короче.

Все IT-спциальности по факту целиком состоят из дилетантов в том смысле, что образование их не готовит. Судя по всему, ни у нас, ни там. Программистов не учат в универе приёмам, которые они потом используют. У самих приёмов и технологий нет необходимых доказательств или даже исследований, доказывающих, что они действительно что-то делают. Нет доказательств, что, скажем, ООП работает. Всё сводится к тому, что все кодеры входят в какие-то секты, основанные на вере и личных переживаниях. Программисты не доучивают ничего до какого-либо логического конца, будь то теория графов, ООП или MySql, и постоянно сталкиваются с задачами, решать которые тупо не готовы по знаниям или навыкам.
Все программы не дописаны полностью, баги никогда не правятся полностью, многие программы работают медленно из-за плохой оптимизации. Программисты рекламируют своим заказчикам, что те потом смогут всё в программе поменять, а когда доходит до дела, то уже поменять что-либо оказывается невозможно. Многие вещи делаются хуже и медленнее, чем можно было, потому что так это смогут доделывать более глупые и дешёвые кодеры, которым можно меньше знать и уметь. Во многих случаях производительность труда из-за этого меньше, чем могла быть.
А ещё все трубят, что кодеров много как собак нерезаных, и это уже не пристижно нифига. А когда открывают вакансию, то оказывается, что на самом деле никого нет, и заполнять её некому, потом набирают кого попало.
Чем больше я работаю кодером, тем больше меня всё разочаровывает. Я наплакал небольшое полотно, пусть тут повисит, короче.

Все IT-спциальности по факту целиком состоят из дилетантов в том смысле, что образование их не готовит. Судя по всему, ни у нас, ни там. Программистов не учат в универе приёмам, которые они потом используют. У самих приёмов и технологий нет необходимых доказательств или даже исследований, доказывающих, что они действительно что-то делают. Нет доказательств, что, скажем, ООП работает. Всё сводится к тому, что все кодеры входят в какие-то секты, основанные на вере и личных переживаниях. Программисты не доучивают ничего до какого-либо логического конца, будь то теория графов, ООП или MySql, и постоянно сталкиваются с задачами, решать которые тупо не готовы по знаниям или навыкам.
Все программы не дописаны полностью, баги никогда не правятся полностью, многие программы работают медленно из-за плохой оптимизации. Программисты рекламируют своим заказчикам, что те потом смогут всё в программе поменять, а когда доходит до дела, то уже поменять что-либо оказывается невозможно. Многие вещи делаются хуже и медленнее, чем можно было, потому что так это смогут доделывать более глупые и дешёвые кодеры, которым можно меньше знать и уметь. Во многих случаях производительность труда из-за этого меньше, чем могла быть.
А ещё все трубят, что кодеров много как собак нерезаных, и это уже не пристижно нифига. А когда открывают вакансию, то оказывается, что на самом деле никого нет, и заполнять её некому, потом набирают кого попало.
Баги в программах имеют много уровней - баги созданные самим разрабами, баги в использованных либах, баги в либах, которые используются в либах. Ничего невозможно написать без либ, а следовательно - без багов. Как бы хорошо ты ни писал, как минимум баги либ всегда есть. Ты находишь и намереваешься написать репорт, чтобы узнать, что баг уже известен, и вот уже 10 лет его не исправляют, так как он совсем минорный, хоть и баг. Воркэраунд заставляет написать в 100 раз больше кода и вот ты уже не укладываешься в сроки. Платная поддержка нужна, чтобы узнать из первых рук, что так задумано, или оно так не поддерживает.
Часто программисты используют либы, которые они в принципе не знают, как работают, так как документация недописана или не написана вообще, если на инглише есть, это ещё хорошо, а уж кодеры, не знающие инглиш, - так вообще - часто рыщут в потёмках.
Разрабы говорят заказчикам, что они всегда могут обновляться, и всё должно работать, и очередной апдейт снова и снова привносит баг, и функциональности отваливаются, а бизнес иногда простаивает. Пользователи активно вовлекаются в процесс тестирования, и каждый релиз идёт со вздрагиванием, и все сразу знают, что что-то сломается.
Все постоянно думают, что они смогут один раз быстро написать программу, и потом её не менять, а потом годами меняют её снова и снова, и каждый раз удивляются.
Сообщение слишком длинное. Полная версия. 38 posts are omitted, из них 8 с файлами. Развернуть тред.
>> No.46219 Ответ
>>46206
> > Ведь именно труд сделал из обезьяны человека.
Да. Чужой.
Когда одна обезьяна заставила работать двадцать других - тогда и получился человек
>> No.46223 Ответ
>>46219
> Когда одна обезьяна заставила работать двадцать других - тогда и получился человек
Заставление работать одних на благо других не человечество изобрело. Другое дело, что это позволило освободить ресурсы для "творческого" труда.
>> No.46866 Ответ
>>46208
Доброчую. К ОП-посту можно добавить негодование на тему культуры: иногда кажется, будто части программистов просто безразличен результат их работы, а другая часть слишком уж склонна к малосодержательным спорам, ругани, максимализму, и т.п.

c:очистите наверху
c2:прочихежовыхтепловойтройкусударь
>> No.46868 Ответ
>>46866
с: начинки доставило
> негодование на тему культуры
Я вот негодую, что многие работают чтобы заработать деньги, даже "художники" (которые artist, а не которые рисуют). Из-за этого все получается либо неочень, либо плохо, но пипл кривя рожей хавает, а значит есть на что жить и можно продолжать работать. Нет, я не за то чтобы работать "за идею" или устраивать пятилетки за три года. Или другая крайность, я не против "макаки"-программиста, который по четкому ТЗ что-то там кодит, думается такие тоже нужны.
Но должен же быть какой-то нижний порог у качества проектов. Или ответсвенное лицо, которое может отвественно заявить что вместо продукта выходит кал, ну, или в лучшем случае что-то невнятное. Но зачем, если можно выпустить сейчас, собрать бабла, а там уже дальше разбираться. Ну или еще чаще не разбираться, потому что проект кал, и как туда шоколадки не тыкай, онг останется калом.
> части программистов просто безразличен результат их работы
Не то чтобы это что-то само по себе что-то плохое, плохо когда это единственный программист.
>> No.46869 Ответ
>>46868
Мне очень не нравится идея, что нельзя ради денег работать. Вот несколько причин, почему это нормально:
1) Ответственность. Я как взрослый человек не имею морального права говорить, что работаю только за идею, и сидеть в безденежье. Особенно я не имею права выбирать безденежье и при этом ныть, что кто-то ещё мне должен был дать больше денег. Особенно, если у меня есть, кого кормить. Отсутствие денег может быть проблемой. Ты даже можешь умереть или утратить здоровье. А кто в твоей жизни несёт ответственность за твои проблемы, когда ты уже взрослый и родителей больше нет, а государство и друзья никогда тебе их не заменят?
2) Уважение к труду тех, от кого ты зависишь. Что с теми, кто работает в поле на тракторе? Они должны на тракторе пахать только за идею? Разве помидоры выращивают не ради самих помидоров? Помидоры ради помидоров, а программы для программ, материальное к материальному - это самый естественный ход вещей. Или нужно сажать помидоры и получать от этого оргазм? Считать, что это не люди, а быдло, означает быть неблагодарными свиньями под дубом. Может тогда всем пойти в музыканты, художники и программисты?
>>46868
Мне очень не нравится идея, что нельзя ради денег работать. Вот несколько причин, почему это нормально:
1) Ответственность. Я как взрослый человек не имею морального права говорить, что работаю только за идею, и сидеть в безденежье. Особенно я не имею права выбирать безденежье и при этом ныть, что кто-то ещё мне должен был дать больше денег. Особенно, если у меня есть, кого кормить. Отсутствие денег может быть проблемой. Ты даже можешь умереть или утратить здоровье. А кто в твоей жизни несёт ответственность за твои проблемы, когда ты уже взрослый и родителей больше нет, а государство и друзья никогда тебе их не заменят?
2) Уважение к труду тех, от кого ты зависишь. Что с теми, кто работает в поле на тракторе? Они должны на тракторе пахать только за идею? Разве помидоры выращивают не ради самих помидоров? Помидоры ради помидоров, а программы для программ, материальное к материальному - это самый естественный ход вещей. Или нужно сажать помидоры и получать от этого оргазм? Считать, что это не люди, а быдло, означает быть неблагодарными свиньями под дубом. Может тогда всем пойти в музыканты, художники и программисты?
3) Я не вижу причин, почему деньги должны расходиться с другими целями. Не делать плохо - это элементарная этика. Ты считаешь, что желание денег автоматически меня преступником делает? Это из того же разряда, что и говорить, что секс - это плохо. Это просто ханжество. Все хотят, зато некоторые строят из этого дьявола. Может, вообще тогда ну её эти физическую реальность? Там всё вот так, все желанные вещи обрастают сложностями и этическими проблемами? Застрять в аниме, играх и интернете то поди лучше было бы.
4) Не будешь денег требовать, и не будешь за ними охотиться, так тебе и не дадут их. Зар. плату всем дают минимальную из той, на которую всё ещё согласны выполнять удовлетворительную работу. Если все побегут не ради денег работать, так тут же и зарплаты им всем опустят. Будем вровень с учителями и врачами идти. И будем всё время ныть.
5) Я видел людей, работающих за идею и делающих отвратительные программы. Их очень много. Их энтузиазм им вообще ничего не даёт. Более того, со своими безумными идеями они утрачивают критерии качества программ и утрачивают вообще связь с реальностью и пользователями. Они фанатично следуют своим обсессиям и всё вокруг игнорируют. Они прямо вымораживают просто. Из-за них я вообще стал очень подозрительно относиться к людям, которые работают на "интересных работах, которым это реально интересно", хуё моё. "Линукс лучше чем ваш мелкософт! Почему Потому что иди нахуй, вот почему! Ебал я твои доводы про реестры и процессы, кому это надо." Господи, даже Торвальдс не ведёт себя так.

Я свою работу всегда стараюсь нормально делать, и навыки обновляю периодически. Даже могу во всякую там теорию графов и т.п. понемногу. А мог бы пойти в учителя или врачи или художники. Да, я пошёл сюда, так как здесь высокие зар. платы и много вакансий. Работа насколько-то интересная, но не более того. В детстве всё это было более или менее интересно, компуктер, то сё, сейчас уже так, кажется ерундой какой-то.
Сообщение слишком длинное. Полная версия.
>> No.46914 Ответ
>>45655
ОП, предлагаю тебе взаимовыгодное сотрудничество: ты мне - трудоустройство в хохляндии в сфере микроэлектроники с зарплатой хотя бы в половину аутсорсинговой , а я не иду отправлять своим дилетантизмом сферу Айти.
>> No.46916 Ответ
>>46868
> "макаки"-программиста, который по четкому ТЗ что-то там кодит
В смысле? Ты один из этих долбоёбов, который считает, что ТЗ не нужно или что ты имеешь в виду?
>> No.46944 Ответ
>>46869
> Мне очень не нравится идея, что нельзя ради денег работать
я не уверен насколько ты меня понял, но я абсолютно против идеи, чтобы работать бесплатно. Человек трудится, а следовательно должен получать за это профит. Иначе это либо рабский труд, либо хобби, где первое как правило нееффективно, а второе имеет мало общего с интересами социума.
Речь шла о "только срубить денег". Безотносительно качества работы, если ее вообще планировалось делать.
>>46916
Скорее отношение RAW/RAI - правила как написано/правила как подразумевалось. Тут конечно есть простор для противоречий. Потому что с одной стороны написано что от тебя хотят, С другой стороны это не всегда совпадает с тем что на самом деле хотят и просто здравым смыслом. (В идеальном мире это конечно должно все остаться на этапе согласования ТЗ.)
>> No.47117 Ответ
>>46868
> Я вот негодую, что многие работают чтобы заработать деньги,
Ну анон, дай нам квартиры бесплатно, дай нам кушать. Или дай нам basic income. Но ты же не даёшь этого?

Как можно от бедных людей, загнанных в тиски финансовой зависимости требовать чтобы они работали с душой, "не за деньги" ?

Ты случаем не менеджер ?
>> No.47570 Ответ
>>46914
Предложение неактуально, я вошел вайти. А что делать, если на каждое резюме без релевантного опыта в айти приглашали на собеседования, а по специальности - даже не откликались, хотя опыт есть? Буду на месте всему учиться, как и вся команда до меня.


No.46029 Ответ [Открыть тред]
Файл: pylogo0.png
Png, 126.61 KB, 800×642 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
pylogo0.png
Предыдущий >>37139 ушёл в бамплимит.

Краткая справка для новичков:
Официальный сайт: http://python.org/
Документация по стандартной библиотеке и разнообразные Tips & Tricks: http://docs.python.org/
неСвежая тема для священной войны, или руководство по выбору между версиями: http://wiki.python.org/moin/Python2orPython3
Ссылка для вопящих про дикие тормоза: http://speed.pypy.org/
Python для микроконтроллеров http://micropython.org или http://www.github.com/micropython
157 posts are omitted, из них 17 с файлами. Развернуть тред.
>> No.47509 Ответ
>>47504
> ПРОТИВОЕСТЕСТВЕННО ПЛОДИТЬ ЛИШНИЕ СТРОКИ
Потому что ты нуб в программировании. Строки плодят по куче разных причин, это улучшает кучу разных вещей иногда. И иногда не только читаемость.
> УСЛОЖНЯЕТ ПРОСМОТР
Потому что ты нихрена не умеешь дробить на подпрограммы.

Эти чёртовы универские лабы не учат писать код, а только портят кодеров. Студент пишет код, получает зачёт и тут же его удаляет. И всегда код пишется на 20 минут, в сто строк от силы. И всегда - водиночку. При этом преподы сподвигают всё оптимиировать, не обращая внимание на реальный прирост производительности, который никто не измеряет. В результате все навыки, которые студент приобрёл оптимизированны под эти условия. А на работе толпа кодеров годами пишут одну единственную программу. Условия задачи меняются каждый день, руководители не могут написать одно тех. задание, и не менять его. Сотни тысяч строк кода. Кодеры увольняются, иногда умирают, приходят новые, а программа продолжает варится. Программа постоянно ломается и её надо чинить. Инструкции и документации часто недописаны, и код становится единственной надёжной документацией. Вот почему вообще весь процесс кодинга абсолютно иной.
>> No.47527 Ответ
>>47509
Синтактическая простота и стилевая строгость для языков с порогом вхождения обезьяны - это полезно в том числе для новичков, а также тех, кому от всего программирования нужно на уровне "наскриптить какой-нибудь автоматизации у себя на компе". Проще гуглить примеры, меньше выстрелов в ногу.
>> No.47529 Ответ
Файл: 129421743_6020657_python.png
Png, 99.60 KB, 554×261 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
129421743_6020657_python.png
>>47509
> нуб в программировании
Это да.
Хорошо, я всё переосмыслил и многое понял. Скорее всего, эта любовь к длинным строкам у меня от... Паскаля. (Нет, не Блеза, я не его потомок.) Помните этот синий экран жизни и меню, где можно выбирать количество строк, отображаемое на экране (больше строк ниже символы, ну вы вспомнели). Я старался писать длинные строки, не плодить лишних строк, чтобы потом всё не прокручивать с помощью Ctrl+Z и Ctrl+W. Да, это всё оттуда. И блоки подпрограмм я не обособлял пустыми строками, нет, Лэйн упаси!
>>47527
> с порогом вхождения обезьяны
Ясно.

Спасибо всем анакондам за ответы. Я больше не буду извергать потоки ненависти на Питон, да и раньше не извергал, а то была просто минутка ярости, вот и всё. Мне, в принципе, теперь всё равно, строки так строки, пробелы так пробелы, я же буддист.
>> No.47530 Ответ
>>47529
В пиздоне строки не экономят. А педиков, которые делают мудрёные однострочники, вообще не уважают во дворе. Но и каждый слой вызовов функций по строчкам не разбивают, запоминая промежуточные результаты в переменных. Это тоже снижает читаемость. Надо короче соблюдать такой баланс. Основной принцип - чтобы лучше читалось. Критерий тут - это когда через полгода перечитываешь свой говнокод и критически оцениваешь свои жалкие потуги делать его читаемым. От чего-то отказываешься, что-то наматываешь на ус.
>> No.47531 Ответ
>>47529
С импортами всё там, конечно не так однозначно, но в любом случае просто не надо особо строки экономить лишний раз.
>> No.47557 Ответ
>>47530
Ссаный awk уделает твой бидон однострочником, что уж говорить о Короле да, ты понял о чем речь.
>> No.47561 Ответ
>>47557
В красном углу awk. В синем углу пусто, т. к. никто не пришёл. Победа красных!
>> No.47562 Ответ
Файл: awk4.gif
Gif, 20.45 KB, 146×223
edit Find source with google Find source with iqdb
awk4.gif
Файл: 14646044717100.jpg
Jpg, 241.53 KB, 1000×1000
edit Find source with google Find source with iqdb
14646044717100.jpg

>>47561
Ты посмотри, что он может. Сорок лет костылю, а он решит все те же задачи без всяких модников.
Это как вим, но может и круче. Смотри какая книжка из 80-х. Как советская фантастика, только ссаного космонавта на обложке не хватает. Ещё твой прадед мог её читать и что-то там костылить на awk! Поищи где-то на книжной полке.
>> No.47563 Ответ
>>47562
Кое-кто на нём авиасимулятор написал, по его словам.
>> No.47565 Ответ
https://transcrypt.org/examples#pong_demo

Нашёл Понг, выдающий 2 FPS на моём планшете.


No.47480 Ответ [Открыть тред]
Файл: image-42.jpg
Jpg, 260.05 KB, 811×811 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
image-42.jpg
https://professorrating.org/professor.php?id=15707 скажем, я хочу завалить лайками этого преподавателя. Сайт учитывает лайки, если они с разных айпи поставлены, просто беру Hoxx VPN, и по списку подключаюсь к разным проксям, а потом по-новой. Прокатывает. Руками все делать не хочется, но я не программист. Поэтому прошу вас помочь, анончики.
>> No.47485 Ответ
>>47480
На сосаче такими вещами занимаются, у них спроси.


No.39943 Ответ [Открыть тред]
Файл: Izumi_Konata__DotAku_by_kssael.png
Png, 1539.48 KB, 800×792 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Izumi_Konata__DotAku_by_kssael.png
В этом ИТТ треде я буду собирать различные ссылочки по игрострою.
Любой мимокрок может присоединиться и подискутировать на тему разработок игор.
Кстати некто в /b/ уже предлагал всем Доброчаном игру запилить.

Итак
http://habrahabr.ru/post/153933/ Инструкция начинающего разработчика игр
http://habrahabr.ru/post/160547/ Как начать писать игры
http://live13.livejournal.com/462582.html Шаблоны игрового программирования. Перевод http://gameprogrammingpatterns.com/
http://game-icons.net/ няшные иконочки
http://www.roguebasin.com/index.php?title=Main_Page RogueBasin
http://habrahabr.ru/company/mailru/blog/195438/ Проектирование интерфейсов в MMORPG Skyforge
http://habrahabr.ru/company/mailru/blog/182088/ Базы данных в онлайн-играх. От Аллодов Онлайн до Skyforge
http://habrahabr.ru/post/164175/ Технология быстрого создания фонов для 2D-игр на базе 3D-заготовок (48 часов разработки)
http://habrahabr.ru/post/201680/ Автоматический генератор квестов
http://habrahabr.ru/post/111538/ Алгоритм «diamond-square» для построения фрактальных ландшафтов
В этом ИТТ треде я буду собирать различные ссылочки по игрострою.
Любой мимокрок может присоединиться и подискутировать на тему разработок игор.
Кстати некто в /b/ уже предлагал всем Доброчаном игру запилить.

Итак
http://habrahabr.ru/post/153933/ Инструкция начинающего разработчика игр
http://habrahabr.ru/post/160547/ Как начать писать игры
http://live13.livejournal.com/462582.html Шаблоны игрового программирования. Перевод http://gameprogrammingpatterns.com/
http://game-icons.net/ няшные иконочки
http://www.roguebasin.com/index.php?title=Main_Page RogueBasin
http://habrahabr.ru/company/mailru/blog/195438/ Проектирование интерфейсов в MMORPG Skyforge
http://habrahabr.ru/company/mailru/blog/182088/ Базы данных в онлайн-играх. От Аллодов Онлайн до Skyforge
http://habrahabr.ru/post/164175/ Технология быстрого создания фонов для 2D-игр на базе 3D-заготовок (48 часов разработки)
http://habrahabr.ru/post/201680/ Автоматический генератор квестов
http://habrahabr.ru/post/111538/ Алгоритм «diamond-square» для построения фрактальных ландшафтов
http://habrahabr.ru/post/232223/ Полезные ресурсы для гейм-дизайнера
http://habrahabr.ru/post/117420/ Текстурирование спрайтов с помощью (dis)placement map
http://habrahabr.ru/post/218401/ Инструментарий гейм-мастера
http://habrahabr.ru/post/154305/ Необходимые ресурсы для геймдизайнеров
http://habrahabr.ru/post/88161/ 5 способов, которыми игры пытаются вызвать зависимость
http://habrahabr.ru/post/199404/ Свен Винке о том, что же важней всего в RPG
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking Source Multiplayer Networking - Valve Developer Community
Ещё в /u/ валялась кафедра геймдизайна.
Сообщение слишком длинное. Полная версия. 184 posts are omitted, из них 62 с файлами. Развернуть тред.
>> No.42821 Ответ
>>42820
Да, но, теперь, когда я об этом вспомнил, флеш чёрта с два запустишь на мобильнике. было вроде много нарекламировано фреймворков и шайтан-компиляторов, которые могли генерить какой-то код под флеш, браузер и/или мобильник. Что-то из этого преуспело вообще? Или в любом случае, игру, запускаемую под браузер и под мобильник придётся писать дважды? Хотя что за игра это будет, чтобы в неё с ручного тач-экрана и настольника с мышью, клавой и монитором играть то. Об этом я думал меньше всего
>> No.42822 Ответ
>>42814
> Это задача, а не протокол.
Это инструмент. Задача это что-то типа такого: надо синхронить позиции объектов меж клиентов и чтоб лагов поменьше было, да быстро запилить.
> Вопрос, как сделать, чтобы можно было слать клиенту данные без подтверждений от клиента?
Т.е. тебя устраивает, что ты потерял по дороге инфу о том, что пользователь нажал кнопку "убить всех"? Или ты городишь свой TCP поверх UDP. Зачем делать то, что и так умеет TCP? А с WebSocket мне даже пингование клиента реализовывать не требуется. Я туды сюды шлю байтики или текст и мне больше не требуется ничего пилить. Не требуется знать, как оно шлётся. Требуется только разобраться, что надо слать туды сюды. А когда впилят наконец долгожданный HTTP2, то вообще збс будет.
>>42815
> > Алсо без TCP/IP и на флеше не обойтись.
> Вай, зачем обманываешь? RTMFP работает через UDP же.
Без TCP обойтись можно. Без TCP/IP нельзя. Даже если это нативное приложение. Вот выходишь за пределы пеки и сетевых карт, тогда да можешь и без TCP/IP. ruwiki://IP лол.
>>42816
Да, но зачем?
>>42820
> В качестве аргумента против передачи пакетов данных без подтверждения
Аргумент в пользу WebSocket - меньше кода придётся пилить дополнительно. А значит меньше отлаживать. А значит меньше багов. А значит проще сопровождать код. А значит быстрее.

Впрочем вот это специально джля вас готовят http://www.w3.org/2012/sysapps/tcp-udp-sockets/ А ещё при большом желании можно через WebRTC пилить.
>>42814
> Это задача, а не протокол.
Это инструмент. Задача это что-то типа такого: надо синхронить позиции объектов меж клиентов и чтоб лагов поменьше было, да быстро запилить.
> Вопрос, как сделать, чтобы можно было слать клиенту данные без подтверждений от клиента?
Т.е. тебя устраивает, что ты потерял по дороге инфу о том, что пользователь нажал кнопку "убить всех"? Или ты городишь свой TCP поверх UDP. Зачем делать то, что и так умеет TCP? А с WebSocket мне даже пингование клиента реализовывать не требуется. Я туды сюды шлю байтики или текст и мне больше не требуется ничего пилить. Не требуется знать, как оно шлётся. Требуется только разобраться, что надо слать туды сюды. А когда впилят наконец долгожданный HTTP2, то вообще збс будет.
>>42815
> > Алсо без TCP/IP и на флеше не обойтись.
> Вай, зачем обманываешь? RTMFP работает через UDP же.
Без TCP обойтись можно. Без TCP/IP нельзя. Даже если это нативное приложение. Вот выходишь за пределы пеки и сетевых карт, тогда да можешь и без TCP/IP. ruwiki://IP лол.
>>42816
Да, но зачем?
>>42820
> В качестве аргумента против передачи пакетов данных без подтверждения
Аргумент в пользу WebSocket - меньше кода придётся пилить дополнительно. А значит меньше отлаживать. А значит меньше багов. А значит проще сопровождать код. А значит быстрее.

Впрочем вот это специально джля вас готовят http://www.w3.org/2012/sysapps/tcp-udp-sockets/ А ещё при большом желании можно через WebRTC пилить.

>>42821
> Хотя что за игра это будет, чтобы в неё с ручного тач-экрана и настольника с мышью, клавой и монитором играть то. Об этом я думал меньше всего.
Что-то такое http://beta.unity3d.com/jonas/DT2/ ? С другой стороны юнити делает нативные приложения под яблоко и ведро почти без изменений кода.
Сообщение слишком длинное. Полная версия.
>> No.43021 Ответ
Бамп кривой демкой https://yadi.sk/d/taA8W6tghHgVy
>> No.46773 Ответ
Все умерли. Впрочем это /s/.
>> No.46774 Ответ
Файл: Skyrim+roulette_147c41_5323395.png
Png, 84.86 KB, 814×774 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Skyrim+roulette_147c41_5323395.png
>> No.46811 Ответ
>>43021
> Blackman12exe.exe
> .exe
Ты серьёзно?
>> No.46862 Ответ
Ололо, пишу в свежем как говно мамонта тренде.
>> No.46893 Ответ
>>46862
> Ололо
Причём прямиком из 2009-го года.
>> No.47146 Ответ
Здравствуй. юный бородатый%% %%пограмист. Есть один сурс: https://github.com/swarmsim/swarm
Как в нём менять отображающийся текст, чтобы вмесвто ларвы были фунгусы, например%%, если я не знаю ничего кроме как немного хтмл+цсс и мизера из пхп и виндусовских, батных команд?
Да, я планктоно сапиенс.
>> No.47479 Ответ
>>47146
clone или download сырцов. Поиск и замена larva(e) на fungus(i).


No.36714 Ответ [Открыть тред]
Файл: 20z_ZW7lnTw.jpg
Jpg, 47.63 KB, 820×325 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
20z_ZW7lnTw.jpg
У нас есть Vim-тред, пусть будет и Emacs.
172 posts are omitted, из них 26 с файлами. Развернуть тред.
>> No.46932 Ответ
>>46924
Я не разобрался ни черта в том, что есть на emacswiki по этой теме.
>> No.47186 Ответ
>> No.47215 Ответ
Как восстановить последнее выделение текста? Чтобы типа как в виме по gv, только без эвил мода.
>> No.47216 Ответ
>>47215
C-x C-x
>> No.47220 Ответ
>>47216
Нет, это совсем не то.
>> No.47221 Ответ
>>47215
Я думал тут за пол часа набросать тебе решение, но понял что задача нетривиальная ввиду того, что путешествуя по истории регионов (выделений) ты будешь создавать новые выделения. В любом случае, публикую свои наработки:
http://pastebin.com/W321qZwe
>> No.47318 Ответ
Файл: -.png
Png, 3.51 KB, 235×49
edit Find source with google Find source with iqdb
-.png
Файл: -.png
Png, 9.83 KB, 900×92
edit Find source with google Find source with iqdb
-.png

Есть одна проблема. Использую емаксклиент, так вот если им попытаться открыть файл который нельзя читать, то вместо ошибки, происходит пик 1, дальше я жму ^C и терминал ломается до перезапуска, перестает отображаться вводимый текст и перевод каретки, весь вывод отображается в одну строку, можно ли это исправить?
>> No.47468 Ответ
>>47318
У меня выводится сообщение об ошибке в таком случае. Какая версия emacs, открываются ли файлы которые можно читать?
>> No.47469 Ответ
>>47468
Читаемые файлы открываются. Если emacsclient -c, то ошибка выводится, а если emacsclient -t, то ломается терминал.
Версия 24.5.1
>> No.47470 Ответ


No.23225 Ответ [Открыть тред]
Файл: JESUS-php.jpg
Jpg, 67.58 KB, 640×480 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
JESUS-php.jpg
Обыскал всю /s/, не нашёл треда.
Собственно хотелось бы освоить пхп и поднимать на нём лёгкие деньги. Какие создать себе условия с литературой, испытательным полигоном для большего удобства? И сколько времени уйдёт на это у неофита со средним IQ вроде меня? Пока даже не знаю с чего начинать, но буду каждый день или два отписываться о прогрессе.
471 posts are omitted, из них 83 с файлами. Развернуть тред.
>> No.47428 Ответ
Вопрос

http://arhivach.org/thread/245785/#956914

p-sch Аноним 19/03/17 Вск 15:04:01 #962 №956914

Вот я делаю студентов и уткнулся в проблему. Есть bootstrap.php и в нем перехват ошибок/исключений вида http://ideone.com/EkC1Qr . И все было хорошо и лампово, пока я не начал делать скрипты для вызова из консоли, что бы заполнять базу фейками (да я узнал про fzaninotto/faker и уже не мог остановится). В скриптах конечно вывод в консоль, а значит при возникновении ошибок обработчик исключений крошится при попытке отдать заголовки.
Завести глобальную переменную с флагом для консольных скриптов? Сделать отдельный bootstrap для них с другим обработчиком? Как это лучше исправить?

Ответ

Можно проверять через phpsapiname() например.

> fileputcontents(DIR . "/../logs/error.log",
есть стандартный лог ошибок и функция error_log(), не изобретай велосипед.
Вопрос

http://arhivach.org/thread/245785/#956914

p-sch Аноним 19/03/17 Вск 15:04:01 #962 №956914

Вот я делаю студентов и уткнулся в проблему. Есть bootstrap.php и в нем перехват ошибок/исключений вида http://ideone.com/EkC1Qr . И все было хорошо и лампово, пока я не начал делать скрипты для вызова из консоли, что бы заполнять базу фейками (да я узнал про fzaninotto/faker и уже не мог остановится). В скриптах конечно вывод в консоль, а значит при возникновении ошибок обработчик исключений крошится при попытке отдать заголовки.
Завести глобальную переменную с флагом для консольных скриптов? Сделать отдельный bootstrap для них с другим обработчиком? Как это лучше исправить?

Ответ

Можно проверять через phpsapiname() например.

> fileputcontents(DIR . "/../logs/error.log",
есть стандартный лог ошибок и функция error_log(), не изобретай велосипед.

> а значит при возникновении ошибок обработчик исключений крошится при попытке отдать заголовки.
Вряд ли. В консоли header просто игнориурется, по крайней мере в PHP5.

> require_once "../src/View/503.html";
Тут не указан конкретный путь к файлу. Это относительный путь, а относительно какой папки он указан? Это вообще работать не будет.

> header("HTTP/1.1 503 Service Unavailable", true, $timeout);
Почитай мануал по функции header и что идет 3-м параметром.
Сообщение слишком длинное. Полная версия.
>> No.47429 Ответ
Вопрос

http://arhivach.org/thread/245785/#956891

Просьба проверить код

Ответ

https://github.com/grigoryMovchan/auth/blob/auth_mvc/app/core/Model.php
Зачем нужен этот класс? Никто не говорит что ты обязан наследовать все модели от одного общего класса.

И определись, что ты назваешь моделью. Ты по моему все подряд классы этим словом называешь. Что такое MysqlModel?

Также, у тебя по моему непонимание, что такое наследование. А наследуется от B значит, что А - измененная версия B. Например, Банк это Организция, но с лицензией на банковскую деятельность и дополнительными возможностями, потому Банк можно наследовать от Организации.

Вопрос

http://arhivach.org/thread/245785/#956891

Просьба проверить код

Ответ

https://github.com/grigoryMovchan/auth/blob/auth_mvc/app/core/Model.php
Зачем нужен этот класс? Никто не говорит что ты обязан наследовать все модели от одного общего класса.

И определись, что ты назваешь моделью. Ты по моему все подряд классы этим словом называешь. Что такое MysqlModel?

Также, у тебя по моему непонимание, что такое наследование. А наследуется от B значит, что А - измененная версия B. Например, Банк это Организция, но с лицензией на банковскую деятельность и дополнительными возможностями, потому Банк можно наследовать от Организации.

У тебя наследуется непонятно что от непонятно чего. Класс для соединения с БД и класс для проверки авторизации наследуются оба от Model. Что у них общего? Ровно ничего, это разные классы для разных задач. Следовательно, наследование тут реализовано неправильно.

Идея с MysqlModel неудачная, так как ты смешиваешь загрузку каких-то конфигов и работу с базой. А зачем, если это можно делать в разных классах и просто передавать в класс для работы с базой уже созданный и настроенный объект PDO? У тебя просто все как-то переусложнено.

$config = loadinifile(...);
$pdo = new PDO(...);

Вот и все. Нет необходмости писать целый класс, чтобы создать объект PDO.

Каждый класс должен заниматься своим делом. Класс не должен одновременно занматься поиском пользователей в БД, валидацией и чтением конфигов.

Далее, почитай комментарии к задаче про студентов, я не хочу тут все пересказывать, в частности, про Dependency Injection. Именно она нужна в AuthModel.

https://github.com/grigoryMovchan/auth/blob/auth_mvc/app/models/MysqlModel.php#L82
Эта функция сделана неудачно, надо сделать вместо нее 4 отдельных функции (вроде queryNum(), queryAssoc() и тд) а не объединять функции с разным алгогритмом работы и разным типом возвращаемых значений. Это ненормально, когда одна функция может возвращать значения разных типов и это неудобно.

> запрос к БД
> без понятия зачем тут нужен новый уровень абстракции
Тогда не надо его делать. Ты должен понимать каждую строчку в своем коде. Пиши проще, чтобы все было понятно, не усложняй.

https://github.com/grigoryMovchan/auth/blob/auth_mvc/app/models/MysqlModel.php#L70
> } catch (PDOException $e) {
Почитай урок про исключения.

В общем, весь MysqlModel - это надо переписать полностью, так как там все намешано в кучу и непонятно, вообще за что класс отвечает. Также, ты все переусложняешь. Если ты хочешь что-то добавить в PDO то либо унаследуй PDO, либо сделай класс который принимает в конструктор объект PDO и предоставляет какие-то полезные функции.

И если ты не делал ООО Вектор, то советую начать с этой задачи, она помогает изучить основы ООП.
Сообщение слишком длинное. Полная версия.
>> No.47430 Ответ
Вопрос

http://arhivach.org/thread/245785/#956741
Аноним 19/03/17 Вск 08:05:18 #959 №956741

На постгрес меня хероку заставил перебраться. Ты писал о том, что в постгрес можно использовать regex-ограничения для полей, но я не совсем понимаю зачем. Мне кажется, если злоумышленник обойдёт PHP-ограничения, то продублированные регулярки на стороне БД вряд ли чем-то помогут. Про CI прочитал, попробую поднять. Насчёт уровня покрытия тестами, то мне кажется, что чем он выше, тем более хрупкими будут тесты (так как их придётся постоянно подстраивать под изменения в проекте).

Ну и можно делать файлообменник на Симфони? Там уже много чего настроено из коробки (есть дебаг-панель, cli-утилиты, проще тестировать, чем Silex, есть плагин для PHPStorm, добавляющий автодополнение для сервисов/шаблонов/функций Twig и так далее). Понимаю, что оверхед, но взамен готов делать более сложные задания по файлообменнику.

Просьба проверить:

- скидки http://arhivach.org/thread/245785/#946704 | https://bitbucket.org/learning_acc/discounts/
- http://arhivach.org/thread/245785/#947452 | https://github.com/kubk/students

Ответ
Вопрос

http://arhivach.org/thread/245785/#956741
Аноним 19/03/17 Вск 08:05:18 #959 №956741

На постгрес меня хероку заставил перебраться. Ты писал о том, что в постгрес можно использовать regex-ограничения для полей, но я не совсем понимаю зачем. Мне кажется, если злоумышленник обойдёт PHP-ограничения, то продублированные регулярки на стороне БД вряд ли чем-то помогут. Про CI прочитал, попробую поднять. Насчёт уровня покрытия тестами, то мне кажется, что чем он выше, тем более хрупкими будут тесты (так как их придётся постоянно подстраивать под изменения в проекте).

Ну и можно делать файлообменник на Симфони? Там уже много чего настроено из коробки (есть дебаг-панель, cli-утилиты, проще тестировать, чем Silex, есть плагин для PHPStorm, добавляющий автодополнение для сервисов/шаблонов/функций Twig и так далее). Понимаю, что оверхед, но взамен готов делать более сложные задания по файлообменнику.

Просьба проверить:

- скидки http://arhivach.org/thread/245785/#946704 | https://bitbucket.org/learning_acc/discounts/
- http://arhivach.org/thread/245785/#947452 | https://github.com/kubk/students

Ответ

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

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

> Насчёт уровня покрытия тестами, то мне кажется, что чем он выше, тем более хрупкими будут тесты (так как их придётся постоянно подстраивать под изменения в проекте).
Хрупкость тестов больше зависит не от их количества, а от того, как они написаны. Подстраивать тесты придется, если меняется логика использования класса, но при таких серьезных изменениях тебе ведь наверняка захочется их протестировоать, и все равно пришлось бы писать или переделывать тесты на этот класс.

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

> Ну и можно делать файлообменник на Симфони?
А не хочешь сделать testhub из ОП поста? Хотя бы частично. Файлообменник на Симфони это стрельба из пушки по воробьям. Там Slim/Silex + Twig + Doctrine лучше подойдет. И так как ты почти все это использовал в студентах, то это по сути будет то же самое и ничему новому не научит. Не думаю, что тебе стоит вообще делать файлообменник. Он предназначен для тех, кто студентов делал без микрофреймворков.

Testhub по сложности близок к реальным проектам.

А еще, в ОП посте есть задание на SPA (никто пока не осилил), если ты хочешь поработать с JS и решал более простые задачи по этой теме.

> Настораживает, что функция автора статьи при epsilon 0.00001 считает, что 1000000 и 1000001 равны: http://floating-point-gui.de/errors/NearlyEqualsTest.java
epsilon это ведь не абсолютная разница, а относительная, относительно сравниваемых чисел. Ну то есть epsilon умножаем на 1000000 чтобы получить абсолютную разницу, получается 10 по моему.

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

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

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

Скидки

Задача про скидки тут: http://www.cyberforum.ru/php-oop/thread1459985.html
Решение анона: https://bitbucket.org/learning_acc/discounts/
Пост анона: http://arhivach.org/thread/245785/#946704
Комментарии:

> Мне кажется есть смысл сделать её неизменяемой, а не надеяться, что пользователь вспомнит вызвать clone (вот я как раз забыл).

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

https://bitbucket.org/learning_acc/discounts/src/be3e1a13fda16af5b5397c94428c4d9b25632d29/src/DiscountResult.php?at=master&fileviewer=file-view-default
> if ($priceWithDiscount < 0) {
> throw new \LogicException(
Вообще для такого случая лучше подходит InvalidArgumentException. Вот тут есть объяснение где используется LogicException: http://stackoverflow.com/questions/5586404/logicexception-vs-runtimeexception/5586510#5586510 и InvalidArgumentException как раз наследуется от него, и уточняет причину ошибки.

Еще один подвох в твоем коде - переменная в конструкторе скидок называется $percent, но она хранит число от 0 до 1. Стоило бы добавить проверку что она в этом диапазоне, так как кто-то может подумать что там именно проценты от 0 до 100. Или использовать там проценты.

> $originalSum = $matchedProducts->calculatePricesSum();
> return new DiscountResult($matchedProducts, $originalSum - $originalSum * $this->percent);
Это так часто встречается, что может стоило сделать в DiscountResult статический конструктор для группы товаров и скидки в N%?

Насчет неизменяемости ProductCollection: там же по-прежнему есть addProduct, какая-то неизменяемость получилась не совсем полноценная.

> $products = clone $this->products;
> $products->detach($product);

> return self::fromSplObjectStorage($products);
Тут в fromSplObjectStorage происходит лишнее копирование объекта Spl, тоже не очень удачно. Лучше наверно обойтись без addAll().

Но это все мелкие советы по улучшению, так-то задача хорошо решена.
Сообщение слишком длинное. Полная версия.
>> No.47431 Ответ
Вопрос

Просьба проверить код, пост анона http://arhivach.org/thread/245785/#947452

Ответ

Не знаю, заметил ли ты, но при добавлении CI около коммита появляется галочка, если тесты пройдены успешно: https://github.com/kubk/students/commits/master , причем клик по ней ведет на подробности. Сразу видно, если кто-то сломал код.

Также, галочка ставится для отдельных веток: https://github.com/php/php-src/branches

Ну и если например кто-то делает пулл-реквест с предложением изменений, то опять же, прогоняются тесты и пишется, не сломались ли тесты, как тут: https://github.com/php/php-src/pull/2427

Это помогает при командной разработке, особенно в больших опен-сурс проектах.

https://github.com/kubk/students/blob/master/tests/StudentGatewayTest.php#L97
Вопрос

Просьба проверить код, пост анона http://arhivach.org/thread/245785/#947452

Ответ

Не знаю, заметил ли ты, но при добавлении CI около коммита появляется галочка, если тесты пройдены успешно: https://github.com/kubk/students/commits/master , причем клик по ней ведет на подробности. Сразу видно, если кто-то сломал код.

Также, галочка ставится для отдельных веток: https://github.com/php/php-src/branches

Ну и если например кто-то делает пулл-реквест с предложением изменений, то опять же, прогоняются тесты и пишется, не сломались ли тесты, как тут: https://github.com/php/php-src/pull/2427

Это помогает при командной разработке, особенно в больших опен-сурс проектах.

https://github.com/kubk/students/blob/master/tests/StudentGatewayTest.php#L97
> public function searchProvider()
Я тут еще подумал, что можно было проверять не найденные id, а найденные имена/фамилии - тогда данные для теста выглядели бы более наглядно. Хотя и id можно использовать, там все равно нужны тестовые данные.

> > - передаем строку с тегом и проверяем, что на выходе тега нет
> > - вызываем htmlentitydecode на результате и проверяем, что получилась исходная строка
> Если правильно понимаю, то второй пункт работает, только если искомая строка не будет найдена. В противном случае результат будет содержать тег b или mark, и исходную строку от такого результата не получим
Я имел в виду под htmlentitydecode еще и вырезание тегов наверно. Но это все равно не универсально, так как например найденное слово может выделяться не только тегами,а например добавлением каких-нибудь скобок. Совсем универсально тест тут не написать, получается.

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

> Теперь html в php нет https://github.com/kubk/students/blob/master/src/LinkGenerator.php#L47
> , но как мне кажется, тут https://github.com/kubk/students/blob/master/templates/student-list.twig#L14+L15
> какой-то низкоуровневый код в шаблоне. Ну и ссылка генерируется только в одном месте, нужен ли макрос, который будет использоваться лишь один раз?
Теперь не нужен.

https://github.com/kubk/students/blob/master/scripts/publish-frontend.sh#L3
> mkdir public/vendor public/vendor/{css,js}
Тут стоит добавить флаг на случай если папка существует. Также, в bash-скриптах полезно ставить в начало set -e чтобы при первой ошибке скрипт завершался. Иначе он будет продолжать работать все равно.

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

https://boiling-brook-29265.herokuapp.com/form
Пол лучше делать радиокнопками, так как в них все опции видны и доступны сразу, без лишних кликов. Выпадающий список используют, чтобы сэкономить площадь ценой более сложного доступа к опциям, но для 2 пунктов там экнономить особо нечего.

И смесь английских подписей к форме и русских слов в интерфейсе не очень логично смотрится.

> https://boiling-brook-29265.herokuapp.com/?notify=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%20%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9%20%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%21
Ты указываешь текст в GET-параметре. Тут есть риск: злоумышленник может вывести произвольный текст и как-то использовать это для обмана пользователя, который доверяет сервису. Если бы это было в популярном сервисе вроде вконтакте - это однозначно была бы уязвимость и наверняка как-то использовалось бы.

https://github.com/kubk/students/blob/master/src/StudentGateway.php#L14
> private $table = 'students';
Тут ты вынес название таблицы, но зачем? Менять ты его вряд ли будешь, и скорее всего в итоге просто будет менее удобно искать где она используется, а также читать SQL запросы.

> public function studentsAreTheSame(Student $studentA, Student $studentB): bool
Возможно, эту функции логичнее поместить в Student. Вроде $a->isSame($b) или Student::areSame(). Второй вариант позволяет принимть null.

Насчет PageObject, да, у тебя они довольно удобно сделаны.

https://github.com/kubk/students/blob/master/tests/ControllerTest.php#L41
> $this->assertTrue($client->getResponse()->isRedirect());
Вот эта проверка, что мы залогинились, мне кажется, не очень точная. Если бы мы писали сценарий для тестера-человека, мы бы вряд ли писали там "проверить, что произошел редирект".

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

А после разлогинивания - соответственно проверить пропадение этого признака.

Так, вообще, задача хорошо сделана, думаю, что это такой образцовый пример решения задачи про студентов. Тебе надо дальше делать что-нибудь посложнее, точно не файлообменник.
Сообщение слишком длинное. Полная версия.
>> No.47432 Ответ
Вопрос

Задание про игру сапер с использованием MVC
Код: https://github.com/greenTea242/MinesweeperMVC
Пост: http://arhivach.org/thread/245785/#945676

Ответ

> if (typeof strCell != "string") {
> throw new ConsoleGameControllerException("Неправильный тип аргумента strCell. Ожидается" +

Не помню, говорил я или нет, для таких проверок удобно сделать функцию вроде assert или даже целый набор таких функций:

assert(typeof strCell == "string");
Assert.hasType(strCell, "string");
Вопрос

Задание про игру сапер с использованием MVC
Код: https://github.com/greenTea242/MinesweeperMVC
Пост: http://arhivach.org/thread/245785/#945676

Ответ

> if (typeof strCell != "string") {
> throw new ConsoleGameControllerException("Неправильный тип аргумента strCell. Ожидается" +

Не помню, говорил я или нет, для таких проверок удобно сделать функцию вроде assert или даже целый набор таких функций:

assert(typeof strCell == "string");
Assert.hasType(strCell, "string");
Assert.notEmpty(x);

Так и компактнее, и читабельнее. И может быть есть готовые библиотеки.

> new ConsoleGameControllerException
Для такого случая, если совсем строго смотреть, логично исплоьзовать что-то вроде InvalidArgumentException, или TypeError, который вроде бы уже есть в яваскрипте. То есть это исключение не привязано к конкретному контроллеру. Потому что это ошибка в написании кода в общем, а не специфичная для этого контроллера ошибка.

> } catch(error) {
> console.log(error.name + ":" + error.message);
Ты зря это делаешь, так как консоль по умолчанию выводит непойманные исключения, да еще со ссылками на код и стектрейсом, а в твоем случае данных меньше.

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

https://github.com/greenTea242/MinesweeperMVC/blob/master/src/controllers/DomGameController.js#L103
> DomGameController.prototype._setEvents = function() {
Вот эта функция должна быть в view, а не в controller, так как это вью знает на что он должен подписываться в DOM, а контролллер это знать не должен. То есть это стоило перенести во вью.

> DomGameView.prototype._createDevTools = function() {
> DomGameView.prototype._createHeader = function() {
Вот эти функции, которые по кусочкам создают интерфейс, можно было бы обойтись без них, если бы у нас был нормальный шаблонизатор, который умеет инклудить подшаблоны. Им можно было бы и поле создать.

> DomGameView.USERTOOLSOPTION_1 = "1";
> DomGameView.DEVTOOLSOPTION_1 = "1";
Есть риск что эти константы где-то перепутаются, так как у них одинаковое значение. Лучше делать разное.

> DomGameView.prototype._setGame = function(game) {
Не уверен что эта функция так уж нужна, может проще было в конструкторе написать this._game = ... ? Но так, ошибки конечно нет, вдруг когда-нибудь понадобится подменять модель на другую.

> this._field.querySelector("td[data-x=" + x + "][data-y= " + y + "]");
Быстрее наверно было бы использовать словарь со ссылками на нужную ячейку, чем запускать поиск по DOM перебором всех ячеек. Хотя на маленьких полях разница вряд ли будет заметна.

В событии DomGameViewEvent.POPUP_CREATED возможно имело смысл передавать ссылку на попап как параметр события.

> for (var i = 0; i < classList.length; i++) {
> div.classList.add(classList[i]);

А можно так: x.className = classList.join(' ');

> var keys = Object.keys(dataAttr);
> for (i = 0; i < keys.length; i++) {

А можно for (key in dataAttr). Что-то ты основы JS подзабыл.

> Util.repeatString
раз уж ты используешь ES5 (Array.isArray), там есть функция и для повтора строк.

> CellSet.prototype.hasCell
> return this._parentContainer[y][x] !== undefined;
Для проверки ключа в словаре есть оператор in, его логичнее использовать. так например

return y in this.pc && x in this.pc[y];

или

return !!(this.pc[y] && this.pc[y][x]);

!! - приведение к boolean

https://github.com/greenTea242/MinesweeperMVC/blob/master/src/models/CellSet.js
Тут у тебя в нескольких функция скопипащен вложенный цикл по клеточкам. Возможно, стоило его вынести в функцию или использовать forEach.

parentContainer лучше было назвать cells.

Еще, у тебя там в модели есть куча проверок, что разные cellSet не равны null. может было проще в конструкторе создать эти CellSet, а при рестарте игры просто их очищать, например вызовом метода clear(). Тогда просто код был бы чуть проще, так как это поле не могло бы быть пустым.

Еще, теоретически можно было сделать эти CellSet генераторами событий изменения клеточек и числа флагов, чтобы гарантировать что мы не упустили ничего. Но это могло бы и усложнить код.

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

Советую дальше изучать Knockout, Anlular 2 или React. В первых 2 проблема рутинного кода работы с DOM решается через data binding, в последнем через перерендеринг страницы.

Сделать на них можно какую-нибудь форму с валидацией или страницу конфигурации чего-нибудь (вроде сборки заказа с разными параметрами). Или какой-нибудь мессенджер (это вроде модно сейчас в стартап-среде). Или можешь посмотреть на задание на SPA в ОП посте и попробовать кусочек из него сделать. Никто пока не осилил.
Сообщение слишком длинное. Полная версия.
>> No.47433 Ответ
>>47432
Норкоман штоле?
>> No.47435 Ответ
>>47432
Весело у вас там, а за что зобанили?
>> No.47438 Ответ
>>47435
Скорее всего по ключевым словам или по ошибке:

> Ошибка постинга: Постинг запрещён. Бан: 701768. Причина: Общее 9 - Вайп, спам, обход спам-листа

В /d/ тоже никто ничего не отвечает.
>> No.47439 Ответ
>>47431
>>47430
Спасибо большое за ответы!

> Ты указываешь текст в GET-параметре. Тут есть риск: злоумышленник может вывести произвольный текст и как-то использовать это для обмана пользователя, который доверяет сервису.
Исправил так: https://github.com/kubk/students/commit/1e649bacaf548c63471862be726c81dfcaae49b6
Правда, строки "edited" и "registered" нигде не документированы.

По поводу служебного URL, проверяющего залогиненость - что он должен возвращать для залогиненого, а что для не залогиненого пользователя?

> А не хочешь сделать testhub из ОП поста? Хотя бы частично.
Я ещё не все задачи по SQL сделал и по вёрстке, не хотелось бы прыгать через задания, у меня по файлообменнику много вопросов.
Например, мне нравится лёгкость использования наследования в Доктрине, можно ли использовать наследование вместо объекта MediaInfo? Основные типы файлов (картинка/аудио/видео/архив) будут иметь по своему классу, с такими объектами удобнее работать, так как мы точно знаем какие свойства и методы у них есть. Есть ли смысл тут использовать Class Table Inheritance? Понимаю, что получение одной сущности - это джойн вместо селекта, а для вывода списка всех файлов - куча джойнов. Для пользователей планирую использовать Single Table Inheritance.
>> No.47440 Ответ
>>47439
> Правда, строки "edited" и "registered" нигде не документированы.

Можно сделать класс, например Notification, и в нем константы NOTIFY_EDITED и тд.

> Я ещё не все задачи по SQL сделал и по вёрстке, не хотелось бы прыгать через задания, у меня по файлообменнику много вопросов.

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

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

> Основные типы файлов (картинка/аудио/видео/архив) будут иметь по своему классу, с такими объектами удобнее работать, так как мы точно знаем какие свойства и методы у них есть.
Я думаю, тут выгоднее вместо наследования просто сделать для MediaInfo хранение JSON-данных в колонке. В сущности хранить объект MediaInfo. А в Доктрине настроить автоматическое конвертирование MediaInfo в JSON-данные при загрузке/записи в БД.

>>47439
> Правда, строки "edited" и "registered" нигде не документированы.

Можно сделать класс, например Notification, и в нем константы NOTIFY_EDITED и тд.

> Я ещё не все задачи по SQL сделал и по вёрстке, не хотелось бы прыгать через задания, у меня по файлообменнику много вопросов.

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

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

> Основные типы файлов (картинка/аудио/видео/архив) будут иметь по своему классу, с такими объектами удобнее работать, так как мы точно знаем какие свойства и методы у них есть.
Я думаю, тут выгоднее вместо наследования просто сделать для MediaInfo хранение JSON-данных в колонке. В сущности хранить объект MediaInfo. А в Доктрине настроить автоматическое конвертирование MediaInfo в JSON-данные при загрузке/записи в БД.

Тут просто проблема в том что у медиаданных может быть много разных свойств, в зависимости от формата файла (попробуй сам посмотреть дампы данных в демо getId3: http://www.getid3.org/demo/ ). В таких ситуациях, сложно и неудобно реализовывать наследование и гигантские таблицы с 50 полями. Тут проще использовать либо EAV (Entity–attribute–value) либо, как я написал, сериализацию (кодирование в виде строки) данных с помощью JSON.

Наследование пригодится в тестхабе, для разных типов вопросов и ответов.

> По поводу служебного URL, проверяющего залогиненость - что он должен возвращать для залогиненого, а что для не залогиненого пользователя?

Так как это только для тестов, то можно возвращать что угодно, я бы использовал либо ответ в виде текста 0/1 либо в виде JSON, с его помощью можно передать много данных.

> Понимаю, что получение одной сущности - это джойн вместо селекта, а для вывода списка всех файлов - куча джойнов.

Джойны нужны, но не так много:

SELECT FROM base LEFT JOIN class1 ON ... LEFT JOIN class2 ON ... LEFT JOIN class3 ON ...

Для Concrete TI можно сделать N выборок, объединенных в UNION:

SELECT FROM class1
UNION
SELECT FROM class2
UNION
...

Вообще, у 3 подходов к наследованию есть свои сильные и слабые стороны, и надо их изучить. Ну например, у Concrete TI трудно обеспечить уникальность id в нескольких таблицах (в БД вроде Postgres, где генератор id - отдельная от таблицы сущность, это возможно), нельзя сделать внешний ключ на сущность не из одной конкретной таблицы. Где-то выборки становятся сложнее, и тд.
Сообщение слишком длинное. Полная версия.


[0] [1] [2] [3] [4] [5] ... [48] [49] [50]
Пароль:

[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]