[WT] [Архив]  [Поиск] Главная Управление
Ычан: [d | b / bro / gf / hr / l / m / med / mi / mu / o / ph / r / s / sci / tran / tv / x | vg | au / tr | a / aa / c / fi / jp / rm / tan / to / vn]
[Назад] [Вся нить] [Последние 50 сообщений]
Ответ в нить
Имя
Animapcha image [@] [?]
Тема   ( ответ в 21641)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, XCF, ZIP размером до 5000 кБ.
  • Ныне 3011 unique user posts. Посмотреть каталог
  • Максимальное количество бампов нити: 500
155344039867.png-(777.18KB, 720×720, junior_developer_kobayashi.png)
21641
No. 21641 Закреплено watch    
Здесь можно получить помощь и консультацию по любому языку программирования, в любой сфере разработки. Не важно, программируете ли вы собственного робота, пишете серверную приблуду, интегрируете чужие API, ковыряете игру, или пытаетесь сделать сайт на Wordpress - если аноним что-то об этом знает, он обязательно поможет.

Пополняемая база знаний: http://pastebin.com/AGhLZppH

Не знаете, какой язык и библиотеки взять для вашей задачи? Вам сюда.
Не знаете, где клиент, а где сервер? Вам сюда.
Не понимаете, что такое ООП? Вам сюда.
Написали код, и не понимаете, почему не работает? Вам сюда.
Обнаружили кусок кода, и не понимаете, как оно вообще могло работать? Вам тоже сюда.
Не знаете, как подступиться к проблеме? Вам обязательно сюда.

Другие тематические нити (периодически обновляется): https://pastebin.com/psy43ibG

Примеры кода лучше выкладывать в виде ссылок на http://pastebin.com или http://ideone.com
Фронтендные вещи лучше выкладывать на http://jsfiddle.net

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

Чтобы не сбивать новичков с толку, а также не разбавлять полезную информацию мусором, беспредметные споры типа "какой язык / парадигма / библиотека / етц лучше" здесь запрещены. Для подобных вещей теперь есть отдельная диспутов нить >>/dev/21353

Если здесь поселится достаточное количество программистов на одном языке / одной сферы, можно будет их выделить в отдельную нить, а в этой оставить на неё ссылку.
По мере поступления вопросов можно составлять FAQ и базу знаний.

Архив нитей:
http://410chan.org/dev/arch/res/14160.html
http://410chan.org/dev/arch/res/15681.html
http://410chan.org/dev/arch/res/17424.html
http://410chan.org/dev/arch/res/19666.html

Прошлая нить пока тонет тут: >>/dev/19666
Развернуть все изображения
No. 21642    
>>21641
В процессе систематизация прошлой нити для пополнения базы знаний.
No. 21644    
>>21641
Черновик обобщенной информации из прошлой нити:

>Хочу сделать поисковик-парсер для одного довольно старого сайта
>>/dev/19688

>Нужен IDE-плагин для CC5X
>>/dev/19754
>>/dev/19764

>Является ли Python + Django хорошим стеком для начала профессиональной деятельности (2018)
>>/dev/19765
>Какие требования предъявляются к джуниорам для стека Python + Django (2018)
>>/dev/20056

>Подскажите курс по машинному обучению
>>/dev/19781
>Подскажите инструментарий для практики по машинному обучению
>>/dev/20988
>>/dev/20990

>Хочу создать простенький 3д-шутер, чтобы разобраться
>>/dev/20005
>>/dev/20007

>Какую специальность лучше выбрать в ВУЗе, чтобы стать программистом (2018)
>>/dev/20014
>>/dev/20018

>Нашли 13 Гб книг по IT-тематике
>>/dev/20146

>Хочу клиент-серверное приложение с броадкастом
>>/dev/20353

>Подскажите гайды по администрированию Windows
>>/dev/20361
>>/dev/20404

>Подскажите гайды по ASN.1
>>/dev/20415
>>/dev/20416
>>/dev/20850

>Подскажите гайды для мультиплеера на Godot
>>/dev/20465

>Чем кавычки отличаются от апострофов в C
>>/dev/20471
>>/dev/20472
>>/dev/20473

>Хочу научиться делать игры
>>/dev/20513

>Подскажите фреймворк для простого десктопного UI
>С точки зрения cовременных реалий
>>/dev/20526
>>/dev/20527
>>/dev/20534
>С точки зрений реалий прошлого
>>/dev/20535

>Подскажите как создать примитивный TCP-сервер на Python
>>/dev/20634

>Поясните применимость Server-side Events в JavaScript
>>/dev/20789

>Чем в C# поля отличаются от свойств с геттерами / сеттерами по-умолчанию
>>/dev/20832

>Cколько времени надо потратить для овладения HTML/CSS/JS
>>/dev/20830
>>/dev/20833

>Подскажите, куда лучше складировать очереди для последующей обработки
>>/dev/20973
>>/dev/20977

>Пример реализации MVP-подхода для веб-приложений
>>/dev/21083

>Подскажите JS-стек для веб-приложений
>>/dev/21136

>Подскажите базовые курсы по созданию ПО
>>/dev/21223

>Подскажите редакторы кода с SSH-терминалом для iPad
>>/dev/21397
No. 21685    
Вопрос по ant.
Что-то я туплю.
Пусть у нас имеется, допустим, свойство а:
<property name='a' value="${filename}"/>

Как мне теперь запихать в свойство b результат применения к свойству а маппера? Например, вот такого:
<globmapper from="*.foo" to="*.bar"/>

No. 21686    
>>21685
>Как мне теперь запихать в свойство b результат применения к свойству а маппера?

Завернув маппер в PathConvert, и указав выводом (property) свойство b, а входом (refid) свойство a ?
https://ant.apache.org/manual/Tasks/pathconvert.html

Пример есть прямо тут:
https://ant.apache.org/manual/Types/mapper.html


<pathconvert property="b" refid="a" targetos="unix">
  <mapper>
     <globmapper from="*.foo" to="*.bar"/>
  </mapper>
</pathconvert>

No. 21687    
>>21686
Действительно туплю. Тем более, что как выяснилось при внимательном чтении мануала, гораздо проще и правильнее применить маппер к самому таску, а не городить этот огрод.
В любом случае — спасибо!
No. 21731    
155397881850.png-(58.51KB, 1005×838, Clipboard01.png)
21731
Почему при клике на сложносочинённую кнопочку иногда не поднимается эвент? Стили при этом переключаются, т.е. событие всё-таки обрабатывается. Пикрилейтед, JS, jQuery, обработчик событий каждого модуля для простоты повешен на документ. Систему определить не удалось, в отладчике проблемы как-бы и нет. Меня это раздражать уже начинает.
No. 21733    
>>21731
А можешь код дать? А то причин может быть много и так в лоб рассуждать это безблагодатность
No. 21735    
155400673221.png-(118.77KB, 1128×879, Clipboard01.png)
21735
>>21733
А тебе код конкретно чего нужен? Это SPA недоделанное. Вот точка входа в приложение — всё, что имеет в зависимостях модель, генерит ивенты. Обработчики везде подключены стереотипно:

function onClick (ev) {
   ... // Do something useful
   return undefined;
}

$(document).on ("click", onClick);

No. 21736    
>>21731
Самый просто вариант - смотреть в дебаге куда идет, разве нет? Ну или поискать остановку ивентов по проекту.
No. 21737    
>>21736
Если бы было так просто, я бы голову не ломала; ну и не спрашивала бы. В дебаггере не удаётся воспроизвести проблему, т.е. любое событие исправно поднимается и обрабатывается. Шуршание по SO выдаёт лишь кучу людей, которые из обработчика возвращают что-то, что конвертируется в false, — мне известо, к чему это приводит и это не мой случай. Какая-то дурацкая проблема, короче, — во вьюхе с разделами кнопки сделаны одиночными div-ами, но даже там событие поднимается через раз, хотя стили переключаются исправно.
No. 21745    
>>21731
>Почему при клике на сложносочинённую кнопочку иногда не поднимается эвент?

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

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

Ты делал что-то подобное?
No. 21747    
>>21745
>в возникшем ивенте click будет указан неправильный eventTarget
С самого начала было заложено, т.е. проверяется target на соответствие селектору и при отрицательном результате ищется его родитель, подпадающий под селектор. Т.е. код вида:

   function pm_onClickEvent (ev) {
      if (!ev.target || !ev.target.parentNode) {
         return;
      }

      var target = jQuery (ev.target);

      if (!target.hasClass ("list-element")) {
         target = target.parents (".list-element");
      }

      if (target.isEmpty ()) {
         return;
      }

      di_model.changeState (
         target.attr ("forum-id"),
         target.attr ("topic-id"));
   }

, простой и прямолинейный.

Может быть это какой-то локальный баг Presto и я зря тут панику развожу. С другой стороны, странно, что о нём никто не знает, будто никто подобных приложений ранее не писал.
No. 21752    
>>21747

В твоём обработчике есть 2 выхода.
1. Если ивент таргета нет вообще
2. Если ивент таргет не соответствует селектору, и у него нет родителей, соответствующих селектору.

В рамках (2) происходит поиск родителей. Но он происходит таким образом, что вернет тебе массив или объект-массив:

target = target.parents (".list-element");


А ты никак его не раскрываешь и передаешь его дальше своей модели как есть. Естественно, аттрибутов forum-id и topic-id у такого элемента не будет, и обработчик не сработает.

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

А еще, пусть это не совсем относится к делу, но если судить по коду, то у тебя странная проверка таргета на пустоту. Если ты конечно не добавил её сам через .prototype и не менял код перед постингом, но зачем

target.isEmpty ()


Как бы в jQuery это делается jQuery.isEmptyObject(a), и таргет там для корректной работы надо раскрыть до нативной ноды а не завернутой jQuery-ноды, поэтому оно должно выглядеть как jQuery.isEmptyObject(target[0]) что передаст туда или нативный массив, или нативный таргет (т.к. у тебя оба завернуты в jQuery)

Сообщай, удалось ли найти проблему, или нет.
No. 21755    
>>21752
Ну, согласно документации https://api.jquery.com/attr/
>.attr( attributeName )
>Get the value of an attribute for the first element in the set of matched elements.
Далее, по https://api.jquery.com/parents/
>.parents( [selector ] )
>the elements are returned in order from the closest parent to the outer ones.
Так что, сколько бы элементов в листе не было, аттрибуты возьмутся у ближайшего к target'у. Далее, модель выполнит изменение своего состояния и исправно породит событие PropertyChange:State; вьюхи получат это событие и начнут перегружать своё содержимое. Т.е. при любых входных данных будет видимый эффект.

>алсо, лучше юзать parentsUntil
Согласна, логически так лучше. Но пока не обязательно ввиду единственности виджета, использующего такие селекторы.

>у тебя странная проверка таргета на пустоту
Она самодельная, как и, например, hashCode и base64Encode. В jQuery почему-то нет метода для проверки на пустоту списка, а писать каждый раз if (obj.length <= 0) как-то утомительно, запутывающе и просто некрасиво, твой вариант ещё хуже, посему пришлось её добавить плагином.

>что передаст туда или нативный массив, или нативный таргет
А вот и нет. Всегда это будет первый элемент списка jQuery-объекта. В JS же массивы можно делать двумя способами: создавать новый инстанс Array () — var a = []; var a = new Array (); —, или делать хэш с числами в качестве ключей — var a = {0 : 10, 1 : 20 }; с этим связан один забавный кейс и одна неразрешимая проблема. В jQuery используется как раз второй вариант.

>Сообщай, удалось ли найти проблему, или нет.
Пересела на хромую Оперу, пока всё работает. Если проблема здесь не проявится, придётся, видимо, смириться.
No. 21761    
>>21733
Да легко: https://bitbucket.org/Milfie/imgboardfrontend/ Больше не сделанного, чем сделанного.
No. 21774    
155433875992.png-(67.75KB, 583×138, Безымянный.png)
21774
Просто хочу поделиться и напомнить, что так не надо.
No. 21775    
>>21774
Что и почему?
No. 21791    
155452949893.jpg-(116.71KB, 1920×1080, 2018-07-11_Jul4001-3840x1080.jpg)
21791
>>21775
мимопроходил
Вероятно, тег инбут внутри блочного и submit как подтверждение. Ставлю на последнее 10 поникоинов.
No. 21792    
>>21791
IMHO, поведение при action="" не определено.
No. 21793    
>>21792
Таки там нужно что-то указывать, если обработчик в другом файле.
>>21775
Абзац внутри формы, почему-то заменяющий label.
No. 21794    
15545582268.jpg-(182.31KB, 1064×1020, 02 - 1064x1020@32 [SIGa21826b1aa05c835064da8a80615.jpg)
21794
Что вы имеете сказать про OpenShift от шапок: https://www.openshift.com/ ?

>>21793
Согласно стандарту HTML, правда не помню, какому именно, то ли 4, то ли 5, пустой action имеет неопределённое поведение, точнее, implementation defined behaviour, т.е. результат отправки такой формы непредсказуем в общем случае. Лиса, например, такую форму просто сбросит в исходное состояние.
Btw, это имеет мало смысла, если submit event обрабатывается внешним обработчиком; у меня, например, форма шлётся ajax-ом, ему всё-равно, какой там action в форме. Ну и сама форма при использовании JS-фреймворков имеет мало смысла, там везде <input data-link="name" /> и прочие биндинги.

>Абзац внутри формы, почему-то заменяющий label
О, Господи!.. Я с таким сталкивалась только когда надо было отображать HTML в Swing-овом JEditorPane, который умеет только HTML3.2 — там тоже есть куча странных тэгов, которые никому не нужны, но хотя бы нет поддержки CSS. Непонятно, зачем вообще сейчас лепить кучу тэгов, отображение которых полностью описывается в CSS?
No. 21795    
>>21794
Можно вообще одни div'ы с input'ами писать.
No. 21799    
155472307949.jpg-(631.81KB, 1280×1024, 33 - 1280x1024@32 [SIG3eb27cf6fc26b448f19d603c9d1f.jpg)
21799
https://www.cyren.com/blog/articles/over-one-third-of-malware-uses-https
Secure != Safe, you know?

https://www.globalsign.com/en/blog/what-is-ssl-inspection/
https://github.com/jsha/minica
Вопрос вот в чём: объясните дуре, как в пределах локалхоста стать авторитетным батей и насколько это будет затратным по CPU? Как я понимаю, для каждого сайта надо генерировать новый сертификат, но это вроде бы не быстрая операция (хотя можно сертификаты кэшировать, конечно). Или проще будет совсем не шифровать контент?
No. 21800    
>>21799
Чего ты хочешь этим добиться и каким образом?
> для каждого сайта надо генерировать новый сертификат, но это вроде бы не быстрая операция
Если генерировать использующий ECC сертификат или слабенький RSA1024, то достаточно быстрая.
No. 21802    
>>21800
SSL Inspection посредством локальной прокси. Мне не очень понятно, как сделать взаимодействие между защищаемым клиентом и проксей, а статей на эту тему мало. Прокся при CONNECT должна ответить OK и сгенерить для запрашиваемого сайта сертификат, далее притворятся, что она и есть тот самый сайт, так?
No. 21806    
>>21802
Сначала связаться с запрашиваемым сайтом, а потом уже ответить OK. Почему для твоего сценария использования не подходит прозрачный MITM? Если ты не запретишь исходящий TLS-трафик не на порт твоего HTTP-прокси, то он останется не проинспектированным.
No. 21808    
>>21806
Так я и говорю про MITM. Обе стороны общаются с проксей думая, что общаются друг с другом. Единственная проблема — надо заморочиться с локальным центром сертификации и руками устанавливать корневой сертификат в каждую дырку. У меня вопрос, в общем-то, — что надо сделать, чтобы стать валидным CA в пределах локалхоста? Функционала этой https://github.com/jsha/minica программы будет достаточно, или нужно ещё что-то сделать?
No. 21809    
>>21808
Под "CONNECT" ты имеешь в виду не HTTP-метод CONNECT?
> что надо сделать, чтобы стать валидным CA в пределах локалхоста?
Воспользоваться программой sslsniff и добавить свой корневой сертификат в доверенные.
No. 21810    
>>21809
Ты знаешь ещё какой-то CONNECT в контексте HTTP, который так пишется?

>Воспользоваться программой sslsniff и добавить свой корневой сертификат в доверенные.
>If you were, for instance, able to obtain a CA certificate somehow
Ну и где мне надыбать этот корневой сертификат для локалхоста, распотрошть програмулину на GO и сделать также, как там?
No. 21812    
>>21810
Тогда по какой причине ты хочешь прокси на уровне HTTP без поддержки других протоколов, которые могут работать поверх TLS?
> где мне надыбать этот корневой сертификат для локалхоста
Сгенерировать, например с помощью команды "openssl req". Sslsniff сама не генерирует корневой сертификат, его предоставляет пользователь.
No. 21813    
>>21812
>Сгенерировать, например с помощью команды "openssl req".
Вот так вот просто: я генерю сертификат и становлюсь локальным центром авторизации всего и вся, Яндекса, Гугла, Неба и Аллаха? Тогда какого беса люди платят им — https://www.globalsign.com/ — сотни баксов за локальные корневые сертификаты, раз их может сгенерировать штатный одмин?
No. 21814    
>>21810
>>21813
Поскольку чую, что вы уже почти распалились до степени, когда просто начнете выяснять друг с другом отношения, то напомню, что для этого есть отдельная Диспутов нить >>/dev/21353
No. 21815    
>>21814
Ты бы по теме лучше чего рассказал.
No. 21820    
>>21813
Не знаю, что у них за услуга. Для доверия самому себе печать сторонней организации не нужна. Браузеры должны игнорировать public key pinning, если цепочка доверия тянется к установленному пользователем корневому сертификату, поэтому это тоже не должно быть препятствием.
No. 21821    
>>21820
То есть никаких проблем с самодельным бессрочным корневым сертификатом быть не должно. Остаётся только хранилище выписанных сертификатов, но это уже программная проблема.

Тогда ещё вопрос: Надо ли обеспечивать устаревание выписанных сертификатов?

>Не знаю, что у них за услуга.
Насколько я поняла, они решают проблему устаревания корневого сертификата, за что и просят несколько сотен баксов в месяц. Опять же, вопрос: устаревание корневого сертификата — это чисто организационное мероприятие, или есть ещё технические нюансы?
No. 21822    
155512572864.jpg-(153.22KB, 664×900, Sakuraba_Milfeulle_full_4043.jpg)
21822
https://github.com/spring-projects/spring-boot/issues/2612#issuecomment-401264199
Как разрешить эту дурацкую проблему? Лепить костыль в ServletContextListener для каждой базы?
No. 21823    
>>21822
Ну, отчасти костыль уже напилили в текущем коде драйверов (тот же PostrgreSQL), добавив метод deregister, который не только отцепит драйвер от драйвер менеджера, но и обеспечит правильное внутреннее состояние драйвера, чтобы тот мог зарегистрироваться потом снова. Соответственно, всё что тебе надо сделать - вызвать такой метод в contextDestroyed. И скорее всего так сделать будет быстрее всего, берешь драйвера которые пользуешь, и в пару строк кода отцепляешь их.

В то же время, можно поступить как авторы драйвера MySQL, и создать драйвер без внутреннего состояния, жизнью которого полностью управляет DriverManager снаружи. Для этого в MySQL создали сначала класс NonRegisteredDriver, куда вынесли код драйвера, выбросив регистрацию в менеджере за борт, а потом уже от него отэкстендили "просто" драйвер, который регистрируется в менеджере.

Если есть время, то можно сделать аналогичный код драйвера для своей базы данных. Таким образом ты сделаешь больше, чтобы потом делать меньше, и также сможешь отправить авторам этот код в виде контрибьюшена. Кстати, может уже кто-то отправил им подобный патч, и можно его позаимствовать
No. 21825    
15553506924.png-(150.40KB, 640×480, 44 - 640x480@32 [SIG455f7546fc53b7465cf9b057eb8ff2.png)
21825
Всё-таки metaspace memleak вызывал org.jboss.logging (https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging), зря я драйвера ругала, их Tomcat сам дерегистрировать умеет. Откат на Hibernate 3.6.x — никаких OOM. Чего теперь делать-то, запихать логгер в %CATALINA_HOME%\lib, вдруг поможет?

З.Ы.: Оставлю толковый гайд по поиску утечек в metaspace: https://habr.com/ru/post/222443/
No. 21830    
>>21825
>запихать логгер в %CATALINA_HOME%\lib
Таки да, и в pom.xml эксплицитно его прописать со scope = provided. Редиски редхатовские...

>>21823
Проще всего будет настроить dataSource на сервере и цеплять его из JNDI как абстрактный java.sql.DataSource. Если это не вариант, то дальше надо наделать костылей: 1) для пула соединений — закрыть все открытые соединения; 2) для драйвера, если он требует каких-то телодвижений, совершить их; 3) собственно дерегистрация — получить загрузчик классов приложения и список драйверов, дерегистрировать только те из них, что загружены приложением; 4) потупить пару секунд. И то это не везде работает. Каких-то других решений отыскать не удалось, у каждого просто есть набор таких костылей, который пихается в каждое приложение.

Остальные подходы, указанные тобой, требуют налаживания контакта с разработчиками — это не всегда завершается успехом: шапки подобные баги (memleak on redeploy) тупо закрывают с “Won't Fix”, например.
No. 21831    
Выгодно ли изучать пролог?
No. 21832    
155545903956.png-(64.27KB, 1978×726, Безымянный.png)
21832
Есть два запроса, в одном синтаксическая ошибка, другой работает. Первый - с ошибкой - написан так, как предлагает phpMyAdmin, второй - с использованием кавычек вида 'а не ` с w3school. Почему так и как мне набирать эти вот ' с клавиатуры? А то постоянно приходится держать открытой вкладку и копировать с неё.
Ну или может где-то какая-то другая ошибка?
No. 21833    
>>21832
Так, что это за кавычки понятно, по коду символа - обычный апостроф. Не понятно почему.
No. 21834    
>>21832
В общем случае обратным апострофом обозначаются имена таблиц и колонок, для строковых литералов используют ' и ".
No. 21835    
>>21834
Имена таблиц и полей интерпретатор из без кавычек понимает, а значения только закавыченные? Интересно. Ну ладно. Спасибо.
No. 21836    
155547731782.gif-(44.17KB, 700×608, 52 - 700x608@32 [SIGd0db8bf6dfe03aa5082108da00f0cc.gif)
21836
>>21834
В общем случае стандартом определены двойные кавычки ["] для идентификаторов и одинарные кавычки ['] для литералов. Обратный апостроф является специфичным для MySQL и может быть отключён в настройках. Если предполагаются миграции в будущем, крайне не рекомендуется привязываться к product specific features.

З.Ы.: https://github.com/ronsavage/SQL/blob/master/sql-99.bnf

>>21835
>Имена таблиц и полей интерпретатор из без кавычек понимает
Только если они не являются ключевыми словами самого языка, иначе надо экранировать. Литералы, в свою очередь, определены через одинарные кавычки.
No. 21837    
Охаё-.

Пишу на Octave (GNU GPL косплей Matlab'а) тулзу для пакетной обработки файлов. Файлы бывают двух типов: с прописанным в имени расширением и без. Для второго случая предусмотрен чекбокс "добавить расширение". Если он выбран, то тулза пытается определить тип файла по его сигнатуре и добавляет в конец имени соответствующее расширение. Если же опция не выбрана, то имя файла не меняется, т.е. остаётся без расширения.

Собственно, вопрос: как правильно реализовать обработку нажатия/ненажатия чекбокса? Я пока додумался до двух вариантов:

Вариант №1.
Просто добавить в главный цикл проверку на нажатый чекбокс, т.е.:
for i=1 to количествоФайлов

    if checkBox
        // чекбокс нажат
        определить_расширение(файлы(i)) // вызываем функцию определения расширения по сигнатуре
    end
    // тут выполняем необходимые операции над i-тым файлом
end

Недостаток этого подхода очевиден: проверка встроена в тело цикла. Если файлов 9000, то будет 9000 бессмысленных проверок на нажатый чекбокс. Не оптимально.

Вариант №2
Сделать две практически идентичных функции, только одна будет вызываться в случае нажатого чекбокса, а вторая — в случае снятого. Всё отличие между кодом функций будет заключаться в том, что в первом случае в цикле ещё будет строчка "определить_расширение(файлы(i))".

Тогда не теряем в быстродействии за счёт отсутствия лишних проверок в цикле. Но две (почти) идентичных функции — тоже как-то избыточно. Или это нормальная практика?

Существует ли более элегантное решение, чтобы функция была одна, но проверка осуществлялась вне тела цикла? Спасибо.
No. 21838    
>>21837
checkBox — это вызов функции или переменная? Если второе, то париться явно не стоит. Если первое, то закэшируй значение в переменной.

>Не оптимально.
Это premature optimization: выводы о том, что надо оптимизировать, делают по результатам профилирования.

>Или это нормальная практика?
Посмотри код любой числодробилки на C/C++, обрети просветление.

>Существует ли более элегантное решение
В конструкторской и проектной деятельности нет такого понятия, как «элегантность» за пределами области дизайна. Т.е. элегантным может быть внешнее оформление прибора или здания, но кишки всегда функциональны. В языках вроде Ada и Java ты можешь накорячить статическую диспетчеризацию — это приведёт к использованию дополнительной памяти и процессорного времени, — но какую проблему она будет решать?
No. 21839    
>>21838
Я благодарен тебе за то, что ты нашёл время написать ответ, но, извини, он мне кажется абсолютно бесполезным и не по существу.

Не нужно быть сверхмозгом, чтобы понять, что каждая дополнительная проверка в основном цикле будет замедлять скорость работы кода (тем более при выполнении на интерпретаторе, коим является Matlab/Octave).

В Matlab/Octave есть встроенный инструмент для бенчмарков — конструкция tic...toc. Если обернуть любой код в эти операторы, то интерпретатор замерит время его выполнения. У меня скрипт почти готов, поэтому было даже интересно провести эксперимент. Я добавил в цикл пустое сравнение, и вот результат при обработке 1000 файлов:
  • со сравнением: 6.75239 seconds
  • без: 6.16035 seconds
Казалось бы, 0.6 секунд, что такого. Но: представь, во сколько раз эти 0.6 секунд растянутся, если запустить тот же код на машине уровня 486. Или если файлов банально будет в 10 раз больше. Ни первое, ни второе мне сейчас не грозит, но нет никаких гарантий, что аналогичная проблема не всплывёт потом в каком-нибудь проекте — там, где это будет уже критично несколько лет назад пришлось писать под i8081, так что это не просто сферическая ситуация в вакууме. Поэтому хочется добавить в свой арсенал паттерн, чтобы в будущем уже на этом не спотыкаться.

> Посмотри код любой числодробилки на C/C++, обрети просветление.
Буду благодарен за конкретные ссылки.

Про элегантность: это просто общепринятый жаргон. Используется, в частности, математиками — ещё часто говорят «красивое» решение (т.к. обычно задачу можно решить несколькими способами; элегантным считается решение с наименьшим количеством шагов или каким-нибудь «трюком»). Программисты старой школы употребляют слово «хак». В моём случае «элегантное» решение должно одновременно обладать двумя свойствами: а) существовать без копипасты одного и того же куса кода; б) не влиять на скорость выполнения цикла.

> checkBox — это вызов функции или переменная?
Булева переменная. Состояние чекбокса (нажат/не нажат). Думал, это понятно из контекста.
No. 21840    
>>21837
>Вариант 2
>Тогда не теряем в быстродействии за счёт отсутствия лишних проверок в цикле. Но две (почти) идентичных функции — тоже как-то избыточно. Или это нормальная практика?

Зависит о скольки строках кода в функциях идет речь, конечно. В общем в случае когда у тебя есть функция 1, которая делает А, и функция 2 которая делает А+Б, то вызов одной заворачивают в другую. Но насколько понимаю, в твоём случае, обе функции представляют из себя цикл прохода по файлам с вызовом каких-нибудь обработчиков, и отличие второй функции - в дополнительном обработчике. Т.е. если ты хочешь повторно использовать код, тебе надо как-то устроить доставку обработчика в тело цикла. И для этого в Octave в целом есть способ, тебе надо этот обработчик передавать параметром в основную функцию, используя function handle:

https://octave.org/doc/v4.2.2/Function-Handles.html

Таким образом, твоя функция с циклом всегда должна ждать аргумент с доп. обработчиком. Но если чекбокс выставлен - ты передаешь настоящий обработчик. А если чекбокс не выставлен - ты передашь пустую функцию. Это решит задачу повторного использования кода, но нужно замерить, на сколько повлияет на быстродействие вызов пустой функции. Всё таки у тебя есть заметная разница по времени уже на 1000 итераций. Алсо, надеюсь ты замеры делаешь по Х раз и потом усредняешь
No. 21841    
>>21839
Вопрос был, напомню:
>как правильно реализовать обработку нажатия/ненажатия чекбокса?
У чекбокса два состояния — включено и выключено. Правильная обработка покрывает оба состояния, что и сделано у вас в коде.

Проблема в чём? Правильно написанная программа — это программа, которая компилируется и работает как надо, т.е. не имеет синтаксических и семантических ошибок. У вас программа компилируется? Работает как надо? Всё, выдыхайте.

>Буду благодарен за конкретные ссылки.
http://www.di-mgt.com.au/bigdigits.html например.

>>21840
>передавать параметром в основную функцию, используя function handle
Это и называется статической диспетчеризацией. Непонятно только, зачем этот огород с вызовами подпрограмм городить, если ему просто if жмёт — оно быстрее-то работать не будет.
No. 21842    
>>21836
Уровень поддержки стандарта уже product-specific. Пользователь phpmyadmin же с мускула долго не слезет.
No. 21843    
>>21842
Где те вендоры, что забивали на стандарт, сгинули в аналах истории? И кому сейчас нужен голый QueryLanguage без поддержки существующими ORM-фреймворками? Так что хочешь-не хочешь, а уровень должен быть достаточный.

>Пользователь phpmyadmin же с мускула долго не слезет.
Это уж ему решать.
No. 21845    
>>21840
Огромное спасибо за конструктивный ответ! Я интуитивно понимал, что что-то такое должно существовать, но не знал, как называется, и как это нагуглить. Могу в процедурное программирование, но как только начинаются всякие классы-указатели-конструкторы, то вступаю на неизведанную территорию.

> Но насколько понимаю, в твоём случае, обе функции представляют из себя цикл прохода по файлам с вызовом каких-нибудь обработчиков, и отличие второй функции - в дополнительном обработчике.
Ты всё понял правильно.

> Таким образом, твоя функция с циклом всегда должна ждать аргумент с доп. обработчиком. Но если чекбокс выставлен - ты передаешь настоящий обработчик. А если чекбокс не выставлен - ты передашь пустую функцию.
Благодарю за объяснение. Попробовал написать простейшую тестовую программу по этому принципу — разобрался. Конечно, смущает бесполезный вызов пустой функции, но, возможно, интерпретатор Octave умеет как-то это распознавать и в реальности ничего не вызывает. В любом случае, будет интересно поэкспериментировать. Да, для чистоты эксперимента, разумеется, буду делать несколько замеров.

Ещё раз спасибо за ответ "в точку"!

>>21841
> Работает как надо? Всё, выдыхайте.
Всю жизнь именно таким подходом и руководствовался, но недавно решил чуть строже к себе относиться, поэтому теперь стараюсь хоть иногда критически задумываться над своими решениями "в лоб". Даже если в этом проекте в итоге не применю эту фичу, то всё равно было полезно узнать о её существовании. За термин "статическая диспетчеризация" спасибо, хотя беглое гугление показало, что её в основном обсуждают в контексте языков, на которых я вряд ли когда-либо буду писать (Java, Swift, C#, etc).
No. 21847    
>>21845
>Всю жизнь именно таким подходом и руководствовался, но недавно решил чуть строже к себе относиться, поэтому теперь стараюсь хоть иногда критически задумываться над своими решениями "в лоб".
А меня всю жизнь учили считать, в частности, в процентах. Поэтому я посчитала и обнаружила, что вы в работающей программе под среду выполнения, специализированную для математиков, боретесь за ~5 % производительности, т.е. как-то выбиваетесь из категорий студент-с-курсовой и вкатывальщик-с-пет-проектом. Если вас волнуют такие малые значения прироста производительности, было бы неплохо поделиться с тредом доходами от бизнеса за product-specific optimizations.
No. 21848    
>>21845
Обязательно сообщай о результатах, мне тоже интересно. Особенно, будет ли вызов пустой функции дороже условия.
No. 21849    
>>21837
>Не оптимально.
Ты обрабатываешь файлы. Доступ к диску - это миллисекунды. За одну миллисекунду ты таких проверок можешь сделать несколько миллионов. Более того, при каждом доступе к файлу тебя ось будет помещать в сон, пока диск работает.
>>21839
>нет никаких гарантий, что аналогичная проблема не всплывёт потом в каком-нибудь проекте
Вот когда всплывёт, тогда и будешь думать.
>>21848
Вообще, должно быть. Потому мне сложно представить вм, где вызов функции был бы легче проверки условия.
No. 21851    
Ой, сколько мой небольшой вопрос внимания привлёк. Неловко даже как-то.

>>21847
> Если вас волнуют такие малые значения прироста производительности, было бы неплохо поделиться с тредом доходами от бизнеса за product-specific optimizations.
Смешно. Я пишу исключительно для себя, в качестве хобби, попутно обучаясь чему-то. Причина, по которой я обратил внимание на такую мелочь в том, что хочу привыкнуть создавать качественный код. Надо же как-то развиваться.

>>21848
Хорошо. Но я тут подумал, что, скорее всего, реализовать этот дополнительный обработчик без входных параметров не получится (а, возможно, придётся и возвращать что-то). Т.о., на вход "пустой" функции всё равно придётся скармливать какие-то данные, пусть внутри неё они никак не будут использоваться. Поэтому, вероятнее всего, >>21849-кун окажется прав.

>>21849
> Вот когда всплывёт, тогда и будешь думать.
Так он и всплыл, я благодаря этому услышал разные точки зрения, и в следующий раз уже не буду обращаться за помощью сообщества. Это же хорошо.
No. 21857    
155577653627.png-(2.37KB, 90×50, java.png)
21857
У меня очередной глупый вопрос!

Кто-нибудь в курсе, как расставляются приоритеты для резолверов в org.springframework.web.servlet.view.ContentNegotiatingViewResolver#viewResolvers в случае, когда имеется более одного резолвера, готового отдать представление? Я сделала через свойство "order" (org.springframework.core.Ordered), но мне кажется, что это какой-то product-specific хак и гарантии его работоспособности с другими версиями фреймворка нет. В документации этот момент как-то опущен: вроде нигде не написано, что так делать нельзя, но нигде и не написано, что так делать стоит.
Удалить сообщение []
Пароль  
[Mod]