Страницы

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

четверг, 6 февраля 2020 г.

Redux странный синтаксис

#ecmascript_6 #redux


Недавно в redux видел генераторы экшенов со странным js синтаксисом, не могу найти
и понять что это

{type: ACTION_ADD, id}


Обтяните почему тут id без пары, это же обект. Такие примеры есть в оф документации
по redux. Спасибо
    


Ответы

Ответ 1



Добро пожаловать в удивительный мир ECMAScript 6 (и 7). Это новая синтаксическая конструкция называется Property Shorthand и призвана упростить фарширование объекта значениями из пачки переменных. Если перевести этот синтаксический сахар на привычный ECMAScript 5, получится следующее: {type: ACTION_ADD, id: id} то есть предполагается, что ранее объявлена переменная id.

php mysql удаляет символ \ при вставке

#php #mysql


update shop_items_rows_values set value = '5\3' where id_row = '94' and id_item = '1'


В базе оказывается значение 53.
    


Ответы

Ответ 1



Символ "\" является специальным для SQL, и его надо экранировать. Если он прописан в запросе явно, руками, то его надо удвоить: update shop_items_rows_values set value = '5\\3' where id_row = '94' and id_item = '1' Если же значение подставляется в запрос динамически, то такое значение надо передавать через плейсхолдер: $sql = "update shop_items_rows_values set value = ? where id_row = ? and id_item = ?"; $stmt = $pdo->prepare($sql)->execute(['5\\3', 94, 1]);

Ответ 2



Символ слеша служит для экранирования данных, т.е. применение слеша к символу часто меняет его значение. Например \n означает символ перевода строки, \t - символ табуляции. В случае чисел больше 0, слеш оставляет символ числа без изменения. Однако, сам он не сохраняется. Если вы хотите сохранить слеш, вам следует преобразовать строку в '5\\3'. И это без учета внешних строк, так как эта строка может быть сама быть частью другой строки.

Потокобезопасность в стандартной библиотеке C++

#cpp #cpp11


Потокобезопасность в стандартной библиотеке C++


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


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


Ответы

Ответ 1



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

Работа статического метода при многопоточности

#c_sharp #многопоточность


Всем привет!

Начал изучать потоки. Автор курса, который я прохожу, привел пример работы с статическими
методами при многопоточности. Он обратил внимание, что хотя статический метод обычно
существует в единственном экземпляре (так как принадлежит всему объекту), при выполнении
этого метода в двух потоках для каждого из них создается как бы копия метода; при этом
автор отмечает, что слово «копия» используется для упрощенного понимания в данном учебном
материале, после чего — цитирую:


  На самом деле происходят очень хитрые процессы — такие как с локальным хранилищем
потока с сохранением промежуточных вычислений регистров — так как НА САМОМ ДЕЛЕ СТАТИЧЕСКИЙ
МЕТОД ВСЕ РАВНО ОДИН. Но благодаря этим сложным процессам и механизмам у нас создается
иллюзия того, что статический метод копируется. ... Но нам как высокоуровневым программистам
это неинтересно.


Что это за механизмы? Как они используются для создания иллюзии копии статического
метода? И при чем тут «хранилище потока с сохранением промежуточных вычислений регистров»?
Что это за хранилище?

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

Возможно, имелся в виду стек, который системой создается для каждого потока; но и
стек это не копирование. Тогда я не знаю, что имел ввиду автор курса — он говорил,
что именно у статических методов имеются какие-то механизмы, которые и создают иллюзию
их копирования.

Если автор всё же ошибался, порошу дать определение понятий из цитаты и разъяснить,
что же хотел сказать автор. Заранее спасибо!
    


Ответы

Ответ 1



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

Правильный перевод формата даты

#python #дата


У меня есть строка с датой в таком формате:

Thu, 18 Aug 2016 11:38:41 +0300


Как перевести ее к такому виду YYYY-MM-DD hh:mm:ss ?
    


Ответы

Ответ 1



Начиная с python 3.2: from datetime import datetime # Переводим строку в объект datetime d = datetime.strptime('Thu, 18 Aug 2016 11:38:41 +0300', '%a, %d %b %Y %X %z') # Получаем из объекта строку в нужном формате print(str(d.strftime('%Y-%m-%d %X'))) Для ранних версий можете использовать библиотеку dateutil: pip install python-dateutil Для вывода даты в нужном формате используйте аналогично: from dateutil.parser import parse d = parse('Thu, 18 Aug 2016 11:38:41 +0300') print(str(d.strftime('%Y-%m-%d %X'))) Подробнее о том, какие еще манипуляции с форматом можно делать, читайте внизу этой документации

Ответ 2



Подобный формат даты используется в электронной почте, поэтому можно email модуль из стандартной библиотеки использовать: >>> from email.utils import parsedate >>> tt = parsedate('Thu, 18 Aug 2016 11:38:41 +0300') >>> tt (2016, 8, 18, 11, 38, 41, 0, 1, -1) >>> import time >>> time.strftime('%Y-%m-%d %H:%M:%S', tt) '2016-08-18 11:38:41' Код работает как на Питоне 2 так и 3. Принимаемый формат для strftime() функции может зависеть от платформы (от C strftime(3)). Если нужна переносимость, то убедитесь, что использованные кода поддерживаются на желаемых платформах.

Как вырезать из псд пнг с эффектами?

#png #photoshop


Есть псдшка, вот там есть такой элемент


Если я оставляю включенным только этот слой, и все его эффекты - то вот что получается



Убирать эти эффекты - нельзя, но нужно как то преобразовать это в пнг с эффектами..
Как это сделать? Можно на урок ссылку, если есть откуда почитать

Интересно было бы узнать кто пользуется и какими скриптами/макросами/плагинами для
фотошопа, облегчающими задачи подобного рода. 
    


Ответы

Ответ 1



Продублируйте слой непосредственно с мечом; Поставьте этот слой самым верхним; Сведите все слои под ним (ваш меч, фон и все эффекты); Получите два слоя - полностью сведенный и сверху слой с мечом; Применяйте меч сверху как маску к слою снизу; Экспортируйте.

Ответ 2



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

Запуск задачи в Ansible от имени другого пользователя

#ansible #sudo


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

Есть PHP-шная админка, работающая от имени wwwrun

Хочется запускать плейбук по кнопочке в админке. То есть юзер wwwrun запускает плейбук,
который исполняется от рута.

Так вот вопрос. Можно ли сделать такое настройками ролей в ansible(или по другому
как?), не выдавая пользователю wwwrun возможность повышения своих привилегий?

PS Документацию и интернеты читал, ответа на вопрос не нашел. Может плохо читал конечно,
но тогда киньте ссылкой, где про это написано.
    


Ответы

Ответ 1



Создаёте скриптик #!/bin/sh ansible-playbook ... В sudoers добавляете разрешение пользователю wwwrun запускать именно этот созданный скрипт: wwwrun ALL=(ALL) NOPASSWD: /full/path/to/script Технически, это повышение привилегий пользователем, но только для одной определённой команды, что при условии отсутствия прав на редактирование этого скрипта (и плейбука!) вполне допустимо. Другой вариант - очередь полноценная с сервером очередей (избыточно, если только для этой задачи и нужно) или её подобие. Самое простое на файлике: Веб-морда создаёт где-нибудь файлик с определённым именем, отмечающий, что нужно запустить плейбук. по крону запускается шелл-скритп, проверяющий, существует ли такой файлик. Если есть - запускает плейбук и после удаляет файлик соответственно на веб-морде проверка - если файл ещё есть, значит плейбук ещё не выполнился. В бонусе - одновременно выполняется только один плейбук. Минус - крон запускается самое частое раз в минуту. Вопросов, почему плейбук выполняется от рута и зачем для этого веб-морда, пожалуй, касаться не буду.

Ответ 2



Если вас действительно интересует именно ansible way. Скрипт ansible который запускается на некотором сервере server-ansible-01 из-под пользователя user01 и выполняет работу на другом сервере server-web-01 действительно может работать из-под пользователя ansible сервера server-web-01. (При чём server-ansible-01 и server-web-01 могут оказаться одним и тем же сервером -- и это как раз ваш случай) Это совершенно штатная фича ansible. Задаётся она на уровне плейбука, а не роли -- хотя если будет желание, то для отдельных шагов роли, подключаемой в плейбуке можно будет указать и другие credentials. Просто укажите в своём плейбуке remote_user: - name: asdf hosts: '{{ target }}' remote_user: root roles: - myrole01 Также если вы подключились к удалённому server-ansible-01 как ansible, то вы можете и некоторые шаги выполнить как пользователь apache или root. Читаем про become - Become (Privilege Escalation) Это работает в современных версиях ансибл (кажется, с 1.9, у меня в 2.1 точно уже давно есть), раньше были другие команды, sudo_user и sudo, можете поискать в документации, я уже давно свои плейбуки отрефакторил. Вопросы, которые касаются возможности подключения к другому серверу -- они всегда сводятся к корректной настройке ssh-ключей (рекомендую почитать в этом моём вопросе: Ansible: форвард ssh-агента и sudo ) и частично будет затронут вопрос passwordless sudo: - name: nopasswd sudo for ansible user lineinfile: "dest=/etc/sudoers state=present regexp='^{{ ansible_user.login }}' line='{{ ansible_user.login }} ALL=(ALL) NOPASSWD: ALL'" Я очень сильно не приветствую то, что вы хотите выполять скрипты ansible из-под аккаунта root (у меня все скрипты спокойно работают и без этого, более того -- со включенным SELinux), этот костыль если вы не хотите убирать -- это уже ваше собственное решение. В целом же ничего не мешает запустить плейбук от имени пользователя wwwrun версебрвера и начать выполнение скриптов на "удалённом" веб-сервере (с тем же самым IP) но уже как root этого веб-сервера. Всё вышенаписанное касается именно выполнения плейбука от другого пользователя. Но. Вы в свой вопрос уместили совершенно другой вопрос: "как мне запустить sh-скрипт из админки сайта, но не от пользователя веб-сервера". Этот вопрос уже никоим образом не относится к ансибл, ответ на него вам дали выше -- если вам важнее именно эта часть вопроса, то рекомендую принять именно ответ @Мелкий -- там ничего нет про ансибл, это просто разрешение wwwrun на sudoers одной определённой команды. Более того, если хотите конкретизировать вопрос и поставить задачу "запускать не просто абы какой скрипт, а именно плейбук ansible", то у вас могут возникнуть сложности именно в связи с тем, что пользователь wwwrun из соображений безопасности имеет урезанные права - вам нужно будет ему в /usr/apache создавать собственный ssh ключ и много чего ещё исправлять. Проходил, знаю. Не то, чтобы эти проблемы нерешаемы, просто я в последнее время как-то больше внимания стал уделять тому, чтобы при создании решений не проделывать дыры в безопасности, а дыр этих тут у вас хватает.

for_each и unique_ptr

#cpp #cpp11


Имеется список unique_ptr. Можно ли, используя for_each пройтись по списку. Лямда
в которую передаю элемент списка:

auto researchRespawns = [&](Tank& tank)


Ошибка: 

cannot convert argument 1 from 'std::unique_ptr' to 'Tank &'


Я понимаю в чём дело, надо бы разыменовать элемент, но можно ли это сделать?
    


Ответы

Ответ 1



Передавайте ссылку на умный указатель и используйте её внутри лямбда-выражения: std::for_each(v.cbegin(), v.cend(), [] (const std::unique_ptr& tank) { // using tank... }); Либо если необходимо использовать именно указанное лямбда-выражение, то проще сделать так: for (auto& tank : v) { researchRespawns(*tank); } Можно немного извернуться и сделать даже так: std::for_each(v.begin(), v.end(), [researchRespawns] (std::unique_ptr& tank) { researchRespawns(*tank); });