Ычан: [d | au / b / bro / hr / l / m / mi / mu / o / ph / r / s / sci / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn / vo]
[Назад]
junior_developer_kobayashi.png - (777.18KB, 720×720)
21641
No. 21641  
Здесь можно получить помощь и консультацию по любому языку программирования, в любой сфере разработки. Не важно, программируете ли вы собственного робота, пишете серверную приблуду, интегрируете чужие API, ковыряете игру, или пытаетесь сделать сайт на Wordpress - если аноним что-то об этом знает, он обязательно поможет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>Подскажите редакторы кода с SSH-терминалом для iPad
>>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  
Clipboard01.png - (58.51KB, 1005×838)
21731
Почему при клике на сложносочинённую кнопочку иногда не поднимается эвент? Стили при этом переключаются, т.е. событие всё-таки обрабатывается. Пикрилейтед, JS, jQuery, обработчик событий каждого модуля для простоты повешен на документ. Систему определить не удалось, в отладчике проблемы как-бы и нет. Меня это раздражать уже начинает.
No. 21733  
>>21731
А можешь код дать? А то причин может быть много и так в лоб рассуждать это безблагодатность
No. 21735  
Clipboard01.png - (118.77KB, 1128×879)
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  
Безымянный.png - (67.75KB, 583×138)
21774
Просто хочу поделиться и напомнить, что так не надо.
No. 21775  
>>21774
Что и почему?
No. 21791  
2018-07-11_Jul4001-3840x1080.jpg - (116.71KB, 1920×1080)
21791
>>21775
мимопроходил
Вероятно, тег инбут внутри блочного и submit как подтверждение. Ставлю на последнее 10 поникоинов.
No. 21792  
>>21791
IMHO, поведение при action="" не определено.
No. 21793  
>>21792
Таки там нужно что-то указывать, если обработчик в другом файле.
>>21775
Абзац внутри формы, почему-то заменяющий label.
No. 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  
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
Поскольку чую, что вы уже почти распалились до степени, когда просто начнете выяснять друг с другом отношения, то напомню, что для этого есть отдельная Диспутов нить >>21353
No. 21815  
>>21814
Ты бы по теме лучше чего рассказал.
No. 21820  
>>21813
Не знаю, что у них за услуга. Для доверия самому себе печать сторонней организации не нужна. Браузеры должны игнорировать public key pinning, если цепочка доверия тянется к установленному пользователем корневому сертификату, поэтому это тоже не должно быть препятствием.
No. 21821  
>>21820
То есть никаких проблем с самодельным бессрочным корневым сертификатом быть не должно. Остаётся только хранилище выписанных сертификатов, но это уже программная проблема.

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

>Не знаю, что у них за услуга.
Насколько я поняла, они решают проблему устаревания корневого сертификата, за что и просят несколько сотен баксов в месяц. Опять же, вопрос: устаревание корневого сертификата — это чисто организационное мероприятие, или есть ещё технические нюансы?
No. 21822  
Sakuraba_Milfeulle_full_4043.jpg - (153.22KB, 664×900)
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  
Всё-таки 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  
Безымянный.png - (64.27KB, 1978×726)
21832
Есть два запроса, в одном синтаксическая ошибка, другой работает. Первый - с ошибкой - написан так, как предлагает phpMyAdmin, второй - с использованием кавычек вида 'а не ` с w3school. Почему так и как мне набирать эти вот ' с клавиатуры? А то постоянно приходится держать открытой вкладку и копировать с неё.
Ну или может где-то какая-то другая ошибка?
No. 21833  
>>21832
Так, что это за кавычки понятно, по коду символа - обычный апостроф. Не понятно почему.
No. 21834  
>>21832
В общем случае обратным апострофом обозначаются имена таблиц и колонок, для строковых литералов используют ' и ".
No. 21835  
>>21834
Имена таблиц и полей интерпретатор из без кавычек понимает, а значения только закавыченные? Интересно. Ну ладно. Спасибо.
No. 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  
java.png - (2.37KB, 90×50)
21857
У меня очередной глупый вопрос!

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

https://anonfile.com/q478M6g4n1/contol_job_3_zip

Спасибо АИБ
No. 21863  
>>21857
Мне кажется, это всё же покрывается в мануале, в главе Chaining Resolvers:

>Spring supports more than just one view resolver. This allows you to chain resolvers and, for example, override specific views in certain circumstances. Chaining view resolvers is pretty straightforward - just add more than one resolver to your application context and, if necessary, set the order property to specify an order. Remember, the higher the order property, the later the view resolver will be positioned in the chain.

Т.е. самим зарегистрированным в ContentNegotiatingViewResolver резолверам ты точно так же выдаешь приоритет через конфигурацию
<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">

  <property name="order" value="1"/>

или из кода, как сделал ты.

Также в референс-мануале по методу setViewResolvers у ContentNegotiatingViewResolver говорится, что

>Sets the view resolvers to be wrapped by this view resolver.
>If this property is not set, view resolvers will be detected automatically.

Что полностью подтверждает легитимность идеи использовать проперти order для вью резолвера.

Также я вижу, что приориетность по Ordered крайней широко используется в самом спринге: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/Ordered.html

Думаю никакому серьезному риску, используя Ordered, ты себя не подвергаешь.
No. 21864  
>>21863
>Мне кажется, это всё же покрывается в мануале, в главе Chaining Resolvers:
Ну, если пользоваться обычным для Джавы способом получения информации (т.е. JavaDocs & sources), то пробежав по цепочке Ordered -> OrderComparator -> AnnotationAwareOrderComparator -> [Find usages] -> CNVR можно обнаружить, что список viewResolvers сортируется в CNVR#initServletContext при помощи AnnotationAwareOrderComparator — т.е. (hint!) чтобы эта магия работала надо в кастомный резолвер заимплементить интерфейс Ordered, — а сам CNVR#resolveViewName просто вернёт первый попавшийся резолвер из списка резолверов для первого попавшегося MIME-типа из списка MIME-типов взятого из заголовка Accept. Вот этого в документации (по крайней мере в JavaDocs) и нет.
No. 21870  
1. Функция, которая принимает указатель на число:
void get_screen_size( int *width, int *height );

2. Функция, которая принимает указатель на строку:
enum error_status get_string_from_user( char **result );

3. Функция, которая принимает указатель на массив строк:
int split_command_line( char ***result );

4. Функция, которая принимает указатель на массив хендлов строк:
??? do_what?( char ****result );

5. Функция, которая ??? ??? ?
6. ???
No. 21871  
>>21870
Это не вопрос.
No. 21872  
Я в реальном проекте (правда на плюсах) видела, как int хранили в структуре в виде массива byte-ов и при каждом обращении тупо кастовали byte[] в int. Наверное, этому есть какое-то разумное объяснение.

>>21870
А что удивляет, что можно сделать ссылку на ссылку и ссылку на объект, аллоцированный на стеке?

type Access_String is access all String;
type Access_Access_String is access all Access_String;
... e.t.c.

No. 21873  
А вот если у нас есть, например, операционная система, и она хранит, например, список имён, импортируемых программой из определённой библиотеки, в массиве. И хранит она не строки, а хэндлы. И весь импорт программы получается массивом массивов хендлов. И тогда функция, которая их возвращает (вместе в размером первого массива) будет иметь вид
enum error_code get_imports( char *****result, int *length );

Хотя и немного притянуто за уши, конечно. А вот шесть - тут уже всё. Видимо пятизвёздочный код - это as far as one can go.
>>21872
Самое очевидное - им нужен был более удобный доступ к отдельным байтам. Структуру можно всё ещё использовать как число - она автоматически копируется, и всё такое, а чтобы вытащить отдельный байт, не нужно делать сдвиги и маски.
No. 21875  
>>21873
Ой, да вот, держи: функция, которая отрисовывает массив кадров на которых на xy(z)-плоскости надо отрисовывать строки, в каждую точку может быть передан массив хэндлов строк, по указателю.
char****(*)***

No. 21876  
>>21873
>>21875
Если вы просто хотите что-то обсудить, для этого есть Диспутов нить >>21353
No. 21877  
Clipboard01.png - (166.83KB, 1400×982)
21877
Я спятила и рисую буквы!
Знаете ли вы, что:
1) в штатном шрифте Вакабы буквы “a” и “e” выше букв “c” и “o”, но ниже букв “d” и “k”;
2) штатный рисователь Вакабы не учитывает смещения в результате трансформации символов, поэтому они могут некогтролируемо выходить за границы холста и налезать друг на друга;
3) в Джаве кривой дефолтный рандом-генератор это вам не Ada с вихрем Мерсена;
4) можно изменить цвет капчи указав для captcha.pl параметр “selector” в GET-запросе, который содержит имя CSS-селектора в текущем стиле.

А вопросы вот какие:
1) насколько харамно использование ResponseEntity<E> во всём контроллере? Ну, мне так удобней просто коды ответа проставлять.
2) верно ли, что каждый микросервис должен иметь собственную базу с аккаунтами приложений-клиентов?

>>21873
Всё бы ничего, но результирующая переменная называлась width и хранила ширину символа. Всё бы ничего, но разработчик библиотеки решил пойти дальше и в том же массиве сохранял бинарные данные этого символа.
No. 21878  
Принесла вам тут краткий гайд по формату GIF с картиночками: http://home.onego.ru/~chiezo/gif.htm

>>21877
>Знаете ли вы, что:
5) в штатном gif-ассемблере Вакабы есть редко появляющийся баг, вызванный тем, что байт конца графического блока принимается за часть последнего графического субблока.
No. 21880  
Стив, поясни про JAX-WS. Мне почему-то кажется, что он немного мёртвый. Или это его нормальное состояние?
No. 21881  
Я спрошу тут, если можно.
Допустим, я с помощью симметричного шифрования хочу зашифровать огромный архив с моими данными. Это достаточно надёжно? Насколько я понимаю, всё шифруется по какому-то сложному алгоритму типа RSA и используется один пароль для зашифровки и расшифровки. Использую gpg
No. 21883  
>>21881
Вопросы, не имеющие прямого отношения к разработке ПО, лучше задавать в /s/.
> Насколько я понимаю, всё шифруется по какому-то сложному алгоритму типа RSA и используется один пароль для зашифровки и расшифровки.
Конкретно RSA используется не для симметричного шифрования. По умолчанию для симметричного шифрования gpg использует AES-128 или CAST5. Да, один пароль для шифрования и расшифровки, но для реальной безопасности в наше время он должен быть очень длинным, то есть это должна быть "парольная фраза". Я рекомендую использовать пароли с энтропией не менее 200 бит (например не менее 15 выбранных гарантированно случайным образом слов из словаря, причём вероятность выбрать любое слово должна быть одинаковой).
> Это достаточно надёжно?
Если у тебя архив больше 4 гигабайт, то не используй шифры, оперирующие 64-битными блоками (это, в частности, CAST5, 3DES, Blowfish), потому что они подвержены birthday attack при использовании одного и того же ключа для таких больших объёмов данных. Практически реализуемые атаки на остальные используемые в gpg симметричные шифры в открытой литературе не описаны. Шифры с длиной ключа 128 бит могут быть взломаны квантовыми компьютерами лет через 10. Если важна безопасность на более долгий срок, то лучше использовать шифры с длиной ключа не менее 256 бит. GnuPG сам по себе не обеспечивает plausible deniability и защиту от утечки твоего пароля через кейлогеры, электромагнитное излучение клавиатуры, звук нажатий, наводки в электрической сети и другие подобные каналы.
No. 21884  
>>21883
> Вопросы, не имеющие прямого отношения к разработке ПО, лучше задавать в /s/.
Смысл? Там сидят 3,5 человека, которые спорят в одном треде, хорош линукс или плох. Тут хотя бы знающие люди есть. Извиняйте, что ворвался в ваш уютный тред.
No. 21886  
>>21883
>квантовыми компьютерами лет через 10
Сразу после того как помрёт флеш и настанет год десктопного линукса.
No. 21910  
461148019.png - (326.99KB, 1024×768)
21910
Анекдот про математика и устойчивость стула...
Как сделать регистрацию новых пользователей и их авторизацию в приложении средствами Java EE 7 без использования сторонних фреймворков вроде Spring Security или Shiro и без привязки к конкретному серверу? Иными словами, можно ли родить универсальное plugable решение, когда приложение и его база от сервера не зависят? Я уже который день хожу вокруг да около и всё никак не пойму, как развёртывать это Security. Просто таскать с каждой фитюлькой на пару килобайт ~20 MB Spring-овских зависимостей не хочется.
No. 21916  
>>21910
Чего нашла: https://arjan-tijms.omnifaces.org/2012/11/implementing-container-authentication.html — enterprise, бессмысленный и беспощадный.
No. 21947  
Кому делать нечего помогите запилить свою имджборду на 000webhost.com. Пытался по гайдам в инете, но, не зря я тут сижу же. Если не хотите общатся тут, так и напишите, дам почту или телегу. Если кто-то заинтересуется могу описать проблему детальнее
No. 21951  
Что-то вкладочек открытых накопилось...

https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/index.html — книжечка по REST-сервисам в Java EE 7.

>>21916
Основная фича JASPIC — это отсутствие состояния, таким образом он отлично подходит для контейнеронезависимой реализации системы аутентификации REST-сервисов. Сессии, если они нужны, надо включать ручками в реализации ServerAuthModule#validateRequest: https://arjan-tijms.omnifaces.org/2013/04/whats-new-in-java-ee-7s-authentication.html

https://stackoverflow.com/a/31314790 — два подхода к реализации кастомной JASPIC-системы аутентификации. Пример от Ораклов для второго подхода: https://docs.oracle.com/cd/E19798-01/821-1752/gizeb/index.html
No. 21958  
Как решается проблема коллизий в Object.hashCode () когда надо получить уникальный идентификатор объекта в пределах JVM? Одной девочке вот такое вот в голову пришло:

this.uniqueId = ((((long) System.identityHashCode (this)) & 0xFFFF_FFFFL) |
                (System.currentTimeMillis () << 32)) & 0x7FFF_FFFF_FFFF_FFFFL;

No. 21959  
>>21958
>когда надо получить уникальный идентификатор объекта в пределах JVM
Разве не так?
https://docs.oracle.com/javase/9/docs/api/java/util/UUID.html
No. 21960  
>>21959
К сожалению, он как минимум чисто теоретически может вернуть дубликат тому що UUID.randomUUID (). Ну и не является примитивным типом, что тоже радости особой при работе не добавляет.
No. 21966  
Ладно, Баг с им, с этим багом Java Core since 2005, который won't fix, не баг и вообще мы вам ничего такого не обещали.

Расскажите лучше юз-кейсы для JPA Criteria API: ну сделали типа JPQL в виде функций, а зачем? Всё-равно для любой работы с базой сложнее find, persist, merge, remove надо делать слой DAO, а там хоть plain-text-ом запросы пиши.

>>21951
JPA/SQL:
https://use-the-index-luke.com/sql/clustering/index-only-scan-covering-index — очень дешёвый поиск и очень дорогая вставка. Используется во всех realm-ах (ну, в Tomocat и TomEE точно). Пример из жизни и не очень: https://dba.stackexchange.com/a/188997 Представление составных ключей для JPA (JSR 338 §2.4): https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Composite_Primary_Keys
No. 21971  
Всем привет и добрый вечер. Заранее извиняюсь за флуд, но больше спросить негде.
Вместе с группой решили сделать подарок преподователю алгоритмов и структур данных (сам работает лидом, увлекается тем же что и преподает). Вариантов не так много. Если книгу, то какую (Кормен есть).
Буду рад услышать любые идеи.
No. 21972  
>>21971
>Книгу
Как насчет
https://www.amazon.com/Soft-Skills-software-developers-manual/dp/1617292397
На удивление хорошие отзывы. И там можно чуть-чуть почитать прям с амазона, чтобы понять, ок или нет.
No. 22052  
Можно ли на C без библиотек и ассемблерных вставок вывести в линуксовую консоль текст?
No. 22055  
>>22052
Только без сторонних библиотек или же без стандартной библиотеки среды выполнения C? В первом случае
#include <stdio.h>
и
puts("text")
, во втором в общем случае нельзя, для некоторых архитектур может быть возможно выполнить системный вызов через вызов функции по определённому адресу. Для старых версий ядра в заголовочных файлах поставлялись макросы _syscall для выполнения системных вызовов без стандартных библиотек, но это было давно и не для всех архитектур.
No. 22058  
>>22055
Речь про второй вариант. Правда, я так понимаю, такое положение дел у всех языков высокого уровня?
No. 22061  
>>22058
>c
>высокий уровень
У меня для тебя плохие новости
Но вообще, у любых скриптовых это не так
No. 22064  
>>22061
>c
>низкий уровень
Для тебя у меня тоже нет хороших новостей.
No. 22065  
>>22052
>>22058
>Можно ли на C без библиотек и ассемблерных вставок вывести в линуксовую консоль текст?
>без стандартной библиотеки среды выполнения C

С ходу я вижу условно "простой" вариант это узнать.

1. Взять код функции, которая выводит текст из стандартной библиотеки.
2. Посмотреть, как организован вывод на экран там.
3. Если он сделан без ассемблера - круто, можно позаимствовать. И это отвечает на твой вопрос.
4. Если он сделан на ассемблере - то значит скорее всего без него нельзя. И это тоже отвечает на твой вопрос.
No. 22066  
>>22061
>Но вообще, у любых скриптовых это не так
У любых скриптовых и обкладка ввода-вывода большая.
Стало понимать, любому высокоуровневому языку требуется библиотека ввода-вывода для нормальной работы?
No. 22069  
>>22066
> Стало понимать, любому высокоуровневому языку требуется библиотека ввода-вывода для нормальной работы?
Смотря какое окружение и что понимать под нормальной работой.
> Можно ли на C без библиотек и ассемблерных вставок вывести в линуксовую консоль текст?
Можно сделать это из ядра или драйвера.
No. 22070  
>>22066
Компилятор любого языка и так преобразует выскоуровневый код в "ассемблерные вставки", если printf реализован в языке как оператор, это же не будет считаться библиотекой ввода-вывода? Запись в память по такому-то адресу не требует никаких библиотек, а в контроллере может быть настроен DMA, чтобы выводил любые байты в таких-то адресах на экран.
Так что о чем вопрос вообще? Наличие или отсутствие прослоек - вопрос удобства.
No. 22141  
847184-milfeulle_sakuraba_25.jpg - (167.40KB, 1284×1920)
22141
JavaEE is rock!!! Ooooyuuueeee! https://medium.com/@swhp/playing-with-java-ee-security-jsr-375-soteria-38e8d2b094d4

Btw, у меня семёрка и JASPIC 1.1. Основная каверза здесь состоит в том, что видимо реализованы только AuthStatus.SUCCESS и AuthStatus.SEND_CONTINUE; на остальные значения сервер порождает пустой 200 OK, а для AuthStatus.SEND_SUCCESS не регистрирует сессию. Пришлось всегда возвращать SUCCESS и делать LoginBean с preRenderView листенером, который проверяет результат процедуры аутентификации и делает редирект.

Поскольку мне надо сделать несколько видов аутентификации в одном приложении, пришлось в SAM-е делать auth procedure builder на enum-ах и конфигурялку, в которой описывается, какой метод для каких ресурсов применять. Как всё это тестировать не имею ни малейшего понятия, лол.

>>22052
В Си не предусмотрен интерфейсинг, так что нет. В Аде можно дёргать произвольные системные вызовы предварительно описав их профили в спецификации ну и слинковав с бинарником с реализацией, btw получишь все прелести несовместимости языковых абстракций, что заставит в итоге писать обёртку наполненную доверху Ada.Unchecked_Conversion и долго и нудно её тестировать на предмет UB потому что, там где Си, там UB inb4: диды сорок лет с этим жили и ты живи, не выёбуйся. Хуже того, в Си не стандартизирована процедура передачи управления подпрограмме в смысле нет стандартного способа передачи параметров и возврата результата, значит таких спецификаций надо будет несколько, иначе о кросскомпиляции можешь забыть ну или таскать всё своё с собой, включая исполнителя, по рабоче-крестьянски — виртуальную машину.

>>22066
Любой язык программирования — это абстракция. Мы сначала описываем типы данных, которые будут хранить видимое состояние, потом действия с этими данными, потом семантику действий — т.е. контракты на изменение видимого состояния. Потом сидим и ломаем голову, как реализовать полученный набор спецификаций в реальности а это уже проблема инженеров таких инженеров в мире наберётся штук тридцать-сорок.

Ввод-вывод — это тоже абстракция. Кому-то надо писать в командной строке «Привет, Мир!», кому-то надо писать логи в файл на лог-сервере, кому-то надо гонять объекты через сеть. Стандартный ввод-вывод — это абстракция над абстракцией, такое себе гипер-обобщение способов передачи данных.

Даже int21h — это абстракция.

Чтобы абстракция начала работать, требуется её реализация.

>>22070
Компилятор работает с семантикой, т.е. с контрактами на изменение видимого состояния, которые мы выше придумали и записали в спецификации языка. Как будет реализован контракт — это проблема инженеров: если им проще дёргать printf из libc, значит так тому и быть; если им проще if-then-else сделать коллбэками на том же самом языке, который они компилируют, (такой процесс преобразования одних языковых конструкций в другие называется итеративная компиляция) — значит так и будет. По итогу твой printf оказывается завязан на огромную инфраструктуру и без неё полезен так же, как может быть полезен смеситель без водопровода.
No. 22147  
http://balusc.omnifaces.org/2010/06/benefits-and-pitfalls-of-viewscoped.html#ReallySimpleCRUDNowWithoutDataModel Что-то я очень медленно въезжаю в этот JSF. С одной стороны есть куча туториалов, с другой Балус их все обозвал нехорошими словами. Видимо надо для одного ресурса @ViewScoped контроллер совместить с темплейтами https://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/ и сверху накатить библиотеку ресурсов https://www.mkyong.com/jsf2/resources-library-in-jsf-2-0/ тогда оно заработает. Только вот в контроллере придётся, похоже, описывать конечный автомат, иначе будет неясно, какой шаблон когда грузить.
No. 22150  
вапвапрвапва.png - (13.85KB, 738×281)
22150
Есть вордпресс, на вордпрессе есть редукс, в редуксе есть типография, а в типографии нет выбора шрифта. Можно ли его туда вернуть?
No. 22170  
>>22150
Надо копать глубже, но я подозреваю что какие-то проблемы с данными. Включено использование Google Fonts?
No. 22172  
>>22170
А зачем нужны гуглошрифты, если сами шрифты у меня тут лежат?
No. 22174  
>>22147
https://stackoverflow.com/a/8503788
Оказывается, шаблоны работают по принципу конкретизации абстракций, т.е. надо написать абстрактный шаблон-лайаут, потом каждое представление от него наследовать и переопределять блоки <ui:insert>; а потом делать композицию при поддержке контроллера

<ui:composition>
   <ui:include src="#{controllerBean.activeView}" />
</ui:composition>

, тогда URL ресурса меняться не будет и оно будет как @ViewScoped работать. А я по привычке пытаюсь в шаблон параметры запихать, вот дура-то...

Основная проблема JSF — он не умеет генерировать динамические ресурсы вида /app/user/{id}, может лишь /app/user.xhtml?id={id}, однако при postback-е теряет часть "?id={id}". Но вы можете переопределить ViewHandler.getActionURL (): https://stackoverflow.com/questions/10352641/handling-view-parameters-in-jsf-after-post
No. 22181  
>>22172
Дело не в том нужны они вообще или нет, дело в том как формируется в соответствующем метабоксе дропдаун селект меню со списком шрифтов.

Насколько я помню, там список условий разных, включая использование Google Fonts, кастомных шрифтов, а также просто дефолтного списка «обычных» шрифтов. Очевидно, что в твоем случае оно идет по какой-то из веток условий и обламывается (вероятно) из-за проблем с данными.

Вопрос почему это происходит и как именно. Обычно, подобное склонно случаться когда включены Google Fonts, но их список (который должен выкачиваться по сети и сохранятся в БД ради кеширования) «сломался» в БД. Поэтому, для начала, попробуй включить/выключить Google Fonts и посмотри поменялось ли что-то.
No. 22200  
Друзья, помогите пожалуйста найти исходники функционала gitignore гита. Конкретно конечно интересует как обыгрывается случай double asterisk (**), ну, и в целом.
No. 22204  
>>22200
Насколько я знаю, как такового "исходника" .gitignore нет.
Игнорируемыми по .gitignore файлами рулит untracked_cache в dir.c лучше сначала почитай хедер, dir.h, когда git вычитывает директорию, он заполняет этот кэш, базируясь на 3 типах игноров - из командной строки, из .gitignore, и из подкапотных гитовых игноров. Соответственно, список файлов полученных из директории затем фильтруется по наличию их в этом кеше. Инвалидация кэша случается в нескольких случаях, например по смене SHA-1 подписи .gitignore (что случится при редактировании этого файла)

https://github.com/git/git/blob/master/dir.h
https://github.com/git/git/blob/master/dir.c

Структурка кэша:
https://github.com/git/git/blob/b697d92f56511e804b8ba20ccbe7bdc85dc66810/dir.h#L85
https://github.com/git/git/blob/b697d92f56511e804b8ba20ccbe7bdc85dc66810/dir.h#L127

>Конкретно конечно интересует как обыгрывается случай double asterisk, ну, и в целом.
Сам матчинг происходит в 2х местах, чуть-чуть в dir.c, где отбрасываются явные не-матчи, и в wildmatch.c, где собственно проверяют, матчится ли строка на паттерн:
https://github.com/git/git/blob/master/wildmatch.c

Как видим, здесь в коде в том числе явно идёт обработка single и double-asterisk
Надеюсь, теперь у тебя появилась точка "зацепа" в исходниках гита.
No. 22205  
>>22174
Блеск и нищета JSF 2:
Надо проводить начальную инициализацию controllerBean.activeView в зависимости от наличия в реквесте параметра “id” и его валидности.

<ui:composition> выполняется во время построения (build-time) дерева компонентов.

<f:metadata> и <f:viewParam> c <f:event> выполняются во время рендеринга (render-time) дерева компонентов.

<f:viewAction> появился только в JSF 2.2.

О, есть @PostConstruct

   @PostConstruct
   public void init () {
      clientId = FacesContext
         .getCurrentInstance ()
         .getExternalContext ()
         .getRequestParameterMap ()
         .get ("id");

      if (clientId == null || clientId.isEmpty ()) {
         view = View.LIST_CLIENTS;
      }
      else if (isClientId (clientId)) {
         view = View.VIEW_CLIENT;
      }
      else {
         view = View.ERROR_CLIENT_NOT_FOUND;
      }
   }


Некоторые действия приводят к редиректам внутри одного и того же модуля, т.е. в пределах одного контроллера, и надо передавать параметры при редиректах чтобы обеспечить bookmarkability, однако в JSF это делается косвенно через внутренний параметр "includeViewParams=true". Можно добавить

   <f:metadata>
      <f:viewParam name="id" value="#{controllerBean.clientId}" />
   </f:metadata>

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

Что посоветуете?

>>22200
Двойной астериск в Ant-е означает «любой файл, включая подпапки». Отсюда и пошло.
No. 22206  
>>22181
Ну что ж, я расставил везде 'google' => false, но ничего не поменялось. Нужно будет таки регистрироваться в гугле для получения его ключа?
No. 22208  
>>22204
Спасибо огромное преогромное!
No. 22215  
>>22206
Ну раз установка эта ни на что не повлияла, то остается старый и проверенный способ дебага - расставлять вызовы var_dump(); с передачей туда переменной и убивать дальнейший вывод с помощью die; Просто с целью понять как у тебя формируется список доступных шрифтов и на каком этапе он ломается.

Насколько я могу понять, все дело в типе поля typography из Redux'а, а значит ныряем в inc/fields/typography/field_typography.php и скролим в сторону ~180 строки, где внутри метода render должно выводиться субполе для font-family. Попробуй дампать такие вещи как $this->value['font-options'] и прочие кошерные места, где должны храниться списки доступных шрифтов. Спойлер: там как минимум второй вариант вывода специально для гугла. Копать надо явно туда.
No. 22224  
Clipboard01.png - (104.51KB, 1070×868)
22224
>>22205
В общем, я ничего более путного не придумала, чем в PostConstruct-е получать clientId, выдёргивать объект с этим id и на основании полученных данных решать, чего показывать; а для <f:viewParam> в контроллере сделать костыль в виде пустого setClietId и делегирующего getClientId { return (client == null ? null : client.getId ()); }. При таком подходе хотя бы: а) отпадает необходимость в дополнительном поле у контроллера; б) если передавать объекты между редиректами молнией, можно в PostConstruct-е сверять id-шники и кидать исключение.

>>22174
>Но вы можете переопределить ViewHandler.getActionURL ()
Пикрилейтед. Захотелось авторов стукнуть сковородкой за такие неочевидные умолчания .
No. 22245  
var cookies = [];

document.cookie.split('; ').forEach(function(i) {
    var t = i.split('=');
    cookies[t[0]] = t[1];
});

Можно ли это записать более красивым образом?
No. 22250  
>>22245
Предположу, что ты вычитываешь куки в словарик, чтобы иметь возможность взять куки по имени. Я не уверен насчет "красивее", но в целом брать куки по имени рекомендуют с помощью регекса (как ни странно) и кода в этом случае будет меньше: https://stackoverflow.com/a/25490531
No. 22252  
https://ru.wikipedia.org/wiki/Enterprise_JavaBeans — на русской вики, внезапно, лежит хороший пример generic сервиса.

>>22205
http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/ — интернационализация в JSF. Тут всё элементарно, единственное замечу, что загрузчик пакетов лучше сделать абстрактным и наследоваться от него.

>>22245
Критерии для «красиво» существуют лишь в голове у дизайнера и заказчика. Область проектной деятельности их никак не определяет. Так что посоветую перестать заморачиваться ответами на риторические вопросы, обратиться к объективной реальности и ответить на следующие вопросы:
1. Является ли твой велосипед типовым методом решения данной задачи?
2. Соответствует ли твой велосипед действующим нормативным документам?
3. Имеет ли твой велосипед средства проверки на соответствие действующим нормативным документам?

>>22250
Осталось дождаться того героя, кто напишет тесты на соответствие спецификации, и вуаля!.. у нас родилась кривая библиотека, написанная свалившим в закат сотрудником. Ну или использовать готовое решение, вроде https://ourcodeworld.com/articles/read/647/top-5-best-javascript-libraries-for-cookies-manipulation
No. 22254  
>>22250
Ага, ага, и всякий раз, чтобы просто проверить, есть у тебя там кука или нет, ты этот регексп заново вызываешь. Офигеть…
No. 22255  
>>22245
На самом деле вопрос должен был звучать: можно ли в подобной конструкции обойтись без временной переменной?
Хотелось бы написать что-то вроде:
var my_map = my_list.?????(function(i){return i.split(separator)});

No. 22258  
>>22255
Да, например используя .reduce()
https://www.w3schools.com/jsref/jsref_reduce.asp


const cookies = document.cookie.split('; ').reduce((o, cookiePair) => {
   var kv = cookiePair.split('=');
   return Object.assign(o, {[kv[0]]: kv[1]});
}, {});


Подробнее объяснено тут: https://stackoverflow.com/a/42974762
No. 22275  
https://stackoverflow.com/questions/10740367/jax-ws-client-basic-authentication — баже, какое же го#но этот ваш Спрынг. Напиши ему километр костылей (костыли для костыля), оно само не может... JAX-WS клиент из коробки это умеет, а костыль над ним не умеет.

Ну и как мне теперь заставить его брать wsdl с сервиса, требующего авторизации?

Ещё они и форум свой грохнули; теперь вопросы, выходящие за рамки написания очередного helloWorld-а, например по интеграции с EE-серверами (в частности, по проблемам с JTA — оно на TomEE 7 стартует со второго раза и рандомно падает в кору, я хз почему) ведут на форум Апачей, где советуют выкинуть Spring нахер и не мучиться.
No. 22276  
Безымянный.png - (17.31KB, 749×272)
22276
Новичок в вордпрессе снова на связи и снова с проблемой.
Ситуация следующая. На ванильном JS написан аякс-запрос для получения новых постовсм. рис1. В теле запроса передаётся оффсет, с какого поста передавать. При этом в вордпрессе $_POST остаётся пуст, но сам обработчик срабатывает и посты возвращаются просто без отступа, сразу с первого. Если передавать гетом, но всё нормально. Вопрос: где может быть проблема и как её исправить?
No. 22278  
>>22276
Content-type не тот. Попробуй application/json.
No. 22279  
>>22276
А ты уверен, что проблема вообще в запросе? Но вообще открой в браузере девтулзы, раздел запросов и посмотри что на самом деле передается в запросе
No. 22281  
>>22278
Это фигня, просто тоже была мысль, что дело в заголовках, вот и проставлял руками разные.
>>22279
В заголовках запроса и у лисы, и у хрома длина контента 1, собственно, то, что я и передаю - одно число.
No. 22282  
>>22281
>В заголовках запроса и у лисы, и у хрома длина контента 1, собственно, то, что я и передаю - одно число.

Это указывает на то, что тело запроса неправильное, т.к. JSON-формат предполагает, что в качестве тела запроса ты передаешь, например, объект, в твоём случае что-то типа:

{
  "offset": 1
}

что никак не может иметь длину 1.

Подробнее про параметры:
https://developer.wordpress.org/rest-api/reference/posts/#list-posts
No. 22283  
>>22282
Ну что ж, я использовал JSON.stringify на объекте из твоего поста и послал результат. Длина контента 12.
No. 22284  
>>22283
Что интересно, начали выводиться другие посты, какждый одни и те же впрочем. А длина контента осталась равной 15ти символам, даже когда я задал оффсет трёхзначным числом.
No. 22285  
>>22284
А если оперировать параметрами page и per_page, например:

{
  "per_page": 10,
  "page": 2
}

Тоже будет выводиться одни и те же посты, даже если менять номер страницы?
No. 22286  
>>22285
Всё ещё 15 символов, даже если добавлять новые элементы. Я в тупике.
No. 22287  
>>22286
Ой, нет, извиняюсь, длина контента растёт, просто я открыл посмотреть как я там раньше другой файл и случайно начал туда писать. Но пост всё ещё пуст.
No. 22288  
Господа, а зачем вы считаете символы и смотрите заголовки запросов? Может стоить посмотреть на тело запроса? Как тут уже сказали, далеко не факт, что у тебя уходит запрос корректно вообще. По разным причинам это может быть, тело запроса не то, заголовки не те, что угодно. Но, давай для начала определимся с парой вещей: ты хочешь использовать REST API встроенный в WP? Или ты руками определил AJAX коллбэки на бэк-энде сам и пытаешься работать с ними? В общем, можешь сказать какой у тебя URL запроса примерно? admin-ajax.php или /wp-json/bla-bla-bla?
No. 22289  
>>22275
>Ну и как мне теперь заставить его брать wsdl с сервиса, требующего авторизации?
Походу никак: конструкцией костыля, решающего проблемы 2003-го года, это не предусмотрено. Но у нас есть wsimport -clientjar и ant unzip... первым пакуем клиентскую библиотечку — в ней есть все необходимые описания, — вторым распаковываем библиотечку в дерево исходников; костылю указываем брать WSDL из класспаза.

>>22276
А ты вообще POST-запрос правильно конструируешь? ЁМНИП, его кодировать надо. curl-ом тот же запрос нормально отрабатывает?
No. 22290  
>>22288
>руками определил AJAX коллбэки на бэк-энде сам и пытаешься работать с ними
>admin-ajax.php
Всё так. Надо слать куда-то ещё каким-то другим способом?

>>22289
>А ты вообще POST-запрос правильно конструируешь? ЁМНИП, его кодировать надо.
Возможно, неправильно. Как кодировать?
No. 22291  
>>22290
https://learn.javascript.ru/xhr-forms
Я очень плохо помню ПоХаПе, но вроде бы в $_POST распихиваются только параметры POST-запроса, переданные в первых двух кодировках, т.е. application/x-www-form-urlencoded и multipart/form-data. О том, что туда ещё содержимое JSON должно запихиваться, я первый раз слышу.
No. 22292  
>>22291
Ну про эти кодировки я знаю, просто я же не форму отправляю.
No. 22293  
>// Отсылаем объект в формате JSON и с Content-Type application/json
>// Сервер должен уметь такой Content-Type принимать и раскодировать
xhr.send(json);
Может проблема именно в том, что сервер не принимает jsonиз-за каких-то настроек?
No. 22294  
>>22292
Потому и $_POST у тебя пустой, логично же.
Или одним из двух стандартных способов, или свой фильтр, который десериализацию JSON-а.

>>22293
JSON не входит в стандарт HTTP, посему ни один сервер ваши самоделки поддерживать не обязан. М.б. только в самом WP есть какая-то инфраструктура для этого.
No. 22295  
>>22294
Так джейсон по сути обычная строка, просто сдобренная огромным количеством кавычек. Чё б обычной строке не передаваться через http?
No. 22296  
mao1Ugp-T_s.jpg - (169.64KB, 722×1024)
22296
>>22294
Короче, оно заработало и заработало правильно, хотя я до конца так и не понимаю, почему раньше не хотело. Большое спасибо за помощь, вот тебе вагон няшек. Так же я буду очень рад, если ты углубишься в объяснения этого всего.
Кстати, про cURL, лучше её использовать, чем плагины?
No. 22297  
>>22296
Забыл написать, что воспользовался formdata, вдруг кому-то нужно будет.
No. 22298  
>>22295
Она и передаётся, только парсить её никто не обязан. Выковыривай её из тела запроса и разбирай/десериализуй во что-то более осмысленное, чем просто последовательность октетов, сам. REST-контроллеры, что в Спрынге, что реализации JAX-RS по-сути этим (но не только этим) и занимаются. Ну или копай в сторону REST API WP, возможно у них есть решение для REST-контроллера, пригодное для переиспользования.

>>22296
Стандарт определяет только два метода передачи данных POST-ом: application/x-www-form-urlencoded и multipart/form-data Когда апп-сервер видит один из этих типов в Content-Type, он разбирает тело запроса и запихивает результаты в карту, parameterMap в Servlet-ах, $_POST в PHP. Если Content-Type какой-то другой, то апп-сервер с телом запроса не делает ничего.
>Кстати, про cURL, лучше её использовать, чем плагины?
Не знаю, что там за плугины, я пользую консольную, то что они с сайта скачать предлагают.
No. 22299  
>>22290
Просто уточнял, т.к. ты начал рассуждать про параметры per_page, page, offset и т.д. и я почему-то подумал, что ты полез в дебри стандартного REST API встроенного в WP, а это все-таки совсем другая штука и не имеет отношения к admin-ajax.php запросам.

Т.е. в случае admin-ajax.php ты обычно сам пишешь функцию-коллбэк (допустим в functions.php или в своем плагине), которая цепляется за нужный экшен (через add_action) для того чтобы отрабатывать запросы, которые прилетают с определенным значением параметра action.

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

Но тут такой еще момент - а зачем тебе вообще там JSON? Обычно при работе с admin-ajax.php по моему опыту все отправляют данные как обычной формой, без предварительной кодировки в JSON. JSON в качестве ответа коллбэка это неплохая штука, чтобы раскодировать потом внутри JS (если есть такая необходимость).

Для тупой подгрузки постов, если у тебя нет там ничего кастомного, ты можешь вообще забить на admin-ajax.php и воспользоваться тем самым REST API: https://developer.wordpress.org/rest-api/ например вот тестовый пример http://demo.wp-api.org/wp-json/wp/v2/posts - тупо делаешь запросы на такой адрес (для своего сайта, конечно же) и получаешь JSON с постами. Можно передавать в запросе параметры вроде offset, per_page, page и прочие штуки вроде категорий, исключений и прочего.
No. 22300  
>>22299
Думаю уже ясно, что камень предкновения был банальным непониманием в какую сторону и в каком формате слать данные.
>REST API
Кот бы знал что оно существует и прдназначено для возврата постов. Очень трудно легко пропустить какую-то базовую, основную вещь, разбираясь самостоятельно.
No. 22303  
За что я люблю Tomcat: если приложение упало во время деплоя на стадии инициализации веб-контекста, то половина приложения остаётся висеть в памяти; последующий редеплой пофикшенного приложения может происходить нормально, но в процессе работы рождаются просто феерические глюки —
>java.lang.NoClassDefFoundError: java/sql/ResultSetMetaData
У красных шапок гораздо лучше это сделано... ну хотя бы не так часто падает, хотя если упадет, то уже конкретно.

http://incepttechnologies.blogspot.com/p/jsf.html — можно сделать тетрис на бэкенде. Btw, тетрис на JSF-е у нас уже есть: http://www.angularfaces.net/tetris/index.jsf — но он халтурный.

>>22275
>оно на TomEE 7 стартует со второго раза и рандомно падает в кору
Пользователи jBoss-а оказались более любопытными: идёт конфликт между persistence-слоями сервера и спрингового приложения. Единственное полноценное решение — заменить гибернейты с хикарипулами на javaee-api со scope: provided и начать писать портабельный EE-код. Spring-у, однако, всё ещё нужен TransactionManager, но его адрес в JNDI у каждого сервера свой и приложение получается непортабельным. Решение, опять же: сервисный слой сделать на EJB и оставить от Spring-а только Spring MVC — ЁМНИП, оно унутре себя никаких вендор-локов не содержит, но это не точно.
No. 22305  
Сколько времени пишу на perl, а напоролся на эту подставу впервые. Вот это вот сообщит, что $l неопределенна:
print $l while my $l = foo;

При этом форма с блоком работает нормально:
while(my $l = foo) { print $l }

Они реально издеваются. И нет, использовать $_ вовсе не всегда удобно.
No. 22309  
Сегодня вопрос будет по теме, в которой я мало что смыслю.
Если я генерю хэши паролей PBKDF2 через javax.crypto.SecretKeyFactory, а потом делаю токен вида HEADER + SALT + HASH, то надо ли мне ещё что-то делать с SALT + HASH, перемешать их, например, или это уже не имеет смысла?

>>22305
А ты use 'strict'; убери и он резво будет печатать тебе пустую строку. Ещё можешь заменить my на our, поскольку my объявляет переменную в текущем scope, однако у условия while он свой собственный:

my $i = 0;
sub foo () { ++$i; };
print qq($i, $l\n) while (my $l = foo, --$l, 1);

Hу и вообще, написание на Perl-е кода, который будет понятен тебе самому через полгода, — это отдельно вырабатываемый навык.

З.Ы.: Циклы у тебя не модные. Надо по-хакерски писать, чтоб все офигели и никто не догадался:

{ last unless my $l = foo; print qq($l\n); redo; }


>Они реально издеваются.
Ларри игрался с языками. Стихотворение “Black Pearl” — это была исполняемая программа, после они всерьёз задумались о readability.
No. 22311  
>>22309
>однако у условия while он свой собственный
Понятно, что причина в чем-то подобном. Вопрос в том, есть ли хоть какой-то осмысленный резон у решения разработчиков языка не включать в этот scope строку в случае посфиксной формы цикла. Или «оно само так получилось»?
No. 22313  
yochi-03-1038x576.jpg - (46.36KB, 1038×576)
22313
>>22311
Насколько я помню, в Perl-е, так же как и в C, однопроходный компилятор, т.е. он не дерево строит, а сразу на месте код генерит. Поэтому не может найти метод/переменную, если сперва к ним идёт обращение, а определение — потом.

>осмысленный резон
>Perl
<—
No. 22314  
>>22313
Фигово помнишь, дерево можно даже пощупать ручками через
use B;


>>22311
Потому что даже если они в общей зоне видимости, объявление идёт лексически после употребления. Ухудшается читаемость. Я уж не говорю, что можно написать do {...} while и таким побразом объявление новой переменной будет много позже её первого употребления.
Алсо,
>NOTE: The behaviour of a my, state, or our modified with a statement modifier conditional or loop construct (for example, my $x if ... ) is undefined.
No. 22315  
252067.jpg - (177.10KB, 1024×768)
22315
>>22314
Я не настолько старая, чтобы иметь экспертное знание по умершей десять лет назад технологии, простите, дедушка. Как бы там ни было, эта бага присуща как раз однопроходникам. Я не вижу в описании https://docstore.mik.ua/orelly/perl3/prog/ch18_01.htm ничего, что указывало бы на многопроходный анализ исходного кода. Ну и AST-а в Perl-е нет, вместо него есть дерево разбора (parse tree), которое ни разу не абстрактное, к тому же документированно от слова «никак»: http://modernperlbooks.com/mt/2012/09/why-perl-5-needs-an-ast.html

Btw, вы довольно выборочно цитируете официальную документацию и довольно резво фантазируете:
https://perldoc.perl.org/perlsyn.html#Simple-Statements
>>NOTE: The behaviour of a my, state, or our modified with a statement modifier conditional or loop construct (for example, my $x if ... ) is undefined.
>The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.
Иными словами, «осмысленного резона» или нет, или его уже забыли... ну или никто просто уже не понимает, как оно работает и где фиксить этот UB.
No. 22318  
>>22315
Попробуйте в следующий раз читать официальную документацию, а не жалобы людишек в коммент-секциях.
https://perldoc.perl.org/perlguts.html#Compiled-code дерево со всеми проходами.

>Иными словами
Иными словами, я привёл цитату о том что даже в левой части UB. Как это относится к валидности рассуждений о правой части - непонятно.
No. 22333  
>>22315
>>22318
Если вы хотите поспорить друг с другом, существует диспутов нить - >>21353
No. 22336  
mill007.png - (367.17KB, 589×700)
22336
>>22318
>Иными словами, я привёл цитату о том что даже в левой части UB. Как это относится к валидности рассуждений о правой части - непонятно.
Это что за бред? Вы пьяны, дедуля? Какие «левые»/«правые» части, вы полит.тв пересмотрели? Мы говорим про simple statement, у которого if, unless, while, until являются _модификаторами_ выражения. Вы что, не знаете языка, о котором пытаетесь спорить?

>https://perldoc.perl.org/perlguts.html#Compiled-code дерево со всеми проходами.
Вам известно, что Perl — это _интерпретируемый_ язык? Что вы мне показываете, вы сами понимаете?

>>22333
Я хочу провести экспертизу васька, заливающего мне тут про язык моей юности. На данный момент:
1) васёк запутался в синтаксисе;
2) васёк запутался в технологиях — интерпретируемый ЯП превратил в компилируемый.
No. 22337  
>>22336
>Какие «левые»/«правые» части
Слева и справа от ключевого слова-модификатора. Очевидно же.
>Вам известно, что Perl — это _интерпретируемый_ язык?
Вам известно, что вы уже третий пост занимаетесь т.н. moving the goalposts, переходите на личности и отказываетесь смотреть мои ссылки?

>>22333
>хотите
Я не хочу. И, пожалуй, возьму за правило игнорировать эту аватарку впредь.
No. 22345  
>>22337
Будет ещё лучше, если вы перестанете выдавать свои фантазии за истину, думая, что английский тут никто не знает.
И совсем хорошо, если перестанете постить ссылки на материалы, содержание которых не в состоянии объяснить.

Не болейте, хорошо кушайте, слушайтесь маму.
No. 22346  
У меня тут от вашей дискуссии появились два вопроса.
1. Как связаны реализация языка и наличие в нём аст?
2. Что же там по этой ссылке https://perldoc.perl.org/perlguts.html#Compiled-code написано?
3. Что значит compilation pass? И если это та самая интерпретация, то почему её так много?
Потому что я тоже, видимо, дурачок и не понимаю.
No. 22347  
>>22346
1. Никак, вообще говоря, пока детали реализации явно не прописываются стандартом до таких мелочей. На практике, когда у языка только один компилятор, то на всё воля его создателей. gcc делает AST. tcc не делает. А язык один.
2. По ссылке описан процесс компиляции исходного кода во внутреннюю интерпретацию - opcodes. Не является деревом парсинга в полной мере, как может и AST.
3. Проходы по исходнику/дереву для оптимизации перед началом интерпретации.
No. 22348  
junior_developer_kobayashi_2.png - (862.55KB, 720×720)
22348
Аноним наконец-то перенес последние ссылки из прошлой нити в базу знаний: http://pastebin.com/AGhLZppH

По какой-то причине, в архивной нити внутри-нитевые ссылки не обновились и пытаются указывать на "живую" нить, а не на архив
No. 22355  
jczxklcz.png - (387.67KB, 850×481)
22355
Привет dev. Начну с краткой хронологии.

Недавно я окончательно решил удариться головой и всеми прочими частями тела в программирование. Ранее у меня был опыт олимпиадного программирования, кое-какие представления о работе языков программирования. Я изучил ваш F.A.Q. Но так и не понял что именно мне делать, но гугл подсобил, подобрал для себя книжку по c++, учу. И, кажется, я забыл описать пройденную школьно-университетскую программу.
В школьные годы мне повезло пройти отбор в лицей с углубленным изучением фундаментальных наук (математика/физика/информатика), касательно информатики - это и было олимпиадное программирование, то есть различные интересные алгоритмы и задачи. Со всеми профильными предметами у меня были хорошие отношения.
Университет я бросил осознанно после полугода, предоставляемый материал был размазан очень тонким слоем + нагрузка непрофильных предметов, ну и, мягко говоря, не самые лучшие условия для проживания и обучения.

Вообщем, как я для себя решил, буду изучать все самостоятельно, по книжкам. За конечную цель взят гейм-дев и реализация некоторых задуманных проектов. Но есть одна проблема, а именно с поиском подходящей литературы, как по программированию, так и по математике. Но, к счастью, только что наткнулся на вот этот канал на ютубе (Ссылка: https://www.youtube.com/channel/UC4omkhNHsYLagT1o6hnmKQw/videos ). Автор рассказывает о том, как он сам вкатился в программирование, какие книги использовал, ну и много другого. Сам он Engine Programmer. Лучше посмотреть, передать словами у меня сейчас не получится.
Так, вернемся к сути поста. В связи с нахождением этого канала планы немного меняются, а именно первым этапом будет изучение основ компьютерных наук по средствам Open Source Society University (Ссылка: https://github.com/ossu/computer-science ). Вторым этапом прочтение технической литературы по языкам программирования/алгоритмам. Ну и в завершении применение знаний на практике, возможно на основе Open Source, возможно самостоятельные идеи, или что-то еще.

И так, попутчики, прошу вас оценить, или дополнить мою программу. Спасибо за внимание.

P.s. Материальная сторона вопроса на данный момент не интересует, исключительно романтика.

P.s.s. Едва разобрался с капчей, странно она работает под моим vpn.
No. 22356  
С OSSU провал, ресурс теперь за доллары. Буду искать альтернативу.
No. 22357  
В целом проблема улажена, начну с изучения Computer Science, уже потом все остальное. Материалы благо легко гуглятся. Давно не чувствовал себя таким живым.
No. 22358  
>>22355
То есть, ты учился полгода, за эти полгода стал олимпиадником, но при этом не умея программировать?
>к счастью, только что наткнулся на вот этот канал на ютубе
Это такая шутка? Что-то не смешно.
Вообще, забудь про компьютер саенс. Точнее, возьми какой-нибудь cs101 курс, и тебе хватит. Налегай на алгебру, геометрию (и физику). Если ты хочешь инди игры делать, а не в сайбере пахать на галере, то и математики много не надо, и лучше сразу брать какой-нибудь туториал/книжку/курс про создание игр, а остальному научишься в процессе.
No. 22359  
>>22358
Олимпиады школьные, примерно с 6-7 по 11 классы, писал в основном на Paskal. По сути это было изучением ЯП с применением различных алгоритмов, как скажем написание эффективной сортировки вручную, отдельной функцией.

>Это такая шутка? Что-то не смешно.
Не понял о чем это.

Хоть в целом я и уловил этот посыл, все равно начну с самых низов, мне это действительно интересно. Раньше я хоть и находился в около программистской среде, но не имел дело с реальными программами. Реализация интерфейса, звука, графики и прочие прелести для меня до сих пор являются загадками, которые подлежат обязательному разгадыванию. Я понимаю, что такой подход весьма долгий и трудный, но и торопиться мне некуда.
No. 22360  
>>22355
>Университет я бросил осознанно после полугода
У вас, батенька, проблемы с осознанным мышлением. В качестве подкрепляющего аргумента привожу довод и о длине поста, там много лишнего.

Что то геймдева. Туда нужны геймдизайнеры - это те, кто до приёма на работу создал пару- тройку игр самостоятельно и сечёт про то, как игры работают вообще; макаки на юнити и подобном, потому что никто с нуля движок не пишет, и только в совсем упоротых случаях оптимизаторы/графикописатели, на это надо пройти весь курс графики и знать чуть ли не подноготную видеокарт.
No. 22361  
>>22355
>Университет я бросил осознанно после полугода
Иными словами, ты недостаточно умён, сообразителен и упёрт для того, чтобы закончить российский ВУЗ, где дипломы дают всем, у кого хватило мозгов ходить на лекции и покупать курсовые. Это статистически наиболее вероятная причина, и так это будет выглядеть в глазах остальных. Специалиста без диплома, в котором написано «Специальность», не бывает, это фантастика.

>буду изучать все самостоятельно, по книжкам.
Серьёзно полагаешь, что тебе хватит энтузазызма тащить это унылое дело лет 5, будучи одновременно и студентом, и преподом? Fun очень быстро закончится, останется рутина.

>>22360
>с нуля движок не пишет
Из того, что я смогла найти за эту неделю, онлайн-игры пишут даже на моём стэке. Хотя может быть и так, что к клиентской части это не относится, но фронт мне не интересен. Только вот писатели почему-то не хотят делиться практикой, так что примеры брать неоткуда.
No. 22362  
1559519774811.jpg - (61.65KB, 458×595)
22362
>Серьёзно полагаешь, что тебе хватит энтузазызма тащить это унылое дело лет 5, будучи одновременно и студентом, и преподом? Fun очень быстро закончится, останется рутина.
Чиочую.

>>22355
Лучше ещё сто раз подумайте. Тем более что в некоторых вещах самостоятельно разобраться бывает сложно. И ёмкой структурированной информации по некоторым темам бывает катастрофически мало.

>олимпиадное программирование
Всерос или свежий перечневый диплом за 11 класс есть? Тогда, если живёте в МСК, предлагаю поступить, скажем, на ПИ во ВШЭ: https://www.hse.ru/ba/se. Там весьма гибкая и неплохая программа, в особенности среди российских ВУЗов. Посмотрите ещё у них ПМИ и программы иных вузов. Изучите рынок вакансий ещё.

>канал на ютубе
Если уж решили заниматься самостоятельно, то лучше регнуться на Coursera и проходить адекватные и популярные ВУЗовские курсы по нужным дисциплинам там. Если заплатить им денюшку, то можно и сертификат.

Просмотрите ещё открытые курсы различных известных вузов. Например — у MIT (https://ocw.mit.edu) можно пройти: введение в алгоритмы https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/ , математику для CS https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-spring-2015/readings/ , прочие. Просмотрите, каков процесс обучения в этих вузах, как, что, и в каком порядке изучается, чтобы понять, что и в каком порядке изучать вам.

>не имел дело с реальными программами
А попробуйте. (Но это так, не очень серьёзно.) Реализуйте что-нибудь простенькое (калькулятор, многопоточное решение систем уравнений с оконным .NET (или иным) интерфейсом, прикрутите библиотеку, распознающую текст, и сделайте для Ведра распознование текста по картинке с камеры, для него же сделайте пакетный обработчик изображений, адекватный FTP-клиент, при том с возможностью локализации интерфейса, прикрутите рекламу рядом с основными его элементами и в PlayMarket получившееся — включите фантазию!). Ознакомьтесь с популярными технологиями в интересующей сфере и попробуйте с ними поиграть. Try and change stuff and see what happens! Для начального ознакомления с миром сойдёт. А оно важно.
No. 22363  
>>22362
>Всерос или свежий перечневый диплом за 11 класс есть?
Лучшем результатом было призовое место на региональном этапе, но, честно говоря, особо к этому делу я не готовился.

Канал на ютубе это не основной способ учиться, это даже совсем не способ учиться. Просто именно на нем я нашел вводную информацию по программированию в принципе.

>Coursera
Обязательно зарегистрируюсь.
За ссылки спасибо. Нашел точно такую же книгу по математике для CS, но с задачами после каждой главы. https://courses.csail.mit.edu/6.042/spring17/mcs.pdf

>А попробуйте.
Ок, буду варьировать программирование с книжками и теорией по мере возможностей.

Большое спасибо, за полноценный ответ по теме.
No. 22364  
73887784_p0.png - (1.66MB, 2150×3035)
22364
> Лучшем результатом было призовое место на региональном этапе, но, честно говоря, особо к этому делу я не готовился
Значит — нет. А жаль. Тем более, что была и есть куча много более простых олимпиад, открывавших двери в сравнительно хорошие заведения. Тем более, что вы затащили регион без особой подготовки…
Гамбарэ! Обязательно думайте о будущем и прощитывайте риски.
No. 22365  
>>22359
>Не понял о чем это.
Самопровозглашённый писатель движков и крутой программист, от которого не было ни одного доказательства его крутости, и который живёт выуживая деньги с дурачков. Зайди к нему в плейлист алгоритмов, и тебе всё сразу станет ясно.
>>22360
>Туда нужны геймдизайнеры
Геймдизайнер у нас - это такой парень, который придумывает как бы вытащить побольше денег из игрока. От него требуется математика (всякие статистики и теории вероятностей), и если он это могёт, то даже неумение сделать понг ему простят.
>макаки на юнити и подобном, потому что никто с нуля движок не пишет
Вот только если ты устраиваешься в серьёзный геймдев программистом, то требовать с тебя будут как раз всю подноготную видеокарт и свой движок, даже если на работе у вас будет юнити.
No. 22367  
>>22365
В серьёзный геймдев с улицы не берут, всё же.
No. 22368  
>>22355

>>Я изучил ваш F.A.Q. Но так и не понял что именно мне делат
>Я хочу программировать, но не понимаю, куда можно приложить усилия
https://410chan.org/dev/arch/res/14160.html#14354
Вот же перечислены возможные сферы.

>>Но есть одна проблема, а именно с поиском подходящей литературы, как по программированию, так и по математике.
>Подскажите литературу по архитектуре компьютерных игр
http://410chan.org/dev/arch/res/19666.html#20007
Наверное пока лучшее что есть по низкоуровневой архитектуре игры, это Андре Ламот.

>За конечную цель взят гейм-дев и реализация некоторых задуманных проектов.
Ты хочешь делать игры сам, или ты хочешь устроиться в студию как engine programmer / toolkit programmer? Если ты хочешь быть просто околоигровым программистом, дальше не читай, ты на верном пути.

Если ты хочешь именно делать игры, то мне кажется ты совершаешь ту же ошибку, что и многие, кто спрашивал в этой нити советов по геймдеву. Суть ошибки: ты собираешься учиться делать движок игры, в то время как тебе надо учиться делать саму игру. Многие считают что движок это очень важно, а когда он есть, игру на нём сделать - тьху. Это не верно. Поэтому лучше найди ютуб-канал, или другие доступные тебе материалы именно по гейм-дизайну, а не по созданию движков. Для твоих первых проектов и экспериментов в гейм-дизайне хватит любого готового движка, собственно, ты и будешь подбирать движок уже под конкретный проект игры. Опыт программирования понадобится для скриптования игровых объектов и подпиливания движка.

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

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

Такие дела, надеюсь смог помочь.
No. 22369  
>>22355
О, я как-то посмотрел одно его видео - пришлось воду с поля тряпкой собирать, больше не смотрел.
No. 22370  
Вопрос по JS-у.

Как будет правильнее и эффективней гонять байты через WebSocket-ы? Как гонять байты AJAX-ом мне известно, там просто кодировку указываешь как user defined и это работает на любом утюге. А через WebSocket-ы как, к чему привязываться, чтобы на любом утюге работало? Гнать ASCII-текстом и кодировать/декодировать в массив?
No. 22371  
>>22370
Чтобы работало прямо совсем на любом утюге, я бы советовал пользоваться кодированием бинарных данных в строку и обратно с помощью Base64

Но вообще, вебсокеты уже поддерживают бинарную передачу из коробки, хочешь блобом, хочешь массивом байт: https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType#Browser_compatibility

Делается это примерно так:

  var socket = new WebSocket('ws://localhost:8082');
  socket.binaryType = 'arraybuffer';
  var byteArray = new Uint8Array(...);
  socket.send(byteArray.buffer);

И при получении так же считываешь в массив:

  var byteArray = new Uint8Array(message.data);

No. 22372  
>>22371
Вот и я к тому же пришла. Только не Base64, а ещё проще: https://docs.oracle.com/javaee/7/api/javax/xml/bind/DatatypeConverter.html#printHexBinary-byte:A-
>вебсокеты уже поддерживают бинарную передачу из коробки
Не на всех утюгах работает, увы.
No. 22374  
Как известно, в перле, если у нас имеется хэш %h, мы можем написать @h{qw(foo bar baz)} и получить список значений. Теперь, допустим, у нас имеется ссылка $rh = \%h. Как сделать то же самое для неё? Вариант ($rh->{foo}, $rh->{bar}, $rh->{baz}) не предлагать.
No. 22375  
2011-05-27-407284.jpg - (151.93KB, 700×1000)
22375
>>22374
Разыменуй ссылку:

my %h = (foo=>1,bar=>2,baz=>3);
my $rh = \%h;
die qq(Test failed!\n)
   unless join (q(), @$rh{qw(foo bar baz)}) eq q(123);

No. 22376  
>>22375
>Разыменуй ссылку
Блин, вот я тормоз…
Спасибо!
No. 22377  
Вопрос от мимопроходившего ретарда, далекого от айти.
Есть boot.ini:
'[bootable]
time = 10
blahblahblahblah
blahblahblahblah
blahblahblahblah'
Задача такова - написать скрипт на VBScript или Jscript (только на них, увы) скрипт, при каждом запуске, прибавляющий к значению time +30.
No. 22378  
>>22377
А вопрос-то в чём, «как нарисовать сову»? Тогда, во-первых, ищешь способ как читать из файла и как писать в файл — может оказаться так, что для выбранных инструментов и целевой операционной системы способа не существует; во-вторых, ищешь способ как читать данные и как изменять данные — может оказаться так, что надо самому писать парсер и ассемблер. В третьих, ищешь способ как запускать полученный скрипт при старте системы.
No. 22381  
Что лучше начать учить: Ruby или Python? Никак выбрать не могу.
No. 22385  
>>22381
А первое ещё живо?
No. 22386  
faptcha_php.png - (4.48KB, 90×50)
22386
>>22381
Питон — длинный, скользкий и противный.
Рубу — гибрид ежа с ужом, т.е. перла с питоном. Т.е. лучше питона, но хуже перла

>>22385
Так всегда, хорошие языки в запустении, плохие — на коне. Куда не глянешь — всюду js, python или вообще go. Зачем так жить?..

А то вон был C++, из него взяли всё хорошее и сделали D, а потом взяли всё плохое и сделали rust. И кто из них популярен, а кто — забыт?
No. 22387  
>>22381
Python. Ruby уже умирает, через 5 лет на нем будут только легаси проекты.
No. 22388  
Дано: perl 5.14, на вызов &CORE::substr($str, @_) выдаёт:
Undefined subroutine &CORE::substr called

Если же вызвать substr без &, то @_ преобразуется в число, а вариант вида substr($str, $_[0], $_[1], $_[2]) ведёт к тому, что всегда вызывается форма с 4 аргументами, независимо от того, сколько изначально их было в @_. A поведение разных вариантов substr отличается очень сильно.

Есть ли приемлемый (без тупой цепочки ifов) выход из ситуации?
Нет обновить там перл я не могу.
No. 22389  
>>22388
Выбирай:
1. substr($str, $_[0], $_[1] // length($str), $_[2] // substr($str, $_[0], $_[1] // length($str)))
2. eval("substr(\$str,".join(','@_).");")
No. 22394  
2017-12-30-942713.jpg - (92.30KB, 785×1334)
22394
>>22388
Вызов через амперсанд появился лишь в 5.16, да и то не для всех встроенных методов. Что же по второму,
>@_ преобразуется в число
то во что ещё он по твоему должен преобразовываться? Метод строкой ожидает только первый параметр, остальные приведутся к числам.
No. 22395  
>>22386
А какие ещё языки ты считаешь хорошими?
No. 22396  
>>21641
может кто помочь? Скачал логотип одной компании и вставил его в html файл. Без подключения css пикча просто висит в левом
углу. Начал прописывать css стиль:width: 100%;
display: flex;
justify-content: center;
Лого становится меньше микробы и висит в левом углу.
No. 22397  
>>22396
>висит в левом углу
>висит в левом углу
Извиняюсь за тавтологию
No. 22399  
>>22396
Хотелось бы увидеть код.
No. 22401  
Untitled.png - (153.67KB, 1920×1080)
22401
>>22399
No. 22403  
>>22401
ХэТэМэЭл тоже.
No. 22404  
>>22401
Так, подожди, а зачем ты флекс прописываешь самой картинке, а не контейнеру? У <img> из дочерних элементов только before и after, а их тебе выравнивать вроеде бы ни к чему.
No. 22406  
>>22400>>22389
Я прошу прощения за флуд, но можно ещё убрать скобки у вызова и получить секьюрную версию варианта 2 в 30 символов.
eval("substr \$str@{[map qq!,\$_[$_]!,0..$#_]}");

Замена кавычек на qq не даёт выигрыша в символах, но чуть читаемее, чем \". Если доподлинно известно, что в @_ только валидные и безопасные параметры, то более короткая запись это
eval('substr $str,'.join(',',@_));

Прошлые комментарии сейчас сотру.
No. 22407  
2018-04-18-959372.jpg - (179.33KB, 500×500)
22407
Вам необходимо достаточно быстро (положим, каждые 50 ms) передавать через веб-сокеты в двустороннем порядке между клиентом и сервером данные бинарного вида. Данные представляют собой строго типизированные объекты, простые (числа, октеты, массивы и так сойдёт, матрицы и так сойдёт 2, строки и так сойдёт 3) и составные (комбинации простых и составных). Как бы вы стали делать сериализацию/десериализацию?
No. 22408  
>>22407
Длина, тип, данные. Конец.
No. 22409  
2018-01-31-948142.jpg - (166.83KB, 599×769)
22409
>>22408
Я не настолько дура. Ты говоришь о том, как их кодировать. Меня интересует, как их снова в объекты превратить и обработать.
No. 22411  
>>22410
Каким образом клиенты должны узнать, что во что им конвертировать?
No. 22413  
>>22411
Почти у каждого REST API есть документация и согласно ей программист понимает каким образом ему из десериализованного объекта получить те или иные данные.
Абстракции это конечно хорошо, но ты можешь рассказать суть, в чем у тебя проблема?
No. 22414  
2017-11-30-937259.jpg - (52.61KB, 600×1082)
22414
>>22413
Мне нужно дуплексное RPC на веб-сокетах, которое можно безболезненно расширять. У меня есть декларативное описание команд и их синтаксиса на джаве и кодеки. Мне надо сделать ответную часть на JS. Можно захардкодить описание, но это — двойная работа, — к тому же изменять методы кодирования и добавлять новые команды будет очень больно. Можно сделать так, как сделали в JAX-WS — отдавать описание клиентам, — тогда у них не будет проблем с синтаксическим разбором (хотя останутся проблемы с семантикой, но они даже в JAX-WS решаемы лишь посредством версионирования описаний). Так как уже сейчас в RPC более 30-и команд, я пойду по второму пути. Спрашиваю, есть ли ещё способы сделать такое.
No. 22416  
Почему в хроме
>window.onload = () => {};
работает, а в лисе нет? Внутри должны навешиваться всякие ивентлистенеры и лиса их не вешает, а хром вешает. Хром даже банальный алерт выполняет, а лиса нет. Может onload уже устарел?
No. 22417  
2017-07-08-913354.jpg - (308.67KB, 881×1277)
22417
>>22416
Потому что ивент поднимается при загрузке ресурса. С точки зрения Лисы, когда ресурс взят из кэша, он не загружен. Это не баг, но фича. Используй DOMContentLoaded.
No. 22418  
>>22417
Я ничего непонял. Какой может быть кэш, если в кэше ничего нет?
No. 22419  
>>22418
А нет, оказывается кеш действительно был не сброшен. Но я всё ещё в смятении: лиса порой выдаёт удивительные фортели.
No. 22420  
2017-11-25-936215.png - (554.50KB, 500×500)
22420
>>22418
В кэше всегда что-то есть. F5 может не приводить к сбросу кэша (обычно происходит избирательное обновление). Как воркэраунд можешь попробовать принудительно сбросить кэш, повесив window.onunload = function(){};, но это своего рода хак.

>>22419
У этого прикола борода лет в шесть. Добро пожаловать в удивительный мир JavaScript. С другой стороны, если у клиента лагучее соединение, то полной загрузки ресурса он может и не дождаться. А посему использование этого ивента выглядит довольно сомнительно, если страничка без скриптов работать не может.
No. 22421  
>>22420
>window.onunload = function(){};
В смысле в сочетании с onload?
В любом случае я воспользовался jqueryвсё равно уже подключена ради слайдера.
>А посему использование этого ивента выглядит довольно сомнительно, если страничка без скриптов работать не может.
Перевесил с окна на документ. Думаю, дом уж как-нибудь загрузится даже на диалапе.
No. 22422  
Clipboard01.png - (96.24KB, 745×902)
22422
Анекдот про эффективных менеджеров.doc
Описание команд получилось реляционным. Ну нету здесь RPC-фреймворка, щито поделать.

>>22421
Да. Сайд-эффектом ивента window.onunload в Лисе является сброс кэша. https://bugs.jquery.com/ticket/8684
>я воспользовался jquery
Да, ей имеет смысл пользоваться, чтобы не разруливать подобные проблемы самостоятельно. Однако в ней не все проблемы фиксятся.
>Думаю, дом уж как-нибудь загрузится даже на диалапе.
Проблема больше в разрывах соединений и потере пакетов. onload поднимется лишь когда загрузятся все стили, скрипты и картинки. Если какая-то картинка потерялась по дороге, ивент не поднимется, так что даже шторку по нему поднимать будет довольно ненадёжно.
No. 22423  
>>22422
>шторку по нему поднимать будет довольно ненадёжно
Да какая шторка, это всё css делает, я вешаю переключение слайдов на кастомные кнопки. И ещё меню сбоку, чтоб при прокрутке, пока идёт элемент, висело прибитым к экрану, а когда кончается - оставалось внизу/вверху элемента.
No. 22424  
>>22422
Может сделать ForeignKey's явными и при загрузке заменять их ссылками на конкретные объекты? А то получается сильно завязано на кодеки. Хотя что мне это даст? Просто более чистую реализацию паттерна Visitor на клиенте за счёт дополнительной процедуры инициализации и дополнительного кода в генераторе? Экцепшоны в этой процедуре, если не будут найдены кодеки для примитивов и обработчики для команд?

>>22423
>Да какая шторка
Матовая, на которой написано “Please wait, loading.” Но основной посыл ты, надеюсь, уловил.
>это всё css делает
Как? ЁМНИП, там нет эвент-хэндлеров.
No. 22425  
>>22424
>Может сделать ForeignKey's
Я не понял, но я согласен.
>Как? ЁМНИП, там нет эвент-хэндлеров.
Не о той шторке подумал.
No. 22426  
>>22425
В JSON нельзя записать физические отношения между объектами, только логические иначе вместо одного объекта получишь много объектов. Сейчас они заданы неявно, подразумевая, что кодеки сами знают, как их расшифровывать. Правда выглядит это стрёмно. Можно задать их явно, вроде {type:"REFERENCE",path:["TYPE","INTEGER"]}, на клиенте при инициализации делать obj[property] = resolveRef (obj[property], spec), где

function resolveRef (ref, root) {
   var dst = root, path = ref.path, i = 0, length = ref.path.length;
   while (i < length) dst = dst[path[i++]];
   if (typeof dst == "undefined")
      throw new Error ("Unknown ref: " + ref.path);
   return dst;
}

Ну а раз необходима процедура инициализации, то в ней до кучи можно делать проверки на наличие кодеков и обработчиков.
No. 22427  
Сап, ычан и чиочан
Я тут пилю текстборду и пытаюсь придумать способ одновременно экранировать html, но и обрабатывать галки

как вы думаете, как это просто сделать?

Чисто для проверки:

<i>хмхмхмхмххмхмхмхмхмхмххмхм
No. 22428  
забыл проверить на галки
> йеп
No. 22429  
>>22427
>обрабатывать галки
Подробнее расписывай, подробнее. И что тебе мешает уже &gt; обрабатывать?
No. 22432  
2017-11-27-936694.jpg - (634.21KB, 1653×1417)
22432
Просто чтобы упорядочить инфу. Может кому пригодится.
1. WebSocketSession /= HttpSession
а) первая может жить намного дольше — ситуация, когда стрим идёт, но AJAX выкидывает 401 Unauthorized;
б) вторая может вообще не создаваться;
Решение: переопределить конфигуратор эндпойнта, выудить/создать HTTP-сессию и теребить ея пинг-понгом, дабы не протухла; также для этого можно хакнуть сессию рефлексией.
2. Ping-Pong сообщения поддерживаются далеко не всеми браузерами. Способа проверки поддержки нету: https://stackoverflow.com/questions/10585355/sending-websocket-ping-pong-frame-from-browser
Решение: свелосипедить свой heartbeat, например. Одобрено железячниками, ссылку с советами по интеграции умного железа и апп-сервера, наверное, не найду.
3. CDI в @ServerEndpoint
а) ой, не работает: https://abhirockzz.wordpress.com/2015/02/10/integrating-cdi-and-websockets/
б) ой, работает: https://abhirockzz.wordpress.com/2016/11/18/websockets-and-cdi-integration-again/
в) ой, не работает, если переопределили конфигуратор эндпойнта.
Решение: JNDI-lookup / @Statefull EJB endpoint (хз, говорят, что может и не работать)
4. Реконнект не предусмотрен: https://stackoverflow.com/questions/34992727/java-websocket-connection-check-if-same-user-reconnects
Решение: свелосипедить; например: https://stackoverflow.com/questions/22431751/websocket-how-to-automatically-reconnect-after-it-dies

Вроде это все нюансы.
No. 22434  
PHP, Wordpress, все дела...
Как мне грамотно реализовать лайки/просмотры/подобные счётчики на сайте с вордпрессомбез плагинов? Потому что, когда я думаю про реализацию, у меня встаёт вопрос где хранить информацию о лайках, если в отдельной таблице, то не получится ли, что я создам слишком много запросов к базе данныхнапример на странице с несколькими постами, что затормозит сайт? Или просто забить и поставить плагинвордпресс же?
No. 22435  
>>22434
Или вот ещё: нужно ли мне модифицировать существующие вордпрессовские таблицыдобавляя поле количества просмотров, к примеру или создать под это дело свои таблицы? Опять же как это скажется на производительности?
No. 22437  
>>22434
А зачем тебе несколько запросов на странице с несколькими постами?
No. 22438  
Извиняюсь, еще немного тестов

[o]Надчеркнут[/o] Подчеркнут
[sub]Снизу[/sub] [sup]Сверху[/sup]
No. 22439  
2017-11-12-934077.jpg - (308.35KB, 2240×1198)
22439
>>22432
5. В TCP нет способа узнать состояние соединения иного, чем попытаться записать что-нибудь в сокет и словить исключение, если соединение отвалилось.
Отсюда очевидно, что:
1) heartbeat для дуплексной коммуникации также должен быть дуплексным;
2) непереданные пакеты должны сохраняться до удачного реконнекта клиента или до таймаута (если клиент отвалился с концами). Отсюда очевидно, что необходимо заиметь хранилище промежуточных данных, т.е. хранилище контекстов (допустим, PushContext), и хранилище контекстов в статической карте с ключами-ID-шниками клиентов (если предполагается сохранять Http-сессию, то ключем может служить её идентификатор).
No. 22440  
>>22437
(Запрос на просмотры, запрос на лайки)*несколько постовже.
No. 22441  
faptcha_php.png - (1.22KB, 90×50)
22441
Что нужно прописать диву в css, чтобы он вел себя примерно как таблица? Т.е.
<div>Some text</div>
должен занимать по ширине столько же места, сколько и
<table border='1'><tr><td>Some text</td></tr></table>
Т.е. — его ширина должна определяться размером текста, который внутри.
No. 22443  
>>22441
>Т.е. — его ширина должна определяться размером текста, который внутри.
Непонятно, где должен располагаться этот div, внутри таблицы? Вне её? Далеко ли?
Впрочем, можно просто жёсто задать ширину пикселями.
No. 22444  
>>22443
Вместо неё.
Хотя стоп, я тормоз. Передо мной борда, и она сделана вовсе не на таблицах, как я думал, а на дивах. А по внешнему виду ничем от табличной не отличается. Т.е. — именно с нужными мне свойствами. Вопрос снимается, лезу смотреть, как сделан класс postbody в местных стилях.
No. 22445  
>>22444
Upd: мда, а ларчик открывался просто:
display: table;
Не сказал бы я, чтобы это выглядело особо красивым решением, но по другому заставить дивы автоматически регулировать свой размер в зависимости от размера содержимого, видимо, нелья…
No. 22446  
>>22445
Upd 2: Нашел вот это: https://ru.stackoverflow.com/questions/22387/Ширина-div-по-контенту
Там приведен десяток разных вариантов решение задачи (и сам вопрос сформулирован куда более внятно), и у всех, чтоб их так, какие-нибудь левые сайд-эффекты.

На самом деле, правильное решение — это
width: fit-content;
Но с поддержкой у него…
No. 22447  
Clipboard01.png - (6.70KB, 616×655)
22447
>>22445
flex-ом злой плантатор пользоваться запрещает или ты слишком крут для лёгких путей?

З.Ы.: У меня всегда обратная проблема была — как сделать так, чтобы <div> вёл себя как <table width="100%">. Потом я узнала, что добрые дяди сделали фреймворк, радикально решающий эти проблемы — <h:panelGrid> отлично работает практически на любом утюге.
No. 22448  
>>22434
Реализовать можно по разному, в зависимости от того что именно тебе надо и в каком виде (а заодно с какими фичами и т.п.), но хранить данные ты можешь просто в специальной таблице метадаты. У WordPress специально предусмотрены таблицы для этого, и логика готовая: можно считывать, записывать, удалять значения, использовать в запросах и сортировках и тому подобное.

Например, делаешь update_post_meta($post_id, ‘_post_views, $view_number); и оно сохранит все в БД. Надо будет вывести? get_post_meta, ну и так далее. По поводу нагрузки особо не волнуйся, если ты не собираешься на каждый чих делать по 50-100 запросов лишних, то это ни на что не повлияет, если ты конечно какой-то рак не напишешь. Так что лучше пиши сам, заодно дополнительный опыт тебе будет.

А вот готовые плагины как раз могут тебя легко подставить. Их часто пишут макаки совсем уж, из-за чего потом сайты могут тормозить.
No. 22449  
>>22440
А зачем тебе делать запрос на каждый отдельный пост, ещё и по разным колонка, когда можно вытащить всё и сразу за один?
No. 22450  
>>22448
Я этим опытом два дня мучаюсьза окном +35, кондей уже не спасает, пока что просто CREATE TABLE
my_own_meta
IF NOT EXIST и потом пишу туда. Ну... собираюсь писать, для начала нужно авторизацию как-то сделать.
С post_meta не ясно как хранить, например, конкретных пользователей, лайкнувших пост. По-моему без отдельной таблицы всё равно не обойтись.
>>22449
Ну да, количество лайков и просмотров можно хранить в одном месте и получать скопом, неудачный пример.
No. 22451  
>>22450
Кондиционеры рулят.

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

>С post_meta не ясно как хранить, например, конкретных пользователей, лайкнувших пост. По-моему без отдельной таблицы всё равно не обойтись.
Можно по разному сделать. В принципе, один пост может содержать множество записей в post meta с идентичным идентификатором, но разными значениями. Можно просто делать add_post_meta для пост, например с ключем user_liked и значением id юзера, который лайкнул. Просто у каждого поста будет целая простыня таких записей потенциально. А можно пойти наоборот. Работа с мета-данными предусмотрена не только для постов, но и для юзеров, соответственно add_user_meta / get_user_meta, где вместо id поста вначале надо будет передать id юзера, потом ключ и уже потом значения. Соответственно можно записывать для каждого юзера какие именно посты он лайкал. Можно вообще упороться и хранить это не отдельными записями, а массивами, если ты хочешь экономить количества записей. Например, сохранять массив у пользователя в мета-данных какие посты он лайкал.
No. 22455  
Имеем меню на css вида a:focus ~ ul. Т.е. при кликe по ссылке онa ловит фокус и список становится видимым.

Вопрос: можно ли без привлечения js, на чистом css, сделать так, чтобы по следующему клику на ту же ссылку эта менюшка закрывалась обратно?
No. 22456  
>>22455
Да, при клике за пределы менюшки оно тоже должно закрываться, т.е. вариант с использованием checked (если я правильно понимаю, как он работает) скорее всего не катит.
No. 22457  
Clipboard01.png - (259.28KB, 1365×824)
22457
>>22439
Никто не забыт, ничто не забыто.
Вроде получилось достаточно универсально. По крайней мере я никаких недочётов не вижу.

>>22456
Фокус либо на ссылке, либо на элементах меню, иначе скрываешь.
No. 22458  
>>22457
>Фокус либо на ссылке, либо на элементах меню
И как это поможет закрыть при втором клике на ссылку?
У меня сейчас — фокус на ссылке либо ховер на списке, что примерно то же самое.
No. 22459  
>>22458
Никак, лол. Тогда не знаю.
No. 22461  
>>22455
Тебе верно сказали, что фокус здесь не совсем катит. Тебе нужен элемент с переключаемым статусом, т.е. чэкбокс, а "ссылку" можешь сделать просто лейблом для своего чэкбокса.
No. 22463  
>>22455
Теоретически, можно добавить к :focus селектору прозрачный псевдо-элемент, через ::before() или ::after который будет перекрывать собой ссылку, и по фокусу или клику на который меню автоматом закроется (т.к. фокус ускачет со ссылки и :focus селектор перестанет работать). Но тут надо эксперементировать, если что, заливай своё меню на jsfiddle.
No. 22465  
2016-11-22-873326.png - (199.02KB, 622×920)
22465
>>22457
>никаких недочётов не вижу
Надо карту в синглтон засунуть, вот чего. В будущем может понадобиться слать сообщения из других контейнеров.

>>22461
Извратский способ, конечно: делаешь полностью прозрачный чекбокс, под ним размещаешь текст лейбла. Только у него тогда вторая хотелка работать не будет. Можно ещё покопать в сторону CSS-переменных, но к ним нет условных операторов и я не видела, чтобы их можно было мутировать, так что вряд ли.
No. 22466  
>>22455
https://css-tricks.com/solved-with-css-dropdown-menus/ — во чего нашла. Оно?
No. 22467  
>>22455
Не слушай этих выше, просто поставь :focus{pointer-events:none}.
No. 22468  
>>22461
Выше уже написано, почему оно не подходит. Тот функционал, который уже работает — более приоритетен, чем это, а извраты с чекбоксами его сломают.

>>22463
Хм. Спасибо за идею, надо будет попробовать.

>>22466
Ну, по крайней мере на первый взгляд я там ничего похожего не вижу. Хотя, конечно, почитаю, так что спасибо.
No. 22469  
>>22467
О, а вот это работает!
Спасибо огромное!
Про это свойство я не знал… И вообще на MDN про него написано, что оно только svg. Но и в лисе и в хроме — всё пашет в обычном html.

Задача решена.
No. 22480  
D0PNnDzVsAAlp4E_jpg_large.jpg - (89.52KB, 1200×852)
22480
Как правильно разделять логику модели и логику контроллера?
Вот, допустим, у меня есть регистрация на фласке.
Пользователь отправляет данные в виде юзернейма, email и пароля. Я минимум должен проверить что эти поля не пустые иначе вернуть ошибку. Это я должен проверять в контроллере, верно? После мне нужно проверить, что юзернейм не используется и почта не занята. Это я проверяю делая запросы в базу из того же контроллера. После, если всё хорошо, создаю нового пользователя. Или лучше сделать отдельный метод модели create_user и передавать туда данные на проверку? По интернетам пишут что кому как удобнее. Кто-то делает толстые контроллеры, кто-то всю логику суёт в базу, а в контроллерах только http-запросы обрабатывает. Как правильнее?
No. 22481  
2019-02-24-984438.jpg - (205.04KB, 1448×2048)
22481
>>22480
В общем случае твоя модель должна делать бизнес-логику вне зависимости от выбранного способа клиент-серверного взаимодействия.

Возьми свой аккаунт-сервис и представь, что завтра захотят добавить к нему веб-сервис, т.е. JAX-WS; после завтра захотят RESTfull API для SPA фронтенда, т.е. JAX-RS; после после завтра засунут в кластер и захотят инжектить в другие бины как JNDI-ресурс.

Та, общая для всех способов, функциональность, которую в итоге ты вынесешь в EJB-сервисный слой, и будет моделью; остальное — контроллерами. То же справедливо и для десктопных приложений; так же и для SPA.

>Пользователь отправляет данные в виде юзернейма, email и пароля. Я минимум должен проверить что эти поля не пустые иначе вернуть ошибку. Это я должен проверять в контроллере, верно?
Да, это валидация веб-формы, специфического способа клиент-серверного взаимодействия.
>После мне нужно проверить, что юзернейм не используется и почта не занята.
Это условия создания нового аккаунта, т.е. бизнес-логика данного приложения. Значит она уедет в сервисный слой. Обычно в случае нарушения условий из сервисного слоя кидают кастомные checked-exception-ы, которые затем обрабатываются в контроллерах.

>По интернетам пишут что кому как удобнее.
Этого нельзя понять на практике если у тебя игрушечный стэк, который жестко фиксирован на каком-либо одном способе, и игрушечные задачи.
No. 22482  
Пишут, что надо поменьше обращаться к DOM.
Вот сделал я генератор таблицы: https://jsfiddle.net/hgvke6to/
Как лучше поменять код?
No. 22484  
2015-07-10-750332_low.png - (133.07KB, 750×650)
22484
>>22482
Проще всего будет закешировать узлы, всё-равно ты только текст в них меняешь: https://pastebin.com/mkGUNMiN
No. 22485  
>>22484
Спасибо, рассмотрю.
Тут возник другой вопрос: я пытаюсь сгенерировать SVG, но в браузерах не показывается ничего, от хромов до файрфоксов. При этом сам сгенерированный код нормально просматривается, например, в Inkscape.
https://jsfiddle.net/par36uwx/
No. 22486  
>>22485
В Presto, кстати, нормально отображается.
Btw... https://jsfiddle.net/Milfeulle/twzfnack/ Даже не спрашивай, почему так, — вряд ли я хочу это знать.
No. 22487  
>>22480

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

В целом >>22481 тебе примерно это и пишет. Но хочу отметить, что дублирования определенных моментов здесь не избежать. Например:

>Пользователь отправляет данные в виде юзернейма, email и пароля. Я минимум должен проверить что эти поля не пустые иначе вернуть ошибку.
>Это я должен проверять в контроллере, верно?

Верно, но. Сервис / модель должны отсекать с ошибкой любой ввод, с которым провести операцию корректно невозможно. Сервис не сможет создать аккаунт на пустой юзернейм и / или имейл, а значит на такой ввод он сам тоже должен возвращать ошибку. Модель пользователя с пустым юзернеймом и / или имейлом не имеет смысла, а значит попытка создать такую модель должна вернуть ошибку.

Да, это небольшое дублирование валидации данных между сервисом / моделью (бизнес-логикой) и контроллером (который внешний интерфейс к твоей бизнес-логике) Но в общем случае, ты как автор сервиса не можешь полагаться на то, что авторы всех интерфейсов к нему сделают всё правильно и не будут присылать тебе сломанные данные. Проверять, впрочем, надо только то, что проверять абсолютно необходимо, т.е. вещи по которым провести операцию нереально, или вещи, которые могут привести к сломанным данным в базе, или нарушить логику работы приложения на других этапах. Поэтому пустое поле ты будешь проверять и в контроллере, и в сервисе / модели, а вот сколько там заглавных букв и цифр ввели в пароль - только в контроллере, т.к. модели такие детали уже не важны.
No. 22488  
2017-11-11-933871.jpg - (341.48KB, 700×990)
22488
>>22487
>а вот сколько там заглавных букв и цифр ввели в пароль - только в контроллере, т.к. модели такие детали уже не важны.
Это же соглашения безопасности для данной информационной системы, ты чего, Стив? Контроллеры не могут устанавливать их произвольно.

@TL;DR
Ну а вообще, проектирование информационной системы начинается с создания концептуальной инфо-модели бизнеса — https://www.site-do.ru/db/db4.php , — из которой потом создаётся реляционная модель — https://www.site-do.ru/db/db5.php , — которая затем отображается на объектную (бизнес-данные, они же JPA @Entity обычно). Здесь закладываются требования к форматам данных и безопасности (т.е. пишется спецификация бизнес-данных), и пишутся валидаторы. То, что в спецификации бизнес-данных не описано — валидация DTO или иных промежуточных данных для пары View-Controller, пользовательского ввода и обработка чэлленджей (всякие там “Solve puzzle”, “Re-enter password”) — валидируется в контроллере.

По итогу должны получиться сервисы, содержащие только бизнес-действия с бизнес-данными, полностью независимые от пар View-Controller и полностью самодостаточные.

Так что ответ на вопрос «Что где валидировать?» содержится в информационной модели бизнеса, а проблема дублирования валидаций по крайне мере для энтерпрайза глубоко вторична если о ней с BeanValidation API вообще кто-то задумывается, так же, как и с транзакциями в EJB — более важно обеспечить в проектируемой системе невозможность потери данных, перевода данных в неконсистентное состояние, обеспечить безопасность работы с данными и невозможность несанкционированной работы с ними.
No. 22489  
Автобусик, миленький, подскажи ресурсов для изучения языков! Поставил себе задачу последовательно выучить Python/Perl, PHP, JS, HTML, C, C++ и Java. Многовато, да. Но так как я планирую быть специалистом по информационной безопасности, без знаний этих языков мне некуда.
No. 22490  
>>22489
Чтобы быть специалистом, а не натасканной обезьяной-заучкой, нужно не языки, а более базовые вещи изучать — т.н. computer science, сети, архитектуры, алгоритмизацию и прочее. Языки лишь инструменты для записи и если знаешь основы — для их изучения будет достаточно почитать справочники и написать пару хелловорлдов.
No. 22491  
>>22489
>так как я планирую быть специалистом по информационной безопасности
Вот и иди учить инфосек.
No. 22492  
2016-05-09-831514.png - (160.42KB, 555×900)
22492
Рубрика «Сами спрашивали, сами отвечаем»: Хэширование паролей
Теория: https://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right
Практика: https://stackoverflow.com/a/2861125 https://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords
Нюансы: https://stackoverflow.com/questions/6947689/hinputsecret-security-is-there-a-way-to-use-a-straight-reference-to-char
No. 22493  
>>22490
Спасибо за советы! Но я всё же считаю, что эти языки я обязан знать также, как и т.н. базу (логику, теорию вероятности, computer science, сети и тд).
А мог бы ты посоветовать материалов по изучению computer science, сети, архитектуры, алгоритмизации и прочего?
No. 22494  
>>22493
>А мог бы ты посоветовать материалов по изучению computer science, сети, архитектуры, алгоритмизации и прочего?

Вот в этой коллекции
>>Нашли 13 Гб книг по IT-тематике
https://410chan.org/dev/arch/res/19666.html#20146

ftp://ftp.micronet-rostov.ru/linux-support/books/

Есть целая секция посвященная алгоритмам:
ftp://ftp.micronet-rostov.ru/linux-support/books/computer science
/data%20Structures%20&%20algorithms/

Если тебе хотелось бы что-то в формате курса, или интерактивных упражнений, можно посмотреть вот в эту сторону:

>>Я ищу базовые курсы по созданию ПО
https://410chan.org/dev/arch/res/19666.html#21223

>>Я ищу задачи и упражнения по алгоритмам (C, Python)
https://410chan.org/dev/arch/res/15681.html#17105
https://410chan.org/dev/arch/res/15681.html#17108
https://410chan.org/dev/arch/res/15681.html#17110
No. 22495  
underscores.png - (49.27KB, 597×509)
22495
Наверное, глупый вопрос. Для обозначения чего обычно ставят префиксы из underscore'ов в cpp в имена? Скажем в исходниках STL? Этот ___x, __BasePtr и тому подобный сахар весьма тяжело читать. Хотя тут нужна привычка, должно быть.
No. 22496  
>>22493>>22494
Кстати о курсах. На Ютубе где-то был курс CS50.
No. 22497  
B0VtSwakpZc.jpg - (170.99KB, 719×1080)
22497
О, вовремя я вспомнил о своём вопросе.

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

>>22487
> Сервис не сможет создать аккаунт на пустой юзернейм и / или имейл, а значит на такой ввод он сам тоже должен возвращать ошибку
На этот случай в SQLAlchemy есть встроенные валидаторы. Но если я это не обработаю в контроллере, то клиент получит 500 ошибку в лицо и никаких подробностей. А тут я её оберну в 400 ошибку и напишу где он не прав.

Спасибо, котятки.
No. 22498  
>>22495
Частные методы/аттрибуты обычнопишут с _
No. 22499  
Сап. Подскажите пожалуйста, почему я получаю в этом коде: <script src="https://ideone.com/e.js/O1MhAz"; type="text/javascript" ></script>
следующую ошибку: Uncaught SyntaxError: missing ) after argument list в 16 строке?
No. 22500  
45673984105_9764a69e3c_n.jpg - (17.01KB, 320×320)
22500
>>22499
Извиняюсь за поломанную разметку.
No. 22501  
>>22500
newString.lenght
Нужно - length
No. 22502  
>>22501
А здесь 16: letters.forEach((item, index, array) {
потерял =>. Раз уж ты пишешь на идеоне, то проверяй свой код там же.
No. 22503  
Вставлю свои 5 (пять) копеек.
>>22499
Object.keys — ты точно понимаешь, что оно делает?
for (i == 0;...

letters.forEach is not a function


newString[i] — а так можно разве?
No. 22504  
[a] AGDG Embassy S01-E15.webm - (1.81MB, 640×360)
22504
Как вкатиться в геймдев?
No. 22505  
Пишу контейнер (разновидность дерева) в C++. Объект дерева хранит обычный указатель на корневую иноду, а каждая инода хранит обычный указатель на, собственно, объект класса данных. Следует ли при удалении инод (а то и вызове деструктора всего дерева) сделать опцию также и для удаления объектов данных, на которые есть указатели в инодах? Или стоит оставить управление памятью объектов класса данных исключительно на совесть пользователя?

Использование описанной опции даст ошибку, если в дерево добавлен (добавление осуществляется по ссылке) элемент, являющийся локальной переменной или элементом массива, вектора или чего ещё. Обходом по дереву извне класса дерева нельзя уничтожать объекты класса данных, потому что они нужны для обхода дерева. Получать указатель на объект, удалять указатель на объект из дерева, и только затем удалять объект по сохранённому указателю, и так уничтожить все объекты данных по указателям в дереве — не то, чтобы медленно, но хочется-то O(n). Автоматическое управление памятью в виде shared_ptr ⇒ потенциальные +80MiB памяти (где-то 4% от скорее всего, но тем не менее) на большом количестве элементов и, что наиболее важно, ухудшение быстродействия, а также необходимость всегда использовать shared_ptr для добавления объектов класса данных в дерево и контроля их времени жизни. Стоит ли погружаться в пучину стандартов и реализаций STL для контейнеров? Как обычно реализуют управление памятью в контейнерах и коллекциях в С++?
No. 22506  
>>22505
>Обходом по дереву
Имеется ввиду обход в правильном порядке (от наименьшего по ключу к наибольшему) с использование итератора класса дерева. Итератор можно написать так, чтобы обход был за O(n) и в корректном порядке, но это не точно.
No. 22507  
2017-02-21-889758.jpg - (261.84KB, 850×680)
22507
>>22432
>1.
>>22457
>httpSession
Не нравится мне это решение — хранить ссылку на объект HttpSession в инстансе @ServerEndpoint. Похоже на какой-то хак, тем более, что на том же SO разработчик Jetty говорил, что такие объекты бесполезно мутировать. Да даже если и имеет смысл, то непонятно, к чему это приведёт при репликации/сохранении сессий.

>>22439
6. WebSocket контейнер — абсолютно автономный контейнер с ограниченной поддержкой CDI, но не суть. Даже если рукопожатие произошло в контексте JSF сервлета, получение JSF @SessionScoped бинов от последнего — задача нетривиальная, поскольку WebSocket контейнер работает в своём собственном контексте: https://stackoverflow.com/questions/36177742/how-to-propagate-cdi-session-beans-from-http-session-to-websocket-session Ещё более нетривиальной является задача передачи данных от @ServerEndpoint в JSF @SessionScoped бин.

7. EJB @ServerEndpoint. Нигде в спецификации не написано, что оно должно так быть, но так есть. https://abhirockzz.gitbooks.io/java-websocket-api-handbook/content/part-1-tying_in_with_the_java_ee_platform.html Для расшаривания данных можно заморочиться со @Stateful EJB: в отличие от CDI Managed Beans, они контекстно независимые. С другой стороны этот бин один хрен надо таскать по ссылке между контейнерами, так что он в данном случае от обычного POJO отличается лишь zero-cost сoncurency и необходимостью явного разрушения.

Можно было бы рассматривать WebSocket-ы как ещё один способ клиент-серверного взаимодействия — похоже, что JSR-356 дизайнили исходя из этого положения, — однако основной его фронт работы — это обеспечение полнодуплексного обмена данными на веб-страницах, — посему отсутствие интеграции с Servlet-контейнером довольно печально.

>>22495
Это соглашения именования (Naming Conventions), означать могут всё, что угодно — у каждого проекта они свои. Смотри в документации для разработчиков к конкретному проекту.

>>22505
Плюсы как-то мимо меня прошли...
Лучше всего было бы передавать в дженерик параметром настройки ссылку на метод деструктора с фоллбэком на NOP, как это сделано в коллекциях Ada 2005: кому надо, укажут, кому не надо — не укажут. Но это Ada, там с настраиваемыми абстракциями всё хорошо. Можно ли так делать в плюсах, мне неизвестно.
No. 22508  
>>22505
>Как обычно реализуют управление памятью в контейнерах и коллекциях в С++?
Запусти valgrind на тестовом векторе и посмотри.

А вообще,
>добавление осуществляется по ссылке
Это, блджад, контейнер, он должен инкапсулировать объект целиком и полностью, и добавлять копирующим конструктором. Если я вижу вектор интов, я ожидаю, что там инты, что на push() я создаю новый инт, что на clear() все инты убиваются в памяти сами. Иначе я бы сделал вектор указателей на инты, которыми бы управлял сам.
No. 22509  
by_ref.jpg - (121.50KB, 1810×344)
22509
>>22508
Векторы, как я понимаю, в сущности класс-надстройка над низкоуровневым динамическим массивом. Это не совсем то. Пример более близких структур данных наподобие list, set и map был бы корректнее. К тому же, добавление в вектор всё равно осуществляется по ссылке. Хоть содержимое, на которое она указывает, и будет потом скопировано.

> Как обычно реализуют управление памятью в контейнерах и коллекциях в С++
> Это, блджад, контейнер, он должен инкапсулировать объект целиком и полностью, и добавлять копирующим конструктором. Если я вижу вектор интов, я ожидаю, что там инты, что на push() я создаю новый инт, что на clear() все инты убиваются в памяти сами.
Всё понятно, спасибо. Но плодить копии объектов мне как раз таки не нужно. Я пишу вещь не под инты или некий общий template, а под вполне конкретные классы. Обзову контейнером указателей на тогда, чтобы не было путанницы.

>>22507
> кому надо, укажут, кому не надо — не укажут
Так и сделаю, спасибо.
No. 22510  
>>22509
>добавление
Не добавление, а push_back то есть.
No. 22520  
>>22495
Имена, начинающиеся с одного символа подчёркивания, в глобальном пространстве имён и в ::std зарезервированы для реализации стандартной библиотеки. Имена, начинающиеся с двух символов подчёркивания или одного underscore с последующей за ней заглавной буквой, в любом пространстве имён и для любого использования тоже зарезервированы для STL. Впрочем, использование начинающихся с двух символов подчёркивания имён в стандартных заголовочных файлах даже для локальных переменных, когда не может быть конфликтов с именами из пользовательской программы, не может быть объяснено этими соображениями, в таких случаях это конвенция, видимо.
No. 22521  
2018-04-28-960485.png - (122.68KB, 800×531)
22521
>>22520
В данном случае слово «зарезервировано» означает лишь организационное мероприятие: разработчики языка и стандартных библиотек решили, что будут использовать такие имена. Это не значит, что ты не сможешь физически создать свои переменные с такими именами, это значит, что отсутствие побочных эффектов, в том числе конфликта имён на этапе компиляции, тебе никто не гарантирует. Т.е. это соглашение в чистом виде. Можно ему не следовать, если ты, к примеру, разработчик стандартной библиотеки или самодвижущийся деревянный болван.

Что до смысла этих префиксов внутри компонентов, то он остаётся на совести разработчика. Их может лепить IDE или форматтер подавляющее большинство имён в Джаве выбрано IDE, к слову, разработчик может вообще не вкладывать в префиксы никакого смысла — просто так принято писать; может вкладывать свой локальный. Зависит в общем-то от того, насколько полное соглашение и насколько строго ему предлагается следовать.
No. 22523  
А вы любите конфетки? http://www.jsweet.org/ Можно писать на JS пока пишете на Java.
No. 22567  
Houseki_no_Kuni_full_2043411.jpg - (728.32KB, 1080×720)
22567
Продолжим тему счастливого лисоводства (которая 52 ESR).

Есть конечный автомат — модуль WebSocketEndpoint, предназначен для установки соединения, настройки RPC, приёма/отсылки команд и реконнектов. Имеет состояние вида type State is (START, SETUP, READY, RESTART, STOP, ERROR);. Состояние переключается данными из инстанса вебсокета (который pv_ws = new WebSocket (URL); pw_ws.onopen = pm_onopen; ... и создаётся внутри WebSocketEndpoint). В нормальных браузерах работает нормально. В лисе такое чувство, что JavaScript многозадачный.

Кейс 1-й: Сервер отсылает данные в последовательности (A, B, C), лиса активирует обработчик onmessage в произвольном порядке, т.е. (B, C, A) или (C, A, B), e.t.c. Ладно, сделаем простой conversation. Сделано, получаем...

Кейс 2-й: Клиент и сервер обмениваются сообщениями по очереди, т.е. A-> && <-B && C->, где “->” — от сервера клиенту; “<-” — от клиента серверу. Все хорошо с порядком, но состояние инстанса WebSocketEndpoint не изменяется. Такое чувство, что он просто клонируется на каждое сообщение. Это мракобесие волшебным образом исчезает при включении отладчика.

Вопрос: WTF?

>>22507
8. WebSocket протоколы оказывается все разные, старые в апп-серверах побанены due to multuple protocol's bugs; на томокате, походу, вообще нет старых версий. В итоге оно работает только в модерновых браузерах, а остальные посылает подальше, т.е. клиент коннектится и сразу же сервер закрывает соединение.
No. 22569  
>>22567
Похоже галка «Отключить HTTP-кэш» в настройках дев-тулзов лисы отключает какой-то другой кэш. Очень весело смотреть, как курсор при пошаговом исполнении выпрыгивает из функции на комментарий и чешет себе дальше. При закрытии дев-тулзов тоже ничего не происходит, всё остаётся по старому. Зато честно загружает с сервера скрипты и стили, вопрос только, куда? Способ грохнуть кэш для сайта я так и не нашла. Ну и ещё косяк: у исключений e.stacktrace печатает стектрейс места своего вызова, а не места, где было вызвано исключение.
No. 22617  
>>22569
Не читал остальной тред, но кажется, что я могу знать в чем суть описанной в вашем посте проблемы. По крайней мере, одной из них.
У браузеров кроме кэша на диске есть ещё и in-memory кэш. То есть, это кэш в оперативной памяти и без него браузер нормально работать просто не может, так что вряд ли вам удастся его отключить.

Хотя утверждать этого я не могу, это только мои предположения.
No. 22618  
>>21947
Не делай там ничего и не оставляй никаких приватных данных. Они твою имиджборду удалят, а аккаунт заблокируют без указания причин (причины им не нужны, им нужны твои данные и то что ты будешь держать на сервере).
Кажется, я там делал что-то. К счастью, никаких важных данных им не оставил. А мою то ли футабу, то ли вакабу они просто удалили через пару дней.

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

Очень поздно ответил, но лучше так, чем совсем ничего. Скупой платит дважды. Не забывайте.
No. 22620  
15659436632210.png - (385.40KB, 800×800)
22620
>>22567
9. Enterprise — это кластер. Нельзя обойти эту тему. https://www.thomas-schuett.de/2014/04/11/websocket-und-der-cluster/ Вкратце, проблема в том, что концепция WebSocket-ов убивают концепцию кластера: если ноды в кластере полностью одинаковы с точки зрения клиентов, то наличие в них WebSocket-соединений делает каждую ноду уникальной, поскольку соединения не могут реплицироваться. Отсюда даже приложение для чата на кластере становится нетривиальным в реализации.

Ну и забавная книжечка, у которой нет оглавления (но главы можно открыть через Гугл, например), и которая, внезапно, содержит низкоуровневые детали протокола: http://enterprisewebbook.com/ch8_websockets.html

>>22523
Как обычно, идея хорошая, реализация не очень. Бардак в кодогенераторе с версиями JS: что-то генерируется под ES3, что-то — под ES6, контроля нет. Куча недоделок, которые некому пофиксить уже больше года. Классы оно делает через revealing module паттерн, т.е. ничего особо хитрого, к чему нельзя было бы прийти самостоятельно.

>>22617
Там вообще дичь какая-то приключилась — файлы загружаются с сервера, это по логам видно, в отладчике отображаются эти загруженные файлы, исполняется какая-то смесь из старых и новых файлов. На пошаговой отладке оно показывало, что выполняет закомментированный участок кода потом вышагало за пределы функции и пошло дальше по пустым строкам. Без отладчика оно, похоже, всегда использует старые версии файлов и обновляет их когда ему приспичит. Ну и стектрейсы меня убили: догадайся, мол, откуда оно прилетело. Короче, ну его нафиг, этот Firefox, для разработки он с такими глюками не подходит. В Макстоне ещё более-менее отладчик, и то он у меня вешается тысячью и одним способом, т.е. такое себе минное поле — туда не нажимай, сюда не нажимай. Блин, почему в Presto был нормальный отладчик?

>>22618
>им нужны твои данные и то что ты будешь держать на сервере
Им может быть просто пофиг на тебя и твои данные. В результате технических работ что-то пошло под rm -rf, да и пёс с ним. Новый админ не на ту кнопку нажал. Или твой сайт что-то ломает в их системе и админу лень разбираться. Общественного резонанса всё-равно не будет, ты же не пойдёшь писать в блог гневные посты о том, что бесплатный хостинг утерял твои данные, — на то он и бесплатный.
No. 22623  
>>22620
Может быть пофиг. А может и не быть. Подозрительное поведение хостинга подсказывает, что им лучше не доверять.
No. 22633  
>>22623
Доверие в бизнесе не имеет ничего общего с человеческим доверием: это просто когда обе стороны знают, что другой стороне не выгодно кидать партнёра. Как только одна из сторон получает иную информацию, доверие испаряется. Отсюда вопрос доверия к бесплатным услугам левых дядей может разве что улыбку вызвать.
No. 22684  
Есть ли более короткий, чем
$i++ while $s>>$i
способ найти максимальный занятый разряд в $s?
No. 22685  
>>22684
Еще можно тупо через логарифмы:
$s ? int(log($s)/log(2)+1) : 0
но я не уверен, что это лучше
No. 22686  
>>22685
>$s ? int(log($s)/log(2)+1) : 0
int(log($s*2+1)/log(2))
^_^
No. 22689  
>>22684
Если под «короче» понимается быстрее, то в таких случаях лучше написать несколько версий и протестировать их. Если под поиском максимального занятого разряда понимается поиск индекса (отсчитывая справа) первого слева бита, для которого значение равно еденице, то на плюсах, по крайней мере, получается, что вот этот
int result = 0;

if(value == 0)
    return -1;
for(unsigned int i = int_type_size / 2; i != 0; i /= 2 ){
    if(value >> i){
        result += i;
        value = value >> i;
    }
}
return result;
метод, ищущий индекс ненулевого бита беззнакового числа value, работает заметно быстрее, нежели формула return value != 0 ? (int)(log(value) / log(2)) : -1. А именно, на 2²⁸ случайных беззнаковых 64-битных целых со случайным количеством ведущих нулей в старших разрядах выполнение первого алгоритма заняло 2.645, а использование логарифмов — 3.959. Чуть хуже логарифмов справился бинарный поиск — 5.104. Поиск индекса в цикле подобном >>22684 занял 12.184. Разница во времени выполнения сохраняется достаточно стабильно.

Но PHP (или что это) вещь скриптовая, и там может быть всё совершенно иначе. А ещё могут быть такие данные, для которых с высокой вероятностью первый ненулевой бит будет в первых старших [левых] разрядах, нежели в младших, и тогда простой цикл будет быстрее.
No. 22691  
PS Компиляция производилась с O2, O3 ломает порядок тестовых операций и делает вещи медленнее, ffast-math излишне ломает точность деления и приводит к неверным результатам. int_type_size есть размерность переменной value в битах, полагается, что она является степенью 2.
No. 22694  
>>22689
>для которых с высокой вероятностью первый ненулевой бит будет в первых старших [левых] разрядах, нежели в младших, и тогда простой цикл будет быстрее.
Угу, как раз мой случай. В 99% случаев, там используются только 1-2 крайних разряда, так что "вилка" будет требовать большего количества итераций.

>PHP (или что это) вещь скриптовая
Это перл. Но не суть важно.
В общем, интереса ради прогнал тесты:
>>22684 — 18с
>>22685 — 14с
>>22686 — 15с
• пустышка, которая вообще ничего не делает — 11с
И всё это — на количестве, на 20 порядков меньшем, чем у тебя. В общем, на скриптах гоняться за скоростью — смысла нет…
No. 22701  
>>22694
>на 20 порядков меньшем
А нет, вру. Мне показалось, что в >>22689 — 10²⁸, а там 2²⁸. Так что — всего на порядок и даже меньше. Но всё равно…
No. 22702  
>>22701
Я надеюсь, запуск Перла ты не учитывал?
No. 22703  
>>22702
А причем здесь его вызов? Всё изнутри считалось. А так — накладные расходы на вызов функции и обход массива в цикле жрут, как можно видеть по последней строке в >>22694, в 2-3 раза больше, чем сама операция.

А на самом деле, если всё аккуратно подсчитать, то получаем, что на логарифмах си в 2.3 раза быстрее перла, что вполне похоже на правду.
No. 22704  
>>22703
>2.3
Но ведь 14 / 3.959 уже 3.536. А данных на перле, как я понимаю, было несколько меньше при этом. Как же оно 2.3-то получается? А вообще, по-хорошему нужно учитывать рабочую тактовую частоту ядра (3.4 GHz у меня), набор инструкций (ivybridge), кэш, способ тестирования (у меня, в частности, за счёт inline и O2, вызова функций, считавших индекс, не было, была подстановка их кода в место использования, ещё прямо в цикле рассчёта индексов была проверка результата алгоритма по соответствующему элементу массива ответов), память и прочее.
No. 22705  
1456465550598.jpg - (86.63KB, 1200×600)
22705
Сохранил в линуксе вывод консоли через оператор ">>" в файл. Там среди прочего был вывод содержимого конфига командой cat. Обрезал в текстовом редакторе лишнее, оставив только конфиг. Запускаю значит, программа ругается что там какие-то дерективы отсутствуют. 3 часа думаю, что я слепой и смотрю на полностью валидный конфиг. Потом замечаю что вывод в терминале этого файла через cat дает 1,5 строки. Оказывается, формат окончания строк там был от макоси. Сконвертировал в unix, стало все нормально.
Вопрос: как? Откуда? При чем тут макось?
Изначально я сохранял вывод docker build . >> file.txt, в Dockerfile была директива RUN cat httpd.conf
No. 22707  
>>22704
Просто ночью спать надо. Я разделил, вместо того, чтобы умножить. На деле разница около 20. А с учетом того, что исполняется оно на разных компах, сравнение смысла не имеет вообще.
No. 22708  
>>22705
Выполнение cat httpd.conf в терменале (без Docker'а) даёт МакОС-style завершение строки или '\n'? Если '\n', то можно предположить, что конфигурация Docker'а такова, что он ковертирует все '\n' в '\r' (или что там у них). А вот если cat сам по себе даёт '\r' как символ завершения строки, то это уже интереснее.
No. 22710  
2015-02-10-710173.jpg - (95.23KB, 450×600)
22710
>>22684
++$i while $s >> $i

На сотню-другую милли-секунд быстрее. На ассемблере вряд ли будет как-то иначе:

   POP S LDI I,8 ; for 8-bit register
LOOP:
   LSL S BRCS END
   DEC I BRNE LOOP
END:
   PUSH I

Но вообще, оптимизация по производительности Перла — это отдельный навык, который никому не нужен и никуда более не применим. Почти что как старый JS без JIT-а.
No. 22712  
А вы тут умнее мейлачеров из pr ?
No. 22713  
2016-07-24-848579.png - (304.76KB, 700×700)
22713
>>22712
Не могу сравнивать — я там не бываю.
No. 22714  
>>22710
>На ассемблере вряд ли будет как-то иначе
Хотя если говорить про высокоскоростные branchless-реализации на ассемблере и C, то можно использовать умножение де Брюина: http://supertech.csail.mit.edu/papers/debruijn.pdf — по скорости оно конкурирует с нативными процессорными реализациями, однако требует наличия в процессоре инструкции целочисленного умножения.
Btw, это, однако, является оффтопом к вопросу.
No. 22778  
зделайте из меня программиста пожалуйста
No. 22788  
Сделол
No. 22801  
Сырно, привет.
Такой вопрос. Java начал изучать ещё год назад, но до сих пор не могу найти ответ. Как применять Java вне среды разработки? I mean чтобы код применялся для рассылки каких-нибудь сообщений и прочее. Возможно ли вообще такое?
Пользуюсь Eclipse.
No. 22814  
2016-08-10-852447.png - (209.99KB, 639×960)
22814
Редхатовские редиски: @WebServiceRef не поддерживает classpath... Ладно, у нас есть Ant.
Норвежские редиски: Opera Blink при коннекте к веб-сокету не передаёт хттп-сессию.

Интересный вопрос: автоматически OpenJPA делает индексы, но не делает FK; Hibernate делает FK, но не делает индексы. Куда пнуть оба чтобы делали и FK и индексы?

>>22801
$ java -jar your.jar

Джарник собирается или IDE, или системой сборки, например, maven-jar-plugin. Винды умеют запускать джарники по двойному клику. У Апачей есть утилита, которая делает виндовую службу из джарника; она идёт в комплекте к томокату (обоим, servlet-контейнеру и ee-серверу); ЕМНИП, у неё даже есть своя страничка на apache.org.
>Eclipse
В этой IDE без бутылки разобраться сложно.
No. 22815  
>>22814
Редхатовские редиски.
Если вы решили поюзать феньку JPA 2.1 SQL Schema generation и имеете форматированные SQL-скрипты, не забудьте указать Гиберу в persistence.xml

<property
   name = "hibernate.hbm2ddl.import_files_sql_extractor"
   value = "org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor" />

Зла на них не хватает.
>OpenJPA
У меня не получилось заставить его генерить FK, его потуги всегда приводят к ругани БД.
No. 22821  
Можно ли выключить/включить автодополнение по tab в клиенте mysql/mariodb без перезапуска оного с ключами -[-no]-auto-rehash?

С включенным оно выдаёт ошибку sql, если внутри копипасты более одного таба подряд. С выключенным — не очень весело вводить всё ручками. Всё время перезапускать клиент с разными ключами — тоже не очень-то приятно.
No. 22828  
>>22815
>его потуги всегда приводят к ругани БД
«Не могу добавить ограничение — оно у вас кривое.» Если тоже самое забить руками или через скрипт, оно забивается без ошибок. Гибер создаёт FK тоже без ошибок через то же ALTER TABLE ADD FOREIGN KEY ... Я не знаю, через какую жопу OpenJPA создаёт таблицы и куда копать.

>>22821
Увы, я через жидеевский сижу, там таких проблем нет.
No. 22829  
Какой HTTP статус отдавать, если:
  • При постинге была введена неправильная капча
  • Капча не найдена в базе (протухла или не выдавалась)
Пока склоняюсь повесть на оба случая статус 400 Bad Request
No. 22831  
>>22829
422 Unprocessable Entity, ошибка валидации же, и расшифровку в теле.
No. 22832  
Вопрос опять-таки по MySQL/MariaDB.
Когда я создаю там процедуру/функцию/триггер/эвент/etc. — могу я быть уверенным, что всё, что находится внутри создаваемой сущности, будет выполнено в рамках одной трансакции, или мне нужно явно прописать это ручками через START TRANSACTION/COMMIT?
No. 22834  
>>22832
Руками, остальное вендорспецифично. Если не укажешь явно, каждый statement будет завёрнут в свою транзакцию и откатить изменения ты не сможешь.
https://stackoverflow.com/a/2622157
No. 22837  
>>22834
>откатить изменения ты не сможешь
Мне не откатить, мне бы гарантию, что они атомарные, т.е. что между моими, скажем, SELECT и UPDATE не вклинится что-то левое…

И еще один вопрос. В SQL (в том его подмножестве, которое понимают вышеуказанные BD) существует какой-то аналог исключений? Вот допустим, я делаю INSERT. Есть некая очень небольшая вероятность, что значение с таким ключём уже есть. И тогда его надо обрабатывать по-особому. Но встречается такое крайне редко. Т.е., если перед каждым INSERT делать SELECT для проверки наличия ключа — в 99.99999% случаев это будет пустой тратой времени.
В рамках самого SQL можно сделать, чтобы оно после неудачного INSERT не обрывало работу запроса с сообщением он ошибке, а делало что-то другое? Или только на уровне того внешнего скрипта, который обращается к базе (база данных вернула ошибку, разбираемся…)?
No. 22838  
>>22837
>существует какой-то аналог исключений?
Сам спросил, сам отвечаю: нормального, походу, нет. Есть вот это: https://mariadb.com/kb/en/library/declare-handler/
Относительно того, стоит ли им пользоваться, или же всё-таки вынести эту часть за пределы базы во внешний скрипт — у меня большие сомнения.

И еще — как в SQL бороться с дублированием кода? Вот, допустим, в разных ветвях IF/ELSE у меня два здоровенных SELECT, отличающихся друг от друга всего парой небольших кусочков условий после очередного AND в конце WHERE. Как бы вынести их общую часть "за скобки"?
No. 22840  
2018-04-18-959373.jpg - (200.85KB, 500×500)
22840
>>22837
>не вклинится что-то левое
Уровни изоляции транзакций же: https://crate.io/docs/sql-99/en/latest/chapters/37.html
https://www.sqlshack.com/concurrency-problems-theory-and-experimentation-in-sql-server/

З.Ы.: JPA устанавливает уровень как READ_COMMITED с возможностью пессимистичных и оптимистичных блокировок, и не подразумевает его изменения. EJB по умолчанию устанавливает требование к открытию транзакции для каждого метода, являющегося точкой входа в сервисный слой. Сделано так для освобождения от блокировок при сохранении требуемой целостности данных. Ты, очевидно, хочешь залочить свою таблицу на время работы процедуры, однако это может стать узким местом в конкурентной среде. Оно тебе точно надо?
No. 22841  
>>22840
>Ты, очевидно, хочешь залочить свою таблицу на время работы процедуры,
Хочу? Я хочу, чтобы на время работы процедуры/функции, про которую сказано, что она NOT DETERMINISTIC MODIFIES SQL DATA, затронутые в ней таблицы были бы для всех остальных r/o.
>однако это может стать узким местом в конкурентной среде. Оно тебе точно надо?
Изменения в базе происходят там не очень часто, так что не думаю, что в моём случае это составит проблему. Фактически, вероятность коллизии там вообще очень мала, но, тем не менее, учитывать её всё равно надо.

>>22838
>стоит ли им пользоваться
В итоге ограничился в том месте
DECLARE EXIT HANDLER FOR 1062 RETURN NULL;
А где и что будет с этим возвращаемым значением разбираться — это уже отдельный вопрос…
No. 22845  
>>22841
Ну и поставь ей уровень изоляции SERIALIZABLE тогда.
No. 22847  
2015-02-25-714113.jpg - (190.27KB, 1000×698)
22847
Мы добавили возможность определять свои DataSource в web.xml! В GF4 работает, в jBoss тоже. В Томкате через жопу: сурсы глобальны, не удаляются при undeploy-е приложения (вернее текут), non-JTA сурсы он назначает приложению самостоятельно, рандомно выбирая один из доступных, (зачем он вообще это делает, блджад?! ведь его кривой ORM-фреймворк OpenJPA потом начинает путаться при авто-апдейтах схемы) ему глубоко похрен, что там указано для юнита в persistence.xml. Они его ещё хотят сертифицировать как EE7-compilant.
http://tomee-openejb.979440.n4.nabble.com/Disable-auto-create-resource-TomEE-1-5-1-td4660448.html — они издеваются: или указывай оба, или прописывай конфигурации для всего руками.
>Keeping with our philosophy to free you up from redundant configuration, we will happily auto-create a missing jta-data-source or non-jta-data-source based upon the supplied DataSource.
>free you up from redundant configuration
>free you up
«Хотели как лучше, получилось как всегда»™®

>>22814
>Редхатовские редиски
Определение, которое устраивает всех (GF, jBoss, TomEE) при работе с веб-сервисом:

@WebServiceRef
   (type = YourServiceProvider.class,
    value = YourServiceImpl.class)
private transient YourServiceProvider yourService;

однако для jBoss надо положить wsdl-файл в yourApp.war:META-INF/wsdl/.
No. 22858  
2017-03-31-896902.png - (733.10KB, 1000×1000)
22858
Вышел TomEE 8.0.0, production ready то бишь, на базе Tomcat 9: https://tomee.apache.org/download-ng.html Из того, что сразу бросилось в глаза:
1) В GUI-программке для настройки службы Windows сломали поддержку XP. Причем саму программку службы не сломали. Лучше заменить её на такую же из семерки или же попробовать скомпилировать из исходников.
2) Bean Validator bval-jsr-2.0.3.jar имеет феерический баг, когда конструкция вида

public interface ResultServiceLocal {
   public void remove (@NotNull final Result result);
}
public class ResultServiceBean
   implements ResultServiceLocal
{
   @Override
   public void remove (@NotNull final Result result) {}
}

по его мнению нарушает принцип Лисков. Рекомендуется сразу заменить на валидатор из семерки поскольку баг-фикса нет.
3) Поддерживает легаси-версии WebSocket-протокола.
4) В админку добавили локализацию.
5) Ест памяти на 10 (десять) мегабайт меньше т.е. не 150, а 140.
Несмотря на все свои недостатки (падает при деплое приложения с кривым EJB, дурь с датасурсами, кривой ORM, частичная поддержка EE 7 когда уже 9-ю обещают) остаётся самым лёгким и простым EE-сервером.
No. 22859  
2017-02-21-889732.png - (357.73KB, 853×644)
22859
JEE-приложения можно крутить на Heroku предварительно залив туда TomEE в docker-образе: http://dplatz.de/blog/2018/heroku.html Никто не говорил, что так делать нельзя. Docker-образы можно делать без Docker-а maven-plugin-ом Google JIB: https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
No. 22868  
Вопрос по css.
Допустим, имеется примерно такой градиент:
background: fixed no-repeat radial-gradient(circle farthest-corner at 90% 15%, [цвета]);
Как теперь расположить поверх него картинку, чтобы она была точно в центре этого градиента и при изменении размера блока не уезжала из оного, но масштабировалась вместе с ним?

Пытался мудрить с background-position/background-size — уезжает из центра при изменении размера окна браузера.
No. 22966  
Кто-нибудь делал приложения на Дропбоксе? Мне нужно приложение для личного использования, там есть кнопочка “Apply for production”. Надо ли мне делать это апплай фо продакшен, если приложение будет приватным?
No. 22967  
2018-01-13-945017.png - (786.27KB, 768×1024)
22967
>>22859
Что-то я в расстройстве от этих хипсторских технологий:
— Полноценно работать с ним можно походу только через консольный вишмастер на Node.js — веб-интерфейс довольно сильно отстаёт в плане настроек всего.
— Оно может подключиться к гитхабу, но не может с него собрать и задеплоить докер-образ. Пришлось городить билдпак и писать сборочные скрипты на sh, которые JDK, TomEE и Maven тянут с мавеновского хранилища и устанавливают на билд-машину, с которой после делается slug-образ.
— Предлагаемая (бесплатно) база (одна база) имеет лимиты, на фоне которых старая добрая JavaDB кажется убер-крутой вещью, и пробрасывается на инстанс машины через одинокую переменную, содержащую урл с кредами, который ни один JDBC-драйвер, в том числе и PgJDBC (какая ирония!), в упор не понимает. Т.е. пили в билдпаке парсер урлов на sh.
— Инстансы машины (dyno) ресетятся в полночь в промежутке от 0 до 3,6 часа, все данные, сохранённые локально, превращаются в тыкву. У вас есть 30 секунд после вспышки (SIGTERM) чтобы их сохранить.

От всего этого, в особенности от того, что меня заставили пердолить скрипты на sh под виндой (вы умеете отлаживать программы в уме?), у меня разыгралась изжога, дикое раздражение и желание нагнуть систему. У меня есть trap по SIGTERM-у — вспышка сверху, — 30 секунд жизни после вспышки, JavaDB, аккаунт в дропбоксе, публичная репа с билдпаком и приватная репа с кредами. Что думаете?
No. 22969  
>>22966
У них в мане сказано, что можно и не публиковать.

>>22967
В мане говорится, что
>When performing controlled or periodic restarts, new dynos are spun up as soon as shutdown signals are sent to processes in the old dynos.
Т.е. на тарбол со стейтом сервера надо выставлять лок на время работы инстанса. API дропбокса позволяет устанавливать на файлы аттрибуты. Однако на старт новых инстансов даётся 60 секунд, успешность старта определяется наличием слушателя на проброшенном в инстанс в переменной PORT порту. Значит надо или запускать на время блокировки стейта какой-нибудь HTTP-сервер со статичной страничкой или проксировать томокат каким-нибудь нгинксом.
No. 22987  
>>22868
Тебе нужно что-то типа такого?
background-image: url(https://www.techpowerup.com/img/u98ID6UrEJvHVjA7.jpg), radial-gradient(#e66465, #9198e5);

background-position: center center, center center;
background-size: auto 50vh, cover;
background-attachment: fixed, fixed;
background-repeat: no-repeat, no-repeat;

No. 22992  
258389_original.jpg - (22.66KB, 523×394)
22992
>>22967
>Пришлось городить билдпак
https://github.com/Millihi/heroku-deploy-tomee — чур не ржать громко!
No. 22994  
>>22987
Нет. Во-первых, оно должно быть не в центре, а недалеко от верхнего правого угла. Во-вторых — у тебя картинка не масштабируется при изменении ширины окна. (Границы картинки должны всегда быть примерно на одних и тех же цветах градиента, изменения её размеров должно быть синхронно с изменением размеров градиента)

У меня пока получается, только если центр градиента совсем загнать в угол, а от картинки, соответственно, оставить видимой лишь четверть:
background-attachment: fixed 

background-repeat: no-repeat; 
background-image: url(bottom-left.png), radial-gradient(....);
background-position: top right;
background-size: 10%, 100%;

Но это, всё-таки, тоже не совсем то, что нужно.
No. 22995  
2018-04-30-960713.jpg - (110.32KB, 1014×1273)
22995
>>22992
Оно работает: https://milfie.herokuapp.com/ Одна машина, 0,5 GB памяти, 0,5 GB дискового пространства, 255 потоков, 550 часов работы на месяц.
Можно деплоить приложения, можно тыкать приложения, например https://milfie.herokuapp.com/tetris/index.xhtml — они сохраняются в дропбоксе, благо, что EE-шные приложения весят копейки.
Осталось разобраться, почему OpenJDK памяти жрёт как не в себя.
No. 23005  

#!/bin/sh

killJob () {
   while read j; do
      echo "Killing job $j"
      kill "$j"
   done<<-EOF
      ${JOB_LIST}
   EOF
}

Syntax error: end of file unexpected (expecting "}")

А чего, это только в BSD работает что ли?! А как тогда списки обрабатывать?
No. 23006  
>>22994
Ну так это по-идее уже мелкие детали, которые просто можно настроить в параметрах, не? Вот например:


background-image: url(https://www.techpowerup.com/img/u98ID6UrEJvHVjA7.jpg), radial-gradient(#e66465, #9198e5);
background-position: top 10px right 10px, center center;
background-size: 50vw 50vh, cover;
background-attachment: fixed, fixed;
background-repeat: no-repeat, no-repeat;


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

Соответственно, в твоем случае просто для картинки (которая является первым элементом фона в примере) ты просто можешь сказать position от правого верхнего угла в нужных тебе единицах измерения - я вот в примере указать top 10px right 10px - т.е. в 10 пикселях от правой стороны и в 10 пикселях от верха. Но ты можешь ведь и другие параметры подобрать. Точно также с параметрами для size - я вот выше в примере указал для первого элемента фона (т.е. картинки) 50vw и 50vh, чтобы картинка жестко масштабировалась от размера экрана (вьюпорта), но там разные варианты есть, в зиависимости от нужного поведения и эффекта.
No. 23007  
2017-06-18-910473.png - (430.25KB, 1400×989)
23007
>>22995
>почему OpenJDK памяти жрёт как не в себя.
Очень просто: это не виртуальная машина, а реальная, у которой 64 гига ОЗУ и 32, ЕМНИП, ядра, а я в неё захожу под автосгенерённым в Убунте аккаунтом с жидовскими квотами. Предлагаемая ими JVM не умеет читать квоты, хотя шапки и сделали патч может быть с Zulu повезёт больше, она новее вроде бы. Пока единственным выходом будет явное указание доступного количества оперативы — -XX:MaxRAM=512m — ну и использование SerialGC.

>>23005
Линуксовый шелл не понимает EOF, отбитый пробелами... Боже, как я ненавижу всё это...
No. 23016  
>>22710
> На ассемблере вряд ли будет как-то иначе
Смотря на каком ассемблере. Для x86-64 можно что-то типа
bsr rax, SRC
cmovz rax, -1
No. 23018  
2014-07-11-660292.jpg - (191.80KB, 727×800)
23018
Вот есть java.util.PropertyResourceBundle, а почему нету java.util.XMLPropertyResourceBundle? Причем Идея их поддерживает, т.е. всё таки кто-то использовал XML-проперти.

>>23016
Хитрое вычисление y = 1 + floor (lb (x)) через последовательности де Брюина предложили как портабельный способ как раз таки ассемблерщики потому, что инструкции эти или багованные, или тормозные.
No. 23019  
>>23005
Дай угадаю: у тебя пробелы вместо табуляции?
No. 23024  
2010-10-26-338254.png - (13.55KB, 400×350)
23024
>>23019
Угадал, и чего? У меня была Фря, там такой фигни не было (там и jobs -p работал, и echo -e, и v=$'1\n2\n3'). Сейчас я за неимением машины с Линуксом смотрю в старые скрипты из Фри, делаю также и получаю какие-то дурацкие невнятные ошибки, над которыми надо ломать голову по пол-дня. Блджад, я десяток-два классов на Джаве могу из головы написать, скомпилять и оно будет работать как задумано, а тут скрипт из трёх методов пятьдесят раз надо переписать пока все скрытые грабли не закончатся.
No. 23031  
>>23024
>по пол-дня
А можно всего лишь осилить ман конкретного интерпретатора или загуглить.
Алсо, ты б ещё с Plan 9 портировал.
No. 23032  
2015-02-18-712413.jpg - (234.24KB, 909×1000)
23032
>>23031
Именно так рассуждали в Майкрософте когда делали шестого осла. Осиливание манов к ослу родило у разработчиков устойчивое стремление убить и закопать осла, что они в итоге и сделали.
No. 23065  
>>23018
> инструкции эти или багованные, или тормозные
Что ты имеешь в виду под "багованные"? Работают так, как описано в документации, а не так, как хотелось бы? Так сейчас есть LZCNT, если нужна другая семантика. Довольно тормозными такие инструкции были на многих x86 микроархитектурах примерно года до 2007, а сейчас стали быстрыми. Может, на ARM ещё на каких-то ядрах есть проблемы с clz?
No. 23115  
2017-03-31-896900.png - (3.54MB, 2300×2434)
23115
>>23031
Я так понимаю, что ждать от тебя ссылок на «документацию» не стоит? Ещё мог бы подогнать BNF языка и показать, где там описано, что EOF space-ами отбивать нельзя.

>>23065
https://stackoverflow.com/a/31718095
No. 23116  
>>23115
https://linux.die.net/man/1/bash , секция Here Documents, последний абзац.
Ихсперт ты наш.
No. 23117  
2017-04-01-897094_jpg.jpg - (1.08MB, 1564×1196)
23117
>>23116
Мне по sh(1), о великий линукс-гуру. Bash — это совсем другой шелл, ты бы ещё по tcsh ман показал.
No. 23118  
>>23116
Ну и по bash(1) ты тоже умудрился ответить на что-то своё. Спрашивали про _delimiter_, как его обозвали в мануале, а не про _word_ из того же мануала. Про _delimiter_ там написано следующее в первом абзаце:
>This type of redirection instructs the shell to read input from the current source until a line containing only delimiter (with no trailing blanks) is seen. All of the lines read up to that point are then used as the standard input for a command.
>(with no trailing blanks)
То есть, без space-ов на конце.
No. 23119  
>>23116
И если говорить про те линуксы, у которых в качестве sh(1) идёт bash(1) в POSIX-режиме, то стандарт ничего не говорит про отбивку EOF space-ами: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
>The here-document shall be treated as a single word that begins after the next <newline> and continues until there is a line containing only the delimiter and a <newline>, with no <blank> characters in between.
Т.е. без пробелов между разделителем и новой строкой.
No. 23121  
>>23117
>Мне по sh(1)
https://linux.die.net/man/1/sh, секция Here Documents, последний абзац.
Ихсперт ты наш.

>>23118
>Спрашивали
Почему >>23005-код не работает. Ответ: он не работает, потому что там пробелы вместо табуляции. При чём здесь какие-то пробелы после EOF, знает только наш ихсперт. Почему слово "only" начинает читаться как "only, but maybe with leading spaces", опять-таки, знает лишь он. Почему надо останавливаться на чтении первого абзаца, а не читать весь соответствующий ман? Почему игнорируется замечание, что это гуглится за 2 секунды? На всё воля ихсперта.
No. 23136  
У меня есть функция, написанная кем-то для матлаба.
У меня есть результат обработки известного набора входных данных (якобы) этой функцией.
У меня есть собственный аналог этой функции не в матлабе, который даёт на тех же данных иной результат.
У меня нет матлаба.
Как мне проверить промежуточные результаты вычислений, чтобы понять, откуда берётся расхождение?
No. 23170  
>>23136
>Как мне проверить промежуточные результаты вычислений?
>У меня нет матлаба.

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

https://octave-online.net/
https://www.tutorialspoint.com/matlab/try_matlab.php

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

Подойдет?
No. 23171  
>>23115
>>23116
>>23117
>>23118
>>23121

Для выяснения отношений между собой существует отдельная диспутов нить >>21353
No. 23211  
2015-02-18-712417.png - (823.06KB, 617×900)
23211
>>23121
В Убунте в качестве sh(1) идёт dash(1), маленький злобный одминчег локалхоста ты наш. dash(1) POSIX-совместимый внезапно, был запилен как-раз как интерпретатор скриптов.

sh(1) в UNIX-like операционках — это POSIX-шелл, актуальный стандарт на него я тебе уже показала. Нигде в стандарте не написано, что так делать нельзя. Кончай тут додумывать нормативную документацию на языке, который ты не знаешь, и постить свои ссылки с помойки — я уже поняла, что ты некомпетентен.
No. 23212  
>>23211
>only the delimiter and a <newline>, with no <blank> characters in between
>If the redirection operator is "<<-", all leading <tab> characters shall be stripped from input lines and the line containing the trailing delimiter.

>Почему слово "only" начинает читаться как "only, but maybe with leading spaces", опять-таки, знает лишь он. Почему надо останавливаться на чтении первого абзаца, а не читать весь соответствующий ман? Почему игнорируется замечание, что это гуглится за 2 секунды? На всё воля ихсперта.

>-а
No. 23251  
>>23170
Да, именно что-то подобное я и искал.
Первая ссылка выдаёт страницу, которая не реагирует на какой-либо ввод, но вторая позволила мне получить результат, полностью совпадающий с моими собственными вычислениями.
Похоже, что имеющийся у меня чужой результат был получен всё-таки не через эту функцию.
Спасибо!
No. 23254  
>>23251
Рад, что получилось всё проверить (хотя странно что октав-онлайн у тебя не отозвался на ввод). Заходи, если надо будет еще совет.
No. 23255  
>>23254
Спасибо, обязательно зайду.
Искомый алгоритм расчёта я уже тоже подобрал - нужно было лишь слегка переставить слагаемые в известной формуле.
Взаимную информацию и информационную энтропию нужно было посчитать.
No. 23431  
Сап. Пробую решить задачку по JS, суть такова: дан массив из чисел, нужно написать функцию, которая умножает каждый чётный элемент массива на 2, а каждый нечётный на 3. Пробую сделать следующим образом: https://pastebin.com/55gcs1gQ
  • возвращается массив, каждый элемент которого равен undefined. Подскажите пожалуйста, где ошибка?

No. 23433  
>>23431
А return в функции за тебя кто ставить будет? https://repl.it/@Milfie/KnownDarkorangePackages
No. 23435  
>>23433
Спасибо. Можешь ещё подсказать, почему в примере тут http://learn.javascript.ru/array-methods#preobrazovanie-massiva return не используется? Не очень понимаю пока что почему это так работает.
No. 23436  
>>23435
Вся разница в синтаксисе, в примере в мануале однострочный синтаксис, где ретурн можно опустить:
>let lengths = ["Bilbo", "Gandalf", "Nazgul"].map(item => item.length);
Но если использовать в этом же примере многострочный синтаксис с {}, как у тебя, уже нужно самому ставить ретурн, иначе будет 3 андефайнеда.
>let lengths = ["Bilbo", "Gandalf", "Nazgul"].map(item => { item.length });
^^ здесь уже надо добавлять return
>let lengths = ["Bilbo", "Gandalf", "Nazgul"].map(item => { return item.length });
No. 23437  
>>23435
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Более короткая форма, если функция состоит только из return expression; Т.е. мог бы записать и так: https://repl.it/@Milfie/WorthwhileRealServerapplication
No. 23438  
>>23436
>>23437
Благодарю.
No. 23451  
DBhmjRbUMAAz5MQ8b.png - (292.26KB, 800×993)
23451
Поскольку у нас зашел разговор про деревья в реляционной модели, я вспомнила один интересный вопрос.

Как в рамках JPA 2.0 правильно готовить @OneToMany чтобы избежать N+1 SELECT проблемы? Из того, что я знаю выходит, что этот маппинг лучше вообще не использовать (даже с FetchType.EAGER), поскольку он проблем принесет больше, чем пользы.
No. 23452  
>>23451
>Как в рамках JPA 2.0 правильно готовить @OneToMany чтобы избежать N+1 SELECT проблемы?
Тоже интересно узнать, как предполагается это делать правильно. Обычно реализации JPA предлагают индивидуальные варианты решения для разных ситуаций.

Например, первая ситуация - массовая загрузка полей, принадлежащих какой-то основной сущности. Здесь Hibernate предлагает использовать батч фетч:
https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#fetching-batch
C батчами твои N+1 селекты превратятся в N/batch_size + 1 селекты, что лучше чем N+1, но всё равно костыли. О чем тут же и сообщают:
>a DTO projection or a JOIN FETCH is a much better alternative since it allows you to fetch all the required data with a single query.

Вторая характерная ситуация - мы грузим наши основные сущности, но не хотим постоянно грузить вместе с ними наши @OneToMany. Здесь Hibernate предлагает указать FetchType в Lazy и дополнительно использовать LazyCollection: https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#fetching-LazyCollection
Эту же ситуацию можно разрешить радикальнее, замаппив две сущности на одну таблицу, одну с "проблемными" полями, одну без, через базовый класс: https://vladmihalcea.com/map-multiple-jpa-entities-one-table-hibernate/

Комбинация двух подходов выше должна максимально смягчить проблему, но всё равно полностью от неё не избавит.
No. 23453  
>>23452
Хорошо бы узнать, зачем ORM-фреймворк вообще так делает, я-то могу коллекцию одним селектом загрузить. Для поддержки наследования, когда коллекция по надклассовому объекту и он не знает, что когда грузить? Ну О'k, а если отношения явно указывать, через @JoinTable, например? Здесь-то https://github.com/Millihi/captcha-service/tree/master/src/main/java/projects/milfie/captcha/domain это сработало, Гибер чудить перестал.

>Обычно реализации JPA предлагают индивидуальные варианты решения для разных ситуаций.
Я их знаю, спасибо. Только вендор-лок — это последнее дело. Тем более, что этот маппинг сами авторы зачем-то ввёли, значит имели представление, как им пользоваться.
No. 23458  
>>23453
А если потратить время и внимательно почитать статьи англоязычных ушлёпков, то в чём вообще проблема, в том, что ему модуль телепатии не завезли и оно работает не так, как хочется, или в том, что оно с FetchType.EAGER JOIN-ы само делать не умеет? Я уже какую статью читаю и понять никак не могу, с чем они все воюют.
No. 23465  
Есть где таблица поддержки новых фич регулярных выражений в Node.js?
Для браузеров есть полно информации, а по ноде даже ничего не гуглится. Atomic capture groups, named capture groups, lookahead/behind и много еще чего не работает в 12.13.
No. 23466  
Я тут ИхSQL исключение выбила:
Incorrect string value: '\xE2' for column '410chan'.'posts_dev'.'filename_original' at row 1
для имени файла
Safebooru - 2girls ;d absurdres alternate costume….png
Оно уникод не розумиит что ли?

>>23458
https://www.fortech.ro/n-1-main-cause-poor-performance-jee-applications-coded-jpa/
В общем, проблему можно разделить на два вида.

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

В первом, когда мы пытаемся итерироваться по коллекции сущностей размером N для которых установлено отношение @OneToMany и FetchType.LAZY, JPA-провайдер честно проинициализирует каждую @OneToMany-коллекцию, что приведет к дополнительным N SELECT-ам. Решается либо специальными запросами с JOIN FETCH, либо через именованные графы загрузки, что однако, JPA 2.1: https://codete.com/blog/jpa-n-plus-1-select-problem/

Во втором, когда мы пытаемся итерироваться по коллекции сущностей размером N для которых установлено отношение @ManyToOne и FetchType.LAZY, JPA-провайдер честно проинициализирует каждую @ManyToOne-сущность, что приведет к дополнительным N SELECT-ам. Решается или также как и для первого подвида, или через кэш второго уровня ( https://en.wikibooks.org/wiki/Java_Persistence/Caching ), который описан в спецификации JPA 2.0, однако не является обязательным для реализации: https://vladmihalcea.com/initialize-lazy-proxies-collections-jpa-hibernate/

Для второго вида, проблема заключается в том, что для @OneToMany/@ManyToOne и FetchType.EAGER JPA-провайдер для загрузки таких отношений может выбрать тот же самый алгоритм, что и для первого вида, т.е. полностью отдельную загрузку. Однако это не всегда верно, поскольку этот вид проблемы находится в зоне ответственности самого JPA-провайдера и у меня нет оснований полагать, что их авторы — идиоты, — и проблему за 10 (десять) лет не решили. OpenJPA старается так не делать, например: https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/ref_guide_perfpack_eager.html , однако у него не всегда получается. Для Гибера может потребоваться более полное описание отношений.
No. 23467  
>>23465
>Есть где таблица поддержки новых фич регулярных выражений в Node.js? Для браузеров есть полно информации
Node.js использует движок хрома, V8. Соответственно, зная версию движка, можно воспользоваться информацией для браузеров. Выводишь версию движка:
> node -p process.versions.v8
Или подсматриваешь её тут в таблице прошлых релизов: https://nodejs.org/en/download/releases/

Потом матчишь версию V8 на версию Хрома тут:
https://en.wikipedia.org/wiki/Google_Chrome_version_history
И смотришь поддержку фич уже по ней.
Например, Node 12.13 использует V8 версии 7.7.299, что матчится на Chrome 77

>Atomic capture groups, named capture groups, lookahead/behind и много еще чего не работает в 12.13
Фичи регексов в JS выносятся как часть спецификации ECMAScript, которой как-то стараются соответствовать движки браузеров. Часть фич что ты перечислил или еще не включена ни в какую спецификацию, или спецификацию в которую они входят еще не все поддерживают. Например, lookbehind входит в ECMAScript2018, но этот её кусок на данный момент поддерживает только последний Chrome.

Быстро подсмотреть фичи которые может JS регекс в свежих версиях браузеров можно тут: https://www.regular-expressions.info/refflavors.html
Например, вот инфа по lookaround-ам: https://www.regular-expressions.info/refadv.html
для удобства, выставь в обоих дропдаунах JavaScript
Альтернативно можно глянуть вот этот gist, колонку ECMA, но это просто скопированная с сайта информация, и непонятно кто и как её будет обновлять: https://gist.github.com/CMCDragonkai/6c933f4a7d713ef712145c5eb94a1816

TL;DR Node.js в плане нативных регекспов поддерживает не больше, чем тот движок хрома, что он использует.
No. 23470  
screenshot.gif - (29.55KB, 843×500)
23470
>>23465

Я только что проверил и named capture groups, и lookbehind в Node.js версии 12.13, всё работает должным образом, скриншот консоли прилагаю.

Вся информация о поддержке новинок языка (не только регулярных выражений, но и вообще) в таблице https://node.green/ есть.
No. 23471  
(Что же касается lookahead, то его поддержка есть во всѣхъ джаваскриптовых движках со времён царя Гороха, так что тут, должно быть, уж точно какое-нибудь недоразумение.)
No. 23499  
Играют ли web-разработчики и обычные программисты в игры в свободное время?
Вопрос никак не относится к работе, просто интересно, тратят ли такие люди на "глупые"(как большинство людей считает) игры время.
No. 23503  
>>23499
No. 23504  
https://github.com/Millihi/captcha-service/issues/8 — как мне лучше переделать модуль Configuration? Сделать по модулю конфигурации на SAM, карту ресурсов вынести в отдельный модуль и строить её в фабрике модулей? Тогда ответственность за перезагрузку конфигурации ляжет на фабрику (хотя она и сейчас непонятно чем занимается).

>>23499
Давно уже не играю. Сложно заставить себя заинтересоваться проблемами нарисованных болванчиков; сложно заставить себя начать вникать в механику.
No. 23505  
Clipboard01.png - (189.02KB, 1301×880)
23505
>>23504
Как-то так. Страшное, как моя жизнь... Однако позволяет подключать модули, написанные не для этой системы.
>Тогда ответственность за перезагрузку конфигурации ляжет на фабрику (хотя она и сейчас непонятно чем занимается).
Значит переквалифицируем фабрику в провайдера.
No. 23516  
Clipboard01.png - (238.54KB, 1145×821)
23516
>>23505
И никто ошибку в дизайне не увидел: сейчас бы в иерархической системе нижестоящему контролировать вышестоящего. Класс-кардинал такой: все думают, что он просто хранит значения из файла конфига, а он решает, кому жить, а кому умереть.

Ладно, у меня тут другой вопрос назрел — как мне лучше блокировку AuthModuleProvider сделать? Насколько уместным будет здесь превращение AuthModuleProvider в EJB Singleton — там как раз в ConcurrencyManagementType.CONTAINER есть LockType.READ и LockType.WRITE? Или лучше более приземлёнными методами сделать, await-signal там?
No. 23521  
code.png - (24.81KB, 479×665)
23521
Стив, есть такая задача. Надо написать функцию для обрезки пробелов справа. Звучит просто, но ее надо дополнительно оптимизировать по количеству обращений к памяти.
Сходу родилось такое, но оптимизацией там и не пахнет. Была идея использовать бинарный поиск и искать сочетание символ+пробел для определения границы строки и хвостовых пробелов, но, кажется, такая реализация будет давать ложные страбатывания на пробелы в середине строки, которые не хвостовые. Есть идеи, что можно придумать?

Код прикрепляю картинкой, а то форматирование в посте как-то странно работает.
No. 23523  
Jaguar #2.jpg - (38.90KB, 512×512)
23523
>>23516
>превращение AuthModuleProvider в EJB Singleton
Не пойдёт, лочить надо извне, в ServerAuthContextImpl. Можно использовать ReentrantReadWriteLock его в GlassFish-е любят, но он даёт слишком большой оверхед, хотя и не блокирует. С другой стороны у взрослых, например в Томокате, при refresh()-е просто пересоздаётся ServerAuthContext. Может зря я парюсь — выкинуть нафиг этот лок?

>>23521

void TrimRight (char * s) {
   size_t len = strlen (s);
   char * it = s + len - 1;

   while (it > s && *it == ' ') {
      *(it--) = '\0';
   }
}

>оптимизировать по количеству обращений к памяти
Ой, всё.
>Есть идеи, что можно придумать?
Подумать, реально ли твой велосипед, генерирующий кэш-миссы, будет быстрее. Потом подумать, что у тебя произвольная последовательность символов, т.е. в порядке следования элементов нет системы, соответственно предполагать что-либо про него ты не можешь.
>использовать бинарный поиск
Бинарный поиск предполагает, что элементы упорядочены по какому-то критерию, соответственно работает только на отсортированных по этому критерию массивах.
No. 23524  
>>23521
У тебя только ASCII на входе? Если нет, то у меня плохие новости.
Если же строго по 1 биту на символ, то как минимум тут можно обойтись без вызова strlen.
В цикле начинаем с указателя s и далее (++s). Встретив символ пробела, запоминаем значение s (эту переменную инициализируем значением -1). Для последующих символов, если это не пробел, сбрасываем эту переменную на -1, если пробел, то присваиваем значение s только в том случае, если она -1. Дойдя до \0, если -1, то ничего не делаем, если > 0, то по этому адресу ставится \0. Остальное можно не затирать (там все равно пробелы, и так сойдет, уязвимости нет).
Как-то так.
No. 23525  
>>23524
> *байту
Конечно же.
No. 23529  
>>23523
Что ой все?
>>23524
Действительно, это работает быстрее.
No. 23530  
>>23529
Публикации бенчмарков местные, конечно же, недостойны?
No. 23531  
Image 004.png - (8.54KB, 265×314)
23531
>>23530
Ну на тебе бенчмарк. Первый вывод это мой оригинальный вариант, последний вот отсюда >>23524. Это на моем ПК.
Если пронать на идеоне, то результат противоположный. https://ideone.com/HOHGdo
No. 23532  
>>23531
Этот >>23524 Стив похоже дело говорит: https://ideone.com/Jfsci9 На моем разница та же.
No. 23533  
>>23524
Только тут прикол не в strlen, поскольку на таких https://ideone.com/ZqvGeq данных она у тебя уже деградирует. А моя по другому деградирует на других данных. Почему я и говорю, что «фсё» — гиблое это дело.
No. 23534  
>>23524
Ну и в целом на случайных наборах данных branchless-решения всегда уделывают любые другие, т.е. ты, Стив. прав только в одном частном случае, когда поток управления не изменяется, следовательно можно использовать спекулятивное выполнение и спекулятивную загрузку памяти. Вот, играйтесь: https://ideone.com/uPkVge время в Милли-секундах.
No. 23536  
>>23534
trimRight3 можно еще оптимизировать, и оставить только один if в цикле.
https://ideone.com/MOdaZF
trimRight5 дает существенный прирост производительности по сравнению с trimRight3 и незначительно быстрее trimRight4, но все равно медленнее остальных.
No. 23537  
Стив, выручай.
Есть набор пар (номер, значение). Пары отсортированы по номеру и считаются равными, если у них одинаковое значение.
Надо проредить набор так, чтобы из каждой последовательности одинаковых пар остались только первая, последняя и каждая N-я, N > 2.
Родил что-то https://ideone.com/bkl7sX подобное, но оно и близко не дает правильный овтет. Кажется, что там должно быть простое решение, но я что-то упускаю и не могу до него дойти. Куда дальше копать - непонятно, я в ступоре уже пару часов.
Данные из примера:
Исходная последовательность: (1, 10) (2, 11) (3, 11) (4, 11) (5, 11) (6, 10) (7, 11) (8, 11) (9, 11) (10, 11) (11, 11) (12, 11) (13, 11) (14, 10)
Результат при N = 3: (1, 10) (2, 11), (4, 11), (5, 11) (6, 10) (7, 11) (9, 11) (12, 11) (13, 11) (14, 10)
Результат при N = 4: (1, 10) (2, 11), (5, 11) (6, 10) (7, 11) (10, 11) (12, 11) (11, 10)
No. 23538  
15719513964691.png - (539.42KB, 628×762)
23538
Есть что-нибудь ультимативное по проектированию баз данных?
Читал разные туториалы, параллельно душению питона, простенькую борду могу состряпать. А вот всякие тонкие моменты и прочие нормальные формы для меня все ещё остались за бортом.
No. 23539  
>>23538
И вдогонку ещё один вопрос.
Делать парсер вакабы на регулярочках не наш метод. Тут нужен какой-нибудь более эффективный и хитрый алгоритм. Интуитивно тоже что-то такое написал, но не уверен что получилось красиво. В какую сторону смотреть на будущее? Тот же markdown парсят наверняка не регулярками.
No. 23540  
>>23539
Посамопиарюсь, но посмотри исходники https://github.com/WagonOfDoubt/kotoba.js/blob/master/app/src/controllers/parser.js и https://github.com/WagonOfDoubt/kotoba.js/blob/master/app/src/json/parser.json
No. 23541  
>>23540
Плохо понимаю синтаксис js. Но попробую осилить твой код.
No. 23542  
>>23541
Там алгоритм не эффективный, его еще рефакторить и рефакторить. Он посимвольно обходит текст, пока не найдет открывающий тег, найдя его, ищет закрывающий, и если не находит, то продолжает искать со следующего символа после того, на котором нашелся ложный открывающий тег. Если закрывающий тег нашелся, то вырезает все, что попало между тегами, и рекурсивно ищет разметку уже внутри этого текста, если вложенность для этого тега поддерживается.
Это наивная реализация, в будущем таки надо компилировать все открывающие теги из конфига в одну большую регулярку, и искать первое вхождение, вместо того, чтобы на каждый символ перебирать конфиг.
То есть без регулярок все равно не обойтись, но этот способ намного хитрее того, что в вакабе.
No. 23543  
>>23537
В общем, кое-как решил сам, но уж очень много костылей там получилось: https://ideone.com/0Cgled
Есть у кого идеи, как это можно поизящней решить?
И, кажется, в прмиере из задания есть ошибка. Черт его знает, ошибка ли это, или же проверка на внимательность. Вместо
> Результат при N = 4: (1, 10) (2, 11), (5, 11) (6, 10) (7, 11) (10, 11) (12, 11) (11, 10)
вроде как должно быть
> (1, 10) (2, 11), (5, 11) (6, 10) (7, 11) (10, 11) (13, 11) (14, 10)
No. 23544  
>>23539
>Делать парсер вакабы на регулярочках не наш метод. Тут нужен какой-нибудь более эффективный и хитрый алгоритм. Интуитивно тоже что-то такое написал, но не уверен что получилось красиво. В какую сторону смотреть на будущее?

Есть несколько подходов к парсингу:
1. Посимвольный парсинг (самый быстрый)
2. Парсинг с помощью регулярных выражений (самый универсальный)
3. Парсинг с помощью комбинаторов (самый красивый)

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

Регулярками обычно что-то "выкусывают", т.е. пользуются в тех случаях когда нельзя четко описать парсеру всю структуру парсимого документа (или в этом нет смысла), а надо получить оттуда какие-то данные.

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

Эти три подхода часто комбинируют друг с другом, как удобнее в конкретном случае.

>Тот же markdown парсят наверняка не регулярками.
Markdown парсят комбинируя подходы указанные выше: https://github.com/lepture/mistune/tree/master/mistune
Конкретно про доступные инструменты парсинга в питоне можно почитать тут: https://tomassetti.me/parsing-in-python/
No. 23545  
1160087788239.png - (16.23KB, 384×384)
23545
>>23539
>Делать парсер вакабы на регулярочках не наш метод.
Но там же всё просто и понятно!

my $poster_re = qr'<label><input\ type="checkbox"\ name="delete"\ value="(\d+)"\ ?/>    # Postnum
                \ (?:<span\ class="(?:file|reply)title">([^<]*)</span>)?                # Subject, if exists
                .*?(?:span\ class="(?:comment|)postername">
                (?:<a\ href="([^"]*)">)?                                                # Email
                ((?:<span\ class="adminname">)?.*?(?:</span>)?)(?:</a>)?</span>         # Name
                (?:<span\ class="postertrip">(.*?)</span>)?)?                           # Trip
                ([^<]*)</label>'xs;                                                             # Date & time
                # One more change and I swear I'll change it to XPath
my $comment_re = qr'(<blockquote>.*</blockquote>)'xs;                                   # Comment

my $file_re =   qr'<span\ class="filesize">(?:Файл:\ )??<a\ target="_blank"\ href="(.*?)">      # Filelink
                ([^<]*)</a>\ \ (?:\ </span>\ &nbsp;<br\ />\ \ \ <div\ class="nothumb">.*?
                Нет<br\ />уменьшенной<br\ />копии</a></div>|                            # There may be no thumb
                -\ \(<em>(\d*)\ KB                                                      # Filesize
                ,\ (\d*)x(\d*)                                                          # File dim.
                (?:,\ ([^<]*))?</em>\)                                                  # Filename
                .*?<img\ src="([^"]*)"\ width="(\d*)"
                \ height="(\d*)"\ alt="[^"]*"
                \ class="thumb"\ /></a>)(?:\ )*'x;                                      # Thumb

my $nofile_re = qr'href="([^"]*)">Нет<br />уменьшенной<br />копии</a></div>';           # Postnum

my $post_re = $poster_re.'.*?(?:'.$file_re.')?'.$comment_re;


А если серьёзно, осиль парсеры хтмла, хоть тот же beautiful soup.
No. 23546  
>>23538
А, ты вмарк имел в виду.

Не используй вмарк, укради маркдаун.
No. 23547  
Вот, кстати, почему мой велосипед такой медленный:

void TrimRightM (char * s)
{
   char *it = s;
   long st = (long)s;
   long ps = (long)it;
   long sp = 0;
   long c2;

   while (*it != '\0') {
      c2 = (long) (*it == ' ');
      sp = (
         ((-(((long) (sp >= st)) & c2)) & sp) |
         ((-(((long) (sp <  st)) & c2)) & ps)
      );
      ++ps;
      ++it;
   }

   sp = (
      (-((long) (sp == 0)) & ps) |
      (-((long) (sp != 0)) & sp)
   );

   *((char *)sp) = '\0'; // Всего одна строчка с reinterpret_cast
                         // портит всю малину.
}


>>23536
Btw, для обычного текста, имеющего вид
string ::= begin_of_string ((letter)* (space)*)* end_of_string

студент предложил самый статистически быстрый вариант: https://ideone.com/MMM69O

>>23537
Map<Value, List<Pair>> — первое, что в голову пришло.

>>23538
Не знаю ни одной, но я и не искала. Есть объектно-базированная модель программирования, предтеча ОО, реляционная от неё отличается только тем, что в последней отношения не физические (указатели), а логические (внешние ключи). Т.е. достаточно просто уметь строить структуры данных. Остальное, это работа с файлами (кэширование, random access и фрагментация), concurency (если у тебя на бэке нет блокировок, значит они есть в базе) и ООП в реляционной модели (которое сделано так же, как в компиляторах). Ну и вендор-специфичные особенности.

>>23539
Сначала в сторону BNF-а своей разметки — если ты сможешь описать это формально, ты сможешь это распарсить. Потом в сторону рекурсивного спуска. Парсер будет работать или с символами, или с токенами; превращать символы в токены — зависит от сложности. Дальше ты просто идёшь по массиву символов/токенов, дергаешь рекурсивно разные функции (link (), code (), refLink (), e.t.c.), они или возвращают разобранную подстроку, или ничего.
No. 23548  
>>23547
> Map<Value, List<Pair>> — первое, что в голову пришло.
Не понял. Как это должно работать?
No. 23549  
>>23548
Раскладываешь свои пары в карту значение-список_пар по значению, далее для каждого значения удаляешь ненужные пары, далее выводишь оставшиеся в список или куда там надо. Решение в лоб. Думаю, в Джаве через Stream API это можно одной строкой сделать.
No. 23550  
1401260987_1218497266.jpg - (41.72KB, 604×543)
23550
>>23549
No. 23551  
>>23550
берешь свои упорядоченные пары

(list
   (1, 10),
   (2, 11),
   (3, 11),
   (4, 11),
   (5, 11),
   (6, 10),
   (7, 11),
   (8, 11),
   (9, 11),
   (10, 11),
   (11, 11),
   (12, 11),
   (13, 11),
   (14, 10)
)

->
распихиваешь их

(map
   (key 10, value (list
      (1, 10),
      (6, 10),
      (14, 10)
   )),
   (key 11, value (list
      (2, 11),
      (3, 11),
      (4, 11),
      (5, 11),
      (7, 11),
      (8, 11),
      (9, 11),
      (10, 11),
      (11, 11),
      (12, 11),
      (13, 11)
   ))
)

->
удаляешь из листов пары, которые не нужны по заданию, или выбираешь те, которые нужны
->
...
->
PROFIT
No. 23552  
>>23551
Ну или я чего-то не понимаю. Если для каждой подпоследовательности одинаковых пар в исходной последовательности, то там ещё проще — просто итерируешься по исходному листу, выбираешь нужные пары и кладёшь их в лист результатов.
No. 23554  
Спасибо за ответы. Тему про парсеры уже начал копать. Сейчас пока разгребаю посимвольную. Так то у меня уже используется этот метод, плюс ссылки всякие билдятся из регулярок. Может найду что-то, чтобы оптимизировать свой код.

>>23538
И ещё раз подниму вопрос по поводу проектирования БД.
Меня немного смущает что я делаю это чисто интуитивно, лол. Хотя, почитав про нормальные формы, у меня почти во всех проектах базы более-менее 3 форму удовлетворяют. А дальше уже не понимаю о чём идёт речь, то бишь по теории начинаю зарываться.
No. 23556  
>>23554
>чисто интуитивно
1. БД должна отражать бизнес-логику.
2. Если в закреплённой на бумажке бизнес-логике (с объектами) есть отношения много:много, или многозначные поля, разбиваешь их в подтаблицы
3. Разбиваешь всё в 3нф и более, кроме тех случаев, когда это не выгодно.
4. Индексы по всем полям, по которым ведётся поиск или жойн.
5. Каскады, функции, триггеры.
6. Профилирование, настройки доступа, типы индексов, жсон-поля и прочие вещи, по которым упарываются за деньги.

В качестве альтернативы, можно на п.1 взять SQLAlchemy и забить.
No. 23557  
>>23556
>Разбиваешь всё в 3нф и более, кроме тех случаев, когда это не выгодно.
Рекомендуют всё же остановиться на пятой.
No. 23559  
Я тут нашла публикации Алексея Шипилёва по JMM (и немножко — по оптимизирующим компиляторам чтоб вы ужаснулись, поскольку “the runtime is obliged to produce results as if there is a compatible abstract machine execution that backs the results”), очень занимательно:
https://shipilev.net/blog/2014/jmm-pragmatics/ — “Java Memory Model Pragmatics (transcript)”
https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/ — “Close Encounters of The Java Memory Model Kind”

После прочтения мне покоя не даёт один вопрос по моему AuthModuleProvider-у. В нём имеется код вида

public class AuthModuleProvider {

   ...

   public synchronized void refresh () {
      resources = dummyResources;
      reloadConfigModules (); // Здесь делаем что-то не относящееся к полю resources
      resources = workResources;
   }

   private final
   Map<String, AuthTypeSpec> dummyResources = new HashMap<> ();
   private final
   Map<String, AuthTypeSpec> workResources  = new ConcurrentHashMap<> ();
   private volatile
   Map<String, AuthTypeSpec> resources      = dummyResources;

   ...

}

А насколько такой код корректен в плане изменения значения resources? Можно ли быть уверенной, что компилятор не выкинет первое присваивание?
No. 23560  
>>23559
>в плане изменения значения resources
в методе refresh ().
slfx
No. 23561  
>>23556
> можно на п.1 взять SQLAlchemy и забить
Сейчас так и делаю, только на что забивать? Это всего лишь ORM, он не спроектирует за меня годные и красивые таблицы.

>>23558
Слишком энтри-левел. Из всего что там есть, я со всем более-менее знаком, а местами и подробнее. Гляну Best Practices со второго курса, может там есть что-то интересное. Ну исключая жаву, которой я не пользуюсь. И вместо lucidchart я использую dbschema.
No. 23562  
>>23561
>он не спроектирует за меня годные и красивые таблицы
Только ты уже не взаимодействуешь стаблицами, ты взаимодействуешь целиком и полностью с ООП, и забиваешь на таблицы.
No. 23563  
DBhmjRbUMAAz5MQ8bH.png - (292.21KB, 800×993)
23563
>>23559
Чегой-то я вся в сомнениях. JLS 17.4.3. говорит только, что
>each read r of a variable v sees the value written by the write w to v such that:
>w comes before r in the execution order, and
>there is no other write w' such that w comes before w' and w' comes before r in the execution order.

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

Может, чтоб не думалось, таки заменить volatile resources на AtomicReference, вызовы его гёттеров и сеттеров выкинуть уж точно не получится?
No. 23566  
>>23539
>>23540
>>23541
>>23542
>>23544
>>23546

Напоминаю, что задача парсинга Маркдауна выглядит вполне решённою в рамках диалекта Commonmark (спецификация которого по адресу https://spec.commonmark.org/current/ излагается весьма пространно), и по адресу https://github.com/commonmark/commonmark.js есть джаваскриптовый парсер его, а по адресу https://github.com/commonmark/cmark сишный.
No. 23569  
Также по адресу https://github.com/markdown-it/markdown-it есть парсер с поддержкой Commonmark и ряда расширений, причём настраиваемый и плагинизируемый.

Для авторов имиджбордов он должен быть болѣе полезен, надо думать, так как позволяет разумно вырубить возможность засовывания сырого HTML в Markdown и одновременно наплагинить спойлеры и прочую имиджбордовскую специфику.
No. 23570  
>>23561
По базам данных есть очень фундаментальный труд от O'Reilly:
Database Design and Relational Theory: Normal Forms and All That Jazz
Но я не уверен, что тебе подойдет, можешь глянуть сэмпл и сказать, это то что ты искал, или нет?

https://books.google.com.ua/books/about/Database_Design_and_Relational_Theory.html?id=Uds1DyR0U8IC
No. 23572  
Я тут взялась пилить разметку, может кому интересно будет: https://bitbucket.org/snippets/Milfie/BrXMnR
No. 23587  
А какие в природе существуют методы введения в заблуждение всяческих нейросетей и систем распознавания образов? Иными словами — возможно ли сделать картинкокапчу, вроде здешней, гуглоустойчивой?

Недавние события показали, что с гуглом она проходится на счет раз. Потому, собственно, такой вопрос и возник.
No. 23588  
>>23587
Из общего, а больше я тут ничего особо и не знаю:
Зашумление входных данных для false negative.
Внесение ложных образов в данные для false positive. Тут, кажется, есть конкретные методы под конкретные сети. Например, у свёрточных иногда бывают точки-триггеры, при максимизации которых на выходе будет неверный положительный отклик.
No. 23589  
>>23572
Основные проблемы:
1. У некоторых категорий нет терминаторов, поэтому появляются определения «такой x, что не принадлежит подмножеству Y множества Z».
2. Неясно, как обрабатывать леворекурсивный страйк strike ::= text "^W" ; в случаях вида «abSTARcSTARdef^W».
3. Рекурсивная разметка утилизирует бэктрек.
4. Ехал бэктрек через бэктрек.

>>23587
Во-первых, с чего ты взял, что гугл использует нейросети для формирования поисковой выдачи? Гораздо эффективней делать это по хэшу — даже без применения Яро-Винклера результатов будет более чем достаточно за счёт коллизий, — а классификацию, как дорогостоящий процесс, запускать раз в месяц или реже. Перед зверским усреднением, рождаемым процессом хэширования, твои потуги бессильны. Выдачу затем можно отсортировать по тому же Яро-Винклеру и пусть узер сам выберет то, что ему надо.

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

В-третьих, капча на Автобусе предназначена для защиты от людей и построена на предположении, что нежелательные здесь элементы не смотрят подобные тайтлы и/или не обладают достаточным упорством и/или упёртостью чтобы гуглить эти картинки.
No. 23592  
Clipboard01.png - (208.23KB, 1167×847)
23592
>>23589
Пока так. Можно ещё добавить блочное форматирование.
По п.2 хз, разделить входной поток на данные и токены разметки, вставлять токены задним числом, на выходе ассемблировать то, что можно?
No. 23594  
faptcha_php.png - (3.66KB, 90×50)
23594
>>23589
>Перед зверским усреднением, рождаемым процессом хэширования, твои потуги бессильны.
Т.е. способов защититься от этого нет?

>и/или не обладают достаточным упорством и/или упёртостью чтобы гуглить эти картинки.
Вот этот, последний пункт очень смахивает на дыру. Потому что один такой упертый может натворить больше дел, чем десять тех, кого капча отсеет…

Капча пикрелейтед. Она что-то знает.
No. 23598  
Чиочан, посоветуй что-нибудь почитать про специализацию шаблонов для самых маленьких.
No. 23600  
>>23594
>Т.е. способов защититься от этого нет?
Ну, можно выпилить из интернета информацию о популярных моэ-слайсах; начать можно прямо с этого форума. Можно использовать персонажей малоизвестных или неизвестных слайсов. Проще и эффективней будет ограничить доступ на форум инвайтами.

>Потому что один такой упертый может натворить больше дел, чем десять тех, кого капча отсеет…
Один упёртый/упоротый получит прицельно столбом по голове. Десять тех, для кого популярные моэ-слайсы стали непреодолимым препятствием, очевидно и так мимо шли, так что нехай себе дальше идут.

Мне лень искать релевантное обсуждение тут где-то на второй-третьей странице, тем более, что пагинацию я так и не сделала, но вкратце капча служит для защиты от:
— спам-ботов общего назначения;
— мамкиных скрипткидисов;
— абузеров сервиса на ручном и полуавтоматическом приводе (совместно с таймаутами);
— сервисов по разгадыванию капчи человеками за мелкий прайс (класс капчей, которые просят пользователя что-то сделать).
No. 23601  
>>23600
> — мамкиных скрипткидисов;
Я мамкин скрипткидист, и меня с написанным на коленке а полчаса скриптом эта капча не остановила. Зато остановил банхаммер.
Достаточно узнать лишь 1 (одну) картинку, а затем простейший скрипт может капчу прощелкивать, пока не получит совпадение. Причем проделать это необходимо лишь 1 раз в сутки, а дальше путь свободен.
Так что фаптча скриптом проходится легче, чем человеком.
No. 23603  
>>23600
Думаю достаточно просто использовать картинки, которых нет в гугле. Например нарисовать самостоятельно.
No. 23604  
>>23598
Тут зависит от каких шаблонах речь? Ты про движки шаблонизации или что?
No. 23605  
Neko.jpg - (112.44KB, 900×1200)
23605
Как по вашему должна обрабатываться разметка для этой строки?
Message := “word0 __word1^W^W word2__”

А для этой?
Message := “word0 __word1^W^W word2”


>>23601
>Я мамкин скрипткидист
Однако у тебя хватило ума, времени и желания написать скрипт.
>Достаточно узнать лишь 1 (одну) картинку, а затем простейший скрипт может капчу прощелкивать, пока не получит совпадение. Причем проделать это необходимо лишь 1 раз в сутки, а дальше путь свободен.
Подавляющее большинство посетителей, и я в том числе, делает точно также без скриптов.
>Так что фаптча скриптом проходится легче, чем человеком.
Ещё раз: ни одна капча не защищена от специализированной под неё атаки. Если ты хочешь оградить форум от сообщений нежелательных людей, эффективней будет выдать нужным людям ключи доступа, чем мешать отправке сообщений дурацкими ребусами. Повышать сложность капчи из-за первого за последние полгода человека, сумевшего автоматизировать процесс её разгадывания, не имеет смысла.

>>23603
Хранить их в строжайшем секрете и расстреливать проболтавшихся на месте?

——————————————————
З.Ы.: Вообще я нахожу очень забавным, что ни одна другая капча не вызвала столько внимания к себе: никто не ноет, что на Новере нечитаемая капча, там в /d/ даже есть тред, посвящённый её разгадыванию; никто не ноет, что на форчане дурацкая порноигра; никто не ноет, что на сосаче рекапча; никто кроме вайпера не обратил внимания, чего там Миша навертел. Зато вот уже полгода все ноют от необходимости угадывать персонажей популярных махо-седзе и моэ-слайсов.
No. 23606  
>>23604
Шаблоны из С++ же.
No. 23608  
>>23605
> Как по вашему должна обрабатываться разметка для этой строки?
Никак, так как эти вакабамарковские ^W^W неюзабельны и не интуитивны, не говоря о том, какие костыли они заставляют добавлять в реализацию парсера. Гораздо проще и понятнее использовать ~~word~~ для зачеркивания. Гнаться за тем самым вакабамарком, идентичным на 100% - контрпродуктивно.
> Подавляющее большинство посетителей, и я в том числе, делает точно также без скриптов.
Однако скрипту гораздо проще это проделывать, и занимает это меньше секунды, в то время как пассажир тратит на это не меньше минуты фрустрации, вот вам пример: >>/b/148629
>>23603
Ну и на взлом такой капчи понадобится в тысячи раз меньше времени, чем на малевание сверхсекретных рисунков, и все скомпрометирует одна лишь юичка, а уберешь юичку - автобус опустеет и превратится в доску объявлений о новых выпусках унтары-кантары.
No. 23609  
>>23608
>Гораздо проще и понятнее использовать ~~word~~ для зачеркивания.
А здесь, на автобусе, почему-то используется ^, а не ~, как в нормальном маркдауне.
>Гнаться за тем самым вакабамарком, идентичным на 100% - контрпродуктивно.
Ычую. Кстати, схема в >>23572, кажется, повторяет еще и такие "милые" особенности вакабамарка, как отсутствие вложенной разметки (типа italic внутри bold — можно, а наоборот — низзя).
No. 23610  
>>23608
>Гораздо проще и понятнее
Да, да, я в курсе, что при прочих равных каждый выберет тот вариант, который он сможет реализовать. Но всё же вопрос не о психологии был. Замечу, однако, что подобная стратегия контрпродуктивна в плане личного развития.
>Однако скрипту гораздо проще это проделывать, и занимает это меньше секунды
Люди уже давно заметили, что машины некоторые вещи делают лучше людей. Попробуйте на досуге поумножать карацубой на листочке, если не верите.

Ладно. Из всего разговора я поняла, что у некоторых фрустрацию вызывает то, что капча слишком простая, поэтому даже ломать её не интересно. Это в принципе попадает в категорию защиты от скрипткидов, значит не является недостатком.
No. 23611  
>>23610
Здесь речь идет о том, что такой разметкой элементарно пользоваться неудобно.

А если реализовать ее хочется исключительно из любви к искусству, и чтоб было посложнее, то тогда ответ на >>23605 очевиден: в первом варианте надо зачеркивать только world1, а во втором — оба.
No. 23612  
autokirara.webm - (458.68KB, 576×384)
23612
>>23610
> даже ломать её не интересно.
Действительно, пока вы тут разметку обсуждали, написал юзерскрипт-автопрощелкиватель. Но я вам его не дам, у вас только усы, лапы и хвост, и Соус не одобрит.
Заняло все 4 часа, из которых 2 ушло на работу с DOM, 1 на совместимость с куклой, и еще 1 капчу прощелкивал, чтобы удачные кадры получить.
No. 23614  
Jaguar_0.gif - (1.13MB, 560×442)
23614
>>23611
Почему вам должно быть удобно на моём личном форуме с кармочкой и инвайтами?
>ответ на >>23605 очевиден
Я в курсе, как подобная функциональность реализована в текстовых редакторах, мне не очевиден, извините.

>>23612
>Но я вам его не дам
Значит мне не пхидётся от него отказываться.
>Заняло все 4 часа
4 часа — это 240 минут. Время, потхебное на гучной пехебог — 1 мин./сутки. Таким обхазом вам надо постить в здешнем /b/ 240 дней для того, чтобы ваш лисапет вышел на самоокупаемость.

И эти люди учат меня пхадуктивности.
No. 23615  
>>23612
>>23614

Для дискуссий вроде ваших есть отдельная диспутов нить >>21353
No. 23616  
>>23598
>Чиочан, посоветуй что-нибудь почитать про специализацию шаблонов для самых маленьких.
>Шаблоны из С++

Хотелось бы узнать, тебе нужно прямо чтиво, какая-то информация по применимости этого подхода, или что-то еще? Если тебе нужен ликбез, то мне кажется вот тут можно быстро понять что к чему, не смотря на "трюки" в заголовке: https://habr.com/ru/post/54762/

И про сами шаблоны, на всякий случай:
https://code-live.ru/post/cpp-template-functions/

Для тех кто не в курсе, шаблоны в C++ - это что-то сходное с тем что в других ОО-языках часто называют генериками, или generic classes.
No. 23621  
Понимает ли тут кто-то что-то в библиотеке pygame? Я сейчас пишу на оной игру, и при добавлении анимаций потребление ресурсов процессора подскочило в полтора раза(pyganim). Есть ли способ что-то с этим сделать?
No. 23622  
>>23621
Есть способ использовать другой движок/библиотеку, но с такими советами меня пошлют туда >>21353
pygame в принципе не про производительность, и там тормоза в игре уровня Марио - это норма. pygame использует софтварный рендеринг без какого либо ускорения. Если нужно запилить что-то более-менее серьезное, нужно искать библиотеку, которая умеет в OpenGL/DirectX, например гуглится pyglet.
No. 23623  
>>23622
Вроде как они собрались переползать на SDL2, который в аппаратное ускорение умеет. Вопрос в том, насколько это поможет уменьшить потребление ресурсов именно за счет анимаций.
No. 23624  
>>23623
Насколько это переползание поможет не уверен, зависит от их реализации (и скорее всего для нормальной работы ускорения им придется серьезно менять api), но в случае с OpenGL/DirectX анимация 2D спрайта реализуется тупо через смещение координат текстуры спрайтщита на полигоне, а видеокарте все равно, с каких координат текстуру рендерить.
Смотря внимательно на исходники, вижу строку:
TIME_FUNC = lambda: int(time.time() * 1000)

И далее эта TIME_FUNC используется везде для определения текущего кадра. То есть скорость анимации никак не привязана к движку, никак не зависит от FPS, и изменяется не по тикам таймера, а по времени на системных часах. Это на самом деле классический говнокод, распространенная ошибка, которую я тоже раньше допускал. А потом словил баг, когда по раномным дням вместо 1 секунды проходило 5, 10, час, а то и целые сутки. И все правильно: система автоматически синхронизировала время по интернету, и секунду назад часы показывали время, различающееся на несколько часов от правильного. В питоне 3.5 на этот случай своя функция есть: https://docs.python.org/3/library/time.html#time.monotonic
Еще возьмем во внимание тот факт, что в функции времени есть операция умножения на 1000, чтобы из питоновских секунд перевести в миллисекунды, потому что в этих единицах должен указываться тайминг. Автор мог бы просто использовать в секундах, либо делил бы на 1000 время кадров, когда их передают в конструктор. Тогда бы операцию умножения нужно было бы проделать всего 1 раз, а сейчас, если на экране 100 спрайтов, то 100 раз берем системное время и умножаем 100 раз на 1000. О какой производительности может идти речь?
И это считай первая строка. В целом эта библиотека, состоящая из одного __init__.py не вызывает доверия. Автор пишет книжки, и видимо преследовал при написании библиотеки только образовательную цель показать, как как можно проще делать игры на коленке, сознательно опуская все подводные камни.
No. 23625  
>>23624
Для начала, можно попробовать заменить TIME_FUNC = lambda: time.time() (или time.monotonic, если версия позволяет) и поделить на 1000 времена кадров, передаваемые в конструктор (pyganim.PygAnimation([('frame1.png', 0.2), ...) вместо 200. Посмотри, стало ли лучше.
Но использовать такую библиотеку так, как указано в примерах, можно только для спрайтов фона. Представь себе файтинг, где анимация персонажей не синхронизирована с их хитбоксами, да и какую угодно игру.
В этой библиотеке есть функции blitFrameNum и blitFrameAtTime, которые никак не используются в примерах. Используя их вместо обычного pyganim.blit, можно привязать анимацию к игровой логике. Только для blitFrameNum придется самому отслеживать текущий кадр анимации, а для blitFrameAtTime следует передавать в качестве elapsed pygame.time.Clock.get_time и переопределить TIME_FUNC как pygame.time.get_ticks
В теории, так будет лучше.
No. 23626  
При взгляде на полузагруженную страницу с заддосенного сайта вопрос возник.

А как скачивающий что-то из сети скрипт может определить, что оно нормально скачалось? Сравнивать длину и content-length, если он есть? Парсить конкретные форматы файлов на предмет ошибок, если это возможно? Какие еще варианты?
No. 23627  
>>23626
Обычно сравнивают контрольную сумму, которую считают по разным алгоритмам, например тот же CRC. Её можно доставить отдельно, или положить в заголовке файла.
No. 23631  
>>23627
Среди заголовков, скажем, этого треда я что-то никакой контрольной суммы не вижу. Спасибо, что хоть content-length имеется.
Не, понятно, если сервер её предоставляет, то это можно использовать. Но в большинстве случаев это не так.
No. 23655  
купил себе прикольный телефон amazon fire phone и очень-очень хочу писать приложения используя его особенности.
загрузил я значит SDK следуя этой инструкции https://developer.amazon.com/es/blogs/tag/SDK и попытался сбилдить проект с примерами, но у меня не получилось...
пытался я фиксить ошибки сам с помощью гугла, но неудачно. остановился на том, что сейчас получаю ошибку "ERROR: Unsupported method: GradleProject.getProjectDirectory()", но когда пытаюсь обновить gradle, то получаю другую ошибку: "ERROR: Gradle version 2.2 is required. Current version is 5.4.1". и таким образом получается замкнутый круг обновлений и откатываний и я не знаю что делать.
может кто попробовать у себя сбилдить эти примеры (ссылка выше) и рассказать мне как это сделать? либо подсказать как можно пофиксить ошибку с gradle. пожалуйста?
No. 23659  
Почему код такой красивый?
No. 23660  
>>23659
Из-за выравнивания.
No. 23661  
>>23655
Попытаюсь понять твою проблему лучше:

Если ты выставляешь версию грейдл-плагина в проекте пониже

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'
}

(и бахаешь кеши, реимпортируешь проект, рестартишь андройд студию), ты получаешь ошибку о неподдерживаемом методе? пробовал как все советуют инстант ран отключать?

А если ты выставляешь версию плагина повыше, ты получаешь ошибку о том, что версия грейдла сильно больше, чем тебе надо?
No. 23662  
>>23661
хмм, я не изменял dependencies.classpath, я изменил только distributionUrl в gradle-wrapper.properties на https\://services.gradle.org/distributions/gradle-5.4.1-all.zip.
в dependencies.classpath у меня стоит значение 'com.amazon.device.tools.build:gradle:1.0.+'. может мне стоит изменить его на 'com.android.tools.build:gradle:5.4.1' или ему подобный?
Я попробовал выставить значение 'com.android.tools.build:gradle:5.4.1', но получил ошибку "ERROR: Could not find com.android.tools.build:gradle:5.4.1.". может ты знаешь какая версия здесь нужна?

еще в примерах https://s3.amazonaws.com/android-sdk-manager/redist/Fire_Phone.zip я изменил значение android.compileSdkVersion c "Amazon.com:Amazon Fire Phone SDK Addon:17" на "17", потому что тоже ошибки были. не знаю правильно ли это, но в примере который я нашел на гитхабе было так (там тоже ошибки с gradle)

в программировании на джаве и для андроида у меня опыта очень мало и я все забыл, поэтому прошу прощения если вопросы глупые-непонятные, но я пытался гуглить и искать решение сам, честно-честно!
No. 23674  
>>23655
>>23662

Мне кажется, тут у нас классическая несовместимость ожидаемого софта с фактическим, по причине того что проект с примерами ждёт более старый софт.
Давай попробуем начать сначала.

Я скачал примеры https://s3.amazonaws.com/android-sdk-manager/redist/Fire_Phone.zip и нашел там FirePhone_Sample_Readme.txt в папке /samples/
Первое, что бросилось в глаза это копирайт: Copyright (c)2014 Amazon.com
Т.е. эта пачка примеров была создана в 2014-15х годах (дата модификации файлов - январь 2015го)

И далее идут инструкции по сборке примеров, из андроид студии, и из комманд-лайна.
Но перед этим, нас просят настроить сетап:

>Ensure that your development environment is set up as described here: https://developer.amazon.com/appsandservices/solutions/devices/fire-phone/docs/setup

И, сходив по этой ссылке, мы узнаём, что такой страницы больше нет. Ок, идём в архив.
В архиве такая страница, слава богу, есть:
https://web.archive.org/web/20140724104654/https://developer.amazon.com/appsandservices/solutions/devices/fire-phone/docs/setup

Но единственное время когда она существовала - это тот самый 2014й год, и всё. Дальше уже 404.
При этом сама страница содержит ссылки на архив с примерами.

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

Итак, какие там требования:

>Android Studio 0.8.+ (recommended)
>Gradle Plugin 0.12.+ (Current beta version)

>Android Studio 0.6.+
>Gradle Plugin 0.11.+

Список грейдл-плагинов, которые доступны в принципе они предлагают глянуть в репозитории:
https://mvnrepository.com/artifact/com.amazon.device.tools.build/gradle
Здесь же можно увидеть, какие версии оно сможет скачать.

При этом сам список доступных на данный момент грейдлов сильно шире:
https://mvnrepository.com/artifact/com.android.tools.build/gradle
https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google

Но тебе нужны версии указанные в инструкции, или близкие к ним по дате выхода.

Старые андройд-студии таких версий доступны только со сторонних сайтов:
https://android-studio.en.uptodown.com/windows/versions
https://android-studio.en.uptodown.com/mac/versions

Соответственно, и Java тебе нужна постарше, 7 / 8 (а может даже и 6)

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

Будешь пробовать?
No. 23675  
>>23674
В догонку еще сайт с релизами андройд-студии, со ссылками прямо на гугол: https://www.npackd.org/p/android-studio
No. 23680  
>>23674
спасибо за такой детальный ответ!
я очень-очень хочу научиться использовать фичи телефона в разработке приложений для него, поэтому попробую воссоздать такую же среду для разработки на виртуалке и там запустить примеры. отпишусь сюда если будут проблемы или вопросы, спасибо!
No. 23704  
Добрый день.
Помогите, пожалуйста, немножечко. Есть картинка 111. Она прикреплена к сообщению.

Как сделать вид, как на картинке 222, которая прикреплена к следующему сообщению?
No. 23705  
111.jpg - (84.34KB, 544×444)
23705
>>23704
Простите.
No. 23706  
222.jpg - (106.86KB, 453×381)
23706
А вот картинка 222 с адекватным нормальным видом.

Меня действительно это очень беспокоит.

Извините, ежели что не так.
No. 23707  
333.jpg - (260.75KB, 1092×604)
23707
И еще один вопрос.

Есть файл манифеста. И при попытке сделать компиляцию выдает вот такое ошибочное сообщение. Что ему надо? Там все в порядке. Ведь в порядке? В 16 строке.

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

И вид сломался (из предыдущих 2,5 сообщений).
No. 23710  
>>23707
>Есть файл манифеста. И при попытке сделать компиляцию выдает вот такое ошибочное сообщение. Что ему надо? Там все в порядке. Ведь в порядке? В 16 строке.
На вид в 16й строке всё хорошо, но парсер ругается, что не видит тэг, или видит вместо него мусор. Такое может случиться, если внутри файла находятся какие-нибудь дикие непечатаемые символы. Это хорошо видно в редакторах, которые такие символы показывают.

Что говорит XML валидатор про этот файл?
https://codebeautify.org/xmlvalidator

Попробуй валидацию двумя способами:
1. Загрузить файл с диска как есть
2. Скопировать содержимое из редактора и вставить
No. 23712  
>>23710
Внезапно было что то очень странное
В xml-файле Strings почему то перестали распознаваться русские символы ВНУТРИ тега, то есть, сам текст. Но я стер одну букву в одном слове и набрал её снова — и все починилось! И эта ошибка с тегом тоже. Диковатое что-то.

А можно еще вопрос?
No. 23713  
>>23712
>Но я стер одну букву в одном слове и набрал её снова — и все починилось! И эта ошибка с тегом тоже. Диковатое что-то.

Если ты под виндоус разрабатываешь, то скорее всего где-то не сошлись кодировки, т.е. что-то что должно было быть UTF-8 закодировалсь в Windows-1251, или наоборот. И парсер, который тоже использует кодировку во время работы, с этим не справился.

>А можно еще вопрос?
Конечно.
No. 23714  
>>23713
Да, под виндовс. А как это можно победить? Чувствую, это будет происходить каждый раз при запуске студии. Я понимаю что можно поискать на соответствующих ресурсах, но сомневаюсь, что смогу составить корректный поисковый запрос в этом конкретном случае. Надеюсь на понимание.

А вопрос вот в чем.
Сейчас делаю (я нулевичёк в программировании) с чистого листа простое приложение под андроид. Галерею с картинками.
Там есть стартовая страничка, с нее переход в оглавление, в оглавлении — список "комнат", в которых внутри ScrollView лежат картинки с подписями. Просто галерея. Ничего сложного.

И со всем этим возникает странная, на мой взгляд, проблема. Когда внутри одной "комнаты" от 1 до 5 картинок, все хорошо. Когда 5+, приложение просто вылетает на рабочий стол при попытке зайти в такую "комнату". Как будто не хватает оперативки или еще чего-то.

Картинки маленькие, от 50 до 900 кб, растровые.

Телефон, на котором тестирую — нонейм Ирбис с андроидом 7. Он специально такой, чтобы тестить адекватность работы на рандомных слабеньких телефончиках. Потому что если запустится на таком, запустится на любом (почти).

В чем тут может быть штука? Или это нормально для андроида?
No. 23715  
image.png - (66.31KB, 994×720)
23715
>>23674
привет! поставил виртуалку, установил андроид студию, но не могу скомпилировать даже обычный сгенерированный новый проект. скорее всего, я что-то упустил и не загрузил какую-то необходимую вещь... можешь помочь?

мои действия:
1. поставил windows 7 на виртуалку
2. установил это https://www.npackd.org/p/android-studio/0.8
3. потом это https://www.npackd.org/p/com.oracle.JDK/1.7
4. добавил путь к jdk в системную переменную path

при попытке скомпилировать проект с примерами амазона получаю ошибку пикрелейтед. гугл говорит, что это может быть связано с maven, java или gradle. наверняка я что-то не установил для андроид студии. есть идеи?
No. 23716  
>>23715
>при попытке скомпилировать проект с примерами амазона получаю ошибку пикрелейтед. гугл говорит, что это может быть связано с maven, java или gradle. наверняка я что-то не установил для андроид студии. есть идеи?
>Received fatal alert: protocol_version

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

Осторожно предположу, что в твоём случае эта ошибка версии TLS-протокола вылазит когда Gradle стучится в Maven-репозиторий за библиотеками для проекта.

Чинится это на старом стеке софта такими способами:

1. Обновить конкретную версию JDK 7 на версию с фиксом.
>Run Gradle with Java 1.7.0_131-b31 or above
Выведи какая там у тебя версия java с помощью java -version

2. Отказаться от протокола HTTPS в пользу HTTP при поиске библиотек в репозитории, подменив ссылку на репозиторий:
>replace mavenCentral() with maven { url = "http://repo.maven.apache.org/maven2"; }
>replace jcenter() with maven { url = "http://jcenter.bintray.com"; }
^^ аналогично с другими репозиториями, если они используются

Рецепты взяты отсюда: https://blog.gradle.org/unable-to-download-maven-central-bintray
Надеюсь, больше там внутри ничего не стучится по https и этот фикс поможет.

>4. добавил путь к jdk в системную переменную path
Не забудь создать системную переменную JAVA_HOME, если она не создалась автоматически

No. 23717  
>>23714
Дегенеративное уебище от Google обсасывается из-за памяти, если быть точнее, то оно выделяет память под изображения в ScrollView и не очищает её нормальным образом. Это типа "норма" такая, ага. Решение состоит в том чтобы использовать ListView вместо ScrollView - он будет подгружать изображения и выгружать их в процессе использования.
No. 23718  
>>23716
> огромную дырку в TLS (который обслуживает https)
> TLS 1.1
Что за дырка? Вроде на TLS 1.2 переходят просто для того, чтобы сломать старые системы ради предположительно более сильных шифров в TLS 1.2 и ради обязательной perfect forward secrecy, а собственно атак на корректно реализованный TLS 1.1 никто не продемонстрировал.
No. 23719  
>>23718
>собственно атак на корректно реализованный TLS 1.1 никто не продемонстрировал.
Всё так. На тему разницы между версиями протоколов также есть короткое резюме здесь: https://security.stackexchange.com/a/57883
No. 23720  
>>23717
Спасибо за ответ.
Сейчас почитал про ЛистВью. Он легаси, оказывается.

Что-то с ним гипермного java-сношений внутри файлов Активити. Получается, под каждую картинку и текст надо свой xml делать. Насколько я понял. Это что-то перебор.

Есть ли более адекватные способы создать вот такую галерею, как я описываю в >>23714 ?

Без загрузки картинок из интернета (потому что неоткуда загружать пока), такой способ тоже возможен, где-то видел обрывки такой информации.
No. 23721  
>>23720
Посмотри тогда в сторону RecyclerView оно вроде по-новее будет
No. 23722  
Image.png - (68.43KB, 1004×728)
23722
>>23716
привет! пытаюсь обновить джаву (сейчас у меня 1.7.0_02-b13), но не могу найти версию которую ты указал для загрузки. попадаю только на какаие-то китайские сайты где загрузить файл не получается. также увидел надпись на сайте Оракл "Updates for Java SE 7 released after April 2015 are only available to Oracle Customers through My Oracle Support", а в архиве последняя версия это 7u80 (а мне 7u131 нужна, верно?)

также попробовал заменить mavenCentral() и смог продвинуться дальше. сейчас меня останавливает ошибка пикрелейтед. есть идеи как решить? (гугол предлагает обновить грейдл или студию, но я боюсь сделать еще хуже)
No. 23723  
IMG_20191207_180645.png - (21.33KB, 800×372)
23723
У меня проблема с питоном. Вот скрин консоли.
В а находится строка '200mm'. Из а создал список b. Потом два пустых списка c и d. Потом в цикле я проверил является ли каждый элемент списка b цифрой. Если этот элемент цифра, то он добавляется в список c, иначе он добавляется в список d. Но получилось все не так. Все цифры и буквы попали в список c, а список d остался пустым. Я не могу понять где ошибка.
No. 23724  
>>23723
Скобки после isdigit().
Сейчас ты проверяешь, есть ли такой метод у x, и получается всегда истина.
No. 23725  
>>23722
>привет! пытаюсь обновить джаву
>также попробовал заменить mavenCentral() и смог продвинуться дальше.
Поскольку ты смог продвинуться дальше подменив ссылку на репозиторий, отложим пока тему апдейта джавы, до тех пор пока не столкнемся с проблемой связанной конкретно с джавой.

>сейчас меня останавливает ошибка пикрелейтед. есть идеи как решить? (гугол предлагает обновить грейдл или студию, но я боюсь сделать еще хуже)
Выглядит так, что твоя студия 0.8 не может работать с грейдл-плагином 1.0 (и враппером 2.2.1)

Что можно сделать:
1. Попробовать открыть проект в более свежей студии, но вышедшей недалеко от последней даты изменения файлов проектов в примерах (январь 2015), т.е. в студии 1.0 или 1.1:
https://www.npackd.org/p/android-studio/1.0.1
https://www.npackd.org/p/android-studio/1.1
Они по идее уже должны справиться с грейдл плагином 1.0 и грейдл-враппером 2.2.1

2. Снизить версию грейдл враппера и грейдл плагина так, чтобы они соответствовали твоей студии. Сработает только если старый грейдл поймет правильно все инструкции и сможет корректно собрать проект. Но попробовать ничего не стоит.

Поскольку у тебя студия 0.8, то тебе нужны враппер 1.х версии и плагин 0.х версии.

Андройд студия 0.8 вышла в июне 2014, значит сначала найдем близкий к дате выхода плагин, помня что минимальная поддерживаемая версия - 0.12, попробуем начать с 0.12.2

dependencies {
    classpath 'com.android.tools.build:gradle:0.12.2'
}

Подбирать версии можно отсюда:
https://mvnrepository.com/artifact/com.amazon.device.tools.build/gradle

Теперь нам нужно подобрать враппер. Тут чуть сложнее, т.к. нужно сначала узнать, что до перехода на грейдл-плагин 1.x, андройд проекты использовали врапперы ветки тоже 1.х (хотя были доступны более свежие)
Инфа отсюда: http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0

Попробуем начать с самой поздней версии из этой ветки, 1.12, выпущенной в том же июне 2014.

task wrapper(type: Wrapper) {
    gradleVersion = '1.12'
}

Подбирать версии можно отсюда:
https://mvnrepository.com/artifact/org.gradle/gradle-wrapper

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

Пиши, что получится.
No. 23726  
>>23724
Спасибо
No. 23737  
Screenshot_2019-12-12-16-10-57.png - (360.42KB, 720×1280)
23737
Есть словарь d, его содержимое нужно превратить в строку. Для начала сделаю его списком. Создам пустой список l. Далее в цикле каждый элемент словаря (его ключ, он почему-то возвращается числом, хотя был строкой) сделаю строкой k. Создам временный список lt, куда помещу ключ k и значение этого ключа из словаря d[k]. Потом в список l добавлю элементы списка lt. И наконец создам из этого списка строку использовав в качестве разделителя пробел.
Это как-бы работает, но кажется мне немного наркоманией. Можно ли сделать тоже самое как-то более разумно?
No. 23738  
>>> d = { '1': 'devochka','2':'bulochka','3':'kot'}

>>> ' '.join(' '.join(i) for i in d.items())

'1 devochka 2 bulochka 3 kot'
No. 23739  
>>23738
Я не понимаю как это работает. for i in d.items() возвращает кортеж. Метод join возвращает строку, я не знал что это работает и с кортежами. Но дальше следующий join объединяет строку со строкой? Так же нельзя! Строки неизменяемы.
No. 23741  
>>23739
d.items() возвращает view object, который для простоты можно считать списком кортежей (key, value).
str.join(iterable), как видно из названия аргумента работает вообще со всеми итерируемыми типами.
i for i in x возвращает генератор.
' '.join(i) for i in d.items() возвращает генератор, который берет каждый кортеж из d.items() и делает его строкой. Для простоты можешь считать генератор списком.
На выходе получается список строк ['key1 value1', 'key2 value2', ...], его ты преобразуешь в одну строку.
No. 23742  
>>23739
> Так же нельзя! Строки неизменяемы.
А метод str.join() ничего не изменяет, кстати.
No. 23744  
>>23725
не могу поверить, но это успех! после обновления андроид студии до версии 1.1 получилось сбилдить проект!

запустил примеры на телефоне, большинство из них с фичами СДК работают, но не работают те проекты, в которых используются объемные контролы. например, ZButton, ZCheckBox и другие, которые начинаются на Z. главный проект, который демонстрирует эти контроллы, называется "DynamicPrespectiveControls".

я не смог подключить телефон для дебага на виртуалке, но смог вывести ошибку пикрелейтед способом, хех (могу сбросить stack trace, если нужно). есть идеи как можно пофиксить? (если что, это я попытался открыть "\samples\DynamicPerspectiveControls\src\com\example\amazon\dpc\ZButtonDepthActivity.java" на телефоне)
No. 23747  
>>23744
Рад что у тебя получилось завести примеры.
Теперь по поводу твоей проблемы.
>могу сбросить stack trace, если нужно
Прикрепи его, пожалуйста, файлом к посту, или залей на тот же pastebin. Чем больше информации в стектрейсе, тем лучше. Надо понять, что именно случилось, т.к. сам InflateException может быть вызван другим эксепшоном который вылетел где-то еще.
No. 23749  
>>23747
Воть: https://pastebin.com/wbPGQ8ea
No. 23751  
>>23744
>>23749
Спасибо за стектрейс. Итак что, насколько я могу понять, происходит:
1. Ты инициализируешь запуск ZButtonDepthActivity в телефоне, и активити подхватывает свой файл layout'a:
DynamicPerspectiveControls/res/layout/activity_zbutton_depth.xml который в этот момент уже в сериализованом бинарном виде, внутри реусрсов в apk, это важно
2. Активити начинает собирать в рантайме компоненты layout'a в классы, согласно описанию.
3. Активити падает при попытке собрать первый же встретившийся ей класс ZContainer

        <com.amazon.euclid.widget.ZContainer
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            euclid:autoPadding="true"
            euclid:baseDepth="@euclid:dimen/globalLayerIn3" >

            <com.amazon.euclid.widget.ZImageButton
                android:id="@+id/zbutton01"
                android:layout_width="50dp"
                android:layout_height="50dp"
                euclid:layout_depth="match_parent"
                android:enabled="true"
                euclid:textDepth="0dp"
                euclid:vbl="glyphs"
                euclid:scene="@euclid:string/glyph_call" />
        </com.amazon.euclid.widget.ZContainer>

Падение происходит на попытке десериализовать по id значение одного из dimension'ов, после поиска его по xml в ресурсах.
В этом описании компонента layout'a я вижу только один такой нестандартный dimension, который надо так сериализовывать / десериализовывать:
>euclid:baseDepth="@euclid:dimen/globalLayerIn3"

В документации его описание можно найти по такому пути:
Fire_Phone/docs/reference/com/amazon/euclid/widget/ZContainer.html#attr_euclid:baseDepth
Fire_Phone/docs/reference/euclid/R.attr.html#baseDepth

>Constant value: 0x7b010068
Посмотрим значения в libs/euclid-api.jar прилагаемом к проекту, декомпилировав его resources.arsc я использовал androuguard arsc:
> androguard arsc euclid-api.jar
> <public type="attr" name="baseDepth" id="0x7b010068"/>
И заодно, возьмем id указывающее на значение globalLayerIn3:
> <public type="dimen" name="globalLayerIn3" id="0x7b070000"/>
Исходя из твоего стектрейса, самая главная ошибка вот эта
> Can't convert to dimension: type=0x7
И я предполагаю, что тут оно не смогло десериализовать именно значение, наткнувшись на айдишник 0x7b070000

Т.е. предположительно, студия во время упаковки ресурсов в apk и сериализации activity_zbutton_depth.xml в бинарный вид лезет в подключенную к проекту euclid-api, уже в её ресурсы, и видит там что значение "@euclid:dimen/globalLayerIn3" надо сериализовать как 0x7b070000, и так его бинарно и записывает. А затем телефон, создавая активити и наткнувшись на этот компонент, лезет в ту же библиотеку euclid-api, чтобы она создала класс с указанными в xml-параметрами, и натыкается на сериализованное значение. Только вот никакого значения с id 0x7b070000 внутри ресурсов euclid-api уже нет, из-за чего всё и вылетает.

Вопрос: как такое вообще может быть?
Предположение: версия библиотеки, которая в итоге пытается создать этот класс на ходу в телефоне отличается от версии библиотеки, которая прикреплена к проекту с примерами, и которой пользуется студия при сборке. И у этих разных версий не совпадают внутри id ресурсов.

Такое могло произойти, если:
  • Твоя версия библиотеки вообще не попала в итоговый apk, и её подсунул телефон может же быть, что у Fire Phone внутри есть своя её версия
  • Твоя версия попала в итоговый apk, но посредством андройд-магии была перекрыта той стандартной, что в телефоне если она существует
Исключить одну из версий можно разобрав итоговый apk, чтобы узнать что там внутри.

Возможные пути решения:
1. Если твоя версия euclid-api просто не попала в apk, добавить её туда насильно, и посмотреть что получится. Можно заодно сверить id ресурсов.
2. Вытащить из телефона euclid-api.jar нужной версии вроде так можно с помощью adb и прикрепить к проекту уже его, чтобы точно всё совпадало. Заодно и остальные библиотеки вытащить, на всякий случай.
3. Понадеяться на авось и позаменять все "проблемные" значения на стандартные, а потом посмотреть, запустится оно, или упадет уже на чем-то еще.
Это реально провернуть, т.к. мы точно так же можем узнать все стандартные значения, на которые ссылаются id ресурсов, снова декомпилировав resources.arsc из libs/euclid-api.jar

> androguard arsc euclid-api.jar --type dimen

> <dimen name="globalLayerIn3">6.0mm</dimen>
> <dimen name="globalLayerIn2">4.0mm</dimen>
> <dimen name="globalLayerIn1">2.0mm</dimen>
> <dimen name="globalLayerScreen">0.0mm</dimen>
> <dimen name="globalLayerOut1">16777214.0mm</dimen>
> <dimen name="globalLayerOut2">16777212.0mm</dimen>
> <dimen name="globalLayerOut3">16777210.0mm</dimen>

> androguard arsc euclid-api.jar --type string
> <string name="glyph_call">ic_call_amazon_3d.scene</string>

После чего заменить в DynamicPerspectiveControls/res/layout/activity_zbutton_depth.xml
> euclid:baseDepth="@euclid:dimen/globalLayerIn3"
на
> euclid:baseDepth="6.0mm"
и аналогично по списку значений, т.к. в том layout используются все 7.

если оно потом вылетит со схожим эксепшоном на строке, заменить:
euclid:scene="@euclid:string/glyph_call"
на
euclid:scene="ic_call_amazon_3d.scene"


Не забывай бекапить файлы перед такими изменениями.
После замены надо сделать чистую сборку apk, загрузить на телефон, и попробовать запустить ту же активити.
Надеюсь, смог понятно всё объяснить.
No. 23752  
Clipboard01.png - (175.30KB, 1400×952)
23752
Рекурсивный спуск всё может. А вы говорите...
No. 23759  
Screenshot_2019-12-19-16-19-10.png - (130.54KB, 720×1280)
23759
Начал про ооп читать. Вроде бы и понятно, но что-то ничего не работает. Видимо что-то не так понял. В общем создал класс и подкласс. Два объекта. Свои имена и цвета они показывают, вот бибикать и ехать не хотят.
No. 23760  
>>23759
Проблема в том же, что и в >>23723: для вызова метода после него нужны скобки, то есть в коде с твоего скриншота это car.honk(), car.drive().
No. 23763  
>>23752
Интересные дизайн-поинты:
—? К классическим токенам '^W' и '^H' нужны токены для оставшихся стилей, но как они должны выглядеть?
—! Парсер не должен съедать разметку, которую он не смог разобрать.
—! Разметка (% % a b _ _ c d % % e f _ _) — абсолютно валидная разметка, — однако (
 
a b _ _ c d
 
e f _ _) — нет.
—! Разметка (a b ^ W c d ^ W) — двойное зачёркивание первых двух символов. Про зачёркивание не знаю, а вот вложенные спойлеры вполне себе есть.
—? Если допускаются вложенные стили одного типа, надо как-то решить вопрос с разметкой таких стилей. Можно сделать разметку вида (% % a b % % % c d % % % e f % %). Однако разметка (% % % % % a b % % c d % % e f % % % % %) — тоже абсолютно валидная разметка, которую, однако, можно разобрать несколькими способами.
—! В токенах стилей нет порядка вложенности, поэтому их можно тасовать как угодно и сортировать по позиции в тексте, типу и классу. За порядком расстановки открывающих и закрывающих тегов должен следить рендерер.
—? Существует маркер продолжения текста блока с новой строки: BOL (space)+ (text)* EOL ; применяемый к блоку списка. Его можно применить и для блока цитаты.
No. 23764  
>>23760
Спасибо. Почему когда добавляю скобки к вызовам name и color происходит исключение?
No. 23765  
>>23764
Вестимо потому, что name и color, будучи лишь полями класса, не являются исполняемым кодом (функциями, методами) или ссылками на него.
No. 23766  
>>23751
привет! спасибо за объяснение!

для начала я попробовал просто заменить значение, как ты написал в конце поста, но теперь я получил такую ошибку: https://pastebin.com/FLTJ2Wnj

еще я заметил, що во время сборки апк я получаю довольно много ошибок. думаю, это может быть важно. для генерации апк я использую этот способ: https://stackoverflow.com/a/16709979
а вот output генерации, где можно увидеть ошибки: https://pastebin.com/2eMApQ2g

возможно, мне нужно билдить апк каким-то другим способом? посмотри пожалуйста, можно ли с этих ошибок извлечь что-то полезное. я пока попробую декомпилировать resources.arsc и разобрать апк
No. 23771  
>>23766
>посмотри пожалуйста, можно ли с этих ошибок извлечь что-то полезное

Учитывая, что проблема у нас в том, что не резолвятся референсы к ресурсам амазоновских библиотек, вот это предупреждение

>AMAZON INFO [Project: :DynamicPerspectiveControls]
>Amazon Fire Phone Build Tools not found.
>References to Amazon resources may fail to resolve.

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

>AMAZON INFO [Project: :DynamicPerspectiveControls] Please use Android SDK Manager to download the Amazon Fire Phone Build Tools extra.
>For details, see https://developer.amazon.com/public/solutions/devices/fire-phone/docs/setup#Installing the Fire Phone SDK Add-on.

Как обычно, ссылка давно умерла, но нас выручает архив:
https://web.archive.org/web/20140701075615/https://developer.amazon.com/public/solutions/devices/fire-phone/docs/setup

При этом насколько я вижу, ссылки на нужный аддон и сопутствующие файлы еще живы:
https://s3.amazonaws.com/android-sdk-manager/redist/addon.xml

Сделай снапшот своей виртуалки (вдруг сетап раздолбается) и попробуй поставить аддон по их инструкции. Заодно проверь, чтобы у тебя все системные переменные, типа ANDROID_SDK были выставлены правильно.

Читая логи дальше, вижу что после пачки этих предупреждений оно пишет, что не может замаппить те самые ресурсы, которые потом вызывают проблемы:
>:DynamicPerspectiveControls:processDebugResourcesE/ResourceType( 2184): DynamicRefTable(0x7b): No mapping for build-time package ID 0x7b.

Думаю, если получится установить аддон в твою студию, проблемы с этими примерами закончатся.
Сообщай о результатах.
No. 23773  
faptcha_php.png - (5.41KB, 90×50)
23773
Дано: php, массив, пользовательская ф-ция сравнения элементов.
Нужен: аналог in_array с использованием этой самой ф-ции.

Т.е. надо проверить, что наше значение совпадает с каким-либо элементом массива — в том смысле, в каком мы определим понятие "совпадает".

Как это лучше сделать?
Тупо пробегать по всему массиву через foreach? Использовать array_filter и смотреть, возвращает ли она пустой массив? Что-то еще?
No. 23774  
>>23773
А почему просто не воспользоваться фукцией array_map? Скармливаешь ей массив и свою функцию сравнения и смотришь что получил в ответе. Ну или можно упороться и написать свою функцию подобного поиска, используя foreach, call_user_func и пару if'ов.
No. 23775  
>>23771
да, я действительно не установил Amazon Fire Phone Build Tools, которое было спрятано в папке Extras. теперь примеры запускаются и я так счастлив! спасибо огромное за то что помогал мне все это время, я бы сам не справился. завтра начну разрабатывать приложение с этими фичами! спасибо еще раз♥
No. 23776  
>>23775
Не за что, рад что всё наконец-то заработало и негодую что амазон или убрал, или попереносил куда-то туториалы. Обращайся если надо будет совет по разработке приложения.
No. 23777  
>>23774
>почему просто не воспользоваться фукцией array_map?
Чем array_map в данном случае лучше array_filter?
>пару if'ов.
Не понял, зачем второй if?

Вообще, в том-то и дело, что вариантов решения много, массив очень большой и надо выбрать тот вариант, который меньше всего тормозит.

Если более конкретно то в массиве — список подсетей в формате XXX.YYY.ZZZ.TTT/NN, значение с которым сравнивается — конкретный IP. Может есть какие хитрости, позволяющие оптимизировать проверку именно для этого случая?

А впрочем, подозреваю, что занимаюсь ерундой и загрузка этого массива из файла займет куда больше времени. Если так, то правильной оптимизацией будет загнать его базу данных, а проверку делать на SQL.
No. 23778  
Clipboard01.png - (106.34KB, 1400×950)
23778
Не выходит каменный цветок... Нужна идея какая-то, как разбирать эту разметку.

>>23777
>Если более конкретно
Для Джавы я бинарный поиск на RandomAccessFile использовала для подобной задачи (поиск строки по данному префиксу в файле с примерно 60 тысячами строк) — очень быстро ищет O (lb (n)), только надо, чтобы строки в файле были отсортированы, и соответственно, вставлять новые записи надо аккуратно. Может выложу на днях на гит пруф, так сказать, оф концепт, если интересно будет.
No. 23779  
>>23777
Если проверять предполагается много раз и массив предполагается статичным и неизменяемым для всех задач определения длины, то тогда, наверное, лучше посортировать и искать бинпоиском.

Если предполагается часто производить операции удаления/добавления элементов, то обязательно ли хранить данные именно в массиве? Нужен ли доступ по индексу быстрее чем за O(log(n))? Страшно ли хранить ещё где-то [16 n, 32 n] байт памяти? Если нет, то для задачи быстрой проверки наличия лучше подойдут деревья. Если при этом доступ по индексу и порядок не нужен или требуется делать очень-очень много максимально быстрых запросов на наличие элемента, то ещё лучше подойдут реализации set'ов.

Если задачу предполагается выполнять немного раз на сильно разнящихся неотсортированных данных, то, возможно, лучше будет банальный перебор.
No. 23780  
>>23779
>>23778
Так, похоже я реально стормозил. Уперся в перебор по массиву, а о других вариантах вообще не думал.
Хотя, действительно, тот же двоичный поиск будет значительно быстрее, чем все эти тупые переборы, хоть через array_bla-bla-bla с каллбаками, хоть без них. А если юзать всякие хитрые структуры, то может и еще выиграть удастся (хотя скорее всего этого уже и не понадобится).
Спасибо всем за советы, буду смотреть.

И да, затратами на изменение/сортировку списка можно пренебречь. Этим будет заниматься совсем другой процесс, запускаемый не так, чтобы особо часто.
No. 23781  
>>23778
>бинарный поиск на RandomAccessFile
https://bitbucket.org/snippets/Milfie/LrG6bz — собственно, вот. Префиксный поиск по key-value хранилищу с повторяющимися ключами, поэтому всегда чистое lb (n) + 1. По сути, решается задача о нахождении равновесия из механики (ну или задача о взвешивании Тартальи). Сделано только чтение, поскольку запись в этот файл вообще не предполагалась, однако поиск при отсутствии искомого ключа укажет на предшествующую ему запись, т.е. место вставки довольно легко вычислить. Единственная недоделка — он первую запись не читает, но у меня там копирайт стоит.
No. 23789  
Всех с наступающим Новым Годом!

Спасибо всем, кто помогал, советовал, и подсказывал начинающим программистам в этом году.
Успехов всем начинающим программистам в их проектах и экспериментах.

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

Всем хорошего кода в Новом Году.
No. 23796  
пытаюсь разобраться с Amazon Fire Phone SDK за одно изучая разработку под андроид по курсу гугла. сейчас прохожу ScrollView и у меня есть проблема, которую никак не могу решить. если я попытаюсь засунуть элемент ZTextView в ScrollView, то получаю ошибку "java.lang.RuntimeException: 3D views (com.amazon.euclid.widget.ZTextViewDelegate@41c262c8) are not allowed to be attached directly to a 2D view hierarchy (android.widget.ScrollView{41c21b58 VFED.V.. ......I. 0,0-0,0}). Please wrap 3D views in a ZViewHost."

окей, заверну ZTextView в ZViewHost. теперь стурктура выглядит как ScrollView => ZViewHost => ZTextView. но теперь я получаю другую ошибку! "java.lang.RuntimeException: You cannot allocate a buffer of size greater than 2048"

это можно как-то пофиксить? я ведь просто хочу добавить скроллбар длинному тексту... также пробовал завернуть элемент в ZContainer, как советуют в доках, но получил такую же ошибку

layout: https://pastebin.com/4Xb2urmk
stack trace: https://pastebin.com/fzFAhFPb
No. 23801  
>>23796
Итак, что мы имеем по стек-трейсу.
1. Вылетает оно на ходу, прямо при попытке отрисовать вьюху
2. Вылетает оно из класса внутреннего API телефона (в SDK я указанных классов не нашел)
3. Оно вылетает на попытке выделить память под текстуру (очевидно, чтобы отобразить какой-то элемент Z-UI, оно делает полигон и накладывает на него текстурку)
4. При этом известно, что телефон где-то там внутри использует OpenGL для отрисовки
5. При этом мы получаем ошибку максимального размера буфера, 2048.

Это может указывать на то, что каким-то образом, мы упёрлись в максимальный размер текстуры (2048 х 2048, предоположительно из-за конкретного GL_MAX_TEXTURE_SIZE). Можно убедиться так ли это, спросив у телефона, и выведя куда-то GL_MAX_TEXTURE_SIZE По-хорошему надо бы достать и декомпилировать ZRenderTextureAllocator.class из телефона, чтобы узнать что там ему не нравится точно. А поcле декомпиляции понять, что оно там такого генерировало, что не уместилось в этот размер.

Но поскольку это всё околопамять проблемы, у меня есть подозрение, что это проблема ScrollView, такая же с которой столкнулся >>23714 кун (вылет при открытии ScrollView), и решением будет попробовать заменить её на RecyclerView или ListView, как советуют >>23717 и >>23721

Попробуй и сообщи о результатах.
No. 23802  
>>23796
оказывается, все работает как ожидается если уменьшить количество текста в ZTextView с ~1800 символов до ~800. возможно, отображать огромное количество текста в 3д плохая идея т.к. это может сказаться на производительности. поэтому буду использовать обычный TextView
No. 23803  
>>23802
Тогда получается, что оно генерит текстуру на базе введенного текста, и при определенном количестве символов вылазит за допустимый размер.
No. 23804  
>>23801
>>23803
спасибо за наводку! если понадобится - попробую использовать RecyclerView или ListView. о них должны похже рассказывать в курсах по андроид разработе которые я прохожу, тогда обязательно попробую повтроить
No. 23807  
снова не понимаю как работать с амазоновскими вью. просто попытался добавить стандратный 2Д элемент (EditText) внутрь ZLinearLayout, чтобы рядом с ним отобразить ZButton, но EditText не отображается, хотя он есть. можно даже ввести текст (которого не будет видно) - на скриншоте можно увидеть курсор на невидемом инпуте.

инпут отобразится лишь в случае, если я вынесу его за пределы ZContainer.

из того, что я попробовал - порылся в документации и пересмотрел layout-ы официальных примерчиков в надежде найти где 2Д вью находятся внутри 3Д вью-групп (нигде). также попробовал заменить ZLinearLayout на LinearLayout, но ничего не изменилось

layout: https://pastebin.com/e9R3GZvQ
No. 23808  
>>23807
> EditText не отображается, хотя он есть. можно даже ввести текст (которого не будет видно)
>инпут отобразится лишь в случае, если я вынесу его за пределы ZContainer.

Есть подозрение, что авторы API не подразумевали что инпут редактирования текста может быть 3D-элементом, и придётся или сооружать свой, реализуя нужные интерфейсы, или имитировать нужное поведение. На возможность этой ситуации указывает тот факт, что в документации некоторые стандартные android-вьюхи имеют свои 3D-адаптированные версии с приставкой Z, например TextView <-> ZTextView: /Fire_Phone/docs/reference/com/amazon/euclid/widget/ZTextView.html

Полный список таких можно увидеть в package summary пакета widget: /Fire_Phone/docs/reference/com/amazon/euclid/widget/package-summary.html

Я подозреваю, что ни одна "обычная" вьюха не отобразится нормально внутри ZContainer'а, и надо использовать / сооружать свою Z-версию, реализуя одновременно стандартные необходимые для этого интерфейсы андройда и интерфейс ZViewInterface: /Fire_Phone/docs/reference/com/amazon/euclid/view/ZViewInterface.html

Т.е. у тебя должно быть что-то вроде
>public class ZEditText extends EditText implements ZViewInterface

Попробуй разобраться, в этом ли дело.
No. 23822  
Screenshot_20200110-151113.jpg - (119.11KB, 1440×913)
23822
Хотелось показать Стиву один крутой сервис, если ещё не видел (недавно его интегрировали с GitHub).
Это Jupyter (ipython notebook) в облаке.
Называется Binder (https://mybinder.org/).
Бесплатный, анонимный, полностью open source-инфраструткура.
Можно играться с кодом в браузере. Можно открывать произвольные ipynb (и не только, а также загружать/просматривать разные другие файлы в файловой системе), подсунуть свой Dockerfile. Можно делать этакие stateless cloud-hosted web apps.
Через некоторое время неактивности докер-контейнер уничтожается, так что сохраняйтесь.
Ссылки:
Запустить python 3:
https://mybinder.org/v2/gh/binder-examples/jupyter-extension/master?filepath=index.ipynb
Запустить Ruby:
https://mybinder.org/v2/gh/RubyData/docker-stacks/master?filepath=README.ipynb

Доки:
https://mybinder.readthedocs.io/en/latest/sample_repos.html
https://mybinder.readthedocs.io/en/latest/using.html
https://mybinder.readthedocs.io/en/latest/config_files.html
https://binderhub.readthedocs.io/en/latest/developer/repoproviders.html
https://ipywidgets.readthedocs.io/en/latest/examples/Using Interact.html
https://jupyter.org/widgets
No. 23824  
>>23808
попробовал вот сделать как ты сказал, в итоге получилось такое: https://pastebin.com/1U8RWv77

пролема в том, что совершенно ничего не изменилось. вью функционирует так же и не отображается. и я не пойму как мне что-то отрисовать используя метод, который я как-то имплементировал. попытался оверрайднуть onDraw примером из интернетов, но ничего не изменилось, кроме того, в описанни ZDelegate я наткнулся на это:
> It is also traditional to override the onDraw method to raise an exception; in a Euclid hierarchy, the onDraw method should never be called

также попробовал имплементировать ZDepthLayoutParams, посмотрел доки, а еще поискал по всему гитхабу ZViewInterface, надеясь найти пример - 0 результатов (в гугле 7), воть

нужно понять как с помощью данных мне методов хотя бы нарисовать бордер, изменить background и отобразить текст, сохранив при этом функционал EditText
No. 23825  
>>23824
>нужно понять как с помощью данных мне методов хотя бы нарисовать бордер, изменить background и отобразить текст, сохранив при этом функционал EditText

Это всё, конечно, не очень простой процесс.
Отталкиваясь от цели - редактируемое поле в Z-варианте, у тебя есть три пути:
1. Создать имитацию элемента доступными средствами.
2. Создать настоящую реализацию (наобум)
3. Создать настоящую реализацию (на базе оригинального кода амазон)

Путь 1. Сделать имитацию EditText. Например, набросать в лейауте картинку-бэкграунд (например ZImageView, или любой подходящий визуально элемент), поверх неё поместить ZTextView, и поверх них твой "невидимый", но рабочий EditTextView. Затем сделать так, чтобы содержимое твоей ZTextView обновлялось текстом введенным в EditTextView. Если всё срастется и всё сделать правильно, получится удовлетворительная имитация нужного элемента.

Путь 2. Понять, где именно в коде размещать код по отрисовке, и как он должен выглядеть. Из-за того что твоя текущая реализация ZEditText не полная (много оверрайдов-пустышек), это будет сделать сложнее, т.к. не ясно, картинка не рисуется из-за того что код отрисовки не тот / не там, или из-за того что какие-то важные для этого процесса методы всё еще не определены.

Поэтому, чтобы понять как в этой штуке хоть что-то нарисовать, предлагаю пойти обратным путём - создать класс MyZTextView / MyZTextViewDelegate, отпочковавшись от ZTextView / ZTextViewDelegate (вроде они оба не final), и засунуть их в тестовую вьюху. А затем начать экспериментально подменять реализацию тех методов, которые, как ты подозреваешь, отвечают за отрисовку, и смотреть на результат. Так ты сможешь найти какой именно из методов что-то рисует, и подменить отрисовкой того, что ты хочешь.

Если всё получится, ты сможешь затем перенести рабочий код в свой ZEditText.
И если даже известный рабочий код не станет там ничего рисовать, значит дело в неполной / неправильной имплементации интерфейса, и надо будет её доделывать.

Ниже будет Путь 3, который и самый простой, и самый сложный одновременно.
No. 23826  
>>23824
>>23825
Путь 3. Просто посмотреть как сами авторы это делают. По логике это можно сделать, распаковав и декомпилировав ZTextView и ZTextViewDelegate, и подсматривая в них, воссоздать их в виде своих MyZTextView и MyZTextViewDelegate, это дало бы понимание сразу всего процесса отрисовки. После чего, уже с этим пониманием, можно было бы сделать наконец-то ZEditTextView.

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


public class ZTextViewDelegate extends ZViewDelegate
{
    public ZTextViewDelegate(final View view, final Context context, final AttributeSet set, final int n) {
        super((View)null, (Context)null, (AttributeSet)null, 0);
        throw new RuntimeException("Stub! You are bundling a stubbed jar in the apk! Please move it to the classpath instead.");
    }
    ...
}


И чтобы узнать, как же они там всё же внутри всё сделали, надо достать нужный jar, class, или dex непосредственно с устройства, и потом уже то что достали декомпилировать. Если ты сможешь найти и достать нужный класс с телефона, можно пойти этим путём.
No. 23827  
>>23824
На самом деле, если этот EditTextView не какой-то краеугольный камень, я бы рекомендовал отложить этот вопрос и двигаться пока дальше, потому что застрять тут можно прилично. А пока двигаешься дальше, можно попробовать найти и взять на заметку приложение на Fire Phone где нужная EditTextView есть, и подсмотреть потом как там у них сделано
No. 23828  
>>23825
>>23826
>>23827
спасибо что объяснил как это делается! похоже, все не так уж просто как я себе представлял. думаю, действительно, отложу это дело на потом, когда мне действительно очень-очень нужен будет свой ZView (а не из любопытства). или же когда будет желание разобраться как там все устроено.

кстати, в стоковых 3д приложениях я ZEditText не замечал. такие инпуты выглядят как обычные андроидовские и 3д фич в них нету. не откидают тень и никак не показывают себя в объеме. возможно, даже amazon в своих приложениях на fire phone использовала лишь обычный ExitText
No. 23829  
>>23828
>возможно, даже amazon в своих приложениях на fire phone использовала лишь обычный EditText
Учитывая, что элемент не включили в SDK, велика вероятность что так оно и есть.

Сообщай о дальнейших успехах, и спрашивай если будут какие-то непонятные проблемы снова.
No. 23832  
Наступил бамплимит, поэтому сделали новую нить >>23830
Закрепите её вместо этой, пожалуйста.