Страницы

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

среда, 17 июля 2019 г.

объеденить строчки json

Имеется такой json:
{art: "1", quan: "1", sum: "1"} {art: "2", quan: "1", sum: "1"} {art: "1", quan: "1", sum: "1"} {art: "12", quan: "1", sum: "1"} {art: "1", quan: "1", sum: "1"} {art: "12", quan: "1", sum: "1"} {art: "1", quan: "1", sum: "1"} {art: "11", quan: "1", sum: "1"} {art: "1", quan: "1", sum: "1"}
Подскажите, как мне найти повторы по полю 'art', удалить повторы и сложить поля quan и sum.
То есть в итоге должно получиться :
{art: "1", quan: "4", sum: "4"} {art: "2", quan: "1", sum: "1"} {art: "12", quan: "2", sum: "2"} {art: "11", quan: "1", sum: "1"}
Код:
function filterArt(arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length - i; j++) { if (arr[i].art == arr[j].art){ arr[i].quan = +arr[i].quan + (+arr[j].quan); arr[i].sum = +arr[i].sum + (+arr[j].sum); arr.splice(j,1); } } } }
Код не совершенен. Подскажите, пожалуйста, в какую сторону копать.


Ответ

Вы ошиблись когда сделали во втором цикле j < arr.length - i: Тогда в определенных случаях, ваш i элемент не сравнится с последними элементами массива.
var arr = [ {art: "1", quan: "1", sum: "1"}, {art: "2", quan: "1", sum: "1"}, {art: "1", quan: "1", sum: "1"}, {art: "12", quan: "1", sum: "1"}, {art: "1", quan: "1", sum: "1"}, {art: "12", quan: "1", sum: "1"}, {art: "1", quan: "1", sum: "1"}, {art: "11", quan: "1", sum: "1"}, {art: "1", quan: "1", sum: "1"} ]; function filterArt(arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i].art == arr[j].art) { arr[i].quan = +arr[i].quan + (+arr[j].quan); arr[i].sum = +arr[i].sum + (+arr[j].sum); arr.splice(j, 1); } } } return arr; } console.log(filterArt(arr));

Есть компонент EditText. Можно ли по какому-нибудь жесту перевести клавиатуру в ввод голосом

Есть компонент EditText. Хочется по какому-нибудь жесту перевести клавиатуру в ввод голосом. Возможно ли такое?


Ответ

Вам нужно обработать ваш жест и вызвать внешний интент:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
теоретически его может и не быть в системе, так что сначала надо проверить его наличие
PackageManager pm = getPackageManager(); List activities = pm.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (activities.size() == 0) //нет распознавателя //blah-blah
Если есть вызвать Activity распознавателя через startActivityForResult(intent, SPEECH_REQUEST) и в onActivityResult() полученные данные положить в EditText
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { //массив распознанных строк ArrayList matches = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); //ложим в EditText
} super.onActivityResult(requestCode, resultCode, data); }
Update
Собственно ответ на сам вопрос:
перевести клавиатуру в ввод голосом. Возможно ли такое?
Увы это невозможно. Нет такого INPUT_TYPE, каждая реализация клавиатуры реализует сама поддержку ввода голосом.

Запись объекта в файл. Правильное закрытие потоков

Делаю так:
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("path"))) { oos.writeObject(myObject); } catch (IOException e) { e.getMessage(); }
Использую конструкцию try-with-resources, которая как бы автоматически вызывает метод close();
Вопрос0: Можно ли так делать или лучше обычный блок try, в котором писать flush() и close() или ещё как вариант писать close() в блоке finally()?
Вопрос1: Если инициализировать потоки отдельно, как правильно закрывать их по отдельности?
Вопрос2: Для десериализации объекта такая конструкция (try-with-resources) тоже допустима?


Ответ

1) так делать можно. Для этого try с ресурсами и создавался, чтобы писать меньше.
2) если вы про пример кода из вопроса, то это у вас всё равно один поток. А если вы действительно хотите открыть несколько потоков, то можно это делать через символ ; в скобках try. Система сама их закроет настолько насколько это возможно.
3) уточните что именно вы хотите сделать. Я доотвечу.

Визуализация структуры классов в Visual Studio

Существует ли расширение для Visual Studio, которое бы графически показывала структуру классов, все наследования и тому подобное?


Ответ

Необходимо в установочнике Visual Studio Installer добавить пакет "Class Designer" (если не ошибаюсь, то так). Затем в проекте, в Solution Explorer нужно выделить все необходимые для отображения классы/структуры, нажать правой кнопкой > View Class Diagram

Алгоритм поиска пика числовой последовательности

Имеется алгоритм поиска пика последовательности, где nel - количетво элементов последовательности, а *less - указатель на функцию сравнивания двух элементов последовательности.
Язык Си:
unsigned long peak(unsigned long nel, int(*less)(unsigned long i, unsigned long j)) { if (nel < 3) return less(0, 1); for (unsigned long k = 1; k < (nel - 1); k++) { if(less(k-1, k) && less(k+1, k)) return k; } }
Он работает для небольших по длине числовых последовательностей, но при подключения функции к программе:
int less(unsigned long i, unsigned long j) { if (i == j) return 0;
if (i < j) { if (j <= 11241155978086311589UL) return 1; if (i >= 11241155978086311589UL) return 0; return (11241155978086311589UL-i) < (j-11241155978086311589UL); }
if (i <= 11241155978086311589UL) return 0; if (j >= 11241155978086311589UL) return 1; return (11241155978086311589UL-j) < (i-11241155978086311589UL); }
unsigned long peak(unsigned long, int (*)(unsigned long, unsigned long));
int main(int argc, char **argv) { unsigned long i = peak(13356955260197607378UL, less); if (i == 11241155978086311589UL) { printf("CORRECT
"); } else { printf("WRONG
"); } return 0; }
Программа выполняется очень долго. Нужна идея оптимизации функции peak(), чтобы она работала как для коротких последовательностей, так и для данной выше программы.
Функция peak должна возвращать индекс любого найденного пика.


Ответ

Для решения задачи можно использовать дихотомию. Кроме того "unsigned long" насколько я знаю 32-битный, потому нужно исправить в коде на uint64_t или unsigned long long. Вот я написал решение на C (немного аккуратней код автора сделал но суть он не меняет), можно запустить онлайн
#include #include
typedef uint64_t u64;
u64 const c_peak = 11241155978086311589ULL; u64 const c_cnt = 13356955260197607378ULL;
u64 peak(u64 nel, int(*less)(u64 i, u64 j)) { if (nel <= 1) return 0; // Note: if nel == 0 there is no answer! if (!less(0, 1)) return 0; if (!less(nel - 1, nel - 2)) return nel - 1;
u64 l = 1, r = nel - 1; while (r - l > 2) { u64 m = l + (r - l) / 2; if (less(m + 1, m)) r = m + 1; else l = m; } if (r - l == 2 && !less(l, l + 1) || r - l <= 1) return l; else return l + 1; }
int less(u64 i, u64 j) { if (i == j) return 0;
if (i < j) { if (j <= c_peak) return 1; if (i >= c_peak) return 0; return (c_peak - i) < (j - c_peak); } else { if (i <= c_peak) return 0; if (j >= c_peak) return 1; return (c_peak - j) < (i - c_peak); } }
u64 peak(u64, int (*)(u64, u64));
int main(int argc, char **argv) { u64 i = peak(c_cnt, less); if (i == c_peak) { printf("CORRECT
"); } else { printf("WRONG
"); } return 0; }

Анимация в стилях WPF

Столкнулся с проблемой при написании стиля, хочу что-бы при наведении на любой из прямоугольников двигалась картинка (block1) + изменялась прозрачность, если применяю в коде прямоугольника - все работает отлично, а в стиле выдает ошибку:
Свойство TargetName не может быть задано для типа Style Setter.


Ответ

Проще всего, наверное, сделать общий стиль у картинки block1, которую вы собираетесь двигать. Вместо стиля у каждого прямоугольника мы соберём нужные свойства вместе. Обычно такое делается через MultiTrigger, но он реализует логику конъюнкции (то есть, триггер срабатывает, когда все условия выполнены), а нам нужна дизъюнкция (если хотя бы одно).
Поэтому нам придётся написать маленький конвертер.
class DisjunctionConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object p, CultureInfo ci) => values.Any(v => (bool)v);
public object[] ConvertBack(object value, Type[] targetTypes, object p, CultureInfo ci)=> throw new NotImplementedException(); }
Имея такой конвертер, всё получается довольно просто.
Вот пример XAML'а:



Результат:

Запись в файл перед уже записанным текстом

Итак, есть текст, к примеру: "я учусь в школе", который записывается в файл в программе. Нужно записать дополнительное слово "хорошей" перед словом школа (в этой же программе). Если пытаюсь это сделать с помощью fprinf, то слово школа просто затирается. Как сделать это не затирая слова, а сдвигая их вправо?
#include #include
int main (void) { FILE *fp;
if ((fp = fopen ("skul.txt", "w")) == NULL) { printf ("ERROR of open file skul.txt
"); exit (EXIT_FAILURE); }
fprintf (fp, "i lern in skul");
if (fclose (fp) != 0) { printf ("ERROR of exit from file skul.txt
"); exit (EXIT_FAILURE); }
if ((fp = fopen ("skul.txt", "r+")) == NULL) { printf ("ERROR of open file skul.txt
"); exit (EXIT_FAILURE); }
fseek (fp, 10L, SEEK_SET);
fprintf (fp, "good ");
if (fclose (fp) != 0) { printf ("ERROR of exit from file skul.txt
"); exit (EXIT_FAILURE); }
return EXIT_SUCCESS; }


Ответ

Есть 2 варианта, можешь попробовать при записи поменять w на w+, даст возможность дополнения файла.2й вариант: считать предложение до нужного символа, потом считать от этого символа до конца , получишь 2 массива char затем добавляешь свое слово и перезаписываешь в файл, чуть сложнее, но точно сработает.

Как вытащить данные из Rest-ответа?

Нужно из запроса создать объект класса User
Есть класс User
public class User {
private String id; private String firstName; private String lastName; private String userName; private String plainTextPassword; private String hashedPassword; }
Есть метод в контроллере по созданию нового пользователя
@RequestMapping(value = "/registration", method = RequestMethod.POST) public ResponseEntity update(@RequestBody User us) {
return new ResponseEntity(us, HttpStatus.OK); }
И есть репозиторий
@Repository public interface UserRepository { User createUser(User user) throws UserAlreadyExistsException; }
С помощью Advanced REST Client делаю запрос
Проблема состоит в том, что не знаю как из ответа вытащить данные о пользователе и создать нового пользователя. Может есть какой-то метод типа Scanner для Rest-сервисов?


Ответ

Немного переделал структуру проекта. Проблему решил с помощью JsonNode и ObjectMapper
Репозиторий:
@Repository public interface UserRepository extends CrudRepository { User save(User user); }
Интерфейс UserService:
public interface UserService { User addNewUser(User user); }
и его implemented класс:
@Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository;
@Override public User addNewUser(User user) { return userRepository.save(user); } }
И сам контроллер:
@RestController public class UserController {
private ObjectMapper mapper = new ObjectMapper();
@Autowired private UserService userService;
@RequestMapping(value = "/registration", method = RequestMethod.POST) public ResponseEntity update(@RequestBody JsonNode user) throws JsonProcessingException { User newUser = mapper.treeToValue(user, User.class); if (userService.addNewUser(newUser) != null) { return new ResponseEntity(HttpStatus.OK); } else { return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } } }

Как написать свой аллокатор?

Часто пишут что с не-стандартным аллокатором код может работать быстрее, а как вообще написать свой аллокатор?


Ответ

Требования к аллокаторам, и их значения по-умолчанию приведены в главе "Allocator requirements [allocator.requirements]". В этой же главе приводится пример минимального аллокатора:
template struct SimpleAllocator { typedef Tp value_type; SimpleAllocator(аргументы конструктора);
template SimpleAllocator(const SimpleAllocator& other);
Tp* allocate(std::size_t n); void deallocate(Tp* p, std::size_t n); };
template bool operator==(const SimpleAllocator&, const SimpleAllocator&); template bool operator!=(const SimpleAllocator&, const SimpleAllocator&);
Предполагается, что контейнеры обязаны обращаться к аллокатору не напрямую, а через шаблон std::allocator_traits, который предоставляет значения по-умолчанию, такие как typedef T* pointer;, и т.п.
Однако существующие реализации стандартных библиотек не везде используют allocator_traits. По этому если мы попробуем например скомпилировать код std::basic_string, SimpleAllocator> s; то мы получим такие ошибки:
/usr/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/basic_string.h:114:41: error: 'rebind' following the 'template' keyword does not refer to a template typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
или
1>S:\MSVS2013\VC\include\xstring(664): error C2903: 'rebind' : symbol is neither a class template nor a function template
В обоих случаях в реализации стандартной библиотеки написано _Alloc::rebind вместо allocator_traits<_Alloc>::rebind
Таким образом, при написании своего аллокатора, надо смотреть на ошибки компиляции, и при необходимости дописывать нужные члены класса.
Ниже приведен пример Arena аллокатора, который компилируется (VC++2013, g++-4.9.2)
#include #include #include #include
class Arena { public: Arena() {} ~Arena() { assert(m_allocations == 0); }
void* allocate(std::size_t n) { if (n > m_available) { m_chunks.emplace_back(100500); m_available = m_chunks.back().size(); m_memory = &m_chunks.back().front(); }
auto mem = m_memory; m_available -= n; m_memory += n; ++m_allocations; return mem; } void deallocate(void* p, std::size_t n) { --m_allocations; auto mem = (unsigned char*)p; if (mem + n == m_memory) { m_memory = mem; m_available += n; } }
private: std::deque> m_chunks; std::size_t m_available = 0; unsigned char* m_memory; int m_allocations = 0; };
template struct ArenaAllocator { using value_type = T;
using Traits = std::allocator_traits>;
#if !defined _MSC_VER // libstdc++ использует конструктор по умолчанию: // __a == _Alloc() ArenaAllocator() : m_arena(nullptr) {}
// libstdc++ требует следующие определения using size_type = typename std::allocator::size_type; using difference_type = typename std::allocator::difference_type; using pointer = typename std::allocator::pointer; using const_pointer = typename std::allocator::const_pointer; // "reference" не входит Allocator Requirements, // но libstdc++ думает что она всегда работает с std::allocator. using reference = typename std::allocator::reference; using const_reference = typename std::allocator::const_reference; #endif
explicit ArenaAllocator(Arena& arena) : m_arena(&arena) {} template ArenaAllocator(const ArenaAllocator& other) : m_arena(other.m_arena) {}
T* allocate(std::size_t n) { return (T*)m_arena->allocate(n * sizeof(T)); } void deallocate(T* p, std::size_t n) { m_arena->deallocate(p, n * sizeof(T)); }
// требуется в VC++ и libstdc++ template void construct(U* p, Args&&... args) { std::allocator().construct(p, std::forward(args)...); } template void destroy(U* p) { std::allocator().destroy(p); } template struct rebind { using other = ArenaAllocator; };
Arena* m_arena; };
template bool operator==(const ArenaAllocator& lhs, const ArenaAllocator& rhs) { return lhs.m_arena == rhs.m_arena; } template bool operator!=(const ArenaAllocator& lhs, const ArenaAllocator& rhs) { return !(lhs == rhs); }
#include #include #include #include #include #include #include #include #include #include
using a_string = std::basic_string, ArenaAllocator>;
template using a_vector = std::vector>; template using a_deque= std::deque>; template using a_list = std::list>; template using a_set = std::set, ArenaAllocator>; template using a_map = std::map, ArenaAllocator>>; template using a_unordered_set = std::unordered_set, std::equal_to, ArenaAllocator>; template using a_unordered_map = std::unordered_map, std::equal_to, ArenaAllocator>>;
struct X {};
int main() { Arena arena; ArenaAllocator arena_allocator(arena);
a_string s_empty(arena_allocator); a_string s_123("123", arena_allocator);
a_vector v_int({1, 2, 3}, arena_allocator); a_vector v_x(42, X{}, arena_allocator); a_vector v_str({s_empty, s_123}, arena_allocator); a_vector v_str_copy(v_str, arena_allocator); a_deque d_int({1, 2, 3}, arena_allocator); a_list l_int({1, 2, 3}, arena_allocator); a_set s_int({1, 2, 3}, std::less{}, arena_allocator); a_map m_str_int(arena_allocator); a_unordered_set us_int(arena_allocator);
auto p = std::allocate_shared(arena_allocator, 123);
#if 0 // этот код не работает в VC++ и g++ a_unordered_map um_str_int(arena_allocator); std::function f(std::allocator_arg_t{}, arena_allocator, []{}); #endif }

Наследник для FileInputStream Java

Задача написать класс, который в конструкторе будет принимать имя файла, если файл с расширением .txt, то создавать объект FileInputStream, если нет - выбрасывать исключение. Я попытался в самом начале сделать проверку на расширение, если txt, то вызывать конструктор суперкласса, ежели нет, то выбрасывать исключение, но ide ругается, что я обязательно должен вызвать конструктор суперкласса первой же строчкой.
public class TxtInputStream extends FileInputStream { FileInputStream fileInputStream;
public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException { String [] fileNameArray = fileName.split(" "); if (fileNameArray[fileNameArray.length].equals("txt")) this.fileInputStream = new FileInputStream(fileName); else { throw new UnsupportedFileNameException(); super.close(); } }
public static void main(String[] args) { }
}
UPD добавлю требования к задаче:
1. Класс TxtInputStream должен наследоваться от класса FileInputStream
2. Если в конструктор передан txt-файл, TxtInputStream должен вести себя, как обычный FileInputStream.
3. Если в конструктор передан не txt-файл, должно быть выброшено исключение UnsupportedFileNameException.
4. В случае выброшенного исключения, так же должен быть вызван super.close().


Ответ

Если наследник, то удалите переменную FileInputStream fileInputStream;
и конструктор будет выглядеть так:
public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException { super(fileName); if(!fileName.endsWith("txt")){ throw new UnsupportedFileNameException(); } }

Если надо сделать как обертку:
тогда удаляем наследование и оставляем переменную FileInputStream fileInputStream;, только делаем её приватной.
тогда конструктор выглядит так:
public TxtInputStream(String fileName) throws FileNotFoundException, UnsupportedFileNameException, IOException { if(fileName.endsWith("txt")) fileInputStream = new FileInputStream(fileName); else{ throw new UnsupportedFileNameException(); } }
но в этом случае необходимо создать нужные вам методы и перенаправить их в объект fileInputStream

Android отключить полноэкранный режим

Добрый день!
Столкнулись с такой проблемой, приложение работает в полноэкранном режиме, при этом требуется постоянный вертикальный режим.
С мобильными приложениями все хорошо, да и с планшетами в целом все нормально было, пока не установили на плaншет HUAWEI с оболочкой EUMI.
Планшет сам, автоматом переходит в горизонтальный режим, если приложение переходит в полноэкранный режим, но нам этого не надо.
Мы уже отключили в настройках "Автоповорот", в приложении так же установлен только один режим, но планшет все равно автоматом переходит в горизонтальный режим. Есть ли возможность это отключить?
UPD:

UPD:





Ответ

Для Activity установи android:screenOrientation="portrait", надеюсь поможет
Пример:

Добавление элемента в модель

Не могу понять как происходит взаимодействие модели и представления. Нужно добавить элемент в модель и установить для него виджет в отображении. У QListView есть метод setIndexWidget, который принимает индекс, но как правильно создать этот индекс? То есть, у QModelIndex конструктор создает не валидный индекс, если я сначала добавлю строку, а потом возьму ее индекс, то он все равно будет не валиден:
int row = model->rowCount(); model->insertRow(row);
QModelIndex index = model->index(row); // isValid() == false
Объясните пожалуйста как это работает
Если сильно упростить код модели, то получится что-то такое:
class ContactList : public QAbstractListModel { Q_OBJECT
public: explicit ContactList(QObject *parent = 0); ~ContactList() {}
int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int) const override;
QModelIndex index(int row, int column, const QModelIndex& parent) const override;
private: QVector models_; };

int ContactList::rowCount(const QModelIndex&) const { return models_.size(); }
QVariant ContactList::data(const QModelIndex &index, int) const { if(!index.isValid()) return QVariant();
return QVariant::fromValue(models_.at(index.row())); }
QModelIndex ContactList::index(int row, int column, const QModelIndex &parent) const { if(hasIndex(row, column, parent)) return createIndex(row, column, reinterpret_cast(models_[row]));
return QModelIndex(); }


Ответ

Проблема состояла в том, что метод insertRow вызывает внутри себя метод insertRows, который было необходимо переопределить. После того как я это сделал, все заработало.
bool ContactList::insertRows(int row, int count, const QModelIndex &parent) { int end = row + count - 1;
beginInsertRows(parent, row, end); for(int i = row; i < end; ++i) models_.append(Q_NULLPTR); endInsertRows();
return true; }

Hibernate: Получение древовидной структуры

У меня есть таблица, замапленная через Hibernate.
В этой таблице существует неограниченное на данный момент количество категорий, многие из которых имеют "родителей" (если в столбце parent_id стоит id категории).
Выглядит это примерно так:
Category={id=10, name="Category_1", parentId=5};
что подразумевает, что родителем для категории 10 является категория 5.
Структура древовидная:

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


Ответ

Нашёл на просторах интернета следующее решение:
https://www.tikalk.com/java/load-tree-jpa-and-hibernate/
Там это решено так:
public Node getTree(){ entityManager.createNamedQuery ("findAllNodesWithTheirChildren").getResultList(); Node root = entityManager.find(Node.class, ROOT_ID); return root; }

Вызов и подключение программы на c++ из c#

Есть программа на c++, которая генерирует зашифрованное сообщение и выводит в файл и консоль. Программа на c# должна эти данные выводить на winforms. Как их вообще связать? Т.е. вызвать шифратор сообщения на с++ из c#, подождать пока она посчитает и выведет данные, а затем на с# в winforms выведет ответ?


Ответ

Лучше переделать программу на C++ в dll, подключить его и из C# вызать соответствующий метод.
C++
Запускаем Visual Studio .NET. Создаём новый проект File->New->Project. Выбираем Visual C++ Project, На вкладке Templates->Visual C++, Выбираем “Win32 Project”. Выбираем имя для проекта, например TestLib. Нажимаем OK. В следующей форме выбираем Application Type: DLL и Empty Project. Добавим в "Source File" New Item->C++ File. Добавим код
#include extern "C" { double __declspec(dllexport) Add (double a, double b) { return a + b; } } Компилируем.
C#
using System.Runtime.InteropServices; using System.Windows.Forms;
namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
[DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern double Add(double a, double b); private void button1_Click(object sender, EventArgs e) { var x = Add(25, 17); MessageBox.Show(x.ToString()); } } }

Не могу отобразить поля DateTime

Имеется модель
class BotUser(models.Model): date_in = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True) date = models.DateField(auto_now=False, null=True, blank=True)
Раньше там стояло значение auto_now=True и auto_now_add=True Сейчас потребовалось отобразить их в админ панели для ручной настройки, решил изменить значения на False. Но они все равно не появляются, как быть?


Ответ

Побробуй удалить auto_now=False
class BotUser(models.Model): date_in = models.DateTimeField(auto_now_add=False, auto_now=False, null=True, blank=True) date = models.DateField(null=True, blank=True)

Получение потоков ввода вывода другого процесса

Допустим мы получили пул процессов которые именуют себя conhost
var list = Process.GetProcessesByName("conhost").GroupBy(_x => _x.Id).ToDictionary(_x => _x.Key, _x => _x);
conhost инстанцируется для каждой копии какого либо консольного приложения Windows для предоставления потоков ввода и вывода (Если это не так поправьте) Так вот мне необходимо "слушать" что пишет и читает каждая консоль - как это сагрегировать я сам решу. Но проблема в том что я не могу добиться доступа к потокам ввода и вывода.
Есть предположение что это решается нативом или Winapi (склонен больше к winapi)
Решение делать свой собственный дочерний процесс меня не устраивает. Мне необходимо слушать пул процессов. А точнее получить доступ к их потокам ввода и вывода.


Ответ

Отвечаю на свой собственный вопрос. Всем кто интересовался этим же советую прочитать данную статью : Windows 7 / Windows Server 2008 R2: Console Host
По идее, ничего в мире, что невозможно решить - нет. Но решение данного вопроса ведет в сторону хака, что конечно же нельзя обсуждать на stackoverflow.

Как правильно настроить webpack, для работы с pug файлами

Возникли проблемы с настройкой webpack
Надо, чтобы в проекте была динамическая HTML-страница. Лучше, чтобы она пререндерилась на сервере. Сам фреймворк: Adonis, однако стандартный template language в нем не такой удобный (edge - файлы). Посему решил использовать Pug
Сама структура проекта такая: есть папка source, в ней папки для каждой страницы / компонента. После билда webpack'ом все попадает в нужные места: public и views.
Все, кроме картинок. Я так и не понял, как по правильному настроить webpack, так, чтобы он не компилировал pug в html и менял ссылки в img src (в случае JPG/JPEG/PNG - это image/[name].[ext], а в случае SVG - icon/[name].svg).
И вообще: правильно ли таким образом использовать pug? Или лучше его использовать только во время билда?
Сейчас я использую следующий способ: Добавляю pug файл в webpack с помощью: html-webpack-plugin, после использую html-webpack-pug-plugin, чтобы в файл добавлялись link и script pug-вида. Я так понимаю, надо настроить loader, такая конструкция:
{ test: /\.pug$/, loaders: ['html-loader', 'pug-html-loader'] }
работает, однако на выходе получаю файл с дефолтным HTML шаблоном.


Ответ

Появилось решение: https://www.npmjs.com/package/pug-asset-loader С помощью этого плагина, можно обрабатывать pug файлы, используя функцию pal() для относительного пути, который будет заменен после сборки.

c# [DllImport] в методе, функция из dll без обьявления

Можно ли как-то в c# в самом методе подключить функцию из dll ? То есть, подобную конструкцию засунуть в метод (например метод Main):
[System.Runtime.InteropServices.DllImport("Kernel32.dll")] static extern uint QueryFullProcessImageName(IntPtr hProcess, uint flags, StringBuilder text, out uint size);
Понимаю, что скорее всего метод в методе объявить не получится. Может как-то можно напрямую из dll функцию вызывать без объявления???


Ответ

Господа @Pavel Mayorov, @Lunar Whisper спасибо! Все получилось при помощи "рефлексии". По этому линку тутор.

Android. RecyclerView поиск по элементам

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



RecyclerViewAdapter:
package com.starikov.definitions.adapters;
import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView;
import com.starikov.definitions.MainActivity; import com.starikov.definitions.R;
public class RecyclerViewAdapter extends RecyclerView.Adapter{
private int[] textId;
public static class ViewHolder extends RecyclerView.ViewHolder{ private LinearLayout mLinearLayout; public ViewHolder(LinearLayout v){ super(v); mLinearLayout = v; } }
public RecyclerViewAdapter(int[] textId){ this.textId = textId; }
@Override public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LinearLayout cv = (LinearLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.definition, parent, false); return new ViewHolder(cv); }
@Override public void onBindViewHolder(ViewHolder holder, int position) { float textSize; LinearLayout linearLayout = holder.mLinearLayout; TextView textView = linearLayout.findViewById(R.id.textId); textSize = MainActivity.sharedPreferences.getFloat(MainActivity.APP_PREFERENCES_TEXT_SIZE, 15); textView.setTextSize(textSize); textView.setText(linearLayout.getResources().getText(textId[position])); }
@Override public int getItemCount() { return textId.length; } }
Фрагмент со списком RecyclerView
package com.starikov.definitions;
import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;
import com.starikov.definitions.adapters.RecyclerViewAdapter; import com.starikov.definitions.definitions.Geometry;
public class GeometryDefinitionFragment extends Fragment {
private static int themePosition; private int[] definitionTexts; int formulaId = 0;
public static void setChoosedTheme(int position){ themePosition = position; }
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { RecyclerView formulaRecycler = (RecyclerView) inflater.inflate(R.layout.himical_definition_fragment, container, false);
switch (themePosition){ case 0: definitionTexts = new int[Geometry.ugli.length]; for (int i = 0; i < Geometry.ugli.length; ++i) { definitionTexts[formulaId] = Geometry.ugli[i].getTextId(); formulaId++; } getActivity().setTitle("Углы"); break; case 1: definitionTexts = new int[Geometry.parallenie_pryamie.length]; for (int i = 0; i < Geometry.parallenie_pryamie.length; ++i) { definitionTexts[formulaId] = Geometry.parallenie_pryamie[i].getTextId(); formulaId++; } getActivity().setTitle("Параллельные прямые"); break; case 2: definitionTexts = new int[Geometry.treugolniki.length]; for (int i = 0; i < Geometry.treugolniki.length; ++i) { definitionTexts[formulaId] = Geometry.treugolniki[i].getTextId(); formulaId++; } getActivity().setTitle("Треугольники"); break; case 3: definitionTexts = new int[Geometry.pryamoygolnii_treugolnik.length]; for (int i = 0; i < Geometry.pryamoygolnii_treugolnik.length; ++i) { definitionTexts[formulaId] = Geometry.pryamoygolnii_treugolnik[i].getTextId(); formulaId++; } getActivity().setTitle("Прямоугольный треугольник"); break; case 4: definitionTexts = new int[Geometry.gmt.length]; for (int i = 0; i < Geometry.gmt.length; ++i) { definitionTexts[formulaId] = Geometry.gmt[i].getTextId(); formulaId++; } getActivity().setTitle("Геометрические места точек"); break; case 5: definitionTexts = new int[Geometry.gomotetia.length]; for (int i = 0; i < Geometry.gomotetia.length; ++i) { definitionTexts[formulaId] = Geometry.gomotetia[i].getTextId(); formulaId++; } getActivity().setTitle("Геометрические места точек"); break; case 6: definitionTexts = new int[Geometry.chetirehugolnik.length]; for (int i = 0; i < Geometry.chetirehugolnik.length; ++i) { definitionTexts[formulaId] = Geometry.chetirehugolnik[i].getTextId(); formulaId++; } getActivity().setTitle("Четырехугольники"); break; }
RecyclerViewAdapter adapter = new RecyclerViewAdapter(definitionTexts); formulaRecycler.setAdapter(adapter); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); formulaRecycler.setLayoutManager(layoutManager); return formulaRecycler; }

@Override public void onResume() { super.onResume(); MainActivity.lastOpenedFragment = new GeometryDefinitionFragment(); MainActivity.genometryDefinitionFrag = true; }
@Override public void onPause() { super.onPause(); MainActivity.genometryDefinitionFrag = false; } }
В нем я получаю id с предыдущего фрагмента и для каждого id заполняю список разными элемнтами.
Класс Geometry
package com.starikov.definitions.definitions;
import com.starikov.definitions.R;
public class Geometry { private int textId;
public static final Geometry[] ugli = { new Geometry(R.string.ugol), new Geometry(R.string.razvernutii_ugol), new Geometry(R.string.pryamim_uglom), new Geometry(R.string.ostrim), new Geometry(R.string.tupim), new Geometry(R.string.smejnie), new Geometry(R.string.gradus), new Geometry(R.string.ravnimi), new Geometry(R.string.bissektrisa), new Geometry(R.string.vertical), new Geometry(R.string.uglom_mejdu_dvumya_peresekauch_praymamim), new Geometry(R.string.perpendikular), };
public static final Geometry[] parallenie_pryamie = { new Geometry(R.string.parallelnie_pryamie), new Geometry(R.string.teorema_suh_paral_pryamih), new Geometry(R.string.aksioma_paral_pryamih), new Geometry(R.string.sledstvie), new Geometry(R.string.parallelnie_pryamie_ugli), new Geometry(R.string.priznaki_parallelnosti_dvuh_prymih), new Geometry(R.string.svoistva_uglov_paral_pr), new Geometry(R.string.teorema_faleca), new Geometry(R.string.rashrir_faleca), };
public static final Geometry[] treugolniki = { new Geometry(R.string.treugolnik), new Geometry(R.string.uglom_treugolnika), new Geometry(R.string.vidi_treugolnikov), new Geometry(R.string.perimetr), new Geometry(R.string.sootnoshenie_ejdu_storonami_i_uglami_treugolnika), new Geometry(R.string.vneshnim), new Geometry(R.string.ravnimi__), new Geometry(R.string.priznaki_ravenstva_treugolnikov), new Geometry(R.string.srednyaya_linia), new Geometry(R.string.mediana), new Geometry(R.string.bissektrisa__), new Geometry(R.string.visota), new Geometry(R.string.svoistvo_srednei_linii_treugolnika), new Geometry(R.string.bissektrisa_ravnobedr), new Geometry(R.string.chetire_zamechatelnie_tochki_treugolnika), new Geometry(R.string.svoistva_median_treugolnika), new Geometry(R.string.reshit_treugolnik), };
public static final Geometry[] pryamoygolnii_treugolnik = { new Geometry(R.string.pryamougolnii_treugolnik), new Geometry(R.string.gipotenuza), new Geometry(R.string.kateti), new Geometry(R.string.swoistvo_mediani_provedennoi_na_gipotenuzu), new Geometry(R.string.priznaki_ravenstva_pryamougolnih_treugolnikov), new Geometry(R.string.v_pryamougolnom_treugolnike), new Geometry(R.string.teorema_pifagora), new Geometry(R.string.obratnaya_teorema_pifagora), new Geometry(R.string.teorema_kosinusov), new Geometry(R.string.teorema_sinusov), };
public static final Geometry[] gmt = { new Geometry(R.string.gmt), new Geometry(R.string.okrujnost), new Geometry(R.string.seredinnii_perpendikular), new Geometry(R.string.sovokupnost_dvuh_pryamih_parallelnoih_dannoi), new Geometry(R.string.parallelnaya_im_pruyamaya), new Geometry(R.string.sovokupnost_dvuh_pryamih), new Geometry(R.string.sovokupnost_dvuh_segmentov_bez_ih_konsov), };
public static final Geometry[] gomotetia = { new Geometry(R.string.gomotetia), new Geometry(R.string.preobrazovanie_podobia), new Geometry(R.string.podobnimi), new Geometry(R.string.sushestvovanie_podobnih_treugolnikov), new Geometry(R.string.svoistvo_preobrazovania_podobia), new Geometry(R.string.priznaki_podobia_treugolnikov), new Geometry(R.string.v_podobnih_treugolnikah), };
public static final Geometry[] chetirehugolnik = { new Geometry(R.string.chetirehugolnik), new Geometry(R.string.vershini_i_storoni), new Geometry(R.string.sosednie_protivoleshahie), new Geometry(R.string.sosednie_smejnie), new Geometry(R.string.diagonal), new Geometry(R.string.vipuklim), new Geometry(R.string.uglom), new Geometry(R.string.sosednie_protivoleshahie_ugli), new Geometry(R.string.svoistvo_uglov_vipuklogo_chetirehugolnika), new Geometry(R.string.perimetr___), new Geometry(R.string.svoistva_parallelograma), new Geometry(R.string.priznaki_parallelograma), new Geometry(R.string.pryamougolnik), new Geometry(R.string.svoistva_pryamougolnika), new Geometry(R.string.priaznaki_pryamougolnika), new Geometry(R.string.romb), new Geometry(R.string.svoistva_romba), new Geometry(R.string.prizanki_romba), new Geometry(R.string.kvadrat), new Geometry(R.string.svoistva_kvadrata), new Geometry(R.string.prizmnaki_kvadrata), new Geometry(R.string.eche_dva_prianaka_kvadrata), new Geometry(R.string.trapecia), new Geometry(R.string.osnovanie_trapecii), new Geometry(R.string.srednyaya_linia_trapecii), new Geometry(R.string.diagonal_trapecii), new Geometry(R.string.visota_trapecii), new Geometry(R.string.svoistva_trapecii), new Geometry(R.string.ravnobokoi_rapeciei), new Geometry(R.string.pryamougolnoi_trapeciei), new Geometry(R.string.svoistva_ravnobokoi_trapecii), };
private Geometry(int textId){ this.textId = textId; }
public int getTextId(){ return textId; } }
Прошу помощи, т.к. сам не разобрался.


Ответ

Разобрался, сделал:
activity_main.xml Тут макет для RecyclerView

android:scrollbarThumbVertical="@drawable/scrollview_thumb" и android:scrollbarTrackVertical="@drawable/vertical_scrollview_track" мои собственные макеты для полосы прокрутки (можно убрать, можно заменить своими)
MainActivity
package com.starikov.search;
import android.os.Bundle; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuItem;
import java.util.ArrayList; import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView; private ArrayList mArrayList = new ArrayList(Formula.physicalFormuls.length); private RecyclerViewAdapter mAdapter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.formula_recycler); mRecyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(layoutManager); mArrayList = setArray(mArrayList); // Заполняем список mAdapter = new RecyclerViewAdapter(mArrayList); // Создаем адаптер mRecyclerView.setAdapter(mAdapter); // Подключаем адаптер }
@Override public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem search = menu.findItem(R.id.search); // Подключаем SearchView SearchView searchView = (SearchView) MenuItemCompat.getActionView(search); search(searchView); return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item); }
private void search(SearchView searchView) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { mAdapter.getFilter().filter(query); return false; }
@Override public boolean onQueryTextChange(String newText) { mAdapter.getFilter().filter(newText); return true; } }); }
private ArrayList setArray(ArrayList list) { // Заполняю ArrayList готовым списком из класса Formula list.addAll(Arrays.asList(Formula.physicalFormuls)); return list; } }
main_menu.xml


Formula.java
package com.starikov.search;
public class Formula { private String name; private int imageId;
public Formula(String name, int imageId){ this.name = name; this.imageId = imageId; }

public static final Formula[] physicalFormuls = { // Текст по которому будет вестись поиск, и картинка которую ищем new Formula("закон движения", R.drawable.formul_zakon_dvijenia), new Formula("координатные уравнения движения", R.drawable.formul_koordinatnie_uravneniya_dvigenia), new Formula("перемещение точки тела",R.drawable.formul_peremechenie), .... };
public String getName(){ return name; }
public int getImageId(){ return imageId; }
public String toString() { return this.name; } }
card_view.xml (макет для элемента списка)





RecyclerViewAdapter.java
package com.starikov.search;
import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView;
import java.util.ArrayList;
public class RecyclerViewAdapter extends RecyclerView.Adapter implements Filterable{
private ArrayList mArrayList = new ArrayList<>(); private ArrayList mFilteredList = new ArrayList<>();
@Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence charSequence) { String charString = charSequence.toString();
if (charString.isEmpty()) { mFilteredList = mArrayList; } else { ArrayList filteredList = new ArrayList<>(); for (Formula formula : mArrayList) { if (formula.getName().toLowerCase().contains(charString)) { // Сортируем по тексту из Formula filteredList.add(formula); } } mFilteredList = filteredList; }
FilterResults filterResults = new FilterResults(); filterResults.values = mFilteredList; return filterResults; }
@Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { mFilteredList = (ArrayList) filterResults.values; notifyDataSetChanged(); } }; }
public static class ViewHolder extends RecyclerView.ViewHolder{ private CardView mCardView; private ImageView imageView; public ViewHolder(CardView v){ super(v); mCardView = v; imageView = v.findViewById(R.id.info_image); } }
public RecyclerViewAdapter(ArrayList arrayList){ mArrayList = arrayList; mFilteredList = arrayList; }
@Override public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view, parent, false); return new ViewHolder(cv); }
@Override public void onBindViewHolder(ViewHolder holder, int position) { holder.imageView.setImageDrawable(holder.mCardView.getResources().getDrawable(mFilteredList.get(position).getImageId())); holder.imageView.setContentDescription(mFilteredList.get(position).getName()); }
@Override public int getItemCount() { return mFilteredList.size(); } }
в Gradle зависимости для CardView и RecyclerView
compile 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:cardview-v7:26.1.0'
Буду рад советам как улучшить код!

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

Проблема заключается в следующем: пользователь выбирает изображения из галереи, которые нужно добавить в сообщение, количество изображений зависит только от пользователя, лимит 10. После отправки сообщения, под текстом пытаюсь вывести изображения в таком виде, как это делается в вк или твиттере, но правильно их скомпоновать у меня не удается. В линейном представлении не вариант, так же само как и сеткой. Хочется, чтобы это выглядело как на картинке. То есть, если пользователь прикрепляет 1 изображение, оно показывается полностью, если 2 картинки - они выводятся в две колонки, если 3 картинки - выводятся в две колонки и снизу под ними третья, и так дальше до лимита. Подскажите пожалуйста, как это можно сделать?


Ответ

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

Реализация программы Матричный дождь в WPF C#

На просторах интернета нашел реализацию Матричного дождя (падающие строки как в фильме Матрица). Реализация консольная и я решил попробовать перенести ее на WPF. В консоли символы дождя ставятся сразу в нужную позицию:
Console.SetCursorPosition(x, y);
Перед каждой вставкой может меняться цвет текста. Решил сделать через массив в который заносятся символы, а потом этот массив "печатается" в TextBox (реализация изменения цвета пока додумана, потом добавлю для каждого символа цвет и перейду на RichTextBox)
tb.Clear(); string s = ""; for (int i = 0; i < mh; i++) { for (int j = 0; j < mw; j++) { s += MatrixArray[i, j]; } s += "
"; tb.Text += s; }
В консоли было так:
public static void MatrixStep(int width, int height, int[] y, int[] l) {
int x; thistime = !thistime;
for (x = 0; x < width; ++x) {
if (x % 11 == 10) {
if (!thistime) continue;
Console.ForegroundColor = ConsoleColor.White; } else { Console.ForegroundColor = ConsoleColor.DarkGreen; Console.SetCursorPosition(x, inBoxY(y[x] - 2 - (l[x] / 40 * 2), height)); Console.Write(R); Console.ForegroundColor = ConsoleColor.Green; } Console.SetCursorPosition(x, y[x]); Console.Write(R); y[x] = inBoxY(y[x] + 1, height); Console.SetCursorPosition(x, inBoxY(y[x] - l[x], height)); Console.Write(' '); // Основной фоновый символ в потоке }
Символы стразу выводились в консоль, а у меня сначала с массив. При выводе дождя наблюдается мерцание текста: Подскажите как можно оптимизировать данную задачу, или может есть более подходящий метод?
Воспользовался предложенным кодом с Canvas
private void PrintMatrix(int x, int y, char r) { this.Dispatcher.Invoke((Action)(() => { AddText(x, y, r); foreach (object myCanvasChild in cConsole.Children) { var tb = myCanvasChild as TextBlock; if (tb == null) return; var top = (double)tb.GetValue(Canvas.TopProperty); Canvas.SetTop(tb, top); } })); }
private void AddText(int x, int y, char r) { Rectangle rct = new Rectangle(); rct.Fill = Brushes.Black; rct.Height = 19; rct.Width = 17; Canvas.SetTop(rct, 21 * x + 4); Canvas.SetLeft(rct, 18 * y); cConsole.Children.Add(rct);
var txt = new TextBlock { Text = r.ToString(), Foreground = tc, FontSize = 18, FontWeight = FontWeights.Bold, FontFamily = new FontFamily("Courier New") }; Canvas.SetTop(txt, 21 * x + 5); Canvas.SetLeft(txt, 18 * y + 3); cConsole.Children.Add(txt); }
Но картинка на canvas подвисает:


Ответ

code behind:
using System; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media;
namespace matrix { ///

/// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private readonly Random rnd = new Random();
public MainWindow() { InitializeComponent(); Task.Factory.StartNew(()=> { while (true) { Application.Current.Dispatcher.Invoke(()=> { AddText(); foreach (object myCanvasChild in MyCanvas.Children) { var tb = myCanvasChild as TextBlock; if (tb == null) return; var top = (double) tb.GetValue(Canvas.TopProperty); Canvas.SetTop(tb, top + 50); } }); Thread.Sleep(TimeSpan.FromMilliseconds(300)); } }); }
private void AddText() { var txt = new TextBlock { Text = $"some message value ={rnd.Next()}", Foreground = new SolidColorBrush(Colors.Green) }; Canvas.SetTop(txt, 0); MyCanvas.Children.Add(txt); } } }
XAML



PS надо бы еще почистить ненужные элементы

Как получить древовидную структуру файловой системы?

Нужно получить список файлов в директориях и поддиректориях в таком виде:
A\B\1 A\B\2 A\B\C\1 A\B\C\2 A\B\C\3 A\B\C\D\1 A\B\C\D\2 A\E\1 A\E\2 ...
Ясно, что нужно использовать рекурсию. Вот, что у меня получилось:
#include #include #include #include #include
struct Tree { bool is_folder; wchar_t data[256]; unsigned children_num; struct Tree* parent; struct Tree* children[1024]; };
void create_tree(struct Tree* node);
int main() { struct Tree Root = { .is_folder = true, .data = L"C:\\Users\\user\\Music", .parent = NULL, .children_num = 0 };
create_tree(&Root);
return 0; }
void create_tree(struct Tree* Root) { WIN32_FIND_DATAW find_file_data; HANDLE file_handel;
/* Файлы и директории ищутся по маске. Т.е. мы находим все файлы подходящие под маску "C:\\Users\\user\\Music\\*". */ wchar_t patch[258]; wcscpy(patch, Root->data); wcscat(patch, L"\\*");
file_handel = FindFirstFileW(patch, &find_file_data); if (file_handel != INVALID_HANDLE_VALUE) { do { /* "." - текущая директория, ".." - директория уровнем выше. */ if (!wcscmp(find_file_data.cFileName, L".") || !wcscmp(find_file_data.cFileName, L"..")) { continue; }
struct Tree* node = malloc(sizeof(*node)); node->children_num = 0; /* Записываем имя элемента. */ wcscpy(node->data, find_file_data.cFileName);
/* Мы нашли директорию. */ if ((find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { node->is_folder = true; /* По-идее, так как в этой директории могут быть свои файлы и подпапки, нужно обработать и их. */ create_tree(node); } else { node->is_folder = false; }
wprintf(L"%s\\%s%s", Root->data, node->data, node->is_folder ? L"\\
" : L"
");
/* Добавляем елемент в дерево. */ Root->children[Root->children_num] = node; Root->children_num++; } while (FindNextFileW(file_handel, &find_file_data));
FindClose(file_handel); } }
Вот результат работы программы:
C:\Users\user\Music\1.txt C:\Users\user\Music\25-17\ C:\Users\user\Music\2Pac\ C:\Users\user\Music\5'nizza\ C:\Users\user\Music\50 Cent\ C:\Users\user\Music\ACDC\ C:\Users\user\Music\Avicii\ C:\Users\user\Music\Beatles\ C:\Users\user\Music\CENTER\ C:\Users\user\Music\Chuck Berry\ C:\Users\user\Music\Classic\ C:\Users\user\Music\Covers\ C:\Users\user\Music\Cranberries\ C:\Users\user\Music\Crash Test Dummies\ C:\Users\user\Music\Dash\ C:\Users\user\Music\David Bowie\ C:\Users\user\Music\desktop.ini C:\Users\user\Music\Eminem\ C:\Users\user\Music\Imagine Dragons\ C:\Users\user\Music\John Lenon\ C:\Users\user\Music\Kellee Maize\ C:\Users\user\Music\KISS\ C:\Users\user\Music\Kongos\ C:\Users\user\Music\Lil Peep\ C:\Users\user\Music\Lil Pump\ C:\Users\user\Music\Linkin Park\ C:\Users\user\Music\Metallica\ C:\Users\user\Music\MS MR\ C:\Users\user\Music\Nautilus Pompilus\ C:\Users\user\Music\Nirvana\ C:\Users\user\Music\Noize MC\ C:\Users\user\Music\Old Gods of Asgard\ C:\Users\user\Music\One Rupublic\ C:\Users\user\Music\Other\ C:\Users\user\Music\Oxxxymiron\ C:\Users\user\Music\Pink Floyd\ C:\Users\user\Music\Poets of the Fall\ C:\Users\user\Music\Post Malone\ C:\Users\user\Music\Radiohead\ C:\Users\user\Music\Roy Jones Jr\ C:\Users\user\Music\Soundtracks\ C:\Users\user\Music\Sting\ C:\Users\user\Music\The Animals\ C:\Users\user\Music\The Lonely Biscuits\ C:\Users\user\Music\The Shins\ C:\Users\user\Music\The Wanted\ C:\Users\user\Music\Three Days Grace\ C:\Users\user\Music\Twenty One Pilots\ C:\Users\user\Music\VLNY\ C:\Users\user\Music\Yong Jeezy\ C:\Users\user\Music\Zayde Wolf\
Как видно, выводятся директории и файлы только первого уровня. В связи с этим, пару вопросов:
Правильно ли написан алгоритм? Если да, то почему программа работает неверно? Есть ли более лучший способ выполнить эту задачу?


Ответ

У вас в node->data, как я понял лежит только имя файла, без пути к нему. И когда вы вызываете рекурсивно create_tree, то на входе в Root->data видит только имя файла и, конечно, ничего найти не может. В node->data надо класть полный путь от корня. – Mike

Нужна информация по шедулерам для встроенных систем

Добрый день.
Когда-то давно я применял шедулер для микроконтроллера http://www.ucos-ii.com. Довольно приятная вещь, хотя и с ограниченной функциональностью. Но с тех пор эта контора заглохла. Подскажите информацию по подобным вещам. Может быть кто-нибудь знает форум, где обсуждаются похожие вещи.
Спасибо.
UPD1:
Оказалось, что контора не заглохла, просто переехала на другой хостинг: https://www.micrium.com/. И при этом контору купил Silicon Labs.


Ответ

Подобных ОСРВ для микроконтроллеров довольно много, перечень можно посмотреть здесь. Достаточно популярной является FreeRTOS (она бесплатна и по ней много материала в сети), embOS, MicroC/OS от Micrium

Как написать компаратор для сортировки?

Как отсортировать числовой массив? Как отсортировать массив объектов по нескольким полям?


Ответ

Стандартная сортировка
Функция sort по умолчанию приводит элементы массива к строкам, а затем сортирует.
[1,-8,90,32,0,0,5,92,900].sort() // [-8, 0, 0, 1, 32, 5, 90, 900, 92]
Если массив состоит из чисел, то такое поведение является нежелательным.
Использование компаратора
Функция sort может принимать аргумент - компаратор.
Компаратор - это функция, которая принимает 2 аргумента и возвращает отрицательное число, если первый меньше, положительное, если второй меньше и 0, если они равны.
Для чисел достаточно распространено использование вычитания в качестве компаратора:
[1,-8,90,32,0,0,5,92,900].sort(function(a, b) { return a-b; }) // [-8, 0, 0, 1, 5, 32, 90, 92, 900]
Вообще, следует с осторожностью относиться к этой конструкции из-за возможного переполнения, но в большинстве случаев она работает.
Компаратор на основе сравнения
Можно вспомнить, что во многих языках true приводится к 1, а false - к 0.
Воспользуемся этой возможностью. Только одно из условий a[1,-8,90,32,0,0,5,92,900].sort(function(a, b) { return (bКакие тут плюсы? Помимо невозможности переполнения, такое сравнение можно использовать не только с числами. Например, строки вычитать мы не можем, а сравнивать можем.
Для сортировки по убыванию надо просто поменять сравнения местами:
[1,-8,90,32,0,0,5,92,900].sort(function(a, b) { return (aСортировка по нескольким полям
При сравнении по нескольким полям требуется, чтобы следующее поле сравнивалось только когда предыдущие равны. Это значит, что часть компаратора, выполняющая сравнение тех полей при вычислении даёт 0.
Таким образом, для объединения сравнений полей замечательно подходит оператор ||, возвращающий первое истинное (в нашем случае ненулевое) значение, либо самое последнее (в нашем случае 0), если все ложны. Таким способом можно объединить любое количество полей.
Отсортируем массив по имени и id:
[{name:"John", id:7}, {name:"John",id:4}, {name:"Adam",id:3}, {name:"Adam",id:30}, {name:"Rose",id:1}].sort(function(a, b) { return (b.name

Отобразить значение тега

Есть такой html:

Как сделать, чтобы длинные значение отображались в 2 строки? А то портят всю верстку. Значения подтягиваются динамически со стороннего API.
П.С.: На крайний случай, если отобразить в 2 строки невозможно, наверное, подойдет вариант, если у selecta появится горизонтальная прокрутка.


Ответ

Отобразить значение тега в две строки внутри нельзя, это невозможно
От себя порекомендую - уходи от использования нативных селектов, они не стерилизуется нормально, чем раньше начнешь использовать кастомные селекты, тем лучше. Вот пару вариантов:
https://select2.org/ https://github.com/silviomoreto/bootstrap-select
Без этого дальше будет... никак )

Проблема not function с callback

Почему возникает ошибка: "objectForImage is not function"? Разве я не могу функцию передавать как объект? Если пример ещё более простым делать, то callback без проблем вызывается.
function loadSprite(dir, objectForImage) { var list_block_image = fs.readdirSync(dir); var file_name = randomElement(list_block_image); jimp.read(dir+file_name, function (err, load_image) { if (err) throw err; objectForImage (load_image);});
}
loadSprite("./boys/", function (image_load) {boysSprite=image_load;});


Ответ

Разобрался. У меня было подряд несколько вызовов:
loadSprite("./boys/", function (image_load) {boysSprite=image_load;}); loadSprite("./bombs/", old_value); loadSprite("./bonus/", old_value);
И крашилось не на строчке 1, она отрабатывала идеально. А на последующих строчках.
Всем спасибо за помощь.

Laravel autologin

Ситуация такая:
Пользователь добавляется в ручную в админ-панели, ему на почту падает письмо, по которому он переходит, завершает регистрацию и его логинит.
Проблема в следующем:
Laravel логинит пользователя, но при редиректе - браузер ведет себя так, как будто никакого автологина и не было и заставляет логинится в ручную.
Код для автологина следующий:
Auth::login($user, true); $isLogin = Auth::check(); //true $user = Auth::user(); //Valid user instance
Перед этим было опробовано:
auth()->guard()->login($user, true);
Результат тот же.
Прощу помощи.
UPD. Laravel v5.5


Ответ

Проблема была с сессией. Вызов session()->flush() решил проблему.

Делегирование реализации интерфейсов

Есть некий интерфейс A и есть его наследник интерфейс B. У меня есть объект интерфейса A мне нужно создать класс, реализующий интерфейс B
Вопрос, кроме прямого объявления всех методов из A и вызова соответствующих методов у объекта нет другого способа реализации?
interface A { void SomeMethod1(...); int SomeMethod2(...); ........ }
interface B extends A { ........ }
class MyClass implements B { private A obj; void SomeMethod1(...) { obj.SomeMethod1(...); }
int SomeMethod2(...) { return obj.SomeMethod2(...); } ........ }
Класс, реализующий A неизвестен и недоступен. Так, что отнаследоваться не получится.


Ответ

Вдохновленный советом @ЮрийСПБ, Сделал так:
Объявил интерфейс
interface DelegateA extends A { A getObj();
@Override default void SomeMethod1(...) { getObj().SomeMethod1(...); }
@Override default int SomeMethod2(...) { return getObj().SomeMethod2(...); } ............ } Объявил интерфейс B
interface B extends A { ........ } Сделал реализацию
class MyClass implements B, DelegateA { private A obj;
@Override A getObj() { return obj; } }
Этот способ мне нравится больше, чем предложенный Юрием, т.к. интерфейс B теперь не зависит ни от каких делегатов и может быть реализован автономно

Как распределить логику между классами UI

У меня есть класс которые в себе содержит логику RecyclerView, также в этом классе содержится логика меню, а помимо этого еще toolBar и другие компоненты UI.

Можно ли перенести логику меню в отдельный класс, toolBar соответственно, а в основном классе RecyclerViewActivity объединить их для работы с R.layout.recyclerview_activity?


Ответ

Можете, если я правильно понимаю вопрос. Необязательно для этого отдельный класс, если вы используете Kotlin , можно сделать через extensions
Конкретно для вашего примера, кусок кода и реализацию с помощью extension можете посмотреть здесь - репозиторий с кодом на github
update: Я вижу что человек поставил мне -1 за ответ. Просто если вы хотите вынести логику из вашего Activity(Fragment), то конечно нужно посмотреть в сторону MVC, MVVM, MVP. Каждый из них стоит применять в зависимости от задачи, но я бы рекомендовал MVP, как по мне он более универсальный.
Вот отличный tutorial, как можно реализовать MVP без библиотек: ссылка на гайд

linux использует только часть процессоров

Имеется восьмипроцессорный сервер. Каждый процессор по 10 ядер, итого 80 физических ядер. ОС Oracle Linux Server release 6.7, ядро 3.8.13-98.2.1.el6uek.x86_64
Проблема в том, что ОС использует только два процессора из 8:

При этом lscpu, говорит что все ядра задействованы
Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 160 On-line CPU(s) list: 0-159 Thread(s) per core: 2 Core(s) per socket: 10 Socket(s): 8 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 47 Stepping: 2 CPU MHz: 2393.990 BogoMIPS: 4787.90 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 30720K NUMA node0 CPU(s): 0-159
Пробовал запустить strees -c 80, количество задействованных ядер не изменилось, только выросла la. Не знаю куда копать. Признателен за любую помощь. Спасибо.


Ответ

Было обновлено ядро ОС. В биосе выставил вручную количество задействованных ядер на CPU (опция Enhanced Processor Core Disable (Intel Core Select)).
После загрузки в ОС все ядра стали использоваться, stress -c 160, соответственно, нагрузил их все. Доподлинно сказать, что именно помогло не могу.
Всем спасибо за помощь.

Spring Security: как поменять HTTP Status для response?

При неудачной авторизации мне необходимо отдавать обратно статус 401. Поскольку у нас в проекте используется Spring Security, то и настройка авторизации настраивается через него:
@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatcher(ADMIN_MATCHERS) .authorizeRequests() .antMatchers(ADMIN_MATCHERS) .access("hasRole('ADMIN')") .anyRequest().authenticated() .and() .formLogin() .usernameParameter(USERNAME) .passwordParameter(PASSWORD) .loginPage(ADMIN_LOGIN) .permitAll() .loginProcessingUrl("/admin/login/auth") .failureHandler(customAuthFailureHandler) .successHandler(successHandler()) .and() .logout() .logoutUrl("/admin/logout") .logoutSuccessUrl(ADMIN_LOGIN) .and() .exceptionHandling() .accessDeniedPage(ADMIN_LOGIN) .and() .csrf().disable() .httpBasic();
Для обработки ошибки авторизации я, как мы видим, использовал failureHandler()
И написал кастомный обработчик:
@Component("customAuthFailureHandler") public class CustomAuthFailureHandler extends SimpleUrlAuthenticationFailureHandler { private static final String ADMIN_LOGIN = "/admin/login"; private static final Integer STATUS_UNAUTHORIZED = 401; private static final String RESPONSE_CODE_KEY = "Response-Code"; private static final String RESPONSE_BAD_CREDENTIALS = "bad-credentials";
@Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { response.setStatus(STATUS_UNAUTHORIZED); response.addHeader(RESPONSE_CODE_KEY, RESPONSE_BAD_CREDENTIALS); getRedirectStrategy().sendRedirect(request, response, ADMIN_LOGIN); } }
Header пересылается без проблем, но вместо статуса 401 ответом приходит 302. То есть, определённый мной статус где-то затирается. Возможно, не нужно использовать sendRedirect?
Подскажите, пожалуйста, рабочее решение в рамках имеющегося кода.


Ответ

В общем, выяснилось, что можно сделать или переадресацию с, допустим, хэдерами, но без HttpStatus, или добавить HttpStatus, но без переадресации. Так, чтоб был и статус, и переадресация, силами Spring Security сделать нельзя.
Я решил задачу следующим образом: создал другую jsp и поменял в настройках строчку
.failureHandler(customAuthFailureHandler)
на
.failureUrl(ADMIN_LOGIN_FAILED)
То же самое можно сделать и силами хэндлера.

Удаления элемента JSONArray

В моем Android приложение приходит JSONArray. Примерно выглядит вот так:
[19,145,51]
При определенных обстоятельств мне приходится удалять один из элементов массива. Сейчас делаю это так:
jsonAr.remove(i);
Но метод remove работает начиная с API 19. Мне же нужно это делать на 17. Как можно удалить элемент так чтобы API 17 тоже понимал что к чему?


Ответ

Если не нужно оставлять ссылку на оригинальный массив и позволительно создать новый, то так:
public static JSONArray remove(final JSONArray from, final int index) throws JSONException { final JSONArray res = new JSONArray(); for (int i = 0, count = from.length(); i < count; i++) { if(index != i) res.put(from.get(i)); }
return res; }

Не могу собрать и запустить qt проект

Скачал я qt и Qt,и решил поизучать,посмотреть.
Так как c++ не очень хорошо знаю а опыта не очень,то прошу о помощи. При создании проекта я обратил внимание на это в основных сообщениях:
Выполняется поиск устройств WinRT. C:/Qt/Qt5.11.0/5.11.0/winrt_armv7_msvc2015/bin/winrtrunner.exe --list- devices Обнаружено 1 устройство WinRT. Project ERROR: Cannot run compiler 'cl'. Output: =================== =================== Maybe you forgot to setup the environment? Ошибка разбора файла C:\Users\timax\Documents\Test1\Test1.pro. Отмена.
И проект не запускается.
Покопавшись я обнаружил, что есть Desktop Qt 1.11.0 MSVC2015 32bit и Desktop Qt 1.11.0 MSVC2015 64bit и пишет "Ошибка: у комплекта не задан компилятор" Как это исправить?


Ответ

Надо было просто поэксперементировать с компиляторами.
В настройках для каждой MSVC надо было указать определенный компилятор
(у меня были не те).

при очередной загрузке Ubuntu появилось меню GNU GRUB

Всем привет! При очередной загрузке Ubuntu 16.04 появилось меню GNU GRUB В нем выбираю первый пункт, этот выбор приводит к:
Подскажите, как мне вернуть работоспособоность системы.


Ответ

Почему появился этот экран?
Во время работы OS были обнаружены ошибки на диске (ошибки файловой системы). И система "просит", чтобы вы провели сканирование диска 'fsck' вручную. Это нормальная ситуация, OS пытается избежать потери данных.
Как решить?
можно подключить диск к другому серверу и протеcтировать можно использовать Ubuntu LiveCD использовать RecoveryMode или Single user mode
Важно! Причиной возникающих ошибок может быть неисправность диска и в первую очередь нужно убедиться, что диск исправен.
Если это ваша основная система - выполните резервное копирование диска или ключевых данных.
p.s. Подобные ситуации сильно напрягают поначалу, но помогают лучше разобраться в логике работы и понять алгоритм восстановления системы.

изменение в styleSheet

Как изменить в QPushButton только 1 элемент на styleSheet? Если сделать так:
setStyleSheet("QPushButton {" "background-color: blue;" "}");
то остальние елементи(border-radius, ... ) стают по дефолту. А нужно изменить только 1 елемент, остальние не трогать.


Ответ

Стили для отдельных элементов управления указываются через спецификатор вида класс#имя. Имена же самих элементов задаются с помощью метода setObjectName
Пример окрашивания текста кнопки с именем myButtonName в красный цвет:
#include #include
int main(int argc, char* argv[]) { QApplication app(argc, argv); app.setApplicationName("Sample Application");
// Задаём стиль для кнопки с именем myButtonName. qApp->setStyleSheet("QPushButton#myButtonName{color:red}");
// Кнопка с именем, указанным в стилях. Стили применяются. QPushButton button1; button1.setObjectName("myButtonName"); button1.setText("Red Button"); button1.show();
// Кнопка с именем, не указанным в стилях. Стили НЕ применяются. QPushButton button2; button2.setObjectName("anotherButton"); button2.setText("Another Named Button"); button2.show();
// Кнопка без имени. Стили также НЕ применяются. QPushButton button3; button3.setText("Unnamed Button"); button3.show();
button1.show(); button2.show(); button3.show(); return qApp->exec(); }

Django allauth как получить токен юзера с которого открыта сессия в браузере?

Доброе утро.
Нужно запостить картинку на стену vk от имени юзера который залогинился на сайте.
Пробовал получить его токен так.
views.py social_accounts = SocialAccount.objects.filter(provider='vk') for social_account in social_accounts: socialtokens = SocialToken.objects.filter(id=social_account.id)
Но мне выдает токен не того кто залогинился на сайте, а первого зарегенного через соцсеть и плюс выдает этот токен в пользование даже тем кто не авторизован.
С неавторизованными вроде разобрался. Наверно не правильно, но они уже не могут выполнить заветное действие.
if request.user.is_authenticated: return render(request, 'parsing/Page1.html', {'values': ['Hello']}) else: return render(request, 'parsing/Page2.html', {'values': ['не Hello']})
А вот получить токен юзера с которого открыта сессия не получается. Подскажите, где можно найти решение? в документации на офф сайте такого не нашел. По форумам тоже ничего похожего не нагуглил.
Python3.6 Django2.0


Ответ

Ну как мне кажется, сначала вам нужно найти нужный аккаунт для пользователя с сессии. Затем если данный аккаунт существует, искать по этому аккаунту уже его токен.
social_account = SocialAccount.objects.filter(provider='vk', user=request.user.pk) socialtoken = SocialToken.objects.filter(account=social_account.pk)
Так должно сработать
social_account = SocialAccount.objects.get(provider='vk', user=request.user.pk) social_token = SocialToken.objects.get(account=social_account)

java - Как работает рандом?

Random.nextInt(100);
Вроде обычный код, правда? Ну, берет этот рандом число от 0 до 100 и фиг с ним. А вы задумывались как он работает? Если нет последовательности, тогда что скрывается за этим методом, nextInt? Это секрет или всем давно известно, а я самый такой отсталый? Кто в теме, просвятите меня, пожалуйста. Интересно, не могу.


Ответ

Я не знаю, как конкретно это реализовано в Java, но вообще-то методы генерации случайных чисел, конечно, не секрет. Для начала берется из системы какое-нибудь быстро меняющееся значение или комбинация таких значений (напр. текущее время в миллисекундах xor объем свободной памяти в байтах), от нее считается какая-нибудь быстрая хэш-функция и полученный результат используется как основание (seed) для генерации псевдослучайной последовательности. Самый простой способ ее вычисления такой: rand[i] = (rand[i - 1] * a + b) % c, где a, b и c - специально подобранные достаточно большие числа. Вроде бы, современные процессоры это на аппаратном уровне умеют делать. См. более подробно на википедии: https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел

Как записать двумерный вектор в двоичный файл?

Предположим, что у меня имеется какой-то двумерный вектор:
std::vector> main_vector; std::vector temp_vector;
for (std::size_t i = 0; i < 5; i++) temp_vector.push_back(i); for (std::size_t i = 0; i < 5; i++) main_vector.push_back(temp_vector);
Как записать его в двоичный файл? Соответственно, размерность неизвестна. Знаю, что стандартным образом как с массивами не прокатит.
bin_file.open("test.txt", std::ios::out | std::ios::binary); bin_file.write((char *)&main_vector, sizeof(main_vector)); //не сработает


Ответ

Решение вот (проверено):
std::ofstream bin_file; std::vector> main_vector; main_vector.resize(5);
const int n = 5; const int m = 5; for (std::size_t i = 0; n < 5; i++) { for (std::size_t j = 0; m < 5; j++) { main_vector[i].push_back(j); } } //демонстрация в поток вывода элементов нашего вектора for (int i {}; i < n; ++i) { for (int j {}; j < m; ++j) { std::cout << main_vector[i][j] << ' '; } } std::cout << std::endl; //запись в файл (расширение УКАЗАННО ВОПРОШАЮЩИМ!) bin_file.open("test.txt", std::ios::out | std::ios::binary); for (int i{}; i < main_vector.size(); ++i) { bin_file.write((char *)&main_vector[i][0], main_vector[i].size() * sizeof(main_vector[i][0])); } bin_file.close();
Ну а проверить что у вас вывелось в файл можно следующим образом:
char array[n * m * sizeof(main_vector[0][0])];
read_file.open("test.txt", std::ios::in | std::ios::binary); read_file.read(array, sizeof(array)); read_file.close();
int *arr = reinterpret_cast(array); for (int i {}; i < n * m; ++i) { std::cout << *arr << ' '; ++arr; }
return 0; }

Вместо страницы сайта yii2 на ubuntu 16.04 отображается текст, как исправить?

По данному видео устанавливал сайт yii2 https://www.youtube.com/watch?v=khpMJiZDvkE. Если в настройках nginx root /var/www/yii/crm_2/3/backend/web; то выйдет стандартная страница yii Если ссылаться на сайт где основной проект root /var/www/yii/crm_2.3/frontend/web; То выходит следующее В чем может быть проблема?
Настраиваем конфигурацию nginx:
sudo nano /etc/nginx/sites-available/default
Меняем содержимое на: !!!Меняем путь в root
server{ charset utf-8; client_max_body_size 128M;
listen 80;
server_name backend.dev; #root /var/www/yii/project/backend/web; root /var/www/yii/crm_2.3/frontend/web; #root /var/www/yii/crm_2.3/backend/web; index index.php;
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
location / { try_files $uri $uri/ /index.php?$args; }
include /etc/nginx/php.conf;
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires off; }
location ~ /\.(ht|svn|git) { access_log off; log_not_found off; deny all; } }
Создаем файл /etc/nginx/php.conf: sudo touch /etc/nginx/php.conf
Добавляем в него содержимое:
sudo nano/etc/nginx/php.conf
location ~ \.php$ { include fastcgi_params; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/run/php/php7.0-fpm.sock; #fastcgi_pass unix:/run/php5-fpm.sock; fastcgi_read_timeout 3000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; }
php установлен Если в index.php прописать frontend/config/main.php
return [ 'id' => 'app-frontend', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'controllerNamespace' => 'frontend\controllers', 'modules' => [ 'gridview' => ['class' => '\kartik\grid\Module'], 'datecontrol' => [ 'class' => '\kartik\datecontrol\Module', 'displaySettings' => [ Module::FORMAT_DATE => 'dd-MM-yyyy', Module::FORMAT_TIME => 'hh:mm:ss a', Module::FORMAT_DATETIME => 'dd-MM-yyyy hh:mm:ss a', ], 'saveSettings' => [ Module::FORMAT_DATE => 'php:U', // saves as unix timestamp Module::FORMAT_TIME => 'php:H:i:s', Module::FORMAT_DATETIME => 'php:Y-m-d H:i:s', ], ],
], 'components' => [ 'request' => [ 'csrfParam' => '_csrf-frontend', ], 'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, 'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true], ], 'session' => [ // this is the name of the session cookie used for login on the frontend 'name' => 'advanced-frontend', ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'bot' => [ 'class' => 'frontend\components\TelegramComponent', 'apiToken' => '411890271:AAGOEkFv8aZSMnNNMK2qmKG5X94Cr4JtxS8', ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ 'admin' => 'zakaz/admin', 'view/' => 'zakaz/view', 'disain' => 'zakaz/disain', 'master' => 'zakaz/master', 'shop' => 'zakaz/shop', 'courier' => 'courier/index', 'todoist' => 'todoist/index', 'helpdesk' => 'helpdesk/index', 'custom' => 'custom/index', 'versia' => 'zakaz/index', 'create' => 'zakaz/create', 'update/' => 'zakaz/update', 'login' => 'site/login', 'logout' => 'site/logout', 'createzakaz/' => 'todoist/createzakaz', 'view-todoist/' => 'todoist/view',
], ], ], 'params' => $params,
];


Ответ

Для apache2 я воспроизвел данную проблему, если в /etc/php/5.6/apache2 добавить файл php.ini и в /etc/php/5.6/cli лежит php.ini (который там был при установке). То всплывает данная ошибка. В nginx такая проблема была из за того ,что при клонирование репозитория и установки php.ini в проект, он заменял все конфигурационный файлы в папке config в проекте yii2 (скорее всего я невнимательно ставил т.к в процессе установки он спрашивает стоит ли заменить файлы), после правки файлов config сайт и на nginx стал работать нормально.