Страницы

Поиск по вопросам

четверг, 2 апреля 2020 г.

Удалить из переменный часть текста

#javascript #jquery #переменные

                    
Есть переменная fileWay - это пути к загруженным файлам на сервере разделенные символом
";" тегом перевода строки пример:

/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/ - этот путь у всех файлов одинаковый, но количество и название файлов может меняться. В итоте нужно получить что-то вроде https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
https://sait.ru/uploads/файл.pdf;
пробовал код ниже но он только для одного файла. как его адаптировать для моего случия? var srcfileWay = fileWay; var element = srcfileWay.split('/'); newfileWay = 'https://sait.ru/uploads/' + element[element.length - 1] Да, это повтор вопроса, не судите строго, но с первого раза я не разобрался, а при редактировании уже ни кто не отвечал на мой вопрос. (надеюсь на понимание)


Ответы

Ответ 1



Все вхождения фиксированной строки можно заменить другой фиксированной строкой с помощью метода replace и регулярного выражения: var fileWay = "/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
/home/j/23412353rt2/sait.ru/public_html/uploads/файл.pdf;
"; var result = fileWay.replace(/\/home\/j\/23412353rt2\/sait\.ru\/public_html/g, "https://sait.ru"); console.log(result);

Как удалить ссылку на коммит из Issue? | Коммит не видно через git log

#git #github

                    
Есть репозиторий: https://github.com/w3lifer/yii2-i18n-js.

Нужно было сделать amend сообщения последнего коммита, чтобы тот ссылался на соответствующее
Issue:

git commit -m 'closes #1: ...' --amend
git push -f
git tag -d 2.1.1
git push origin :refs/tags/2.1.1
git tag 2.1.1
git push --tags


Соответственно, автоматически закрылся Issue #1; но как оказалось, я ошибся в номере
— нужно было указать номер #2. Тогда я повторил процедуру, но уже с верным номером:

git commit -m 'closes #2: ...' --amend
git push -f
git tag -d 2.1.1
git push origin :refs/tags/2.1.1
git tag 2.1.1
git push --tags


Я ожидал, что ссылка в Issue #1 исчезнет и он откроется автоматически, но этого не
произошло: там она осталась и указывает на коммит closes #1: ....

Из всего этого у меня возникло несколько вопросов.


Разве коммит closes #1: ... не должен был исчезнуть?
Почему его нигде не видно: ни в git log, ни через gitk, ни через IDE, однако можно
сделать его checkout?
Как его можно удалить из Issue #1?




Насчёт третьего вопроса: пробовал, если просто сослаться на Issue без ключевых слов
для закрытия, а потом удалить ссылку из сообщения, то в Issue ссылка исчезает.




https://github.com/isaacs/github/issues/1081
https://stackoverflow.com/q/21983964/4223982

    


Ответы

Ответ 1



Git не удаляет коммиты и не перезаписывает их. Когда пользователь делает git commit --amend, создается новый коммит, а старый становится невидим, если не привязать его к какой-нибудь ветке. Если вы знаете хэш коммита, то на него можно переключиться командой git checkout 5ccd263b4 (где 5ccd263b4 - ваш хэш). Гитхаб адресует коммиты по хэшу (это хорошо заметно в ссылке, что вы предоставили), потому и отображает ссылку корректно. Плюс к сказанному: у гитхаба скорее всего нет никакой процедуры отслеживания переписывания истории, т.к. сам факт переписывания истории в публичном репозитории является плохой практикой.

Spring Security: как сделать разделение ролей?

#java #spring #spring_mvc #spring_security

                    
Как в Spring сделать разделение ролей? Если, например, стоит, что администратор (значение
из базы) true, то открыта конкретная ссылка для просмотра в jsp и на эту страницу (на
которую вела ссылка) вход закрыт прочим пользователям (с другими ролями).

Это делается через Spring Security, верно?

UPD: Буду рад любым советам. Кто-то поставил минус, просьба отписаться в комментариях.
    


Ответы

Ответ 1



Как-то так, например some_page.jsp Админка SomeController.java @Controller public class SomeController { @RequestMapping(path = "/admin", method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_ADMIN')") public String admin(Model model) { return "admin"; } } Совет простой - попробуйте почитать документацию, там всё очень подробно описано.

JS keycode event

#javascript #html #события

                    
пытаюсь сделать html страницу с 


  event.keyCode


написал такой скрипт :

document.addEventListener('keydown', eventT, false);

    function eventT(event) {

        switch (event.keyCode) {
            case 38:
                console.log('вперед');
                break;
            case 40:
                console.log('назад');
                break;
            case 37:
                console.log('лево');
                break;
            case 39:
                console.log('право');
                break;
        }
    }


здесь все работает но как можно сделать движение нискосоком добавил такой скрипт
но не сработало 

if (event.keyCode == 37 && event.keyCode == 38) {
      console.log('найскосок NUM7')
} else
if (event.keyCode == 38 && event.keyCode == 39) {
      console.log('найскосок NUM9')
}


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





    Control Panel


Control Panel




Ответы

Ответ 1



Чтобы обрабатывать одновременное нажатие клавиш, надо нажатия записывать отдельно, а обрабатывать - отдельно. Попробуйте: const keys = []; document.onkeydown = e => { if(keys.indexOf(e.which)<0) keys.push(e.which); }; document.onkeyup = e => { keys.splice(keys.indexOf(e.which),1); }; setInterval(() => { keys.forEach(item => { switch(item){ case 87:case 38://W console.log('вперед'); break; case 68:case 39://D console.log('вправо'); break; case 65:case 37://A console.log('влево'); break; case 83:case 40://S console.log('назад'); break; default: //console.log(item); } }); // Наискосоки: if (keys.includes(37) && keys.includes(38)) { console.log('найскосок NUM7') } if (keys.includes(38) && keys.includes(39)) { console.log('найскосок NUM9') } if (keys.includes(39) && keys.includes(40)) { console.log('найскосок NUM3') } if (keys.includes(37) && keys.includes(40)) { console.log('найскосок NUM1') } }, 111);

Ответ 2



Что-то вы заморочились... Вот что-то похожее на более правильную реализацию: document.addEventListener('keydown', eventT, false); document.addEventListener('keyup', eventT, false); var arrowLeft=false; var arrowRigth = false; var arrowForward = false; var arrowBack = false; function eventT(event) { switch (event.keyCode) { case 38: arrowForward = !arrowForward; break; case 40: arrowBack = !arrowBack; break; case 37: arrowLeft = !arrowLeft; break; case 39: arrowRigth = !arrowRigth; break; } if(arrowRigth === true) { if(arrowForward === true) console.log('диагональ направо'); else console.log('право'); } else if(arrowLeft === true) { if(arrowForward === true) console.log('диагональ налево'); else console.log('лево'); } else if (arrowBack === true) { console.log('назад'); } else if(arrowForward === true) { console.log('вперед'); } }

Преобразование типов с проверкой

#java #преобразование_типов

                    
Есть такой код

int i = 300;
byte b = (byte)i;


Можно ли как-то его заставить генерировать исключение при обнаружении, что i не помещается
в байт? Или только так?

int i = 300;
if (i < Byte.MIN_VALUE || i > Byte.MAX_VALUE)
    throw new ArithmeticException();
byte b = (byte)i;

    


Ответы

Ответ 1



Суть та же, но на мой взгляд покрасивее, хотя и менее понятно =) Имя метода взял по подобию Math.toIntExact(long) byte toByteExact(int i){ byte b = (byte)i; if (i != b) throw new ArithmeticException(); else return b; }

Что всё-таки означает загадочный символ . в bash?

#linux #bash #unix

                    
Почему символ . в зависимости от контекста выполняет разные задачи? Например в команде
cd . он выполняет роль текущей директории, а в команде . patch/activate является аналогом
команды source?

P.S наверное я дилетант, но это действительно ломает мне мозг
    


Ответы

Ответ 1



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

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

#linux #tar

                    
Например имеем в текущем каталоге папки 001,002,003.

На выходе надо иметь три архива 001.tar.gz, 002.tar.gz, 003.tar.gz
    


Ответы

Ответ 1



может не самое элегантное, но хорошо работающее решение: find . -type d -maxdepth 1 -mindepth 1| xargs -i tar -cvzf {}.tar.gz {} объясняю что происходит: 1) find . -type d -maxdepth 1 -mindepth 1 find — утилита для поиска и обхода файлов и директорий . — текущий каталог -type d — ключ для обхода только директрий в текущем каталоге -maxdepth 1 -mindepth 1 — глубина обхода после этого на stdout у нас подаются адреса каталогов которые нужно архивировать 2) | xargs -i tar -cvzf {}.tar.gz {} | — конвейер. переваёт вывод поманды в следующую команду xargs — утилита, помогающая формировать список аргументов -i — ключ,который говорит что мы будем что-то подставлять tar -cvzf {}.tar.gz {} — команда для архивации каталога по gz(вместо {} подставляется имя каталога, сформированное утилитой find). -{}.tar.gz — имя архива(каталог+"tar.gz") вторые {} — что директория для архивации после этого в текущем каталоге у тебя появятся нужные тебе архивы , которые ты запросто можешь переместить в нужную тебе директорию командой: find . -type f| grep tar.gz | xargs -i mv {} нужная/папка

Ответ 2



очевидно, что надо «пройтись» в цикле по всем именам каталогов, и для каждого из них вызвать программу tar с соответствующими аргументами. цикл. что-нибудь вроде: $ for n in *; do test -d $n && команда; done здесь test -d имя — вернёт истину, если имя является каталогом. соответствующие аргументы — это что-нибудь вроде: tar -czf имя.tgz имя итого: $ for n in *; do test -d $n && tar -czf $n.tgz $n; done возможный недостаток: под маску * (по умолчанию) не подпадут файлы/каталоги, имена которых начинаются с символа . (точка). альтернативным способом организации цикла может служить вызов программы find либо в связке с программой xargs: $ find -mindepth 1 -maxdepth 1 -type d | xargs -I '{}' tar -czf '{}'.tgz '{}' либо с помещением нужной команды в «тело» опции -exec: $ find -mindepth 1 -maxdepth 1 -type d -exec tar -czf '{}'.tgz '{}' \;